【weka】分类,cross-validation,数据
一、分类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的包加错了,代码旁边有注释。
package org.ml; import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Random; import weka.attributeSelection.CfsSubsetEval;
import weka.attributeSelection.GreedyStepwise;
import weka.classifiers.Classifier;
import weka.classifiers.Evaluation;
import weka.classifiers.meta.AttributeSelectedClassifier;
import weka.classifiers.trees.J48;
import weka.core.Instances;
import weka.filters.Filter;
import weka.filters.supervised.attribute.AttributeSelection; public class Test { public static Instances getFileInstances(String fileName)
throws FileNotFoundException, IOException {
Instances m_Instances = new Instances(new BufferedReader(
new FileReader(fileName)));
m_Instances.setClassIndex(m_Instances.numAttributes() - 1);
return m_Instances;
} public static Evaluation crossValidation(Instances m_Instances,
Classifier classifier, int numFolds) throws Exception {
Evaluation evaluation = new Evaluation(m_Instances);
evaluation.crossValidateModel(classifier, m_Instances, numFolds,
new Random(1));
return evaluation;
} public static Evaluation evaluateTestData(Instances m_Instances, Classifier classifier) throws Exception {
int split = (int) (m_Instances.numInstances() * 0.6);
Instances traindata = new Instances(m_Instances, 0, split);
Instances testdata = new Instances(m_Instances, split, m_Instances.numInstances() - split);
classifier.buildClassifier(traindata);
//下面一行是m_Instances,或traindata,或testdata都没关系,因为Evaluation构造方法要的只是instance的结构,比如属性
Evaluation evaluation = new Evaluation(m_Instances);
evaluation.evaluateModel(classifier, testdata);
return evaluation;
} public static Instances selectAttrUseFilter(Instances m_Instances) throws Exception {
AttributeSelection filter = new AttributeSelection();
filter.setEvaluator(new CfsSubsetEval());
filter.setSearch(new GreedyStepwise());
filter.setInputFormat(m_Instances);
return Filter.useFilter(m_Instances, filter);
} public static void selectAttrUseMC(Instances m_Instances, Classifier base) throws Exception {
AttributeSelectedClassifier classifier = new AttributeSelectedClassifier();
classifier.setClassifier(base);
classifier.setEvaluator(new CfsSubsetEval());
classifier.setSearch(new GreedyStepwise());
Evaluation evaluation = new Evaluation(m_Instances);
evaluation.crossValidateModel(classifier, m_Instances, 10, new Random(1));
System.out.println(evaluation.toSummaryString());
} public static void printEvalDetail(Evaluation evaluation) throws Exception {
System.out.println(evaluation.toClassDetailsString());
System.out.println(evaluation.toSummaryString());
System.out.println(evaluation.toMatrixString());
} public static void main(String[] args) throws Exception { Instances data = getFileInstances("C:\\Program Files\\Weka-3-7\\data\\soybean.arff");
//交叉验证
Evaluation crossEvaluation = crossValidation(data, new J48(), 10);
printEvalDetail(crossEvaluation); System.out.println("=====================================");
//一般分类器分类,部分数据用于train,部分用于test
Evaluation testEvaluation = evaluateTestData(data, new J48());
printEvalDetail(testEvaluation); System.out.println("=====================================");
//特征筛选
Instances newData = selectAttrUseFilter(data);
System.out.println("Oral data:" + data.numAttributes());
System.out.println("selected data:" + newData.numAttributes());
testEvaluation = evaluateTestData(newData, new J48());
printEvalDetail(testEvaluation); System.out.println("=====================================");
selectAttrUseMC(data, new J48()); // System.out.println("=====================================");
// J48 classifer = new J48();
// classifer.buildClassifier(data);
// for (int i = 0; i < data.numInstances(); i++) {
// //输出每个样例被分到的类别,如果是二分,分别表示为0和1
// System.out.println(data.instance(i) + " === " + classifer.classifyInstance(data.instance(i)));
// }
}
}
【weka】分类,cross-validation,数据的更多相关文章
- 交叉验证 Cross validation
来源:CSDN: boat_lee 简单交叉验证 hold-out cross validation 从全部训练数据S中随机选择s个样例作为训练集training set,剩余的作为测试集testin ...
- 用KNN算法分类CIFAR-10图片数据
KNN分类CIFAR-10,并且做Cross Validation,CIDAR-10数据库数据如下: knn.py : 主要的试验流程 from cs231n.data_utils import lo ...
- 交叉验证(cross validation)
转自:http://www.vanjor.org/blog/2010/10/cross-validation/ 交叉验证(Cross-Validation): 有时亦称循环估计, 是一种统计学上将数据 ...
- 10折交叉验证(10-fold Cross Validation)与留一法(Leave-One-Out)、分层采样(Stratification)
10折交叉验证 我们构建一个分类器,输入为运动员的身高.体重,输出为其从事的体育项目-体操.田径或篮球. 一旦构建了分类器,我们就可能有兴趣回答类似下述的问题: . 该分类器的精确率怎么样? . 该分 ...
- Cross Validation(交叉验证)
交叉验证(Cross Validation)方法思想 Cross Validation一下简称CV.CV是用来验证分类器性能的一种统计方法. 思想:将原始数据(dataset)进行分组,一部分作为训练 ...
- 交叉验证(Cross Validation)简介
参考 交叉验证 交叉验证 (Cross Validation)刘建平 一.训练集 vs. 测试集 在模式识别(pattern recognition)与机器学习(machine lea ...
- 几种交叉验证(cross validation)方式的比较
模型评价的目的:通过模型评价,我们知道当前训练模型的好坏,泛化能力如何?从而知道是否可以应用在解决问题上,如果不行,那又是哪里出了问题? train_test_split 在分类问题中,我们通常通过对 ...
- cross validation
k-folder cross-validation:k个子集,每个子集均做一次测试集,其余的作为训练集.交叉验证重复k次,每次选择一个子集作为测试集,并将k次的平均交叉验证识别正确率作为结果.优点:所 ...
- 交叉验证(Cross Validation)方法思想简介
以下简称交叉验证(Cross Validation)为CV.CV是用来验证分类器的性能一种统计分析方法,基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train ...
- 验证和交叉验证(Validation & Cross Validation)
之前在<训练集,验证集,测试集(以及为什么要使用验证集?)(Training Set, Validation Set, Test Set)>一文中已经提过对模型进行验证(评估)的几种方式. ...
随机推荐
- 如何修改 Ubuntu 的字符集?
步骤: 1.编辑 local 文件 输入: vi /var/lib/locales/supported.d/local 将 zh_CN.GB2312 加入到后面,保存. 2.执行:locale-gen ...
- jQuery属性操作(二)
挂载到$上的几个属性操作方法分析,发现属性操作用到了sizzle封装的方法 attr: function( elem, name, value ) { var hooks, ret, ...
- CF 445A DZY Loves Chessboard
A. DZY Loves Chessboard time limit per test 1 second memory limit per test 256 megabytes input stand ...
- 被C语言操作符优先级坑了
今天有一个枚举的题目的代码是这样的: 重点在于maxXor这个函数的实现,枚举两个数字,其中maxr保存了最大值的 i 异或 j , 可是这个程序执行结果大大出乎意外-_-. 然后就把 i 异或 j ...
- golang学习资料[Basic]
http://devs.cloudimmunity.com/gotchas-and-common-mistakes-in-go-golang/index.html 基础语法 <Go By Exa ...
- 【CF884D】Boxes And Balls 哈夫曼树
[CF884D]Boxes And Balls 题意:有n个箱子和若干个球,球的颜色也是1-n,有ai个球颜色为i,一开始所有的球都在1号箱子里,你每次可以进行如下操作: 选择1个箱子,将里面所有的球 ...
- git如何回滚当前修改的内容?
git如何回滚当前修改的内容? 1.打开git gui,在工具栏上点击 commit ,选择 Revert Changes, 这里可以回滚单个文件: 2.一键回滚所有修改: 打开git gui,在工 ...
- css如何设置div中的内容垂直居中?
<style>.out { position: relative;//相对div的定位 top: 30%;//相对div的border-top的距离,根据元素的高度,50%则为垂直居中:} ...
- Xcode - LLDB调试技巧
LLDB是Xcode默认的调试器,它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能.平时用Xcode运行程序,实际走的都是LLDB.熟练使用LLDB,可以让你debug事半功倍. ...
- Apache服务器301重定向去掉.html和.php
在做优化网站的时候,会考虑到网站整站的集权: 考虑到网站可以生成静态,首先,让网站优先访问 index.html 之后考虑:去掉 .html 和 .php. 利用 .htaccess <IfMo ...