2014-01-27 54 views
1

我正在使用Python中的sci-kit学习支持向量机。scikit-learn:SVM给我零错误,但无法预测

我已经训练了模型,使用了GridSearch和交叉验证来找到最佳参数,并且有 评估了15%坚持组的最佳模型。

在最后的混淆矩阵说我有0错误分类。
后来,模型给了我不正确的预测,当我给它一个手写数字(我没有包括这个代码,以保持这个问题恭敬地短)。

由于SVM具有零误差,并且后来无法正确预测,所以我错误地构建了此SVM。

我的问题是这样的:

我说得对不对怀疑我用交叉验证一起GridSearch不知何故不正确?或者,我是否给了某种可笑的GridSearch参数,并且给我提供了错误的结果?

感谢您为阅读这篇文章而付出的时间和精力。


步骤1:分割使用train_test_split函数

X_train, X_test, y_train, y_test = 
cross_validation.train_test_split(X, y, test_size=0.15, 
random_state=0) 

步骤2中的数据集分为85%/ 15%:应用GridSearchCV函数来设置调谐分类器的训练

C_range = 10.0 ** np.arange(-2, 9) 
gamma_range = 10.0 ** np.arange(-5, 4) 
param_grid = dict(gamma=gamma_range, C=C_range) 
cv = StratifiedKFold(y=y, n_folds=3) 

grid = GridSearchCV(SVC(), param_grid=param_grid, cv=cv) 
grid.fit(X, y) 

print("The best classifier is: ", grid.best_estimator_) 

输出是在这里:

('The best classifier is: ', SVC(C=10.0, cache_size=200, 
class_weight=None, coef0=0.0, degree=3, 
gamma=0.0001, kernel='rbf', max_iter=-1, probability=False, 
random_state=None, shrinking=True, tol=0.001, verbose=False)) 

步骤3:最后,评估对剩余的15% 保持退出设置调整分类。

clf = svm.SVC(C=10.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, 
    gamma=0.001, kernel='rbf', max_iter=-1, probability=False, 
    random_state=None, shrinking=True, tol=0.001, verbose=False) 

clf.fit(X_train, y_train) 

clf.score(X_test, y_test) 
y_pred = clf.predict(X_test) 

输出是在这里:

precision recall f1-score support 

     -1.0  1.00  1.00  1.00   6 
     1.0  1.00  1.00  1.00  30 

avg/total  1.00  1.00  1.00  36 

Confusion Matrix: 
[[ 6 0] 
[ 0 30]] 
+1

您是否尝试过使用更多测试样本对其进行评估?如果您提到的测试样本不是来自训练和保留集合,我认为这是一个可能的结果,而不是您的代码的错误。保持设置上的零误差不能保证实际测试集上的零误差。另一方面,由于GridSearchCV已经看到了所有的X和Y,包括保留,所以保持设置错误可能是对测试错误的过度乐观估计。 –

+0

我已经使用了cv = StratifiedKFold(y = y,n_folds = 3),这是85%的数据进行的3倍交叉验证......所以我相信用作测试集的15%的数据具有从来没有被网格搜索看到。 与此同时,用于预测(不起作用)的样本以前从未见过SVM并存在于不同的文件中。不幸的是我只有其中一个。 –

+0

纠正我,如果我错了,X,Y,100%的数据和“X_train,y_train”85%的数据? –

回答

3

您的测试集的数据太少(只有6个样品中的一个类)是在预测准确性充满信心您模型。我建议每个班级至少标注150个样本,并在持续测试中保留50个样本以计算评估指标。

编辑:也看看它未能预测的新样本:是否在相同范围内的特征值(例如[0,255]而不是[0,1]或[-1,1])来自训练和测试集的数字)?当你用matplotlib绘制它们时,新数字是否与你的测试集中的其他数字一样?

+0

感谢这两个简单,实用而有价值的见解! 我的原始数据集有235个观测值。由于这显然太少了,我可以使用K-fold Cross验证来解决它吗,或者您能否推荐一个很好的资源来描述如何以最佳方式解决这个限制?谢谢! –

+0

我接受了答案,并继续在这里的问题: http://stackoverflow.com/questions/21415934/using-sci-kit-learn-how-do-i-learn-a-svm-over-a-小数据集 –