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
原文地址:https://www.cnblogs.com/codeDog123/p/6715636.html