1

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 つの特異性。

4

1 に答える 1

3

最初SGDClassifierの注意: デフォルトのパラメータを使用しています: それらはこのデータセットに最適な値ではない可能性があります: 他の値も試してください (特にアルファ、正則化パラメータ)。

あなたの質問に答えるために、数値画像分類タスクである MNIST のようなデータセットで線形モデルが非常にうまく機能する可能性はほとんどありません。次のような線形モデルを試すことができます。

  • SVC(kernel='rbf')(ただし、スケーラブルではありません。トレーニング セットの小さなサブセットを試してください)、インクリメンタル / アウトオブコアではありません
  • ExtraTreesClassifier(n_estimator=100)以上ですが、アウトオブコアでもありません。サブエスティメータの数が多いほど、トレーニングに時間がかかります。

また、データの小さなサブセット (例: 10000 サンプル) でフィッティングを使用してデータセットを変換し、変換されたトレーニング セット全体を次のような線形モデルに渡すことで、 Nystroem 近似を試すこともできます。データセットに対して 2 回のパスが必要です。SVC(kernel='rbf')Nystroem(n_components=1000, gamma=0.05)SGDClassifier

また、github には1 つの隠れ層パーセプトロンのプル リクエストExtraTreesClassifierがあり、MNIST よりも高速に計算でき、MNIST で 98% のテスト セット精度に近づく必要があります (コア外学習用の partial_fit API も提供します)。

編集: スコアの推定値の変動SGDClassifierが予想されます: SGD は確率的勾配降下法を表します。つまり、例は一度に 1 つずつ考慮されます: 分類が不適切なサンプルは、モデルの重みを有害な方法で更新する可能性があります他のサンプルの場合、データに対して複数回のパスを実行して、検証精度のよりスムーズな推定値を得るのに十分なほど学習率を下げる必要があります。for ループでitertools.repeatを使用して、データセットに対して複数のパス (たとえば 10) を実行できます。

于 2013-09-19T14:15:45.307 に答える