1 何为岭回归?
岭参数k不是唯一确定的,其估计的回归系数是一个估计族。
2 何为岭迹分析?
1)定义
2)作用
k值的选取原则:
如下图所示,当k=k0时,各回归系数的估计值基本都能相对稳定。
除了岭迹法,还可以使用VIF确定k值。可以选方差扩大因子cjj≤10的k值:
除了岭迹法、VIF,还可使用残差平方和确定k值:
3 如何基于岭回归选择变量?
选择变量的原则:
4 python实现
from sklearn.linear_model import Ridge
import pandas as pd
import statsmodels.formula.api as smf
from statsmodels.stats.outliers_influence import variance_inflation_factor
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
#构造数据
df = pd.DataFrame(
{'y': [15, 10, 8, 9, 3],
'x1': [1, 1, 2, 3, 4],
'x2': [2, 2, 3, 2, 1],
'x3': [4, 6, 7, 8, 9],
'x4': [4, 3, 4, 5, 4]},
)
#建模
result = smf.ols('y~x1+x2+x3+x4',data = df).fit()
# 计算方差扩大因子(多重共线性判断)
VIFlist = []
for i in range(1, 3, 1):
vif = variance_inflation_factor(result.model.exog, i)
VIFlist.append(vif)
print(pd.Series(VIFlist))
#岭回归处理(即原理部分)
eps = list(np.random.randn(5)) # 误差项,个数是由数据的条数决定
y = -1.1584 + 0.0547 * df['x1'] + 0.1341 * df['x2'] -0.0548 * df['x3']-0.0320* df['x4'] + eps
df['y'] = y #覆盖原来的y值
#岭回归模型
dfnorm = (df - df.mean()) / df.std() #标准化自变量矩阵
# 切片将x和y分开
Xnorm = dfnorm.iloc[:, 1:]
ynorm = df.iloc[:, 0]
clf = Ridge() #岭回归函数
coefs = [] #存放岭回归估计值
errors = [] #存放残差
alphas = np.linspace(0.1, 30, 2000) #步长为0.1, 取30个alpha值
#遍历每个alpha值,计算出一系列的岭回归估计值
for a in alphas:
clf.set_params(alpha=a)
clf.fit(dfnorm, ynorm)
coefs.append(clf.coef_)
#画岭回归图
plt.subplot(111) #创建一个画布
ax = plt.gca() #gca()一个坐标轴的设置函数
ax.plot(alphas, coefs, label=list(Xnorm.keys())) #画图
ax.legend(list(Xnorm.keys()), loc='best') #设置图例
plt.xlabel('alpha')
plt.ylabel('weights')
plt.title('Ridge coefficients as a function of the regularization')
plt.axis('tight')
plt.show()
#下面就是删除调变化趋势大的自变量,重复上面的所有的操作,直到一个最优的结果,然后确定k值
从图中可以看出,alpha(k)越小时,系数很不稳定,随着k的增大,系数趋于稳定,当k趋近于无穷时,系数趋近于0。
参考:
https://blog.csdn.net/DL11007/article/details/129198295