我正在使用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]]
您是否尝试过使用更多测试样本对其进行评估?如果您提到的测试样本不是来自训练和保留集合,我认为这是一个可能的结果,而不是您的代码的错误。保持设置上的零误差不能保证实际测试集上的零误差。另一方面,由于GridSearchCV已经看到了所有的X和Y,包括保留,所以保持设置错误可能是对测试错误的过度乐观估计。 –
我已经使用了cv = StratifiedKFold(y = y,n_folds = 3),这是85%的数据进行的3倍交叉验证......所以我相信用作测试集的15%的数据具有从来没有被网格搜索看到。 与此同时,用于预测(不起作用)的样本以前从未见过SVM并存在于不同的文件中。不幸的是我只有其中一个。 –
纠正我,如果我错了,X,Y,100%的数据和“X_train,y_train”85%的数据? –