ScikitLearn-確率的勾配降下法
ここでは、確率的勾配降下法(SGD)と呼ばれるSklearnの最適化アルゴリズムについて学習します。
確率的勾配降下法(SGD)は、コスト関数を最小化する関数のパラメーター/係数の値を見つけるために使用される、シンプルでありながら効率的な最適化アルゴリズムです。言い換えると、SVMやロジスティック回帰などの凸損失関数の下で線形分類器の識別学習に使用されます。係数の更新はインスタンスの最後ではなくトレーニングインスタンスごとに実行されるため、大規模なデータセットに正常に適用されています。
SGD分類器
確率的勾配降下法(SGD)分類器は、基本的に、分類に対するさまざまな損失関数とペナルティをサポートする単純なSGD学習ルーチンを実装します。Scikit-learnは提供しますSGDClassifier SGD分類を実装するモジュール。
パラメーター
次の表は、によって使用されるパラメータで構成されています SGDClassifier モジュール-
シニア番号 | パラメータと説明 |
---|---|
1 | loss − str、デフォルト= 'ヒンジ' これは、実装中に使用される損失関数を表します。デフォルト値は「ヒンジ」で、線形SVMが得られます。使用できる他のオプションは次のとおりです。
|
2 | penalty − str、 'none'、 'l2'、 'l1'、 'elasticnet' これは、モデルで使用される正則化用語です。デフォルトでは、L2です。L1または 'elasticnetを使用できます。同様に、しかし両方ともモデルにスパース性をもたらす可能性があるため、L2では達成できません。 |
3 | alpha −フロート、デフォルト= 0.0001 正則化項を乗算する定数であるAlphaは、モデルにペナルティを課す量を決定する調整パラメーターです。デフォルト値は0.0001です。 |
4 | l1_ratio −フロート、デフォルト= 0.15 これはElasticNetミキシングパラメータと呼ばれます。その範囲は0 <= l1_ratio <= 1です。l1_ratio= 1の場合、ペナルティはL1ペナルティになります。l1_ratio = 0の場合、ペナルティはL2ペナルティになります。 |
5 | fit_intercept −ブール値、デフォルト= True このパラメーターは、定数(バイアスまたは切片)を決定関数に追加する必要があることを指定します。falseに設定されている場合、切片は計算に使用されず、データはすでに中央に配置されていると見なされます。 |
6 | tol − floatまたはnone、オプション、デフォルト= 1.e-3 このパラメーターは、反復の停止基準を表します。デフォルト値はFalseですが、Noneに設定すると、反復は次の場合に停止します。loss >> best_loss - tol for n_iter_no_change連続した時代。 |
7 | shuffle −ブール値、オプション、デフォルト= True このパラメーターは、各エポックの後にトレーニングデータをシャッフルするかどうかを表します。 |
8 | verbose −整数、デフォルト= 0 これは、詳細レベルを表します。デフォルト値は0です。 |
9 | epsilon −フロート、デフォルト= 0.1 このパラメーターは、鈍感な領域の幅を指定します。損失= 'イプシロン非感受性'の場合、現在の予測と正しいラベルとの差がしきい値未満の場合は無視されます。 |
10 | max_iter − int、オプション、デフォルト= 1000 名前が示すように、これはエポックを通過するパスの最大数、つまりトレーニングデータを表します。 |
11 | warm_start − bool、オプション、デフォルト= false このパラメーターをTrueに設定すると、前の呼び出しのソリューションを再利用して、初期化として適合させることができます。デフォルト、つまりfalseを選択すると、前のソリューションが消去されます。 |
12 | random_state − int、RandomStateインスタンスまたはNone、オプション、デフォルト= none このパラメーターは、データのシャッフル中に使用される、生成された疑似乱数のシードを表します。以下はオプションです。
|
13 | n_jobs − intまたはnone、オプション、デフォルト=なし これは、マルチクラス問題のOVA(One Versus All)計算で使用されるCPUの数を表します。デフォルト値はnoneで、これは1を意味します。 |
14 | learning_rate −文字列、オプション、デフォルト= '最適'
|
15 | eta0 − double、デフォルト= 0.0 これは、上記の学習率オプション、つまり「定数」、「invscalling」、または「適応」の初期学習率を表します。 |
16 | power_t − idouble、デフォルト= 0.5 これは、「増加する」学習率の指数です。 |
17 | early_stopping − bool、デフォルト= False このパラメーターは、検証スコアが改善されていないときにトレーニングを終了するための早期停止の使用を表します。デフォルト値はfalseですが、trueに設定すると、トレーニングデータの層化された部分が検証として自動的に確保され、検証スコアが向上しない場合はトレーニングが停止します。 |
18 | validation_fraction −フロート、デフォルト= 0.1 これは、early_stoppingがtrueの場合にのみ使用されます。これは、トレーニングデータの早期終了のための検証セットとして補助を設定するトレーニングデータの割合を表します。 |
19 | n_iter_no_change − int、デフォルト= 5 これは、早期停止の前にアルゴリズムを実行した場合に改善が見られない反復回数を表します。 |
20 | classs_weight − dict、{class_label:weight}または「balanced」、またはNone、オプション このパラメーターは、クラスに関連付けられた重みを表します。指定しない場合、クラスの重みは1になります。 |
20 | warm_start − bool、オプション、デフォルト= false このパラメーターをTrueに設定すると、前の呼び出しのソリューションを再利用して、初期化として適合させることができます。デフォルト、つまりfalseを選択すると、前のソリューションが消去されます。 |
21 | average − iBooleanまたはint、オプション、デフォルト= false これは、マルチクラス問題のOVA(One Versus All)計算で使用されるCPUの数を表します。デフォルト値はnoneで、これは1を意味します。 |
属性
次の表は、によって使用される属性で構成されています SGDClassifier モジュール-
シニア番号 | 属性と説明 |
---|---|
1 | coef_ −配列、形状(1、n_features)if n_classes == 2、else(n_classes、n_features) この属性は、フィーチャに割り当てられた重みを提供します。 |
2 | intercept_ −配列、形状(1、)if n_classes == 2、else(n_classes、) これは、意思決定関数の独立した用語を表します。 |
3 | n_iter_ − int 停止基準に到達するまでの反復回数を示します。 |
Implementation Example
他の分類器と同様に、確率的勾配降下法(SGD)には、次の2つの配列を適合させる必要があります。
トレーニングサンプルを保持する配列X。サイズは[n_samples、n_features]です。
ターゲット値、つまりトレーニングサンプルのクラスラベルを保持する配列Y。サイズは[n_samples]です。
Example
次のPythonスクリプトは、SGDClassifier線形モデルを使用します-
import numpy as np
from sklearn import linear_model
X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
Y = np.array([1, 1, 2, 2])
SGDClf = linear_model.SGDClassifier(max_iter = 1000, tol=1e-3,penalty = "elasticnet")
SGDClf.fit(X, Y)
Output
SGDClassifier(
alpha = 0.0001, average = False, class_weight = None,
early_stopping = False, epsilon = 0.1, eta0 = 0.0, fit_intercept = True,
l1_ratio = 0.15, learning_rate = 'optimal', loss = 'hinge', max_iter = 1000,
n_iter = None, n_iter_no_change = 5, n_jobs = None, penalty = 'elasticnet',
power_t = 0.5, random_state = None, shuffle = True, tol = 0.001,
validation_fraction = 0.1, verbose = 0, warm_start = False
)
Example
これで、フィットすると、モデルは次のように新しい値を予測できます。
SGDClf.predict([[2.,2.]])
Output
array([2])
Example
上記の例では、次のpythonスクリプトを使用して重みベクトルを取得できます-
SGDClf.coef_
Output
array([[19.54811198, 9.77200712]])
Example
同様に、次のPythonスクリプトを使用して切片の値を取得できます-
SGDClf.intercept_
Output
array([10.])
Example
を使用して、超平面までの符号付き距離を取得できます。 SGDClassifier.decision_function 次のPythonスクリプトで使用されているように-
SGDClf.decision_function([[2., 2.]])
Output
array([68.6402382])
SGDリグレッサ
確率的勾配降下法(SGD)リグレッサーは、基本的に、線形回帰モデルに適合するようにさまざまな損失関数とペナルティをサポートする単純なSGD学習ルーチンを実装します。Scikit-learnは提供しますSGDRegressor SGD回帰を実装するモジュール。
パラメーター
によって使用されるパラメータ SGDRegressorSGDClassifierモジュールで使用されたものとほぼ同じです。違いは「loss」パラメータにあります。にとってSGDRegressor モジュールの損失パラメータの正の値は次のとおりです-
squared_loss −通常の最小二乗適合を指します。
huber: SGDRegressor−イプシロンの距離を超えて二乗損失から線形損失に切り替えることにより、異常値を修正します。'huber'の機能は、アルゴリズムが外れ値の修正に集中しないように 'squared_loss'を変更することです。
epsilon_insensitive −実際には、イプシロン未満のエラーは無視されます。
squared_epsilon_insensitive−これはepsilon_insensitiveと同じです。唯一の違いは、イプシロンの許容誤差を超えると損失の2乗になることです。
もう1つの違いは、「power_t」という名前のパラメーターのデフォルト値が0.5ではなく0.25であるということです。 SGDClassifier。さらに、「class_weight」および「n_jobs」パラメーターはありません。
属性
SGDRegressorの属性も、SGDClassifierモジュールの属性と同じです。むしろ、次の3つの追加属性があります-
average_coef_ −配列、形状(n_features、)
名前が示すように、機能に割り当てられた平均の重みを提供します。
average_intercept_ −配列、shape(1、)
名前が示すように、平均切片項を提供します。
t_ − int
トレーニングフェーズ中に実行された体重更新の数を提供します。
Note −属性average_coef_およびaverage_intercept_は、パラメーター「average」をTrueに有効にした後に機能します。
Implementation Example
次のPythonスクリプトは SGDRegressor 線形モデル-
import numpy as np
from sklearn import linear_model
n_samples, n_features = 10, 5
rng = np.random.RandomState(0)
y = rng.randn(n_samples)
X = rng.randn(n_samples, n_features)
SGDReg =linear_model.SGDRegressor(
max_iter = 1000,penalty = "elasticnet",loss = 'huber',tol = 1e-3, average = True
)
SGDReg.fit(X, y)
Output
SGDRegressor(
alpha = 0.0001, average = True, early_stopping = False, epsilon = 0.1,
eta0 = 0.01, fit_intercept = True, l1_ratio = 0.15,
learning_rate = 'invscaling', loss = 'huber', max_iter = 1000,
n_iter = None, n_iter_no_change = 5, penalty = 'elasticnet', power_t = 0.25,
random_state = None, shuffle = True, tol = 0.001, validation_fraction = 0.1,
verbose = 0, warm_start = False
)
Example
これで、フィットしたら、次のpythonスクリプトを使用して重みベクトルを取得できます-
SGDReg.coef_
Output
array([-0.00423314, 0.00362922, -0.00380136, 0.00585455, 0.00396787])
Example
同様に、次のPythonスクリプトを使用して切片の値を取得できます-
SGReg.intercept_
Output
SGReg.intercept_
Example
次のPythonスクリプトを使用して、トレーニングフェーズ中に体重の更新数を取得できます-
SGDReg.t_
Output
61.0
SGDの長所と短所
SGDの長所に従う-
確率的勾配降下法(SGD)は非常に効率的です。
コードチューニングの機会がたくさんあるので、実装は非常に簡単です。
SGDの短所に従う-
確率的勾配降下法(SGD)には、正則化パラメーターなどのいくつかのハイパーパラメーターが必要です。
機能のスケーリングに敏感です。