2017-11-02 6 views
2

ロジスティック回帰 (http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.htmlを参照)の正規化パラメータCを使用すると、関数をうまく定義してフィットしたり、ステップ関数の問題を避けることができます(https://datascience.stackexchange.com/questions/10805/does-scikit-learn-use-regularization-by-default/10806参照)。sklearnロジスティック回帰はなぜ重みと切片の両方を正則化するのですか?

をしかしsklearn.linear_model.LogisticRegressionが実際にもインターセプトをregularizesと思われている:

しかし、ロジスティック回帰で正則は機能だけの重みを心配すべきではなく、インターセプト(http://aimotion.blogspot.com/2011/11/machine-learning-with-python-logistic.htmlもここで説明)。

1)リンク上Conside注意深く(https://datascience.stackexchange.com/questions/10805/does-scikit-learn-use-regularization-by-default/10806):なぜここにSIGMODを左にわずかに移動され、私はロジスティック曲線とデータ点に適合しようとした)、切片0

2に近づくと手動の最尤関数。 L2ノルムへの切片を含めると、Sklearnの関数と同じ結果が得られます。

つ質問してください:

1)私はこの間違ったを取得しました、これはバグである、またはインターセプトを規則​​化するためのよく正当な理由があるのでしょうか?

2)sklearnを使用し、インターセプト以外のすべてのパラメータを正規化する方法はありますか?

ありがとうございます!

import numpy as np 
from sklearn.linear_model import LogisticRegression 

C = 1e1 
model = LogisticRegression(C=C) 

x = np.arange(100, 110) 
x = x[:, np.newaxis] 
y = np.array([0]*5 + [1]*5) 

print x 
print y 

model.fit(x, y) 
a = model.coef_[0][0] 
b = model.intercept_[0] 

b_modified = -b/a     # without regularization, b_modified should be 104.5 (as for C=1e10) 

print "a, b:", a, -b/a 

# OUTPUT: 
# [[100] 
# [101] 
# [102] 
# [103] 
# [104] 
# [105] 
# [106] 
# [107] 
# [108] 
# [109]] 
# [0 0 0 0 0 1 1 1 1 1] 
# a, b: 0.0116744221756 100.478968664 
+0

私は数年前に同様の質問をしました。私はあなたがこれを制御するために引数のintercept_scalingを使うことができることを知っていますが、私は適切なテクニックについては分かりません。 https://stackoverflow.com/questions/17711304/how-to-set-intercept-scaling-in-scikit-learn-logisticregression – cxrodgers

答えて

0

scikit-learnにはデフォルトの正規化ロジスティック回帰があります。

sklearn.linear_model.LogisticRegressionintercept_scalingパラメータの変更は、Cパラメータのみが変更された場合の結果にも同様の影響を与えます。

intercept_scalingパラメータを変更した場合、正規化はロジスティック回帰の偏りの推定に影響します。このパラメータの値がより高い側にある場合、バイアスに対する正則化の影響は低減される。 Per official documentation

インターセプトはintercept_scaling * synthetic_feature_weightになります。

注!合成特徴量は、他のすべての特徴と同様に、l 1/l 2正則化 の影響を受ける。 合成フィーチャウェイト(したがって、インターセプト)の正規化の影響を軽減するには、 のintercept_scalingを増やす必要があります。


希望します。

+0

私は最小の例を追加しました。この例では、傍受を正規化しないために追加する必要があるものを説明してください。ありがとう! – wolf

+1

傍受スケーリングを任意に大きくすると、正規化は無視されます(厳密にゼロではありません)。 – cxrodgers

+0

@cxrodgersが正しく指摘しているので、 'model = LogisticRegression(intercept_scaling = 99999)'を試してみましょう。 – Prem

0

おかげ@Premが、これは確かなソリューションです:

C = 1e1 
intercept_scaling=1e3 # very high numbers make it unstable in practice 
model = LogisticRegression(C=C, intercept_scaling=intercept_scaling) 
関連する問題