SGDClassifierを使用して MNIST 問題にオンライン (アウト オブ コア)学習アルゴリズムを使用しようとし ていますが、必ずしも精度が向上するとは限りません。
この場合、どうすればよいですか?どういうわけか最高の精度で分類器を保存しますか? 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"
トレーニングに 10k サンプル、テストに 10k サンプルを使用して MNIST で linearSVM と SGD をテストしたところ、0.883 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
更新: データを 1 回 (10 回) 通過させると、最高の精度 90.8 % が得られました。これが解決策になる可能性があります。また、分類子に渡す前にデータをシャッフルする必要があるという SGD のもう 1 つの特異性。