Scikit-learn:SGDClassifierにロジスティック回帰だけでなく予測もさせる


24

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

私がやりたいのは、scikit-learnの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

3
質問と観察:繰り返し実行したSGDの精度はどれくらい安定していますか?2つのアルゴリズムは同等ではなく、同じデータが与えられても同じ精度を必ずしも生成するわけではありません。実際には、SGDのエポックまたは学習率を変更してみてください。それを超えて、SGDの機能を正規化してみることができます。
image_doctor

したがって、上記では10倍のクロス検証を使用しているため、繰り返し実行でSGDをテストしませんでした。私にとってはこれで十分です。
hlin117

これらのアルゴリズムがなぜ同等ではないのか、説明していただけますか?ここでSGDClassifierを見ると、「「ログ」の損失はロジスティック回帰を提供する、確率的分類器です。」機械学習の知識にはギャップがあると思います。
hlin117

実装の詳細な研究がなければ、なぜそれらが同等ではないのかを明確にすることはできないと思いますが、それらが同等ではないという良い手がかりは、各メソッドの結果が大きく異なることです。私の推測では、それぞれで使用される推定方法の収束特性に関係しているのではないでしょうか。
image_doctor

1
ロジスティック回帰では勾配降下が使用され、確率的勾配降下では確率的勾配降下が使用されるため、これらのアルゴリズムは異なります。前者の収束はより効率的で、より良い結果をもたらします。ただし、データセットのサイズが大きくなると、SGDCはロジスティック回帰の精度に近づくはずです。GDのパラメーターの意味はSGDのパラメーターとは異なるため、少し調整してみてください。少しスラッシングしている可能性があるため、SGDの学習率を(低下させて)少し遊んでみて、収束を改善することをお勧めします。
AN6U5

回答:


23

反復数に関するコメントはスポットオンです。デフォルトでは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

4

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

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

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

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

詳細については、Sklearn Logistic Regression Documentationを参照できます。


3

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


1

TL; DRalphan_iter(またはmax_iter)のグリッドを指定し、SGDClassifierのハイパー最適化にparfit を使用できます

同僚のVinay Patlollaは、parfitを使用してロジスティック回帰と同様にSGD Classifierを実行する方法に関する優れたブログ投稿を書いています

Parfitはハイパーパラメーター最適化パッケージであり、SGDClassifierを最適化するのに役立つパラメーターの適切な組み合わせを見つけるために利用しました。

要約すると、SGDClassifierの2つの主要パラメーターはalphan_iterです。Vinayを直接引用するには:

sklearnのn_iterはデフォルトではNoneです。ここでは、十分に大きい量(1000)に設定しています。最近追加されたn_iterの代替パラメーターはmax_iterです。同じアドバイスがmax_iterにも当てはまります。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.