2013-09-19 8 views
1

Я пытаюсь использовать онлайн (out-of-core) алгоритм обучения для задачи MNIST с помощью SGDClassifier Но мне кажется, что точность не всегда возрастает.MNIST и SGDClassifier classifer

Что я должен делать в этом случае? Сохранить как-то classifer с лучшими ? точность ли SGDClassifier сходящегося к некоторому оптимальному решению

Вот мой код:

import numpy as np 
from sklearn.linear_model.stochastic_gradient import SGDClassifier 
from sklearn.datasets import fetch_mldata 
from sklearn.utils import shuffle 

#use all digits 
mnist = fetch_mldata("MNIST original") 
X_train, y_train = mnist.data[:70000]/255., mnist.target[:70000] 

X_train, y_train = shuffle(X_train, y_train) 
X_test, y_test = X_train[60000:70000], y_train[60000:70000] 

step =1000 
batches= np.arange(0,60000,step) 
all_classes = np.array([0,1,2,3,4,5,6,7,8,9]) 
classifier = SGDClassifier() 
for curr in batches: 
X_curr, y_curr = X_train[curr:curr+step], y_train[curr:curr+step] 
classifier.partial_fit(X_curr, y_curr, classes=all_classes) 
score= classifier.score(X_test, y_test) 
print score 

print "all done" 

Я тестировал linearSVM против СГДА на MNIST нас используя 10k образцов для поезда и 10k для теста и получите 0,833 13,95 и 0,85 1,32, поэтому SGD быстрее, но менее точен.

#test linearSVM vs SGD 
t0 = time.time() 
clf = LinearSVC() 
clf.fit(X_train, y_train) 
score= clf.score(X_test, y_test) 
print score 
print (time.time()-t0) 

t1 = time.time() 
clf = SGDClassifier() 
clf.fit(X_train, y_train) 
score= clf.score(X_test, y_test) 
print score 
print (time.time()-t1) 

также я нашел некоторую информацию здесь https://stats.stackexchange.com/a/14936/16843

UPDATE: более за один проход (10 проходов) через данные achived лучшую точность 90,8% .so это может быть решением. И еще одна особенность SGD заключается в том, что данные должны быть перетасованы перед передачей в классификатор.

+0

Не могли бы вы отредактировать свой вопрос, чтобы добавить результат своего сценария, чтобы люди, у которых нет установленного скинара, все еще могут решить вопрос? Что вы наблюдаете и что вы ожидали бы вместо этого? – ogrisel

+0

Вывод результата примерно 0,52 0,6 0,75 0,74 0,84 0,80 0,82 при его повышении, но затем он колеблется около 0,8 + -значения_сочетания, и я ожидаю, что он будет всегда увеличиваться до некоторого значения max_score и затем останавливается. – mrgloom

+0

Вы можете найти уже расшифрованную версию набора данных MNIST здесь: http://mnist-decoded.000webhostapp.com/ – SomethingSomething

ответ

3

Первое замечание: вы используете SGDClassifier с параметрами по умолчанию: они, вероятно, не являются оптимальными значениями для этого набора данных: попробуйте другие значения (особенно для альфа, параметр регуляризации).

Теперь, чтобы ответить на ваш вопрос, маловероятно, что линейная модель будет очень хорошо работать с таким набором данных, как MNIST, который представляет собой задачу классификации цифровых изображений. Вы можете попробовать линейные модели, такие как:

  • SVC(kernel='rbf') (но не масштабируется, попробуйте на небольшом подмножестве обучающего множества), а не инкрементный/вне ядра
  • ExtraTreesClassifier(n_estimator=100) или более, но не из - ядро. Чем больше количество подзадач, тем дольше он будет тренироваться.

Вы также можете попробовать Nystroem approximation из SVC(kernel='rbf') путем преобразования набора данных с помощью Nystroem(n_components=1000, gamma=0.05), установленного на небольшом подмножестве данных (например, 10000 образцов), а затем, проходящих весь трансформируются обучение набор для линейной модели, такой как SGDClassifier: он требует 2 прохода над набором данных.

Существует также pull request for 1 hidden layer perceptron на GitHub, что должно быть и быстрее вычислить, чем ExtraTreesClassifier и подход 98% точности испытания установленного на MNIST (а также обеспечить partial_fit API для вне-ядра обучения).

Edit: флуктуация оценки SGDClassifier балла ожидаются: SGD означает стохастический градиентный спуск, что означает, что примеры рассматривается один за один раз: плохо классифицируемые образцы могут вызвать обновление весов модель, которая вредна для других образцов, вам нужно сделать более одного прохода над данными, чтобы уменьшить скорость обучения, чтобы получить более плавную оценку точности проверки. Вы можете использовать itertools.repeat в своем цикле for, чтобы выполнить несколько проходов (например, 10) по вашему набору данных.

+0

Спасибо за ответ, но мне нужен онлайновый (внекорневой) алгоритм, я просто пытаюсь его использовать MNIST. Совместим ли SGDClassifier с некоторым оптимальным решением? – mrgloom

+0

Да, но только тогда, когда у вас достаточно образцов, и ваша задача линейно разделяется. – ogrisel

+0

Используется ли partial_fit только для больших данных? (Когда мы не можем поместить все образцы в память). \t Может ли быть такая ситуация, когда у нас есть почти неограниченные данные, но когда мы подаем данные с помощью partial_fit, мы получаем некоторую точность (например, 80%), но мы не знаем, когда остановиться из-за флуктуаций classifer (всегда ли это лучше обрабатывать все доступные данные?) Итак, что является преимуществом по сравнению с другими линейными классификаторами (это быстрее или точнее)? (может быть, для больших данных мы можем обучать N линейных классификаторов на небольших партиях данных и линейной регрессии поверх этого?) – mrgloom

Смежные вопросы