Python 为什么sklearn logistic回归将权重和截距都正则化?

Python 为什么sklearn logistic回归将权重和截距都正则化?,python,scikit-learn,regression,Python,Scikit Learn,Regression,logistic回归中的正则化参数C (请参阅)的使用允许对功能进行良好定义,并避免过度安装或阶跃功能出现问题(请参阅) 然而,逻辑回归中的正则化应该只关注特征的权重,而不是截距(这里也解释了:) 但似乎sklearn.linear_model.logistic回归实际上也将截距正则化。原因如下: 1) 仔细考虑上面的链接():sigmod稍微向左移动,靠近截距0 2) 我尝试用逻辑曲线和手动最大似然函数拟合数据点。将截距包含到L2范数中会得到与sklearn函数相同的结果 请回答两个问题: 1

logistic回归中的正则化参数C (请参阅)的使用允许对功能进行良好定义,并避免过度安装或阶跃功能出现问题(请参阅)

然而,逻辑回归中的正则化应该只关注特征的权重,而不是截距(这里也解释了:)

但似乎sklearn.linear_model.logistic回归实际上也将截距正则化。原因如下:

1) 仔细考虑上面的链接():sigmod稍微向左移动,靠近截距0

2) 我尝试用逻辑曲线和手动最大似然函数拟合数据点。将截距包含到L2范数中会得到与sklearn函数相同的结果

请回答两个问题:

1) 我是不是搞错了,这是一个bug,还是有合理的理由来规范拦截

2) 有没有一种方法可以使用sklearn和specify来正则化除截取之外的所有参数

谢谢

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

scikit学习具有默认的正则化逻辑回归

如果只改变
C
参数,则
sklearn.linear\u model.logisticsregression
intercept\u scaling
参数值的变化对结果有类似的影响

intercept_scaling
参数修改的情况下,正则化对logistic回归中的偏差估计有影响。当此参数的值位于较高一侧时,正则化对偏差的影响将减小。Per:

截距变为
intercept\u scaling*合成功能\u weight


注意!合成特征权重采用l1/l2正则化 与所有其他功能一样。减少正则化对系统的影响 合成特征权重(因此在截距上) 必须增加截距/单位比例



希望有帮助

谢谢@Prem,这确实是解决方案:

C = 1e1  
intercept_scaling=1e3    # very high numbers make it unstable in practice
model = LogisticRegression(C=C, intercept_scaling=intercept_scaling)

几年前我问了一个类似的问题。我知道你可以使用参数intercept\u scaling来控制这一点,但我不确定合适的技术。我添加了一个最小的示例。你能用这个例子来说明需要添加什么来不规范截距吗?谢谢我认为,如果你使截距缩放任意大,它的正则化将是可以忽略的(但严格来说不是零),正如@cxrogers正确指出的那样-让我们试试
model=LogisticRegression(intercept\u scaling=99999)