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

我使用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个特征已经没有效果了。(在汽车的例子中,这可能包括诸如车辆的脏污程度、轮胎剩余胎面深度、收音机调到的频道等特征)。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注