python 中逻辑回归的混淆结果

confusing results with logistic regression in python

我正在 Python 中使用来自维基百科的示例进行逻辑回归。 link to example

这是我的代码:

from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
Z = [[0.5], [0.75], [1.0], [1.25], [1.5], [1.75], [1.75], [2.0], [2.25], [2.5], [2.75], [3.0], [3.25], [3.5], [4.0], [4.25], [4.5], [4.75], [5.0], [5.5]] # number of hours spent studying
y = [0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1] # 0=failed, 1=pass

lr.fit(Z,y)

这方面的结果是

lr.coef_
array([[ 0.61126347]])

lr.intercept_
array([-1.36550178])

而他们得到的小时系数值为 1.5046,截距为 -4.0777。为什么结果如此不同?他们对 1 小时学习的预测是通过概率 0.07,而我用这个模型得到 0.32,这些是截然不同的结果。

我认为问题是由于您有

Z = [[0.5], [0.75], [1.0], [1.25], [1.5], [1.75], [1.75], [2.0], [2.25], [2.5], [2.75], [3.0], [3.25], [3.5], [4.0], [4.25], [4.5], [4.75], [5.0], [5.5]]

但应该是

Z = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 1.75, 2.0, 2.25 ...]

试试这个

"problem" 是 scikit-learn 中的 LogisticRegression 使用 L2-regularization (aka Tikhonov regularization, aka Ridge, aka normal prior). Please read sklearn user guide about logistic regression 实现细节。

实际上,这意味着 LogisticRegression 有一个参数 C,默认情况下等于 1C 越小,正则化越多 - 这意味着,coef_ 变小,intercept_ 变大,这会增加数值稳定性并减少过度拟合。

如果C设置的很大,正则化的效果就会消失。有

lr = LogisticRegression(C=100500000)

你分别得到coef_和intercept_

[[ 1.50464535]]
[-4.07771322]

就像维基百科的文章一样。

更多理论。过度拟合是一个有很多特征但没有太多例子的问题。一个简单的经验法则:如果 n_obs/n_features 小于 10,则使用小 C。在 wiki 示例中,有一个特征和 20 个观察值,因此即使使用大 C,简单逻辑回归也不会过拟合。

小 C 的另一个用例是收敛问题。如果正面和负面的例子可以完全分开或在多重共线性的情况下(如果 n_obs/n_features 很小,这又更有可能),它们可能会发生,并导致非正则化情况下系数的无限增长。