一、分类classifier

  如何利用weka里的类对数据集进行分类,要对数据集进行分类,第一步要指定数据集中哪一列做为类别,如果这一步忘记了(事实上经常会忘记)会出现“Class index is negative (not set)!”这个错误,设置某一列为类别用Instances类的成员方法setClassIndex,要设置最后一列为类别则可以用Instances类的numAttributes()成员方法得到属性的个数再减1。

  然后选择分类器,比较常用的分类器有J48,NaiveBayes,SMO(LibSVM有Java版的,可以在weka中使用,但要设置路径),训练分类器使用J48的buildClassifier(注意J48还有别的分类器它们都继承自Classifier类,使用方法都差不多),分类数据用J48类中的classifyInstance方法,例中使用的数据集为contact-lenses.arff,分类结果为2.0,结果为2.0的原因是:首先用文本编辑器打开数据集,有一行为@attribute contact-lenses {soft, hard, none},而第一个样本为young, myope, no, reduced, none,最后一列为类别,也就是contact-lences为类别,第一个样本的类别为none,在属性说明中none为第二个所以为2.0(从0开始数)。

二、评估Evaluation

  Evaluation类,这次只讲一下最简单的用法,首先初始化一个Evaluation对象,Evaluation类没有无参的构造函数,一般用Instances对象作为构造函数的参数。

如果没有分开训练集和测试集,可以使用Cross Validation方法,Evaluation中crossValidateModel方法的四个参数分别为,第一个是分类器,第二个是在某个数据集上评价的数据集,第三个参数是交叉检验的次数(10是比较常见的),第四个是一个随机数对象。

如果有训练集和测试集,可以使用Evaluation 类中的evaluateModel方法,方法中的参数为:第一个为一个训练过的分类器,第二个参数是在某个数据集上评价的数据集。例中我为了简单用训练集再次做为测试集,希望大家不会糊涂。

提醒大家一下,使用crossValidateModel时,分类器不需要先训练,这其实也应该是常识了。

Evaluation中提供了多种输出方法,大家如果用过weka软件,会发现方法输出结果与软件中某个显示结果的是对应的。例中的三个方法toClassDetailsString,toSummaryString,toMatrixString比较常用。

