lasso回归_写给初学者的LASSO回归

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 19:16   1477   0
e55ab0f0e9acadfb737db176ef7570ad.png

LASSO回归是对回归算法正则化的一个例子。正则化是一种方法,它通过增加额外参数来解决过拟合问题,从而减少模型的参数、限制复杂度。正则化线性回归最常用的三种方法是岭回归、最小绝对值收敛和选择算子(LASSO)以及弹性网络回归。

在本文中,我将重点介绍LASSO,并且对岭回归和弹性网络回归做简单的扩展。

假设我们想在一个数据集上建立一个正则化回归模型,这个数据集包含n个观察和m个特征。

LASSO回归是一个L1惩罚模型,我们只需将L1范数添加到最小二乘的代价函数中:

df0beafd357dc591ae4d2890fbaae119.png

看这里

d5d941a2ac2b2d47be1ab64cf96a6f35.png

通过增大超参数α的值,我们加强了模型的正则化强度,并降低了模型的权重。请注意,没有把截距项w0正则化,还要注意α=0对应于标准回归。

通过调整正则化的强度,某些权重可以变为零,这使得LASSO方法成为一种非常强大的降维技巧。

LASSO算法

  • 对于给定的α,只需把代价函数最小化,即可找到权重或模型参数w。
  • 然后使用下面的等式计算w(不包括w0)的范数:
6df8b1dec2fa4d222545aa4db9ac9a75.png

案例研究:使用游轮数据集预测船员人数

我们将使用邮轮数据集cruise_ship_info.csv来演示LASSO技术

本案例已经发布在实验平台,请关注微信公众号:老齐教室。并回复: #姓名+手机号+案例# 获取。 注意: # 必须要有

1.导入必要的库

import numpy as npimport pandas as pdimport matplotlib.pyplot as plt

2.读取数据集并显示列

df = pd.read_csv("cruise_ship_info.csv")df.head()
c25ad3dd7b9292ac3ff7769c4dac6381.png

3.选择重要的变量

从《数据准备和特征工程》中的有关阐述可知,协方差矩阵图可用于特征选择和降维。从前述数据集中发现,在6个预测特征( [‘age’, ‘tonnage’, ‘passengers’, ‘length’, ‘cabins’, ‘passenger_density’] )中,如果我们假设重要特征与目标变量的相关系数为0.6或更大,那么目标变量“crew”与4个预测变量“tonnage”, “passengers”, “length, and “cabins”的相关性很强。因此,我们能够将特征空间的维数从6减少到4。

cols_selected = ['Tonnage', 'passengers', 'length', 'cabins','crew']df[cols_selected].head()
7e28564a9b123640db7faeb390af7f1b.png
X = df[cols_selected].iloc[:,0:4].values    # features matrix y = df[cols_selected]['crew'].values        # target variable

4. 实现LASSO回归

a.将数据集分成训练集和测试集

from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split( X, y,                                       test_size=0.4, random_state=0)

b.特征数据区间化

from sklearn.preprocessing import StandardScalersc_y = StandardScaler()sc_x = StandardScaler()y_std = sc_y.fit_transform(y_train[:, np.newaxis]).flatten()X_train_std = sc_x.fit_transform(X_train)X_test_std = sc_x.transform(X_test)y_train_std = sc_y.fit_transform(y_train[:, np.newaxis]).flatten()

c.实现LASSO回归

from sklearn.linear_model import Lassofrom sklearn.metrics import r2_scorealpha = np.linspace(0.01,0.4,10)r2_train =[]r2_test =[]norm = []alpha = np.linspace(0.01,0.4,10)for i in range(10):    lasso = Lasso(alpha = alpha[i])    lasso.fit(X_train_std,y_train_std)    y_train_std = lasso.predict(X_train_std)    y_test_std = lasso.predict(X_test_std)    r2_train = np.append(r2_train,              r2_score(y_train,sc_y.inverse_transform(y_train_std)))    r2_test = np.append(r2_test,              r2_score(y_test,sc_y.inverse_transform(y_test_std)))    norm = np.append(norm,np.linalg.norm(lasso.coef_))

d.可视化结果

plt.figure(figsize=(8,6))plt.scatter(alpha,r2_train,label='r2_train')plt.plot(alpha,r2_train)plt.scatter(alpha,r2_test,label='r2_test')plt.plot(alpha,r2_test)plt.scatter(alpha,norm,label = 'norm')plt.plot(alpha,norm)plt.ylim(-0.1,1)plt.xlim(0,.43)plt.xlabel('alpha', size = 14)plt.ylabel('R2_score',size = 14)plt.legend()plt.show()
43e4aa6ac555e5ac8a7aa5d2002c5f5a.png

我们观察到,随着正则化参数α的增加,回归系数的范数变得越来越小。这意味着更多的回归系数被强制为零,这会增加偏差(模型过度简化)。α保持较低值时,比如α=0.1或更低时,是偏差和方差的最佳平衡点。在决定使用哪种降维方法之前,应将该方法与主成分分析法(PCA)进行比较。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP