SVM分类中的特征选择 - 奇怪的行为

时间:2016-08-15 16:47:16

标签: machine-learning classification svm feature-selection

我正在使用UCI ML乳腺癌数据集来使用SVM构建分类器。我正在使用LIBSVM及其fselect.py脚本来计算特征选择的f分数。我的数据集有8个功能,其分数如下:

5:  1.765716
2:  1.413180
1:  1.320096
6:  1.103449
8:  0.790712
3:  0.734230
7:  0.698571
4:  0.580819

这意味着第五个特征是最具辨别力的,第四个特征是最少的。我的下一段代码看起来像这样:

x1=x(:,5);
x2=x(:,[5,2]);      
x3=x(:,[5,2,6]);    
x4=x(:,[5,2,6,8]);
x5=x(:,[5,2,6,8,3]);
x6=x(:,[5,2,6,8,3,7]);
x7=x(:,[5,2,6,8,3,7,4]);


errors2=zeros(7,1);

errors2(1)=svmtrain(y,x1,'-s 0 -t 2 -c 0.062500 -g 0.0039062 -v 10');
errors2(2)=svmtrain(y,x2,'-s 0 -t 2 -c 0.062500 -g 0.0039062 -v 10');
errors2(3)=svmtrain(y,x3,'-s 0 -t 2 -c 0.062500 -g 0.0039062 -v 10');
errors2(4)=svmtrain(y,x4,'-s 0 -t 2 -c 0.062500 -g 0.0039062 -v 10');
errors2(5)=svmtrain(y,x5,'-s 0 -t 2 -c 0.062500 -g 0.0039062 -v 10');
errors2(6)=svmtrain(y,x6,'-s 0 -t 2 -c 0.062500 -g 0.0039062 -v 10');
errors2(7)=svmtrain(y,x7,'-s 0 -t 2 -c 0.062500 -g 0.0039062 -v 10');

注意:使用网格搜索计算gamma和C,x是具有8列的完整矩阵(对应于8个特征)

当我打印errors2矩阵时,我得到以下输出:

errors2 =

   88.416
   92.229
   93.109
   94.135
   94.282
   94.575
   94.575

这意味着当我使用所有功能时,我获得最高的准确度,并且当我使用最具辨别力的功能时,我获得最低的准确度。据我所知,当我使用包含最具鉴别力的特征的子集时,我应该得到最准确的。为什么程序会以这种方式运行呢?有人可以指出我可能犯的任何错误吗? (我的直觉说我已经计算出C错了,因为它太小了。)

1 个答案:

答案 0 :(得分:1)

您获得的错误率与预期的一样。添加额外功能可以降低错误率,因为您有更多信息。

作为一个例子,考虑尝试找出汽车的型号。最具辨别力的特征可能是制造商,但增加引擎尺寸,高度,宽度,长度,重量等功能将进一步缩小范围。

如果您正在考虑许多功能,其中一些可能具有非常低的判别力,您可能会遇到过度拟合训练数据的问题。这里你只有8个功能,但它已经看起来像添加第8个功能没有任何效果。 (在汽车示例中,这可能是一些功能,例如汽车有多脏,轮胎上留下的胎面数量,收音机调到的通道等)。