三、特征选择AttributeSelection

  用AttributeSelection进行特征选择,它需要设置3个方面,第一:对属性评价的类(自己到Weka软件里看一下,英文Attribute Evaluator),第二:搜索的方式(自己到Weka软件里看一下,英文Search Method),第三:就是你要进行特征选择的数据集了。最后调用Filter的静态方法userFilter,感觉写的都是废话,一看代码就明白了。唯一值得一说的也就是别把AttributeSelection的包加错了,代码旁边有注释。

  1. package org.ml;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.FileNotFoundException;
  5. import java.io.FileReader;
  6. import java.io.IOException;
  7. import java.util.Random;
  8.  
  9. import weka.attributeSelection.CfsSubsetEval;
  10. import weka.attributeSelection.GreedyStepwise;
  11. import weka.classifiers.Classifier;
  12. import weka.classifiers.Evaluation;
  13. import weka.classifiers.meta.AttributeSelectedClassifier;
  14. import weka.classifiers.trees.J48;
  15. import weka.core.Instances;
  16. import weka.filters.Filter;
  17. import weka.filters.supervised.attribute.AttributeSelection;
  18.  
  19. public class Test {
  20.  
  21. public static Instances getFileInstances(String fileName)
  22. throws FileNotFoundException, IOException {
  23. Instances m_Instances = new Instances(new BufferedReader(
  24. new FileReader(fileName)));
  25. m_Instances.setClassIndex(m_Instances.numAttributes() - 1);
  26. return m_Instances;
  27. }
  28.  
  29. public static Evaluation crossValidation(Instances m_Instances,
  30. Classifier classifier, int numFolds) throws Exception {
  31. Evaluation evaluation = new Evaluation(m_Instances);
  32. evaluation.crossValidateModel(classifier, m_Instances, numFolds,
  33. new Random(1));
  34. return evaluation;
  35. }
  36.  
  37. public static Evaluation evaluateTestData(Instances m_Instances, Classifier classifier) throws Exception {
  38. int split = (int) (m_Instances.numInstances() * 0.6);
  39. Instances traindata = new Instances(m_Instances, 0, split);
  40. Instances testdata = new Instances(m_Instances, split, m_Instances.numInstances() - split);
  41. classifier.buildClassifier(traindata);
  42. //下面一行是m_Instances,或traindata,或testdata都没关系,因为Evaluation构造方法要的只是instance的结构,比如属性
  43. Evaluation evaluation = new Evaluation(m_Instances);
  44. evaluation.evaluateModel(classifier, testdata);
  45. return evaluation;
  46. }
  47.  
  48. public static Instances selectAttrUseFilter(Instances m_Instances) throws Exception {
  49. AttributeSelection filter = new AttributeSelection();
  50. filter.setEvaluator(new CfsSubsetEval());
  51. filter.setSearch(new GreedyStepwise());
  52. filter.setInputFormat(m_Instances);
  53. return Filter.useFilter(m_Instances, filter);
  54. }
  55.  
  56. public static void selectAttrUseMC(Instances m_Instances, Classifier base) throws Exception {
  57. AttributeSelectedClassifier classifier = new AttributeSelectedClassifier();
  58. classifier.setClassifier(base);
  59. classifier.setEvaluator(new CfsSubsetEval());
  60. classifier.setSearch(new GreedyStepwise());
  61. Evaluation evaluation = new Evaluation(m_Instances);
  62. evaluation.crossValidateModel(classifier, m_Instances, 10, new Random(1));
  63. System.out.println(evaluation.toSummaryString());
  64. }
  65.  
  66. public static void printEvalDetail(Evaluation evaluation) throws Exception {
  67. System.out.println(evaluation.toClassDetailsString());
  68. System.out.println(evaluation.toSummaryString());
  69. System.out.println(evaluation.toMatrixString());
  70. }
  71.  
  72. public static void main(String[] args) throws Exception {
  73.  
  74. Instances data = getFileInstances("C:\\Program Files\\Weka-3-7\\data\\soybean.arff");
  75. //交叉验证
  76. Evaluation crossEvaluation = crossValidation(data, new J48(), 10);
  77. printEvalDetail(crossEvaluation);
  78.  
  79. System.out.println("=====================================");
  80. //一般分类器分类,部分数据用于train,部分用于test
  81. Evaluation testEvaluation = evaluateTestData(data, new J48());
  82. printEvalDetail(testEvaluation);
  83.  
  84. System.out.println("=====================================");
  85. //特征筛选
  86. Instances newData = selectAttrUseFilter(data);
  87. System.out.println("Oral data:" + data.numAttributes());
  88. System.out.println("selected data:" + newData.numAttributes());
  89. testEvaluation = evaluateTestData(newData, new J48());
  90. printEvalDetail(testEvaluation);
  91.  
  92. System.out.println("=====================================");
  93. selectAttrUseMC(data, new J48());
  94.  
  95. // System.out.println("=====================================");
  96. // J48 classifer = new J48();
  97. // classifer.buildClassifier(data);
  98. // for (int i = 0; i < data.numInstances(); i++) {
    //        //输出每个样例被分到的类别,如果是二分,分别表示为0和1
  99. // System.out.println(data.instance(i) + " === " + classifer.classifyInstance(data.instance(i)));
  100. // }
  101. }
  102. }

