sklearn logistic回归得出有偏见的结果?

时间:2016-12-13 15:58:13

标签: python scikit-learn logistic-regression

我运行了大约1000个类似的逻辑回归,具有相同的协变量,但数据和响应变量略有不同。我的所有响应变量都有稀疏的成功(p(成功)< .05)。

我按如下方式运行LR:我有一个名为“success_fail”的矩阵,它对每个设置(设计矩阵的行)都有成功次数和失败次数。我将LR视为:

skdesign = np.vstack((design,design))
sklabel = np.hstack((np.ones(success_fail.shape[0]), 
                     np.zeros(success_fail.shape[0])))
skweight = np.hstack((success_fail['success'], success_fail['fail']))
logregN = linear_model.LogisticRegression(C=1, 
                                solver= 'lbfgs',fit_intercept=False)   
logregN.fit(skdesign, sklabel, sample_weight=skweight)

(sklearn版本0.18)

我注意到,通过正则化回归,结果始终存在偏差,以预测更多"成功"比在训练数据中观察到的。当我放松正规化时,这种偏见消失了。观察到的偏见对我的用例来说是不可接受的,但更正规化的模型似乎确实好一些。

下面,我绘制了针对2个不同C值的1000个不同回归的结果: results for the different regressions for 2 different values of C

我查看了其中一个回归的参数估计值:每个点下面都是一个参数。看起来截距(左下角的点)对于C = 1模型来说太高了。 enter image description here

为什么会这样?我该如何解决?我可以让sklearn更少地规范拦截吗?

1 个答案:

答案 0 :(得分:1)

感谢sklearn邮件列表中的可爱人们,我找到了答案。正如您在问题中所看到的,我创建了一个设计矩阵(包括截距),然后使用“fit_intercept = False”设置拟合模型。这导致了拦截的正规化。对我来说非常愚蠢!我需要做的就是从设计中删除拦截并删除“fit_intercept = False”。