我正在使用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错了,因为它太小了。)
答案 0 :(得分:1)
您获得的错误率与预期的一样。添加额外功能可以降低错误率,因为您有更多信息。
作为一个例子,考虑尝试找出汽车的型号。最具辨别力的特征可能是制造商,但增加引擎尺寸,高度,宽度,长度,重量等功能将进一步缩小范围。
如果您正在考虑许多功能,其中一些可能具有非常低的判别力,您可能会遇到过度拟合训练数据的问题。这里你只有8个功能,但它已经看起来像添加第8个功能没有任何效果。 (在汽车示例中,这可能是一些功能,例如汽车有多脏,轮胎上留下的胎面数量,收音机调到的通道等)。