我正在使用来自维基百科的示例在 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,这些是截然不同的结果。
最佳答案
“问题”是 scikit-learn 中的 LogisticRegression 使用 L2-regularization (又名 Tikhonov 正则化,又名 Ridge,又名正常先验)。请阅读sklearn user guide about logistic regression了解实现细节。
在实践中,这意味着 LogisticRegression
有一个参数 C
,默认情况下等于 1
。 C
越小,正则化越多 - 这意味着 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 较小,则更有可能),它们可能会发生,并导致非正则化情况下系数的无限增长。
关于python - 混淆结果与 python 中的逻辑回归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47248587/