我在维基百科中使用此示例在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,这些是截然不同的结果。
答案 0 :(得分:4)
“问题”是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很小则更可能),并且在非正则化的情况下导致系数无限增长,则可能会发生这种情况。
答案 1 :(得分:0)
我认为这个问题是因为你有
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 ...]
试试这个