如何使用 MATLAB 从 WEKA 检索类值

2024-03-20

我正在尝试使用 MATLAB 和 WEKA API 从 WEKA 检索类。一切看起来都很好,但类始终为 0。有什么想法吗?

我的数据集有 241 个属性,将 WEKA 应用于该数据集我得到了正确的结果。

创建第一个训练和测试对象,然后构建分类器并执行分类实例。但这给出了错误的结果

    train = [xtrain ytrain];
    test =  [xtest];

    save ('train.txt','train','-ASCII');    
    save ('test.txt','test','-ASCII');

%## paths
WEKA_HOME = 'C:\Program Files\Weka-3-7';
javaaddpath([WEKA_HOME '\weka.jar']);

fName = 'train.txt';

%## read file

loader = weka.core.converters.MatlabLoader();

loader.setFile( java.io.File(fName) );
train = loader.getDataSet();
train.setClassIndex( train.numAttributes()-1 );

% setting class as nominal

v(1) = java.lang.String('-R');
v(2) = java.lang.String('242');
options = cat(1,v(1:end));

filter = weka.filters.unsupervised.attribute.NumericToNominal();
filter.setOptions(options); 
filter.setInputFormat(train);   
train = filter.useFilter(train, filter);

fName = 'test.txt';

%## read file

loader = weka.core.converters.MatlabLoader();

loader.setFile( java.io.File(fName) );
test = loader.getDataSet();

%## dataset
relationName = char(test.relationName);
numAttr = test.numAttributes;
numInst = test.numInstances;

%## classification
classifier = weka.classifiers.trees.J48();
classifier.buildClassifier( train );
fprintf('Classifier: %s %s\n%s', ...
    char(classifier.getClass().getName()), ...
    char(weka.core.Utils.joinOptions(classifier.getOptions())), ...
    char(classifier.toString()) )

classes =[];

for i=1:numInst

     classes(i) = classifier.classifyInstance(test.instance(i-1));


end

这是一个新代码,但仍然无法正常工作 - 类 = 0。Weka 对于相同算法和数据集的输出正常

=== 按类别详细准确度 ===



               TP Rate   FP Rate   Precision   Recall  F-Measure   ROC Area  Class
                 0.99      0.015      0.985     0.99      0.988      0.991    0
                 0.985     0.01       0.99      0.985     0.988      0.991    1
Weighted Avg.    0.988     0.012      0.988     0.988     0.988      0.991
  

=== 混淆矩阵 ===



    a    b   <-- classified as
 1012   10 |    a = 0

   15 1003 |    b = 1
  

 

    ytest1 = ones(size(xtest,1),1); 

    train = [xtrain ytrain];
    test =  [xtest ytest1];

    save ('train.txt','train','-ASCII');    
    save ('test.txt','test','-ASCII');

%## paths
WEKA_HOME = 'C:\Program Files\Weka-3-7';
javaaddpath([WEKA_HOME '\weka.jar']);

fName = 'train.txt';

%## read file

loader = weka.core.converters.MatlabLoader();

loader.setFile( java.io.File(fName) );
train = loader.getDataSet();
train.setClassIndex( train.numAttributes()-1 );

v(1) = java.lang.String('-R');
v(2) = java.lang.String('242');
options = cat(1,v(1:end));

filter = weka.filters.unsupervised.attribute.NumericToNominal();
filter.setOptions(options); 
filter.setInputFormat(train);   
train = filter.useFilter(train, filter);

fName = 'test.txt';

%## read file

loader = weka.core.converters.MatlabLoader();

loader.setFile( java.io.File(fName) );
test = loader.getDataSet();

filter = weka.filters.unsupervised.attribute.NumericToNominal();
filter.setOptions( weka.core.Utils.splitOptions('-R last') );
filter.setInputFormat(test);   
test = filter.useFilter(test, filter);


%## dataset
relationName = char(test.relationName);
numAttr = test.numAttributes;
numInst = test.numInstances;

