scikit 的 LogisticRegression 中有 intercept_ = 0.0 是否正常?
Is it normal to have intercept_ = 0.0 in scikit's LogisticRegression?
我一直在努力证明为什么我从 scikit-learn 得到 intercept_=0.0
和 LogisticRegression。拟合的逻辑回归具有以下参数:
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_
属性,它们如下:
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_
的任何其他系数一样)?仅仅是 "luck" 吗?是因为我的数据集吗?
来自docstring
在 intercept_scaling
参数上 LogisticRegression
:
intercept_scaling : float, default 1.
Useful only when the solver
‘liblinear’ is used and self.fit_intercept is set to True. In this
case, x becomes [x, self.intercept_scaling], i.e. a “synthetic”
feature with constant value equal to intercept_scaling is appended to
the instance vector. The intercept becomes intercept_scaling *
synthetic_feature_weight.
Note! the synthetic feature weight is
subject to l1/l2 regularization as all other features. To lessen the
effect of regularization on synthetic feature weight (and therefore on
the intercept) intercept_scaling has to be increased.
为什么这是正常做法?截距项在技术上只是附加到 X/feature 项的 1s 列向量的 系数。
例如,使用简单线性回归,假设您有一个包含 2 个特征和 10 个样本的 X 特征数据集。如果您要使用 scipy.linalg.lstsq 来获取系数 包括 截距,您首先要使用 statsmodels.tools.tools.add_constant
之类的东西将一列 1 附加到您的特征。如果你没有追加 1 的列,你只会得到 2 个系数。如果你确实附加了,你会得到第三个 "coefficient" 这只是你的截距。
将其联系起来的简单方法是考虑预测值。截距项乘以一列 1 就是它本身——即您将截距(乘以一)添加到其他系数和特征的总和中,以获得 nx1 预测值数组。
我一直在努力证明为什么我从 scikit-learn 得到 intercept_=0.0
和 LogisticRegression。拟合的逻辑回归具有以下参数:
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_
属性,它们如下:
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_
的任何其他系数一样)?仅仅是 "luck" 吗?是因为我的数据集吗?
来自docstring
在 intercept_scaling
参数上 LogisticRegression
:
intercept_scaling : float, default 1.
Useful only when the solver ‘liblinear’ is used and self.fit_intercept is set to True. In this case, x becomes [x, self.intercept_scaling], i.e. a “synthetic” feature with constant value equal to intercept_scaling is appended to the instance vector. The intercept becomes intercept_scaling * synthetic_feature_weight.
Note! the synthetic feature weight is subject to l1/l2 regularization as all other features. To lessen the effect of regularization on synthetic feature weight (and therefore on the intercept) intercept_scaling has to be increased.
为什么这是正常做法?截距项在技术上只是附加到 X/feature 项的 1s 列向量的 系数。
例如,使用简单线性回归,假设您有一个包含 2 个特征和 10 个样本的 X 特征数据集。如果您要使用 scipy.linalg.lstsq 来获取系数 包括 截距,您首先要使用 statsmodels.tools.tools.add_constant
之类的东西将一列 1 附加到您的特征。如果你没有追加 1 的列,你只会得到 2 个系数。如果你确实附加了,你会得到第三个 "coefficient" 这只是你的截距。
将其联系起来的简单方法是考虑预测值。截距项乘以一列 1 就是它本身——即您将截距(乘以一)添加到其他系数和特征的总和中,以获得 nx1 预测值数组。