我使用UCI ML乳腺癌数据集来构建基于SVM的分类器。我使用的是LIBSVM及其fselect.py脚本来计算特征选择的F分数。我的数据集有8个特征,它们的分数如下:
5: 1.7657162: 1.4131801: 1.3200966: 1.1034498: 0.7907123: 0.7342307: 0.6985714: 0.580819
这意味着第5个特征是最具区分性的,而第4个特征是最不具区分性的。我接下来的代码大致如下:
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,因为它太小了)。
回答:
你得到的错误率是可以预期的。添加额外的特征应该会降低错误率,因为你有了更多的信息。
举个例子,假设你要确定一辆车的型号。最具区分性的特征可能是制造商,但添加诸如发动机尺寸、高度、宽度、长度、重量等特征会进一步缩小范围。
如果你考虑了很多特征,其中一些可能具有非常低的区分能力,你可能会遇到过拟合训练数据的问题。在这里你只有8个特征,但看起来添加第8个特征已经没有效果了。(在汽车的例子中,这可能包括诸如车辆的脏污程度、轮胎剩余胎面深度、收音机调到的频道等特征)。