【weka】分类,cross-validation,数据的更多相关文章

  1. 交叉验证 Cross validation

    来源:CSDN: boat_lee 简单交叉验证 hold-out cross validation 从全部训练数据S中随机选择s个样例作为训练集training set,剩余的作为测试集testin ...

  2. 用KNN算法分类CIFAR-10图片数据

    KNN分类CIFAR-10,并且做Cross Validation,CIDAR-10数据库数据如下: knn.py : 主要的试验流程 from cs231n.data_utils import lo ...

  3. 交叉验证(cross validation)

    转自:http://www.vanjor.org/blog/2010/10/cross-validation/ 交叉验证(Cross-Validation): 有时亦称循环估计, 是一种统计学上将数据 ...

  4. 10折交叉验证(10-fold Cross Validation)与留一法(Leave-One-Out)、分层采样(Stratification)

    10折交叉验证 我们构建一个分类器,输入为运动员的身高.体重,输出为其从事的体育项目-体操.田径或篮球. 一旦构建了分类器,我们就可能有兴趣回答类似下述的问题: . 该分类器的精确率怎么样? . 该分 ...

  5. Cross Validation(交叉验证)

    交叉验证(Cross Validation)方法思想 Cross Validation一下简称CV.CV是用来验证分类器性能的一种统计方法. 思想:将原始数据(dataset)进行分组,一部分作为训练 ...

  6. 交叉验证(Cross Validation)简介

    参考    交叉验证      交叉验证 (Cross Validation)刘建平 一.训练集 vs. 测试集 在模式识别(pattern recognition)与机器学习(machine lea ...

  7. 几种交叉验证(cross validation)方式的比较

    模型评价的目的:通过模型评价,我们知道当前训练模型的好坏,泛化能力如何?从而知道是否可以应用在解决问题上,如果不行,那又是哪里出了问题? train_test_split 在分类问题中,我们通常通过对 ...

  8. cross validation

    k-folder cross-validation:k个子集,每个子集均做一次测试集,其余的作为训练集.交叉验证重复k次,每次选择一个子集作为测试集,并将k次的平均交叉验证识别正确率作为结果.优点:所 ...

  9. 交叉验证(Cross Validation)方法思想简介

      以下简称交叉验证(Cross Validation)为CV.CV是用来验证分类器的性能一种统计分析方法,基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train ...

  10. 验证和交叉验证(Validation & Cross Validation)

    之前在<训练集,验证集,测试集(以及为什么要使用验证集?)(Training Set, Validation Set, Test Set)>一文中已经提过对模型进行验证(评估)的几种方式. ...

随机推荐

  1. Nokia 920全部CODE

    code码都是7位,我是从别的地方copy过来的,code码后面带了些乱码懒得删了,自己数7位code就是了. RM-820 NDT AMERICA ATT White        059N5T3R ...

  2. hihoCoder挑战赛28 题目3 : 树的方差

    题目3 : 树的方差 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 对于一棵 n 个点的带标号无根树,设 d[i] 为点 i 的度数. 定义一棵树的方差为数组 d[1. ...

  3. 下载Google Play外国区APP技巧

    安卓用户若遇到喜欢的APP是外国区的,只要FQ就能下载.比起果粉还要注册,是简便很多.但有没有更简单的办法?这个必须有!笔者前几天在网上闲逛时,就发现了一个给力的网站.让你不用FQ,只需3个步骤,就能 ...

  4. 【转】JavaScript 事件顺序:冒泡和捕获

    补充说明:这篇文章通俗易懂地讲解了冒泡和捕获原理,原文来自 ppk 大侠的 quirksmode 站点.感谢网友 hh54188 的翻译. 事件的发生顺序 这个问题的起源非常简单,假设你在一个元素中又 ...

  5. Java Mail 发送邮件(SSL加密方式,TSL加密方式)

    一.一般配置 发送邮件需要用到  mail包 maven 依赖如下: <!-- https://mvnrepository.com/artifact/javax.mail/mail --> ...

  6. Quartz学习——SSMM(Spring+SpringMVC+Mybatis+Mysql)和Quartz集成详解(转)

    通过前面的学习,你可能大致了解了Quartz,本篇博文为你打开学习SSMM+Quartz的旅程!欢迎上车,开始美好的旅程! 本篇是在SSM框架基础上进行的. 参考文章: 1.Quartz学习——Qua ...

  7. mysql count(*) 和count(列) 的区别

    count(*) 是统计包含null的记录,而count(列)不含null; 在不带where的情况下count(*)与count(列)相比,并非统计所有列,而是忽略所有列而直接统计行数; 当coun ...

  8. ZH奶酪:JavaScript调用AngularJS的函数/$scope/变量

    使用背景: 需要在其他JavaScript文件中调用AngularJS内部方法或改变$scope变量,同时还要保持双向数据绑定: 首先获取AngularJS application: 方法一:通过co ...

  9. POJ - 1191 棋盘分割 记忆递归 搜索dp+数学

    http://poj.org/problem?id=1191 题意:中文题. 题解: 1.关于切割的模拟,用递归 有这样的递归方程(dp方程):f(n,棋盘)=f(n-1,待割的棋盘)+f(1,割下的 ...

  10. Linux umask限制导致php的mkdir 0777无效

    原因:mkdir权限受当前linux umask限制 解决方法: $oldmask = umask(0); mkdir("test", 0777); umask($oldmask) ...