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