岭回归

λ值的确定–可视化法

由于岭回归模型的系数是关于λ值的函数,因此可以通过绘制不同的λ值和对应回归系数的折线图确定合理的λ值。

根据不同的λ值计算相应的回归系数。在Python中,可以使用sklearn子模块linear_model中的Ridge类实现模型系数的求解

通过Ridge“类”完成岭回归模型求解的参数设置,然后基于fit“方法”实现模型偏回归系数的求解

通过Ridge“类”完成岭回归模型求解的参数设置,然后基于fit“方法”实现模型偏回归系数的求解

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:用于指定模型的最大迭代次数

tol:用于指定模型收敛的阈值

solver:用于指定模型求解最优化问题的算法,默认为'auto',表示模型根据数据集自动选择算法

random_state:用于指定随机数生成器的种子
# 构造不同的Lambda值
Lambdas = np.logspace(-5, 2, 200)
# 构造空列表,用于存储模型的偏回归系数
ridge_cofficients = []
# 循环迭代不同的Lambda值
for Lambda in Lambdas:
	ridge = Ridge(alpha = Lambda, 
	normalize=True)
	ridge.fit(X_train, y_train)
	ridge_cofficients.append(ridge.coef_)
# 绘图
plt.plot(Lambdas, ridge_cofficients)

图中的每条折线代表了不同的变量,对于比较突出的喇叭形折线,一般代表该变量存在多重共线性;

交叉验证法确定λ值

实现岭回归模型的k重交叉验证,可以使用sklearn子模块linear_model中的RidgeCV类

RidgeCV(alphas=(0.1, 1.0, 10.0), fit_intercept=True, normalize=False, 
scoring=None, cv=None, gcv_mode=None, store_cv_values=False)

alphas:用于指定多个lambda值的元组或数组对象,默认该参数包含0.1、1和10三种值。

fit_intercept:bool类型参数,是否需要拟合截距项,默认为True。

normalize:bool类型参数,建模时是否需要对数据集做标准化处理,默认为False。

scoring:指定用于评估模型的度量方法。

cv:指定交叉验证的重数。

gcv_mode:用于指定执行广义交叉验证的方法,当样本量大于特征数或自变量矩阵X为稀疏矩阵时,该参数选用'auto';当该参数为'svd'时,表示通过矩阵X的奇异值分解方法执行广义交叉验证;当该参数为'engin'时,则表示通过矩阵X'X的特征根分解方法执行广义交叉验证。

store_cv_values:bool类型参数,是否在每一个Lambda值下都保存交叉验证得到的评估信息,默认为False,只有当参数cv为None时有效。
# 设置交叉验证的参数,对于每一个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
out:
0.013509935211980266
# 基于最佳的Lambda值建模
ridge = Ridge(alpha = ridge_best_alpha, normalize=True)
ridge.fit(X_train, y_train)
# 返回岭回归系数
pd.Series(index = ['Intercept'] + X_train.columns.tolist(),
data = [ridge.intercept_] + ridge.coef_.tolist())

# 导入第三方包中的函数
from sklearn.metrics import mean_squared_error
# 模型的预测
ridge_predict = ridge.predict(X_test)
# 预测效果验证
RMSE = np.sqrt(mean_squared_error(y_test,ridge_predict))
RMSE
out:
53.120889598460927

该值的评判标准是:对于每一个λ值计算平均均方误差(MSE),然后从中
挑选出最小的平均均方误差,并将对应的λ值挑选出来,作为最佳的惩罚项系数λ的值。
通过预测后,使用均方根误差RMSE对模型的预测效果做了定量的统计
值,结果为53.121
对于该统计量,值越小,说明模型对数据的拟合效果越好。

LASSO回归

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

可视化方法确定λ值

通过绘制不同的λ值与回归系数的折线图,然后根据λ值的选择标准,判断
出合理的λ值。由于折现图中涉及LASSO回归模型的系数计算,因此需要介绍sklearn子模块linear_model中的Lasso类

Lasso(alpha=1.0, fit_intercept=True, normalize=False, precompute=False, 
copy_X=True, max_iter=1000, tol=0.0001, warm_start=False, 
positive=False, random_state=None, selection='cyclic')

alpha:用于指定lambda值的参数,默认该参数为1
fit_intercept:bool类型参数,是否需要拟合截距项,默认为True

normalize:bool类型参数,建模时是否需要对数据集做标准化处理,默认为False

precompute:bool类型参数,是否在建模前通过计算Gram矩阵提升运算速度,默认为False

copy_X:bool类型参数,是否复制自变量X的数值,默认为True

max_iter:用于指定模型的最大迭代次数,默认为1000

tol:用于指定模型收敛的阈值,默认为0.0001。

warm_start:bool类型参数,是否将前一次的训练结果用作后一次的训练,默认为False。

positive:bool类型参数,是否将回归系数强制为正数,默认为False。

random_state:用于指定随机数生成器的种子。

selection:指定每次迭代时所选择的回归系数,如果为'random',表示每次迭代中将随机更新回归系数;如果为'cyclic',则表示每次迭代时回归系数的更新都基于上一次运算

交叉验证法确定λ值

LassoCV(eps=0.001, n_alphas=100, alphas=None, fit_intercept=True, normalize=False, 
precompute='auto', max_iter=1000, tol=0.0001, copy_X=True, cv=None,
verbose=False, n_jobs=1, positive=False, random_state=None,
selection='cyclic')

eps:指定正则化路径长度,默认为0.001,指代Lambda的最小值与最大值之商

n_alphas:指定正则项系数Lambda的个数,默认为100个

alphas:指定具体的Lambda值列表用于模型的运算

fit_intercept:bool类型参数,是否需要拟合截距项,默认为True

normalize:bool类型参数,建模时是否需要对数据集做标准化处理,默认为False

precompute:bool类型参数,是否在建模前,通过计算Gram矩阵提升运算速度,默认为False

max_iter:指定模型最大的迭代次数,默认为1000次

tol:用于指定模型收敛的阈值,默认为0.001

copy_X:bool类型参数,是否复制自变量X的数值,默认为True

cv:指定交叉验证的重数

verbose:bool类型参数,是否返回模型运行的详细信息,默认为False

n_jobs:指定交叉验证过程中使用的CPU数量,即是否需要并行处理,默认为1表示不并行运行,如果为-1,表示将所有的CPU用于交叉验证的运算

positive:bool类型参数,是否将回归系数强制为正数,默认为False

random_state:用于指定随机数生成器的种子

selection:指定每次迭代时所选择的回归系数,如果为'random',表示每次迭代中将随机更新回归系数;如果为'cyclic',则表示每次迭代时回归系数的更新都基于上一次运算

应用

# 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_
lasso_best_alpha

out:
0.062949889902218878
# 基于最佳的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
out:
53.048714552744023