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
,默认情况下等于 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 中使用来自维基百科的示例进行逻辑回归。 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
,默认情况下等于 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 很小,这又更有可能),它们可能会发生,并导致非正则化情况下系数的无限增长。