質問

ロジスティック回帰をトレーニングする方法は、Scikit-Learnがインターフェイスを提供する確率的勾配降下を使用することです。

私がやりたいのは、scikit-learn'sを取ることです sgdclassifier ロジスティック回帰と同じスコアを付けてもらいます ここ. 。ただし、スコアは同等ではないため、いくつかの機械学習の強化が欠けている必要があります。

これが私の現在のコードです。 SGDClassifierには、ロジスティック回帰と同じ結果が得られるものは何ですか?

from sklearn import datasets
from sklearn.linear_model import LogisticRegression
from sklearn.linear_model import SGDClassifier
import numpy as np
import pandas as pd
from sklearn.cross_validation import KFold
from sklearn.metrics import accuracy_score

# Note that the iris dataset is available in sklearn by default.
# This data is also conveniently preprocessed.
iris = datasets.load_iris()
X = iris["data"]
Y = iris["target"]

numFolds = 10
kf = KFold(len(X), numFolds, shuffle=True)

# These are "Class objects". For each Class, find the AUC through
# 10 fold cross validation.
Models = [LogisticRegression, SGDClassifier]
params = [{}, {"loss": "log", "penalty": "l2"}]
for param, Model in zip(params, Models):
    total = 0
    for train_indices, test_indices in kf:

        train_X = X[train_indices, :]; train_Y = Y[train_indices]
        test_X = X[test_indices, :]; test_Y = Y[test_indices]

        reg = Model(**param)
        reg.fit(train_X, train_Y)
        predictions = reg.predict(test_X)
        total += accuracy_score(test_Y, predictions)
    accuracy = total / numFolds
    print "Accuracy score of {0}: {1}".format(Model.__name__, accuracy)

私の出力:

Accuracy score of LogisticRegression: 0.946666666667
Accuracy score of SGDClassifier: 0.76
役に立ちましたか?

解決

反復数に関するコメントはスポットです。デフォルト SGDClassifier n_iter5 あなたがすることを意味します 5 * num_rows 重量スペースのステップ。 sklearnの経験則 典型的なデータの場合は約100万ステップです。例では、1000に設定するだけで、最初に許容度に達する可能性があります。あなたの精度は低くなります SGDClassifier 寛容の前に反復制限に達しているので、あなたは「早期停止」しています

あなたのコードをすばやく変更して、私は得る:

# Added n_iter here
params = [{}, {"loss": "log", "penalty": "l2", 'n_iter':1000}]

for param, Model in zip(params, Models):
    total = 0
    for train_indices, test_indices in kf:
        train_X = X[train_indices, :]; train_Y = Y[train_indices]
        test_X = X[test_indices, :]; test_Y = Y[test_indices]
        reg = Model(**param)
        reg.fit(train_X, train_Y)
        predictions = reg.predict(test_X)
        total += accuracy_score(test_Y, predictions)

    accuracy = total / numFolds
    print "Accuracy score of {0}: {1}".format(Model.__name__, accuracy)

Accuracy score of LogisticRegression: 0.96
Accuracy score of SGDClassifier: 0.96

他のヒント

SGDClassifierは、名前が示すように、その最適化アルゴリズムとして確率的勾配降下を使用します。

Sklearnでのロジスタクレクトの実装を見ると、5つの最適化手法(ソルバー)が提供され、デフォルトでは、座標降下(CD)を使用して収束するのは「Liblinear」です。

数の反復、最適化、正規化の種類(ペナルティ)、およびその大きさ(c)以外にも、アルゴリズムのパフォーマンスにも影響します。

IRISデータセットチューニングで実行している場合、これらすべてのハイパーパラメーターは大きな変更をもたらさない可能性がありますが、複雑なデータセットでは意味のある役割が果たしています。

詳細については、を参照できます Sklearnロジスティック回帰ドキュメント.

また、SGDClassifierの「アルファ」ハイパーパラメーターをグリッド検索する必要があります。 Sklearnドキュメントで明示的に言及されており、私の経験からは、精度に大きな影響を与えます。見る必要がある2番目のハイパーパラメーターは「n_iter」です - しかし、私は自分のデータでより小さな効果が見られました。

tl; dr: :グリッドを指定できます アルファn_iter(また max_iter)そして使用します parfit SGDClassifierでの超最適化用

私の同僚のVinay Patlollaは、素晴らしいブログ投稿を書きました PARFITを使用したSGD分類器を実行する方法とロジスティック回帰を実行する方法.

parfit 彼が使用したハイパーパラメーター最適化パッケージであり、SGDClassifierを最適化するのに役立つパラメーターの適切な組み合わせを見つけ、実行する時間をはるかに短い時間で実行するためのロジスティック回帰です。

要約すると、SGDClassifierの2つの重要なパラメーターは アルファn_iter. 。 Vinayを直接引用するには:

sklearnのn_iterはデフォルトではありません。ここでは、十分に大量(1000)に設定しています。最近追加されたN_ITERの代替パラメーターはMAX_ITERです。同じアドバイスがmax_iterに適用される必要があります。

アルファハイパーパラメーターは、二重の目的を果たします。これは、正規化パラメーターであり、デフォルトのスケジュールに基づく初期学習率の両方です。これは、ロジスティック回帰係数を正規化することに加えて、モデルの出力は、フィッティングルーチンが実行するアルファとエポック(n_iter)の数との相互作用に依存することを意味します。具体的には、アルファが非常に小さくなるため、ゆっくりした学習率を補うためにN_iterを増やす必要があります。これが、広範囲のアルファを検索するときに、N_iterを十分に大きく指定する方がより安全である(しかし遅くなっている)理由です。

ライセンス: CC-BY-SA帰属
所属していません datascience.stackexchange
scroll top