具有非正则截距项的 Scikit-learn 岭回归
Posted
技术标签:
【中文标题】具有非正则截距项的 Scikit-learn 岭回归【英文标题】:Scikit-learn Ridge Regression with unregularized intercept term 【发布时间】:2014-11-25 09:35:50 【问题描述】:scikit-learn Ridge 回归是否在正则化项中包含截距系数,如果是,有没有办法在不正则化截距的情况下运行岭回归?
假设我适合岭回归:
from sklearn import linear_model
mymodel = linear_model.Ridge(alpha=0.1, fit_intercept=True).fit(X, y)
print mymodel.coef_
print mymodel.intercept_
对于某些数据 X,y,其中 X 不包含 1 的列。 fit_intercept=True 会自动添加一个intercept列,对应的系数由mymodel.intercept_给出。我无法弄清楚的是这个截距系数是否是优化目标中正则化总和的一部分。
根据 http://scikit-learn.org/stable/modules/linear_model.html, 优化目标是相对于 w 最小化:
||X*w - y||**2 + alpha* ||w||**2
(使用 L2 规范)。第二项是正则化项,问题是在我们设置fit_intercept=True的情况下是否包含截距系数;如果是这样,如何禁用它。
【问题讨论】:
【参考方案1】:拦截不受处罚。只需尝试一个带有大截距的简单 3 点示例。
from sklearn import linear_model
import numpy as np
x=np.array([-1,0,1]).reshape((3,1))
y=np.array([1001,1002,1003])
fit=linear_model.Ridge(alpha=0.1,fit_intercept=True).fit(x,y)
print fit.intercept_
print fit.coef_
截距设置为 MLE 截距 (1002),而斜率受到惩罚(0.952 而不是 1)。
【讨论】:
这对我来说不是很清楚,例如根据以下示例,截距随 alpha 的不同值而变化: from sklearn import linear_model clf = linear_model.Ridge (alpha = 0.1, normalize=False, fit_intercept=True) X=np.array([[0, 0], [ 0, 0], [1, 1]]) y= np.array([0, .1, 1]) clf.fit(X,y) 很抱歉花了一年多的时间才回复您。 MLE 解决方案给出的截距完美地重建了所有点的平均值。如,以所有 X 的平均值评估的拟合模型应等于所有 y 的平均值。对你来说仍然如此。 middle_x = np.mean(X, axis=0); middle_y = np.mean(y); np.sum(clf.coef_ * middle_x) + clf.intercept_ == middle_y; #真 这应该标记在正确的答案上。 intercept=mean(y) 表示截距是非正则化的。以上是关于具有非正则截距项的 Scikit-learn 岭回归的主要内容,如果未能解决你的问题,请参考以下文章