SVM分类中的特征选择-怪异行为
Feature selection in SVM classification-Weird behaviour
我正在使用 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
这意味着第 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 个特征已经没有效果了。 (在汽车示例中,这可能是诸如汽车有多脏、轮胎上剩余胎面的数量、收音机调谐到的频道等特征)。
我正在使用 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
这意味着第 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 个特征已经没有效果了。 (在汽车示例中,这可能是诸如汽车有多脏、轮胎上剩余胎面的数量、收音机调谐到的频道等特征)。