<h1 style="text-align:center">机器学习第二次实验作业</h1>
<div style="text-align:center">学号:1412653 姓名:杨立</div>
问题描述
一、Instances类
①读入bank.arff文件,并输出该数据集的样例数,属性数,类别数(注:最后一列为类别属性)
二、filters的相关类
以读入的bank数据集为基础,分别实现以下几个要求:
① 利用Filter类和Discretize类将所有numeric属性(即age和income)离散化,将属性按值平均离散为10段,并且输出离散化的前20个样例;
② 利用Filter类和Normalize类将所有numeric属性(即age和income)归一化,归一的区间为[-1,1],并且输出归一化的前20个样例;
③ 利用Filter类和Remove类删掉第2和第3个属性(即sex和region),并且输出删除第2和第3个属性的前20个样例;
三、classifier的相关类和Evaluation类
①分别采用NaiveBayes,SMO,J48,1NN分类器对bank数据集进行分类,在采用10折交叉验证的情况下,输出分类正确率,观察是否与Weka Explorer面板中调用这4种分类器得到的分类正确率相同(Weka Explorer中同样采用10折交叉验证);
②以U_segmentation_train数据集为训练集,以U_segmentation_test数据集为测试集,分别采用NaiveBayes,SMO,J48,1NN分类器,输出分类正确率,观察是否与Weka Explorer面板中调用这4种分类器得到的分类正确率相同(Weka Explorer中同样采用U_segmentation_test为测试集);
四、选做
①读sample.txt手动生成arff文件
②采用KNN分类器对bank数据集进行分类,验证方式为10折交叉验证,在K分别选1,5,10,30的情况下,输出分类正确率,对这4种输出结果进行比较和分析。
解决方案
1.Instances类
根据提供的api参考,我们只需要按照相同的步骤,获取到Instances类的实例,即可输出bank,arff的数据集的各方面属性。
代码如下:
//将文件转换为Instances类返回
private static Instances _readFile(String filename) throws Exception{
FileReader fd = new FileReader(filename);
return new Instances(fd);
}
//输出Instances类的基本信息
private static void _base(Instances f){
System.out.println("样本数目是:" + f.numInstances());
int numAttributes = f.numAttributes();
System.out.println("属性数目是:" + numAttributes );
System.out.println("类别数目是:" + f.numDistinctValues(numAttributes-1) );
}
2.filters的相关类
- 利用Filter类和Discretize类将所有numeric属性离散化.
在这里,由于Discretize类只能够离散numeric属性的数据,所以我们没有必要指定需要离散的列,调用设置桶的数据为10,输出结果即可。
private static void _discretize(Instances f) throws Exception{
Discretize filter = new Discretize();
filter.setBins(10);
filter.setInputFormat(f);
System.out.println("离散化后的前二十个数据是:");
_output(f,filter);
}
- 对与归一化,同理我们可以得到相同的处理函数
private static void _normalize(Instances f) throws Exception{
Normalize filter = new Normalize();
filter.setScale(1);
filter.setInputFormat(f);
System.out.println("归一化后的前二十个数据是:");
_output(f,filter);
}
- 对于删除类,查阅api文档后,也是只需要同样处理即可。
3.classifier的相关类和Evaluation类
- 分别采用NaiveBayes,SMO,J48,1NN分类器对bank数据集进行分类,在采用10折交叉验证的情况下,输出分类正确率,观察是否与Weka Explorer面板中调用这4种分类器得到的分类正确率相同(Weka Explorer中同样采用10折交叉验证);
为了尽量不重复累赘,我们只列出朴素贝叶斯的结果截图与Explore截图。对于朴素贝叶斯而言,我们只需要创建一个朴素贝叶斯的实例,接着再调用输出函数,输出正确率结果即可。
//朴素贝叶斯验证
private static void _n_bayes_test(Instances f) throws Exception{
System.out.println("朴素贝叶斯");
_output_test(new NaiveBayes(),f);
}
/**
* 输出分类器的验证结果
*
* @param cl 传入的分类器
* @param f 数据集
* @throws Exception
* */
private static void _output_test(Classifier cl,Instances f) throws Exception{
//cl.buildClassifier(f);
Evaluation eval = new Evaluation(f);
eval.crossValidateModel(cl, f, 10, new Random(1));
//eval.evaluateModel(cl, f);
System.out.println(eval.toClassDetailsString());
}
那么对比一下通过函数调用与Explore的结果(截图如下),可发现,结果一致,说明调用成功。
调用函数 Explore实验结果基本保持一致,所以后面就不再重复列出。
- 以U_segmentation_train数据集为训练集,以U_segmentation_test数据集为测试集,分别采用NaiveBayes,SMO,J48,1NN分类器,输出分类正确率,观察是否与Weka Explorer面板中调用这4种分类器得到的分类正确率相同(Weka Explorer中同样采用U_segmentation_test为测试集);
在这里,这个问题的解决方法实际上是与上一个问题的方法是类似的。所以我们只需要在函数上稍微修改,即可实现同样的功能。我们同样只举出朴素贝叶斯的例子,更加具体的方法可以参考附件代码。
结果一致,说明实验成功。
选做部分
(1)由txt生成arff
不限制语言,这里我采用脚本语言NodeJs来处理txt文件。
-
step1 将多余的中文删掉得到纯数据部分
2017.3.1:晴,微风,正午10摄氏度,空气潮湿。适合出行 2017.3.2: 多云,无风,正午6摄氏度,空气干燥。适合出行 2017.3.3:下雨,微风,正午8摄氏度,空气潮湿。不适合出行 2017.3.4: 晴,大风,正午12摄氏度,空气潮湿。适合出行 2017.3.5: 多云,大风,正午-3摄氏度,空气干燥。不适合出行
在不限制语言的使用情况,我们使用脚本语言Nodejs来处理。大致思路是:读入文件数据之后,先根据 '\n' 来将每一段分开,生成一个数组,每一个数组元素是一个句子。大致如下
$ node util.js
[ ' 2017.3.1:晴,微风,正午10摄氏度,空气潮湿。适合出行\r',
' 2017.3.2: 多云,无风,正午6摄氏度,空气干燥。适合出行\r',
' 2017.3.3:下雨,微风,正午8摄氏度,空气潮湿。不适合出行\r',
' 2017.3.4: 晴,大风,正午12摄氏度,空气潮湿。适合出行\r',
' 2017.3.5: 多云,大风,正午-3摄氏度,空气干燥。不适合出行\r',
'' ]
接着只需要根据 ":",",",“。”来区分具体的信息即可。最后经过处理之后,生成的文件内容如下
@relation whether
@attribute 'date' string
@attribute 'advice' string
@attribute 'whether' string
@attribute 'wind' string
@attribute 'temperature' string
@attribute 'humidity' string
@data
'2017.3.1','适合出行','晴','微风','正午10摄氏度','空气潮湿'
'2017.3.2','适合出行',' 多云','无风','正午6摄氏度','空气干燥'
'2017.3.3','不适合出行','下雨','微风','正午8摄氏度','空气潮湿'
'2017.3.4','适合出行',' 晴','大风','正午12摄氏度','空气潮湿'
'2017.3.5','不适合出行',' 多云','大风','正午-3摄氏度','空气干燥'
网友评论