• java-ml(二)


    SVM分类Iris.csv数据集

    首先说明几个概念:

    True Positive (TP): “真正” 指被model预测为正的正样本,即判断为真的正确率

    True Negative(TN): “真负” 指被model预测为负的负样本,即判断为假的正确率

    False Positive(FP): “假正” 指被模型预测为正的负样本,即误报率

    False Negative(FN): “假负” 指被模型预测为负的正样本,即漏报率

    精准度(precision): P = TP/(TP+FP) 指被分类器判定正例中的正样本的比重

    召回率(Recall): R=TP/(TP+FN) = 1- FN/T 指的是被预测为正例的占总的正例的比重

    准确率(Accuracy): A = TP/(TP+FN)=(TP+TN)/(TP+FN+FP+TN) 分类器的准确度,能将正的判定为正,负的判定为负。

    以下为SVM的训练和预测:

    public static void main(String[]args) throws IOException{
             Dataset data=FileHandler.loadDataset(new File("D:/test/Iris.csv"),4,",");
             Sampling s=Sampling.SubSampling;
             Classifier c=new LibSVM();  //创建svm分类器
             for(int i=0;i<5;i++){
                 Pair<Dataset, Dataset> datas=s.sample(data, (int)(data.size()*0.8),i);  //根据初始数据集分成训练集和测试集         
                 c.buildClassifier(datas.x()); //训练分类器
                 Map pms=EvaluateDataset.testDataset(c, datas.y());  //测试分类器的性能
                 System.out.println(pms);
             }
             //预测
             double[] values = new double[] { 5.1,3.5,1.4,0.2 };
             Instance instance=new DenseInstance(values);//设置一个样本
             System.out.println(c.classify(instance));//输出该样本的分类结果

    }

    输出为:

    {Iris-versicolor=[TP=11.0, FP=0.0, TN=18.0, FN=1.0], Iris-virginica=[TP=9.0, FP=1.0, TN=20.0, FN=0.0], Iris-setosa=[TP=9.0, FP=0.0, TN=21.0, FN=0.0]}

    {Iris-versicolor=[TP=10.0, FP=0.0, TN=19.0, FN=1.0], Iris-virginica=[TP=10.0, FP=1.0, TN=19.0, FN=0.0], Iris-setosa=[TP=9.0, FP=0.0, TN=21.0, FN=0.0]}

    {Iris-versicolor=[TP=8.0, FP=0.0, TN=21.0, FN=1.0], Iris-virginica=[TP=10.0, FP=1.0, TN=19.0, FN=0.0], Iris-setosa=[TP=11.0, FP=0.0, TN=19.0, FN=0.0]}

    {Iris-versicolor=[TP=9.0, FP=0.0, TN=21.0, FN=0.0], Iris-virginica=[TP=9.0, FP=0.0, TN=21.0, FN=0.0], Iris-setosa=[TP=12.0, FP=0.0, TN=18.0, FN=0.0]}

    {Iris-versicolor=[TP=10.0, FP=0.0, TN=20.0, FN=0.0], Iris-virginica=[TP=6.0, FP=0.0, TN=24.0, FN=0.0], Iris-setosa=[TP=14.0, FP=0.0, TN=16.0, FN=0.0]}

    Iris-setosa

    可以看到五次训练结果的准确度分别为:

    第一次:(11+18)/(11+18+1)=0.9666666666666667

    第二次:(10+19)/(10+19+1)=0.9666666666666667

    第三次:(8+21)/(8+21+1)=0.9666666666666667

    第四次:(9+21)/(9+21)=1

    第五次:(10+20)/(10+20)=1

    准确度都比较高

    最后对于向量{5.1,3.5,1.4,0.2}给出的种类预测为Iris-setosa类。

    补充:Classifier的方法有三个:

    void buildClassifier(Dataset data)
    Create a classifier from the given data set.
    java.util.Map<java.lang.Object,java.lang.Double> classDistribution(Instance instance)
    Generate the membership distribution for this instance using this classifier.
    java.lang.Object classify(Instance instance)
    Classify the instance according to this classifier.

     注意:classDistribution是返回一个向量,例如

             double[] values = new double[] { 5.1,3.5,1.4,0.2 };
             Instance instance=new DenseInstance(values);//设置一个样本
             System.out.println(c.classDistribution(instance));//输出该样本的分类结果

    输出的是:{Iris-versicolor=0.0, Iris-virginica=0.0, Iris-setosa=1.0},表名Iris-setosa是分类结果。

    具体的说明如下

    • classDistribution

      java.util.Map<java.lang.Object,java.lang.Double> classDistribution(Instance instance)
      Generate the membership distribution for this instance using this classifier. All values should be in the interval [0,1] Note: The returned map may not contain a value for all classes that were present in the data set used for training. If the map does not contain a value, the value for that class equals zero.
      Parameters:
      instance - the instance to be classified
      Returns:
      an array with membership degrees for all the various classes in the data set
  • 相关阅读:
    OI竞赛常见错误总结
    lis最长上升子序列o(nlogn)优化
    链表及其简单应用
    栈及其简单应用
    哈希表Hash:概念与基本操作
    队列及其简单应用
    poj1418 Viva Confetti 判断圆是否可见
    poj1981 Circle and Points 单位圆覆盖问题
    poj2187 Beauty Contest(旋转卡壳)
    poj2932 Coneology (扫描线)
  • 原文地址:https://www.cnblogs.com/codeDog123/p/6715636.html
Copyright © 2020-2023  润新知