美文网首页
机器学习第二次作业实验报告

机器学习第二次作业实验报告

作者: MatrixFK | 来源:发表于2017-03-20 14:30 被阅读251次

    <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文档后,也是只需要同样处理即可。
    Paste_Image.png

    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摄氏度','空气干燥'

    相关文章

      网友评论

          本文标题:机器学习第二次作业实验报告

          本文链接:https://www.haomeiwen.com/subject/mwmbnttx.html