当我们的数据存在多重共线性时,即其中的一个自变量可以用其他一个或几个自变量的线性表达式进行表示,你会发现,拟合之后的方差会特别大
一般说来当解释变量的容忍度(TOLERANCE)小于0.10或者方差膨胀因子(VIF)大于10时,说明变量之间存在多重共线性现象,会影响到回归模型的正确估计。
方差膨胀因子VIF=1/(1-r2),r是线性相关系数
具体可以参考:多重共线性,怎么判断是否有多重共线性,怎么解决
scikit-learn介绍了一种岭回归,岭回归就是带二范数惩罚的最小二乘回归。
通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价获得回归系数更为符合实际、更可靠的回归方法,对病态数据的拟合要强于OLS。本质是在自变量信息矩阵的主对角线元素上人为地加入一个非负因子。
再来看看scikit-learn上面的代码
#-*- coding: UTF-8 -*- import numpy as np import matplotlib.pyplot as plt from sklearn import linear_model # X is the 10x10 Hilbert matrix X = 1. / (np.arange(1, 11) + np.arange(0, 10)[:, np.newaxis]) y = np.ones(10) print (X) print (y) n_alphas = 10 alphas = np.logspace(-10, -2, n_alphas) #创建以10的-10次方开始,10的-2次方结尾,元素个数为200的等比数列,赋值给alphas coefs = [] for a in alphas: ridge = linear_model.Ridge(alpha=a, fit_intercept=False) ridge.fit(X, y) coefs.append(ridge.coef_) ax = plt.gca() #获取当前的axes绘图区域 ax.plot(alphas, coefs) ax.set_xscale(‘log‘) ax.set_xlim(ax.get_xlim()[::-1]) # reverse axis,间隔是10的-1次方 plt.xlabel(‘alpha‘) plt.ylabel(‘weights‘) plt.title(‘Ridge coefficients as a function of the regularization‘) plt.axis(‘tight‘) plt.show()
在岭迹图中,当alpha值过大时,回归系数趋近于零,当alpha越小时,相当于最小二乘法,回归系数振荡很大。
所以需要选取合适的系数值
岭回归和lasso回归类似
原本是想用岭回归和lasso来再把titanic来一遍,不过,这个也没有多重共线性问题,还是用接下来的逻辑回归来尝试一下吧。
羞愧的我。
原文:http://www.cnblogs.com/timotong/p/7471586.html