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