Sklearn SV C с набором данных MNIST: Неправильно неправильно с di git 5? - PullRequest
0 голосов
/ 28 марта 2020

Я установил очень простой SV C для классификации цифр MNIST. По какой-то причине классификатор довольно последовательно неверно предсказывает ди git 5, но при пробе всех других чисел он не пропускает ни одного. Кто-нибудь имеет какие-либо идеи, если я могу установить это неправильно, или это просто очень плохо, предсказывая число 5?

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn.svm import SVC
from sklearn.metrics import confusion_matrix

data = datasets.load_digits()
images = data.images
targets = data.target

# Split into train and test sets
images_train, images_test, imlabels_train, imlabels_test = train_test_split(images, targets, test_size=.2, shuffle=False)


# Re-shape data so that it's 2D
images_train = np.reshape(images_train, (np.shape(images_train)[0], 64))
images_test = np.reshape(images_test, (np.shape(images_test)[0], 64))


svm_classifier = SVC(gamma='auto').fit(images_train, imlabels_train)

number_correct_svc = 0
preds = []

for label_index in range(len(imlabels_test)):

    pred = svm_classifier.predict(images_test[label_index].reshape(1,-1))
    if pred[0] == imlabels_test[label_index]:
        number_correct_svc += 1

    preds.append(pred[0])

print("Support Vector Classifier...")
print(f"\tPercent correct for all test data: {100*number_correct_svc/len(imlabels_test)}%")

confusion_matrix(preds,imlabels_test)

Вот результирующая матрица путаницы:

array([[22,  0,  0,  0,  0,  0,  0,  0,  0,  0],
       [ 0, 15,  0,  0,  0,  0,  0,  0,  0,  0],
       [ 0,  0, 15,  0,  0,  0,  0,  0,  0,  0],
       [ 0,  0,  0, 21,  0,  0,  0,  0,  0,  0],
       [ 0,  0,  0,  0, 21,  0,  0,  0,  0,  0],
       [13, 21, 20, 16, 16, 37, 23, 20, 31, 16],
       [ 0,  0,  0,  0,  0,  0, 14,  0,  0,  0],
       [ 0,  0,  0,  0,  0,  0,  0, 16,  0,  0],
       [ 0,  0,  0,  0,  0,  0,  0,  0,  2,  0],
       [ 0,  0,  0,  0,  0,  0,  0,  0,  0, 21]], dtype=int64)

Я читал страницу sklearn для SV C, но не могу сказать, что я делаю неправильно

Обновление:

Я пытался использовать SCV (gamma = 'scale') и это кажется гораздо более разумным. Было бы неплохо узнать, почему «авто» не работает? со шкалой:

array([[34,  0,  0,  0,  0,  0,  0,  0,  0,  0],
       [ 0, 36,  0,  0,  0,  0,  0,  0,  1,  0],
       [ 0,  0, 35,  0,  0,  0,  0,  0,  0,  0],
       [ 0,  0,  0, 27,  0,  0,  0,  0,  0,  1],
       [ 1,  0,  0,  0, 34,  0,  0,  0,  0,  0],
       [ 0,  0,  0,  2,  0, 37,  0,  0,  0,  1],
       [ 0,  0,  0,  0,  0,  0, 37,  0,  0,  0],
       [ 0,  0,  0,  2,  0,  0,  0, 35,  0,  1],
       [ 0,  0,  0,  6,  1,  0,  0,  1, 31,  1],
       [ 0,  0,  0,  0,  2,  0,  0,  0,  1, 33]], dtype=int64)

1 Ответ

0 голосов
/ 29 марта 2020

Со вторым вопросом гораздо проще разобраться. Дело в том, что в ядре RBF гамма обозначает, насколько волнистой будет граница принятия решения. Что мы подразумеваем под "волнистыми"? Чем выше значение гаммы, тем точнее будет граница принятия решения. Граница принятия решения СВМ.

если передано gamma='scale' (по умолчанию), то в качестве значения гаммы используется 1 / (n_features *X.var()),

, если 'auto', используется 1 / n_features.

Во втором случае гамма выше. Для MNIST стандартное отклонение составляет менее 1. В результате вторая граница принятия решения является гораздо более точной, давая лучший результат, чем в предыдущем случае.

...