转自:https://blog.youkuaiyun.com/weixin_43374551/article/details/83688913
一、岭回归
1.参数推导
线性回归模型的目标函数 J ( β ) = ∑ ( y − X β ) 2 J ( β ) = ∑ ( y − X β ) 2 J ( β ) = ∑ ( y − X β ) 2 J(β)=∑(y−Xβ)2J(β)=∑(y−Xβ)2 J(\beta)=\sum(y-X\beta)^2 J(β)=∑(y−Xβ)2J(β)=∑(y−Xβ)2J(β)=∑(y−Xβ)2λ值。
import pandas as pd
import numpy as np
from sklearn import model_selection
from sklearn.linear_model import Ridge
import matplotlib.pyplot as plt
data=pd.read_excel(r’C:\Users\Administrator\Desktop\diabetes.xlsx’)
#拆分为训练集和测试集
predictors=data.columns[:-1]
x_train,x_test,y_train,y_test=model_selection.train_test_split(data[predictors],data.Y,
test_size=0.2,random_state=1234)
#构造不同的lambda值
Lambdas=np.logspace(-5,2,200)
#存放偏回归系数
ridge_cofficients=[]
for Lambda in Lambdas:
ridge=Ridge(alpha=Lambda,normalize=True)
ridge.fit(x_train,y_train)
ridge_cofficients.append(ridge.coef_)
#绘制岭迹曲线
plt.rcParams[‘font.sans-serif’]=[‘Microsoft YaHei’]
plt.rcParams[‘axes.unicode_minus’]=False
plt.style.use(‘ggplot’)
plt.plot(Lambdas,ridge_cofficients)
#x轴做对数处理
plt.xscale(‘log’)
plt.xlabel(‘Log(Lambda)’)
plt.ylabel(‘Cofficients’)
plt.show()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
书上说在0.01附近大多数回归系数就趋于稳定,这哪看得出?所以定性的方法一般不太靠谱,还是用定量的方法吧!
(2)交叉验证法确定
λ
λ
λ
λλ \lambda
λλλλ下交叉验证的评估信息,默认为False,只有cv为None时有效。
import pandas as pd
import numpy as np
from sklearn import model_selection
from sklearn.linear_model import RidgeCV
data=pd.read_excel(r’C:\Users\Administrator\Desktop\diabetes.xlsx’)
#拆分为训练集和测试集
predictors=data.columns[:-1]
x_train,x_test,y_train,y_test=model_selection.train_test_split(data[predictors],data.Y,
test_size=0.2,random_state=1234)
#构造不同的lambda值
Lambdas=np.logspace(-5,2,200)
#设置交叉验证的参数,使用均方误差评估
ridge_cv=RidgeCV(alphas=Lambdas,normalize=True,scoring=‘neg_mean_squared_error’,cv=10)
ridge_cv.fit(x_train,y_train)
print(ridge_cv.alpha_)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
得到的结果是0.135
3.代码实现
Ridge(alpha=1.0, fit_intercept=True, normalize=False, copy_X=True, max_iter=None, tol=0.001, solver=‘auto’, random_state=None)
• alpha:用于指定 λ λ λ λλ \lambda λλλλ值参数,默认为1。
• fit_intercept:bool类型,是否需要拟合截距项,默认为True。
• normalize:bool类型,建模时是否对数据集做标准化处理,默认为False。
• copy_X:bool类型,是否复制自变量X的数值,默认为True。
• max_iter:指定模型的最大迭代次数。
• solver:指定模型求解最优化问题的算法,默认为’auto’。
• random_state:指定随机生成器的种子。
import pandas as pd
import numpy as np
from sklearn import model_selection
from sklearn.linear_model import Ridge,RidgeCV
from sklearn.metrics import mean_squared_error
data=pd.read_excel(r’C:\Users\Administrator\Desktop\diabetes.xlsx’)
data=data.drop([‘AGE’,‘SEX’],axis=1)
#拆分为训练集和测试集
predictors=data.columns[:-1]
x_train,x_test,y_train,y_test=model_selection.train_test_split(data[predictors],data.Y,
test_size=0.2,random_state=1234)
#构造不同的lambda值
Lambdas=np.logspace(-5,2,200)
#设置交叉验证的参数,使用均方误差评估
ridge_cv=RidgeCV(alphas=Lambdas,normalize=True,scoring=‘neg_mean_squared_error’,cv=10)
ridge_cv.fit(x_train,y_train)
#基于最佳lambda值建模
ridge=Ridge(alpha=ridge_cv.alpha_,normalize=True)
ridge.fit(x_train,y_train)
#打印回归系数
print(pd.Series(index=[‘Intercept’]+x_train.columns.tolist(),
data=[ridge.intercept_]+ridge.coef_.tolist()))
#模型评估
ridge_pred=ridge.predict(x_test)
#均方误差
MSE=mean_squared_error(y_test,ridge_pred)
print(MSE)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
二、LASSO回归
1.参数推导
岭回归无法剔除变量,而LASSO回归模型,将惩罚项由L2范数变为L1范数,可以将一些不重要的回归系数缩减为0,达到剔除变量的目的。
KaTeX parse error: Expected 'EOF', got '&' at position 24: …ed text node: '&̲ThickSpace;&Thi…J(β)=∑(y−Xβ)2+λ∣∣β∣∣1=∑(y−Xβ)2+∑λ∣β∣=ESS(β)+λl1(β)其中
E
S
S
(
β
)
=
<
原
文
练
接
/
s
p
a
n
>
ESS(β)=<原文练接/span>
ESS(β)=<原文练接/span>