2

我一直在努力证明为什么我从 scikit-learnintercept_=0.0获得LogisticRegression 。拟合的 Logistic 回归具有以下参数:

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_Logistic 回归的属性,它们如下:

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 惩罚,对吧?)以及intercept_=0.0.

我想补充一点,我试过了class_weight=None,我得到了intercept_ != 0.0.

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

4

1 回答 1

1

从参数 上的文档字符串到:intercept_scalingLogisticRegression

intercept_scaling : 浮点数,默认 1。

仅当使用求解器“liblinear”且 self.fit_intercept 设置为 True 时才有用。在这种情况下,x 变为 [x, self.intercept_scaling],即在实例向量中附加了一个常数值等于 intercept_scaling 的“合成”特征。截距变为intercept_scaling * synthesis_feature_weight。

笔记!合成特征权重像所有其他特征一样受到 l1/l2 正则化。为了减少正则化对合成特征权重(以及因此对截距)的影响,必须增加截距缩放。

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

例如,使用简单的线性回归,假设您有一个特征数据集X,其中包含 2 个特征和 10 个样本。如果您要使用scipy.linalg.lstsq来获取包括截距在内的系数,您首先要使用类似statsmodels.tools.tools.add_constant将一列 1 附加到您的特征的东西。如果你没有附加 1 的列,你只会得到 2 个系数。如果你确实追加了,你会得到第三个“系数”,这只是你的截距。

将其联系起来的简单方法是考虑预测值。截距项乘以一列 1 只是其本身 - 即您将截距(乘以 1)添加到其他系数和特征的总和乘积中,以获得您的nx1预测值数组。

于 2017-07-11T17:07:50.600 回答