如何避免在 scikit 的 LogisticRegression 中对截距进行正则化

机器算法验证 物流 scikit-学习 正则化
2022-03-18 08:07:31

Scikit 的 LogisticRegression 规范了截距项。

是否可以单独处理这些系数(就正则化而言)。

我可以看到两种情况可能有用:

  • 截距项设置为预测总体均值的值
  • 截距项是非正则化的(允许具有较大的值)。

(LR 会从第二个开始吗?)

为什么。如果正则化的目的是减少预测对任何一个因素的依赖,我们还应该鼓励(并强制)对“没有任何因素解释”产生更强的默认偏差。因为截距不是(可变)输入因子,所以我更愿意在截距上允许比其他因子更大的幅度权重。

虽然这可能会使我们损失训练损失,但由于训练集的方差,我们可能会看到系数的方差较低。

2个回答

使用 liblinear 以外的求解器。liblinear 求解器(以前是 LogisticRegression 的默认值)对截距进行正则化,但其他求解器没有(参见https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression)。如果您必须使用 liblinear,请参阅 intercept_scaling 参数,可能包含该参数以缓解此问题。

有一个快速而肮脏的修复方法可以减少拦截的正则化。

为此,我们可以在拦截列中附加一个巨大的数字说1×109, 而不是用 all 展开数据框1柱子。

例如,对于mtcars数据,如果我们想对权重进行逻辑回归,我们可以

> head(cbind(1e9,mtcars$wt))
      [,1]  [,2]
[1,] 1e+09 2.620
[2,] 1e+09 2.875
[3,] 1e+09 2.320
[4,] 1e+09 3.215
[5,] 1e+09 3.440
[6,] 1e+09 3.460

代替

> head(model.matrix(am~wt,mtcars))
                  (Intercept)    wt
Mazda RX4                   1 2.620
Mazda RX4 Wag               1 2.875
Datsun 710                  1 2.320
Hornet 4 Drive              1 3.215
Hornet Sportabout           1 3.440
Valiant                     1 3.460