采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
PolynomialFeatures 生成出的数据是带有截距项的,而回归函数又重复的添加了截距项,理论上将导致共线性,导致最优解不唯一,而实际从结果看,算法机智地把多项式截距项踢掉了,回归系数为0 我想知道sklearn.LinearRegression是怎么避开共线性的? 如何在sklearn 或者python 中进行共线性检验? 如果回归时我不希望有截距项,应如何设置?
PolynomialFeatures 生成的数据没有截距。截距这个概念是针对直线方程来说的。而 PolynomialFeatures 的结果只不过是将原先的特征从 n1 个特征,根据多项式的规则,扩充到了 n2 个特征。
新的特征中,有一个特征的值,永远是 1,因为对应多项式的 0 次幂项。但这是一个特征,是一个维度,只不过,这个维度上,所有的数据值为 1 而已。
而将新的数据带入线性回归中求解,求出拟合度最高的直线,此时,才有截距的概念。
我没有理解什么叫不希望有截距项?对于一个直线方程来说,截距就是存在的。
继续加油!:)
我指的就是说,X的前两列都是1,线性相关,导致共线性,导致最优解不唯一(比如这个问题里,只要这两项系数和为常数,cost function就是同一个值),共线性检验是做线性回归前必须做的,因为即使是弱共线性也会导致估计结果无效,xtx不可逆这些问题,何况两列完全相同,无论用任何算法求解都不可能,像这个结果输出这样得到系数为0(比如梯度下降这两个系数梯度永远相同必然结果是同一个值),所以sklearn一定是做了这方面设计的。 然后是如果我不想要这个等于1的feature还怎么弄,这也是很常见的,比如多个feature的时候我的模型里本来就没有截距项,或者做方差分析,截距项系数p值并不显著
我理解你的意思了。我不确定 sklearn 做了什么检查或者处理,这在计算机内部,已经属于数值分析的内容了。但确实,sklearn 的实现中不是简单的直接开始搜索或者求解,对数据有相当多的预处理过程。相应源码可以参考这里:https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/linear_model/_base.py。375 行开始是线性回归。 如果不想要这个等于 1 的feature,直接在矩阵中删掉这一列就好了。 至于统计学,很多时候,从计算机的角度看,做机器学习并不关注一些统计指标,比如显著性。整体,机器学习更关注预测结果的准确性。实际上,很多机器学习算法背后的统计学意义非常弱,比如大火的神经网络和深度学习,这也是很多大牛吐槽现阶段机器学习的重要原因。 当然,在机器学习领域,有一个子领域,就叫统计学习,会更强调统计意义一些,不过我不是专门做统计学习的,对很多统计学内容并不了解。 实际上,我的爱人在学术界工作,经常接触统计分析。我们在交流的时候,经常有的一大分歧就是模型的统计意义。学术界更强调可解释性,更强调模型参数的统计指标分析;但是,业界,甚至是计算机专业的学界,很多时候都会忽略对统计指标的分析(比如检验显著性),而更强调在测试数据上的效果。
非常感谢!
登录后可查看更多问答,登录/注册
Python3+sklearn,兼顾原理、算法底层实现和框架使用。
2.4k 19
3.4k 17
2.9k 15
1.6k 15
1.4k 14