Scikit learn scikit'中的截距=0.0是否正常;什么是逻辑回归?
我一直在努力证明为什么我从scikit learn获得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
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
值。我将尝试上载与数据相关的讨论: