Scikit learn scikit'中的截距=0.0是否正常;什么是逻辑回归?

Scikit learn scikit'中的截距=0.0是否正常;什么是逻辑回归?,scikit-learn,logistic-regression,liblinear,Scikit Learn,Logistic Regression,Liblinear,我一直在努力证明为什么我从scikit learn获得intercept\u=0.0。拟合的逻辑回归具有以下参数: LogisticRegression(C=0.0588579519026603, class_weight='balanced', dual=False, fit_intercept=True, intercept_scaling=6.2196752179914165, max_iter=100, mul

我一直在努力证明为什么我从scikit learn获得
intercept\u=0.0
。拟合的逻辑回归具有以下参数:

LogisticRegression(C=0.0588579519026603, class_weight='balanced', 
                   dual=False, fit_intercept=True, intercept_scaling=6.2196752179914165,
                   max_iter=100, multi_class='ovr', n_jobs=1, penalty='l1',
                   random_state=1498059397, solver='liblinear', tol=0.0001,
                   verbose=0, warm_start=False)
我使用的数据集具有以下特征:

  • 形状(113441,69)
  • 1个具有唯一性的功能(-1,0)
  • 68个具有唯一性的功能(1,0)
我首先研究了逻辑回归的
coef\uu
属性,它们如下所示:

array([[-0.11210483,  0.09227395,  0.23526487,  0.1740976 ,  0.       ,
    -0.3282085 , -0.41550312,  1.67325241,  0.        ,  0.        ,
    -0.06987265,  0.        , -0.03053099,  0.        ,  0.09354742,
     0.06188271, -0.24618392,  0.0368765 ,  0.        ,  0.        ,
    -0.31796638,  1.75208672, -0.1270747 ,  0.13805016,  0.        ,
     0.2136787 , -0.4032387 , -0.00261153,  0.        ,  0.17788052,
    -0.0167915 ,  0.34149755,  0.0233405 , -0.09623664, -0.12918872,
     0.        ,  0.47359295, -0.16455172, -0.03106686,  0.00525001,
     0.13036978,  0.        ,  0.        ,  0.01318782, -0.10392985,
     0.        , -0.91211158, -0.11622266, -0.18233443,  0.43319013,
    -0.06818055, -0.02732619,  0.        , -0.09166496,  0.03753666,
     0.03857431,  0.        , -0.02650828,  0.19030955,  0.70891911,
    -0.07383034, -1.29428322, -0.69191842,  0.        ,  0.43798269,
    -0.66869241,  0.        ,  0.44498888, -0.08931519]])
在这里,我们可以看到一些零(预期是由于L1惩罚,对吧?)以及
截距=0.0

我想补充一点,我尝试了
class\u weight=None
,得到了
intercept!=0.0

此截获=0.0的原因可能是什么?截距是否也被正则化,并且恰好被设置为零(与
coef
的任何其他系数一样)?这仅仅是“运气”吗?是因为我的数据集吗?

来自 在
intercept\u scaling
参数上,切换到
LogisticRegression

截距\u缩放:浮点,默认为1

仅当解算器 使用“liblinear”,并将self.fit_intercept设置为True。在这个 在这种情况下,x变成[x,自截距_缩放],即“合成” 将具有等于截距的常量值的特征添加到 实例向量。截距变为截距* 合成特征重量

注意!综合特征权重为 与所有其他特征一样,受l1/l2正则化的约束。减轻压力 正则化对合成特征权重的影响(因此对 必须增加截距(intercept)和截距(U)缩放

为什么这是正常的做法?截距项在技术上只是附加到X/特征项的1s列向量的系数

例如,使用简单线性回归,假设您有一个包含2个特征和10个样本的特征X的数据集。如果要使用来获取包括截距在内的系数,您首先需要使用类似于
statsmodels.tools.tools.add_constant
的方法,将1列附加到特征中。如果不附加1列,则只能得到2个系数。如果你添加了,你会得到第三个“系数”,这只是你的截距


把这一点联系起来的简单方法是考虑预测值。截距项乘以一列1就是它本身——也就是说,你把截距(乘以1)加到其他系数和特征的和积上,获取nx1预测值数组。

我碰巧查看了scikit学习逻辑回归
liblinear
,发现
intercept=intercept=intercept\u scaling*raw\u coef.[:,-1]
。然而,这是一种好的做法吗?我读到不建议对截取项进行正则化,但实际上我没有找到任何字符串原因。我想仔细看看,因为您的
intercept\u scaling=6.2196752179914165
,而默认值应为1。(我看不出在调用
.fit
时有什么原因需要更改)您可以将您的csv数据发布到google文档吗?不管怎样,
liblinear.train\u wrap
都会对截距向量进行正则化。由于对大多数Logit超参数进行超参数搜索,我得到了
intercept\u scaling
值。我将尝试上载与数据相关的讨论: