2015-11-12 3 views
1

Я пытаюсь предсказать набор данных MNIST (http://pjreddie.com/projects/mnist-in-csv/) с помощью SVM с использованием радиального ядра. Я хочу тренироваться с несколькими примерами (например, 1000) и прогнозировать гораздо больше. Проблема в том, что всякий раз, когда я предсказываю, предсказания постоянны , если только индексы тестового набора совпадают с показателями набора тренировок. То есть предположим, что я тренируюсь с примерами 1: 1000 из моих учебных примеров. Затем прогнозы правильны (т. Е. SVM делает все возможное) для 1: 1000 моего тестового набора, но затем я получаю тот же вывод для остальных. Если, однако, я тренируюсь с примерами 2001: 3000, тогда только те примеры тестов, соответствующие этим строкам в тестовом наборе, помечены правильно (т. Е. Не с той же константой). Я полностью в недоумении, и я думаю, что есть какая-то ошибка, потому что тот же самый код отлично работает с LinearSVC, хотя, очевидно, точность метода ниже.Scikit изучает неправильные прогнозы с помощью SVC

Во-первых, я тренируюсь с примерами 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!

ответ

4

Ядро по умолчанию - 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]]) 
Смежные вопросы