2

我正在研究支持向量机,在 Python 中使用 sci-kit learn。

我已经训练了模型,使用 GridSearch 和交叉验证来找到最佳参数,并在 15% 的保留集上评估了最佳模型。

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

因为 SVM 的误差为零,而且后来它无法正确预测,所以我错误地构建了这个 SVM。

我的问题是这样的:

我是否正确地怀疑我以某种方式错误地使用了交叉验证和 GridSearch?还是我给了 GridSearch 参数有些荒谬,并且给了我错误的结果?

感谢您花时间和精力阅读本文。


第 1 步:使用 train_test_split 函数将数据集拆分为 85%/15%

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

第 2 步:将 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]]
4

1 回答 1

3

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

编辑:还看一下它无法预测的新样本:特征值是否在同一范围内(例如 [0, 255] 而不是 [0, 1] 或 [-1, 1] 用于训练的数字和测试集)?例如,当您使用 matplotlib 绘制新数字时,新数字“看起来”是否像测试集中的其他数字?

于 2014-01-28T07:45:29.383 回答