我正在研究一个具有许多功能的小型数据集,其中大多数只是垃圾。目标是在这个二元分类任务上具有良好的分类精度。
因此,我编写了一个小示例代码来说明问题。该代码简单地创建了一个二进制数据集,其中包含许多随机特征和一个用于类标签 1 的有用特征。然后我通过线性 SVM 执行简单的模型选择。问题是分类精度很差,甚至是随机的。(我也尝试了一个 StratifiedKFold 结果相同)
那么,为什么 SVM 很难找到好的模式呢?这也可能是样本数量减少的问题,但我无法增加数据集。
PS我想在没有特征选择的情况下解决问题(如果存在解决方案)
import numpy as np
from sklearn.utils import shuffle
from sklearn import preprocessing
from sklearn.svm import SVC
from sklearn.grid_search import GridSearchCV
from sklearn.cross_validation import StratifiedShuffleSplit
# dataset
N = 10
X1 = np.random.rand(N,500)
X2 = np.random.rand(N,500)
X2[:,100] = 1
data = np.concatenate((X1,X2), axis=0)
labels = np.concatenate((np.zeros(N),np.ones(N)))
# shuffle and normalization
data, labels = shuffle(data, labels)
scaler = preprocessing.StandardScaler().fit(data)
data_n = scaler.transform(data)
# CV
sss = StratifiedShuffleSplit(labels, n_iter=100, test_size=0.4, random_state=0)
clf = GridSearchCV(SVC(kernel='linear'), {'C': np.logspace(-4,2,100)}, cv=sss)
clf.fit(data_n, labels)
for params, mean_score, scores in clf.grid_scores_:
print("%0.3f (+/-%0.03f) for %r" % (mean_score, scores.std() * 2, params))
谢谢。