%## classification
classifier = weka.classifiers.trees.J48();

classifier.buildClassifier( train );
fprintf('Classifier: %s %s\n%s', ...
    char(classifier.getClass().getName()), ...
    char(weka.core.Utils.joinOptions(classifier.getOptions())), ...
    char(classifier.toString()) )

classes = zeros(numInst,1);
for i=1:numInst   
     classes(i) = classifier.classifyInstance(test.instance(i-1));     
end

这是Java中类分发的代码片段

// output predictions
    System.out.println("# - actual - predicted - error - distribution");
    for (int i = 0; i < test.numInstances(); i++) {
      double pred = cls.classifyInstance(test.instance(i));
      double[] dist = cls.distributionForInstance(test.instance(i));
      System.out.print((i+1));
      System.out.print(" - ");
      System.out.print(test.instance(i).toString(test.classIndex()));
      System.out.print(" - ");
      System.out.print(test.classAttribute().value((int) pred));
      System.out.print(" - ");
      if (pred != test.instance(i).classValue())
    System.out.print("yes");
      else
    System.out.print("no");
      System.out.print(" - ");
      System.out.print(Utils.arrayToString(dist));
      System.out.println();

我将它转换为这样的 MATLAB 代码

classes = zeros(numInst,1);
for i=1:numInst
     pred = classifier.classifyInstance(test.instance(i-1));  
     classes(i) = str2num(char(test.classAttribute().value(( pred))));
end

但类输出不正确。

在你的答案中,你没有表明 pred 包含类和 predProb 概率。只需打印即可!


训练和测试数据必须具有相同数量的属性。因此,在您的情况下,即使您不知道测试数据的实际类别,也只需使用虚拟值:

ytest = ones(size(xtest,1),1);    %# dummy class values for test data

train = [xtrain ytrain];
test =  [xtest ytest];

save ('train.txt','train','-ASCII');    
save ('test.txt','test','-ASCII');

加载测试数据集时,不要忘记将其转换为名义属性(就像对训练数据集所做的那样):

filter = weka.filters.unsupervised.attribute.NumericToNominal();
filter.setOptions( weka.core.Utils.splitOptions('-R last') );
filter.setInputFormat(test);   
test = filter.useFilter(test, filter);

最后,您可以调用经过训练的 J48 分类器来预测测试实例的类值:

classes = zeros(numInst,1);
for i=1:numInst
     classes(i) = classifier.classifyInstance(test.instance(i-1));
end

EDIT

如果不知道您正在使用的数据,就很难判断。

让我用一个完整的例子来说明。我将在 MATLAB 中根据 Fisher Iris 数据创建数据集(4 个属性、150 个实例、3 个类)。

%# load dataset (data + labels)
load fisheriris
X = meas;
Y = grp2idx(species);

%# partition the data into training/testing
c = cvpartition(Y, 'holdout',1/3);
xtrain = X(c.training,:);
ytrain = Y(c.training);
xtest = X(c.test,:);
ytest = Y(c.test);          %# or dummy values

%# save as space-delimited text file
train = [xtrain ytrain];
test =  [xtest ytest];
save train.txt train -ascii
save test.txt test -ascii

我应该在这里提到,在使用之前确保两个数据集中的每个数据集中都完全表示了类值,这一点很重要NumericToNominal筛选。否则,训练集和测试集可能是不相容。我的意思是,每个类中的每个类值都必须至少有一个实例。因此,如果您使用虚拟值,也许我们可以这样做:

ytest = ones(size(xtest,1),1);
v = unique(Y);
ytest(1:numel(v)) = v;

接下来,让我们使用 Weka API 读取新创建的文件。我们将最后一个属性从数字转换为名义(以启用分类):

%# read train/test files using Weka
fName = 'train.txt';
loader = weka.core.converters.MatlabLoader();
loader.setFile( java.io.File(fName) );
train = loader.getDataSet();
train.setClassIndex( train.numAttributes()-1 );

fName = 'test.txt';
loader = weka.core.converters.MatlabLoader();
loader.setFile( java.io.File(fName) );
test = loader.getDataSet();
test.setClassIndex( test.numAttributes()-1 );

%# convert last attribute (class) from numeric to nominal
filter = weka.filters.unsupervised.attribute.NumericToNominal();
filter.setOptions( weka.core.Utils.splitOptions('-R last') );
filter.setInputFormat(train);   
train = filter.useFilter(train, filter);

filter = weka.filters.unsupervised.attribute.NumericToNominal();
filter.setOptions( weka.core.Utils.splitOptions('-R last') );
filter.setInputFormat(test);   
test = filter.useFilter(test, filter);

现在我们训练一个 J48 分类器并用它来预测测试实例的类别:

%# train a J48 tree
classifier = weka.classifiers.trees.J48();
classifier.setOptions( weka.core.Utils.splitOptions('-c last -C 0.25 -M 2') );
classifier.buildClassifier( train );

%# classify test instances
numInst = test.numInstances();
pred = zeros(numInst,1);
predProbs = zeros(numInst, train.numClasses());
for i=1:numInst
     pred(i) = classifier.classifyInstance( test.instance(i-1) );
     predProbs(i,:) = classifier.distributionForInstance( test.instance(i-1) );
end

最后,我们根据测试数据评估经过训练的模型性能(这应该与您在 Weka Explorer 中看到的类似)。显然,只有当测试实例具有真实的类值(而不是虚拟值)时,这才有意义:

eval = weka.classifiers.Evaluation(train);

eval.evaluateModel(classifier, test, javaArray('java.lang.Object',1));

fprintf('=== Run information ===\n\n')
fprintf('Scheme: %s %s\n', ...
    char(classifier.getClass().getName()), ...
    char(weka.core.Utils.joinOptions(classifier.getOptions())) )
fprintf('Relation: %s\n', char(train.relationName))
fprintf('Instances: %d\n', train.numInstances)
fprintf('Attributes: %d\n\n', train.numAttributes)

fprintf('=== Classifier model ===\n\n')
disp( char(classifier.toString()) )

fprintf('=== Summary ===\n')
disp( char(eval.toSummaryString()) )
disp( char(eval.toClassDetailsString()) )
disp( char(eval.toMatrixString()) )

上述示例在 MATLAB 中的输出:

=== Run information ===

Scheme: weka.classifiers.trees.J48 -C 0.25 -M 2
Relation: train.txt-weka.filters.unsupervised.attribute.NumericToNominal-Rlast
Instances: 100
Attributes: 5

=== Classifier model ===

J48 pruned tree
------------------

att_4 <= 0.6: 1 (33.0)
att_4 > 0.6
|   att_3 <= 4.8
|   |   att_4 <= 1.6: 2 (32.0)
|   |   att_4 > 1.6: 3 (3.0/1.0)
|   att_3 > 4.8: 3 (32.0)

Number of Leaves  :     4

Size of the tree :  7

=== Summary ===

Correctly Classified Instances          46               92      %
Incorrectly Classified Instances         4                8      %
Kappa statistic                          0.8802
Mean absolute error                      0.0578
Root mean squared error                  0.2341
Relative absolute error                 12.9975 %
Root relative squared error             49.6536 %
Coverage of cases (0.95 level)          92      %
Mean rel. region size (0.95 level)      34      %
Total Number of Instances               50     

=== Detailed Accuracy By Class ===

             TP Rate  FP Rate  Precision   Recall  F-Measure   ROC Area  Class
              1        0         1         1         1          1        1
              0.765    0         1         0.765     0.867      0.879    2
              1        0.118     0.8       1         0.889      0.938    3
Weighted Avg. 0.92     0.038     0.936     0.92      0.919      0.939

=== Confusion Matrix ===

  a  b  c   <-- classified as
 17  0  0 |  a = 1
  0 13  4 |  b = 2
  0  0 16 |  c = 3
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 MATLAB 从 WEKA 检索类值 的相关文章

  • 改变眼睛图像中特定区域的颜色[Matlab]

    I am trying to change the pupil of the following image This is not a feature extraction or eye detection task I want to
  • 预测误差指标的差距是什么:MAPE 和 WMAPE?

    我知道 MAPE 和 WMAPE 作为预测误差指标 它们有一些好处 但差距是什么 有人说 For MAPE Combinations with very small or zero volumes can cause large skew
  • Matlab:在类中导入函数

    我在 Matlab 中有一个类文件 我使用包规范创建了 i 目录结构 MyPkg F1 F2 F3 fun m myc m 我的班级是myc并将其插入包装中MyPkg 一个功能fun保存在子包中F3在主要的一处 我想使用函数fun在我的课堂
  • 如何在输入对话框中预设光标或选择默认答案

    如果创建一个输入对话框inputdlg和默认答案 看起来像这样 我需要哪个回调命令才能使它看起来像那样 这里缺少很多文档 这是为客户提供的一种 豪华服务 但我认为如果它很容易实现的话那就太好了 这个问题实际上已经解决了 因为我发现有一些方便
  • 如何在 Matlab 中使用变化的输入/时间相关的输入函数求解 DAE?

    我正在使用 ode15i 求解器求解 DAE 问题 我有 8 个变量和 8 个方程 系统很复杂 到目前为止唯一可用的求解器是 ode15i 我使用过该指南 http se mathworks com help symbolic set up
  • 有没有办法在 mex 文件中制作 try-catch 语句?

    我知道在 C 中没有内置的方法来执行 try catch 语句 但是 MATLAB 是否为 MEX 文件提供了任何类型的 try catch 功能 我尝试使用Longjmp and Setjmp以中描述的方式http www di unip
  • Sklearn 随机森林回归器的错误

    当尝试使用 y 数据拟合随机森林回归器模型时 如下所示 0 00000000e 00 1 36094276e 02 4 46608221e 03 8 72660888e 03 1 31375786e 04 1 73580193e 04 2
  • 如何在 MATLAB 中调整矩阵大小?

    假设我有一个1 by 12矩阵 我想将其调整为4 by 3矩阵 我怎么能这样做呢 我当前的解决方案有点丑陋 for n 1 length mat 3 out n 1 3 mat n 1 3 1 n 1 3 3 end 有一个更好的方法吗 r
  • 将 MATLAB 单元格类型转换为 C++

    我正在使用 C 转换 MATLAB 程序犰狳 http arma sourceforge net docs html syntax对于矩阵代数 我被困住了cell http blogs mathworks com loren 2006 06
  • 仅正样本和未标记数据集的二元半监督分类

    我的数据由评论组成 保存在文件中 其中很少被标记为正面 我想使用半监督和PU http www cs uic edu liub publications ICDM 03 pdf分类将这些评论分为正面和负面类别 我想知道 python sci
  • SpaCy 的相似度是如何计算的?

    初学者 NLP 问题在这里 similarity 方法如何运作 哇 spaCy 太棒了 它的tfidf模型可以更容易预处理 但w2v只有一行代码 token vector 惊人的 In his spaCy 上的 10 行教程 https g
  • 具有表面梯度的颜色 matplotlibplot_surface 命令

    我想将 surf 命令从MATLAB到plot surface命令中绘图库 我面临的挑战是使用时cmapplot surface 命令中的函数用渐变为表面着色 这里是matlab script Matlab Commands x 5 25
  • 在python中访问包含matlab类的.mat文件

    我有一个从 matlab 2012b 生成的 mat 文件 它包含一个带有用户定义的 matlab 类的变量 在 python 3 3 中使用 scipy io loadmat 加载文件时 我得到以下信息 mat scipy io load
  • 在不同长度的数组中查找相同的日期时间

    考虑以下儒略日期数组 Jday1 datenum 2011 01 01 00 00 yyyy mm dd HH MM 60 60 24 datenum 2011 12 31 23 00 yyyy mm dd HH MM Jday2 date
  • iOS 将 URL 中的音频分成帧

    我正在 iOS 上开发一个简单的网络广播应用程序 具有非常简单的语音 音乐识别功能 主要思想是一个收音机 它播放来自 url 的信号 同时检查正在广播的信号类型 当它检测到语音时 它会改变频道等等 我使用 Storyboards 和 AVF
  • Matlab:不正确的索引矩阵参考(或智胜matlab)

    我希望能够写jasmine http pivotal github io jasmine 类似于 Matlab 中的测试 所以像 expect myfibonacci 0 toBe 0 expect myfibonacci 5 toBe 1
  • 计算向量中连续 1 和 0 的数量

    在 Matlab 中我有一个如下所示的向量 0 0 1 1 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 0 1 0 1 我现在要做的是统计这个向量中1的个数 连续的 1 算作 1 此外 我还想计算 1 之间 0 的平均值和中
  • 梯度下降Matlab实现

    我已经浏览了堆栈溢出中的许多代码 并在同一行上编写了自己的代码 这段代码有一些问题我无法理解 我正在存储值 theta1 和 theta 2 以及用于分析目的的成本函数 x 和 Y 的数据可以从此下载页 它具有 dat 文件形式的 x 和
  • 现代 CNN(卷积神经网络)作为 DetectNet 旋转不变吗?

    众所周知 用于目标检测的 nVidia DetectNet CNN 卷积神经网络 基于 Yolo DenseBox 的方法 https devblogs nvidia com parallelforall deep learning obj
  • MATLAB:解包函数

    我正在与 Mathworks 的某人讨论 unwrap http www mathworks com access helpdesk help techdoc ref unwrap html函数中对于 以外的跳跃容差有一个 bug 并且希望

随机推荐

  • 如何插入包含页码、文件路径和图像的页脚?

    I m trying to format the footer so it has the page x out of y on the top right of the footer and then the image centered
  • 使用 Velocity 和 Jasmine 测试 Meteor 时需要超时

    对于流星 速度和茉莉花来说还很陌生 所以不确定我是否做错了什么 使用茉莉花来做它不适合的事情 或者这只是它的工作方式 我发现我需要为几乎所有测试设置超时才能让它们通过 应该是这种情况还是我做错了什么 例如 我正在运行一些测试来检查验证消息
  • 当列表项很少时,如何将页脚视图显示到屏幕末尾?

    我想向列表视图添加页脚 当列表项数量较多时 页脚效果很好 但是当列表视图的项目很少时 页脚会显示在屏幕中间 就在列表视图的下方 这看起来很破旧 在这种情况下 我希望页脚与父底部对齐 谢谢你的期待 这是你想要的最简单的例子 你可以自定义它
  • cocos2d中忽略精灵的透明区域

    我已经被困了好几个星期了 现在试图找出如何忽略对精灵透明区域的触摸 我一直在尝试使用本教程来跟踪像素完美碰撞 http www learn cocos2d com 2011 12 fast pixelperfect collision de
  • Python 单元测试 - 如何修补我正在测试的方法内部的异步调用

    我使用 unittest mock 为我的 python 代码构建测试 我有一个正在尝试测试的方法 其中包含对另一个函数的异步调用 我想修补该异步调用 以便我可以让 Mock 返回一个测试值asset id 而不是实际调用异步方法 我尝试了
  • std::memory_order_seq_cst 的工作原理

    我从以下位置获取了有关 std memory order seq cst 的示例 http en cppreference com w cpp atomic memory order http en cppreference com w c
  • HTML 输入换行文本而不是水平溢出

    我有一个input字段 用户将在其中输入文本 当文本变得太长时 输入字段会水平延伸 而不是垂直下降 我尝试添加这个CSS overflow hidden word wrap break word 但我没有运气 关于如何实现这一目标还有其他建
  • 在 VBA (Excel) 中获取时区信息

    我想在 VBA 中确定不同国家 地区在特定日期的 GMT UTC 时间偏移 包括夏令时 有任何想法吗 编辑 来自自我回答 谢谢 0xA3 我快速浏览了链接页面 我假设您只能获取 Windows 运行所在本地的 GMT 偏移量 Convert
  • 如何构建一个 GUI 以在 jupyter 笔记本中使用?

    这个想法是能够在笔记本中构建和使用 GUI 因此使用具有大量参数的长函数比仅在笔记本中键入字符更有效 显然不是具体细节 但如果有人可以指出一些可能有帮助的库 项目 链接或任何资源 我查遍了互联网 到目前为止什么也没有 PyData 中有一个
  • git clone 不签出活动分支

    我有一个远程裸存储库 有两个分支 master 和 testing 其中 HEAD 指 testing 克隆此存储库时 git 检查 master 如果 master 和 testing 位于同一修订版上 即 HEAD test maste
  • Eclipse 任务为空

    我正在使用 Eclipse Helios 并在我的 java 类中添加了一些任务 使用 TODO blah blah 在行计数附近 我有一个小图标 表明任务已被识别 但我在任务视图中看不到它们 我尝试了任务视图和任务列表视图 它们是空的 但
  • 如何在量角器中调用另一个函数中的函数

    第一个功能 describe Shortlisting page function it Click on candidate status Screened function element by css i flaticon lefta
  • 以编程方式将下拉列表添加到特定单元格

    我想知道如何使用 VBA 以编程方式将下拉列表添加到 Excel 工作表的特定单元格 例如 我希望能够向单元格 i j 添加下拉列表并定义列表的元素 以编程方式执行此操作 With Selection Validation Delete A
  • 使用 dapper 查询空间数据

    我找到了一些相关的问题 https stackoverflow com questions 18088169 dapper spatial geography type 但作者放弃了 继续使用存储过程来进行 映射 这实际上是一个延续问题he
  • 如何使用 Laravel Passport 生成短令牌?

    我使用 Laravel Passport 和密码授予模式 我发现它生成的访问令牌很长 如下所示 token type Bearer expires in 31536000 access token eyJ0eXAiOiJKV1QiLCJhb
  • 没有 元素的 selenium 文件上传

    我正在尝试使用 selenium python 上传我的简历here https boards greenhouse io robinhood jobs 996796 app 在简历 简历附件部分下 当我检查 Attach 元素时 它显示为
  • java.lang.OutOfMemoryError:为 ChunkPool::allocate 请求 32756 字节。交换空间不足?

    我正在使用通过 WebLogic 10 3 部署在 HP 服务器上的 java 应用程序 版本信息 WebLogic Version 10 3 OS Version B 11 23 java version java version 1 6
  • 为什么这个工厂返回 $$state 对象而不是 response.data?

    所以我在服务器中有一个对象集合 我想在页面加载时填充 ng repeat 我创建了一个工厂 它从服务器上的资源中获取列表 如下所示 app factory objectArray http function http This is ret
  • 在 Elasticsearch 中搜索所有嵌套子级与给定查询匹配的对象

    给定一个具有以下映射的对象 a properties id type string b type nested properties key type string 我想检索该对象的所有实例 其中所有嵌套子对象都与给定查询匹配 例如 假设我
  • 如何使用 MATLAB 从 WEKA 检索类值

    我正在尝试使用 MATLAB 和 WEKA API 从 WEKA 检索类 一切看起来都很好 但类始终为 0 有什么想法吗 我的数据集有 241 个属性 将 WEKA 应用于该数据集我得到了正确的结果 创建第一个训练和测试对象 然后构建分类器