岭回归与LASSO回归模型

线性回归模型的短板

当自变量个数多于样本量或自变量间存在多重共线性时,将无法根据公式计算回归系数的估计值。

岭回归模型

为了解决多元线性模型中回归参数β存在的不可逆问题,统计学家提出了岭回归模型。
该模型解决问题的思路是在线性模型的目标函数之上添加L2正则项(也称为惩罚项)。

λ值的确定--交叉验证法

'''
交叉验证的基本思想是将原始数据进行分组,一部分做为训练集,另一部分做为验证集。
首先用训练集对分类器进行训练,再利用验证集来测试训练得到的模型,以此来做为评价分类器的性能指标。
多重交叉验证目的是为了让所有的数据都参与模型的构造和模型的验证,从而得到最优的模型。
'''

# 使用方法
RidgeCV(alphas=(0.1, 1.0, 10.0), fit_intercept=True, normalize=False,
scoring=None, cv=None)

alphas:⽤于指定多个lambda值的元组或数组对象,默认该参数包含0.1、1和10三种值。
fit_intercept:bool类型参数,是否需要拟合截距项,默认为True。
normalize:bool类型参数,建模时是否需要对数据集做标准化处理,默认为False。
scoring:指定⽤于评估模型的度量⽅法。
cv:指定交叉验证的重数。

岭回归模型应⽤

寻找最佳的Lambda值

# 导入第三方模块
import pandas as pd
import numpy as np
from sklearn import model_selection
from sklearn.linear_model import Ridge,RidgeCV
import matplotlib.pyplot as plt

# 读取数据集
diabetes = pd.read_excel(r'diabetes.xlsx', sep = '')
# 处理数据,构造自变量
predictors = diabetes.columns[2:-1]

# 将数据集拆分为训练集和测试集
X_train, X_test, y_train, y_test = model_selection.train_test_split(diabetes[predictors], diabetes['Y'],test_size = 0.2, random_state = 1234 )

# 构造不同的Lambda值
Lambdas = np.logspace(-5, 2, 200)

# 岭回归模型的交叉验证
# 设置交叉验证的参数,对于每一个Lambda值,都执行10重交叉验证
ridge_cv = RidgeCV(alphas = Lambdas, normalize=True, scoring='neg_mean_squared_error', cv = 10)
# 模型拟合
ridge_cv.fit(X_train, y_train)
# 返回最佳的lambda值
ridge_best_Lambda = ridge_cv.alpha_
ridge_best_Lambda

基于最佳的Lambda值建模

# 导入第三方包中的函数
from sklearn.metrics import mean_squared_error

# 基于最佳的Lambda值建模
ridge = Ridge(alpha = ridge_best_Lambda, normalize=True)
ridge.fit(X_train, y_train)

# 返回岭回归系数
pd.Series(index = ['Intercept'] + X_train.columns.tolist(),data = [ridge.intercept_] + ridge.coef_.tolist())

# 预测
ridge_predict = ridge.predict(X_test)

# 预测效果验证
RMSE = np.sqrt(mean_squared_error(y_test,ridge_predict))
RMSE	# 越小越好

Lasso回归模型

岭回归模型解决线性回归模型中回归参数β不可逆的办法是添加L2惩罚项,
但缺陷在于始终保留建模时的所有变量,无法降低模型的复杂度。
对于此,Lasso回归采用了L1正则的惩罚项。

LASSO回归模型的交叉验证

LassoCV(alphas=None, fit_intercept=True, normalize=False,max_iter=1000, tol=0.0001)

alphas:指定具体的Lambda值列表⽤于模型的运算
fit_intercept:bool类型参数,是否需要拟合截距项,默认为True
normalize:bool类型参数,建模时是否需要对数据集做标准化处理,默认为False
max_iter:指定模型最⼤的迭代次数,默认为1000次

Lasso回归模型应用

# 导入第三方模块中的函数
from sklearn.linear_model import Lasso,LassoCV

# 构造不同的Lambda值
Lambdas = np.logspace(-5, 2, 200)

# LASSO回归模型的交叉验证
lasso_cv = LassoCV(alphas = Lambdas, normalize=True, cv = 10, max_iter=10000)
# 模型拟合
lasso_cv.fit(X_train, y_train)
# 输出最佳的lambda值
lasso_best_alpha = lasso_cv.alpha_

# 基于最佳的lambda值建模
lasso = Lasso(alpha = lasso_best_alpha, normalize=True, max_iter=10000)
lasso.fit(X_train, y_train)

# 返回LASSO回归的系数
pd.Series(index = ['Intercept'] + X_train.columns.tolist(),data = [lasso.intercept_] + lasso.coef_.tolist())

# 预测
lasso_predict = lasso.predict(X_test)

# 预测效果验证
RMSE = np.sqrt(mean_squared_error(y_test,lasso_predict))
RMSE
posted @ 2020-10-28 00:52  最冷不过冬夜  阅读(974)  评论(0编辑  收藏  举报