Skip to main content
 首页 » 编程设计

python之Scikit 使用 SVC 学习错误预测

2025年05月04日29lvdongjie

我正在尝试通过使用径向核的 SVM 预测 MNIST ( http://pjreddie.com/projects/mnist-in-csv/) 数据集。我想用几个例子(例如 1000)进行训练并预测更多。问题是无论何时我预测,预测都是恒定的除非测试集的索引与训练集的索引一致。也就是说,假设我使用训练示例中 1:1000 的示例进行训练。然后,对于我的测试集的 1:1000,预测是正确的(即 SVM 尽力而为),但随后我得到了其余部分的相同输出。但是,如果我使用示例 2001:3000 进行训练,则只有与测试集中那些行对应的测试示例被正确标记(即不具有相同的常量)。我完全不知所措,我认为存在某种错误,因为完全相同的代码在 LinearSVC 上工作得很好,尽管显然该方法的准确性较低。

首先,我使用 501:1000 的训练数据进行训练:

# dat_train/test are pandas DFs corresponding to both MNIST datasets 
dat_train = pd.read_csv('data/mnist_train.csv', header=None) 
dat_test = pd.read_csv('data/mnist_train.csv', header=None) 
 
svm = SVC(C=10.0) 
idx = range(1000) 
#idx = np.random.choice(range(len(dat_train)), size=1000, replace=False) 
X_train = dat_train.iloc[idx,1:].reset_index(drop=True).as_matrix() 
y_train = dat_train.iloc[idx,0].reset_index(drop=True).as_matrix() 
X_test = dat_test.reset_index(drop=True).as_matrix()[:,1:] 
y_test = dat_test.reset_index(drop=True).as_matrix()[:,0] 
svm.fit(X=X_train[501:1000,:], y=y_train[501:1000]) 

在这里你可以看到大约一半的预测是错误的

y_pred = svm.predict(X_test[:1000,:]) 
confusion_matrix(y_test[:1000], y_pred) 

全错(即常量)

y_pred = svm.predict(X_test[:500,:]) 
confusion_matrix(y_test[:500], y_pred) 

这是我希望看到的所有测试数据

y_pred = svm.predict(X_test[501:1000,:]) 
confusion_matrix(y_test[501:1000], y_pred) 

您可以使用 LinearSVC 检查以上所有内容是否正确!

请您参考如下方法:

默认内核是 RBF,在这种情况下 gamma 很重要。如果不提供gamma,则默认为auto,即1/n_features。您最好运行网格搜索来找到最佳参数。这里我只是说明在适当的参数下结果是正常的。

In [120]: svm = SVC(C=1, gamma=0.0000001) 
 
In [121]: svm.fit(X=X_train[501:1000,:], y=y_train[501:1000]) 
Out[121]: 
SVC(C=1, cache_size=200, class_weight=None, coef0=0.0, 
  decision_function_shape=None, degree=3, gamma=1e-07, kernel='rbf', 
  max_iter=-1, probability=False, random_state=None, shrinking=True, 
  tol=0.001, verbose=False) 
 
In [122]: y_pred = svm.predict(X_test[:1000,:]) 
 
In [123]: confusion_matrix(y_test[:1000], y_pred) 
Out[123]: 
array([[ 71,   0,   2,   0,   2,   9,   1,   0,   0,   0], 
       [  0, 123,   0,   0,   0,   1,   1,   0,   1,   0], 
       [  2,   5,  91,   1,   1,   1,   3,   7,   5,   0], 
       [  0,   1,   4,  48,   0,  40,   1,   5,   7,   1], 
       [  0,   0,   0,   0,  88,   2,   3,   2,   0,  15], 
       [  1,   1,   1,   0,   2,  77,   0,   3,   1,   1], 
       [  3,   0,   3,   0,   5,   4,  72,   0,   0,   0], 
       [  0,   2,   3,   0,   3,   0,   1,  88,   1,   1], 
       [  2,   0,   1,   2,   3,   9,   1,   4,  63,   4], 
       [  0,   1,   0,   0,  16,   3,   0,  11,   1,  62]])