当前位置:   article > 正文

Python套索回归lasso、SCAD、LARS分析棒球运动员薪水3个实例合集|附数据代码

Python套索回归lasso、SCAD、LARS分析棒球运动员薪水3个实例合集|附数据代码

全文链接:https://tecdat.cn/?p=35585

数据科学和机器学习领域,回归分析是一种强大的工具,用于探索变量之间的关系并预测未来的结果。其中,套索回归(Lasso Regression)是一种线性回归方法,特别适用于解决高维数据和过拟合问题。它通过引入正则化项来限制模型复杂度,从而在保持模型预测能力的同时,降低模型的方差点击文末“阅读原文”获取完整代码数据)。

相关视频

本文3个实例合集旨在通过实例帮助客户展示Python中套索回归的应用,特别是针对棒球运动员薪水数据的预测。我们将通过详细的代码和数据集,展示如何使用套索回归来分析和预测棒球运动员的薪水。此外,我们还将引入其他两种相关的回归技术——SCAD(Smoothly Clipped Absolute Deviation)和LARS(Least Angle Regression),以便读者能够更全面地了解线性回归模型的不同变体。

SCAD是一种具有平滑绝对偏差惩罚项的回归方法,它在处理高维数据时能够提供更好的模型解释性和预测性能。而LARS则是一种基于最小角回归的算法,它在选择特征时能够考虑特征之间的相关性,从而避免选择高度相关的特征。

1.Python套索回归lasso分析棒球运动员薪水

数据

该数据集包含20个变量和322个观察值,涉及大联盟球员的数据查看文末了解数据免费获取方式。我们希望基于球员上一年度的各种统计数据来预测棒球运动员的薪水。

e84591127b180ca9976eed9af39492f3.png

导入

492b96f1e314522435977416259e9c80.png

缺失值

请注意,有些球员的薪水数据是缺失的:

06a91973df0fb5b916e96fe0ecbf7626.png

我们简单地删除了缺失的案例:

  1. # 删除缺失案例
  2. df = df.dropna()

创建标签和特征

因为我们将使用scikit learn中的套索算法,所以我们需要将我们的分类特征编码为独热编码数值特征(哑变量):

dummies = pd.get_dummies(df[['League', 'Division','NewLeague']])

da175dae830890520c2e155b37e5c314.png

5381f9519215bd413fb54fb49fe9e26e.png 接下来,我们创建标签y:

我们删除包含结果变量(Salary)的列,以及已经创建了哑变量的分类列:

X_numerical = df.drop(['Salary', 'League', 'Division', 'NewLeague'], axis=1).astype('float64')

列出所有数值特征(稍后需要用到):

beab8caae3a31728b850cf6a33c60d51.png

  1. # 创建所有特征
  2. X = pd.concat([X_numerical, dummies[['League_N', 'Division_W', 'NewLeague_N']]], axis=1)

7650cf0ec79815e65b3e18f6b4a42745.png

数据划分

将数据集划分为训练集和测试集,其中前70%的数据用于训练,剩余的30%用于测试。

b88c408618013ea5bb775deb9dac54fa.png

标准化

Lasso回归在所有数值特征都围绕0中心化且方差在同一量级时表现最佳。如果一个特征的方差比其他特征大几个数量级,它可能会主导目标函数,导致估计器无法如预期那样从其他特征中正确学习。

这意味着标准化我们的特征很重要。我们通过从观测值中减去均值,然后除以标准差来实现这一点。所谓的标准分数(z-score)对于观测值x的计算公式如下:

ff5613026020c00a5ebdb0292c389854.png

其中:

  • x 是特征中的一个观测值

  • μ 是该特征的均值

  • s 是该特征的标准差

为了避免数据泄漏,数值特征的标准化应始终在数据划分之后进行,并且仅使用训练数据。此外,我们从训练数据中获取特征所需的所有统计信息(均值和标准差),并在测试数据上使用它们。注意,我们不标准化哑变量(它们只取0或1的值)。

X_train[list_numerical] = scaler.transform(X_train[list_numerical])

1d2d5ddb501ad2fdf930ee19992b78fb.png

Lasso回归

首先,我们在训练集上应用Lasso回归,并任意选择一个正则化参数α为1。

模型评估

我们打印训练集和测试集的R²分数。

96f487db7785b83978ea9d16a5302d9d.png

接着计算训练集和测试集的均方误差(MSE)。

mse_train = mean_squared_error(y_train, pred_train)

这些指标帮助我们了解模型在训练集和测试集上的性能。通常,我们希望看到R²分数在测试集上接近训练集,并且均方误差尽可能小。然而,在实际应用中,模型往往会在训练集上表现更好,这可能是由于过拟合。因此,我们需要仔细调整正则化参数α,以找到模型复杂度和泛化能力之间的最佳平衡。

1ce28a02c4a9f25f068733c734d7a293.png

α的作用

为了更好地理解α的作用,我们绘制了lasso系数随α变化的图形(max_iter是最大迭代次数):

  1. coefs.append(lasso.coef_)
  2. ax = plt.gca()

7cf709cabfa44e51a8c1a10fd48ebc43.png

请注意,如果α=0,那么lasso将给出最小二乘拟合,而当α变得非常大时,lasso将给出所有系数估计都等于零的空模型。


点击标题查阅往期内容

8fc3e14e44d894c19785439d566a33b4.png

R语言lasso协变量改进Logistic逻辑回归对特发性黄斑前膜因素交叉验证可视化分析

outside_default.png

左右滑动查看更多

outside_default.png

01

fcaffb87ec37963c180306bb8f910796.png

02

1ca8d08550e08633c113a8223ab1fe6b.png

03

3ef4b3aa7d953756648bc9bcdd7d8e7b.png

04

64ba401d8492df19e10ac570ce047e87.png

从图形的左侧到右侧,我们观察到最初lasso模型包含许多预测器,并且系数估计的绝对值很大。随着α的增加,系数估计逐渐趋近于零。

接下来,我们使用交叉验证来找到α的最佳值。

使用最佳α值的Lasso回归

为了找到α的最佳值,我们使用scikit-learn的Lasso线性模型进行迭代拟合,同时沿着正则化路径进行交叉验证(LassoCV)。最佳模型是通过交叉验证选择的。

k折交叉验证

显示交叉验证选择的最佳惩罚值:

  1. python复制代码
  2. model.alpha_

1e4c33e416e01187df3967bc362fbf0b.png

最佳模型

使用最佳α值构建最终模型:

lasso_best.fit(X_train, y_train)

b0d5e8f27b0d72287db51c94ab2e49b5.png

显示模型系数和名称:

  1. # 获取最佳模型的系数
  2. coef = lasso_best.coef_
  3. # 将系数和特征名称结合起来
  4. # 显示特征及其对应系数
  5. print(feature_coef.sort_values())

请注意,上面的代码片段假设您有一个包含特征名称的DataFrame X_df。在实际应用中,您需要将X_train转换为DataFrame(如果它不是的话),并指定相应的列名。然后,您可以创建一个Series对象,将系数与特征名称关联起来,并按值排序来显示哪些特征对模型的影响最大。如果X_train已经是DataFrame并且包含列名,那么您可以直接使用这些列名。如果X_train是NumPy数组,则需要手动创建一个包含特征名称的列表。

9fc73b53489a54c972159c844f55a76a.png

模型评估

为了评估模型的性能,我们可以使用训练集和测试集的R平方分数(决定系数),以及均方误差(Mean Squared Error, MSE)。

这将显示模型在训练集和测试集上的拟合程度。R平方分数越接近1,表示模型的拟合效果越好。

均方误差(MSE)是预测值与真实值之间差异的平方的平均值,它可以帮助我们了解模型预测的错误程度。MSE值越小,说明模型的预测能力越强。

此外,为了更深入地了解模型选择过程,我们还可以绘制Lasso路径图,该图展示了交叉验证过程中不同alpha值对应的均方误差。这有助于我们理解alpha参数如何影响模型的复杂度以及预测性能。

  1. python复制代码
  2. # 绘制Lasso路径图
  3. plt.plot(alphas, coefs.T, '-')

这段代码将生成一个图表,展示随着alpha值的变化,各特征的系数是如何变化的。通过此图,我们可以更直观地理解正则化强度对模型系数的影响,以及哪些特征在模型中更重要。

请注意,绘制Lasso路径图可能需要安装额外的库,如matplotlib,并确保你的环境中有这些库。此外,上面的代码示例假设你已经拟合了LassoCV模型,并将其存储在变量model中。如果你的模型变量名称不同,请相应地替换。

  1. plt.axvline(
  2. model.alpha_, linestyle="--", color="k", label="alpha: CV

5647ef69c2ade1234c0ae4cca5fc9c44.png

2.Python高维统计建模变量选择:SCAD平滑剪切绝对偏差惩罚、Lasso惩罚函数比较

变量选择是高维统计建模的重要组成部分。许多流行的变量选择方法,例如 LASSO,都存在偏差。带平滑削边绝对偏离(smoothly clipped absolute deviation,SCAD)正则项的回归问题或平滑剪切绝对偏差 (SCAD) 估计试图缓解这种偏差问题,同时还保留了稀疏性的连续惩罚。

惩罚最小二乘法

一大类变量选择模型可以在称为“惩罚最小二乘法”的模型族下进行描述。这些目标函数的一般形式是

b00ce2632bdf4c827ef4635c3481c7aa.png

其中 ea9dd39d0d35d5d31437d4bf879b4ec9.png 是设计矩阵, 82b59791da3d8e0dafa68e27a7421669.png 是因变量的向量, 8c8e04cadb7d1fec8768ceae08a4291c.png 是系数的向量,1a3a024a103c4a700b524c21a7696343.png 是由正则化参数索引的惩罚函数 88d4c3f448a7fe345ae312cd7dd389f2.png.

作为特殊情况,请注意 LASSO 对应的惩罚函数为 b7deeda93d4c9048b16b568369080d8f.png,而岭回归对应于 b6b9aeab681d5dbbd74daa67a747e73f.png. 回想下面这些单变量惩罚的图形形状。

a78e6f9d9da613e9c31f804955a3e7d3.jpeg

SCAD

Fan和Li(2001)提出的平滑剪切绝对偏差(SCAD)惩罚,旨在鼓励最小二乘法问题的稀疏解,同时也允许大值的 β
. SCAD惩罚是一个更大的系列,被称为 "折叠凹陷惩罚",它在以下方面是凹的, R+ 和 R-
. 从图形上看,SCAD 惩罚如下所示:

501c2e154062da77f95dbe0cb971f943.jpeg

有点奇怪的是,SCAD 惩罚通常主要由它的一阶导数定义 38394404261118921c5ac1714242b1b6.png, 而不是 4e96df0eebffb3dc38c87bb79f481d14.png. 它的导数是

17792d3e110211f28c93c39e07f15371.png

其中 a 是一个可调参数,用于控制 β 值的惩罚下降的速度,以及函数 191def418f97284bbf8e41aa6c115bff.png 等于 a97b26b4998c4ada72db091d1916cd27.png 如果 658eb41b5489fd70f327f4de2999344b.png, 否则为 0。

我们可以通过分解惩罚函数在不同数值下的导数来获得一些洞察力 λ:

0e221d30daca160aeaceedce1cb58010.png

对于较大的 β 值 (其中 748d8b19d06c1d484b45dfe2aa805ce2.png),惩罚对于 β 是恒定的。换句话说,在 β 变得足够大之后,β 的较高值 不会受到更多的惩罚。这与 LASSO 惩罚形成对比,后者具有关于 |β|的单调递增惩罚:

b34f1cf5bde172b7264920b3a5c971bf.png

但是,这意味着对于大系数值,他们的 LASSO 估计将向下偏置。

另一方面,对于较小的 β 值 (其中 |β|≤λ),SCAD 惩罚在 β 中是线性的。对于 β 的中等值(其中 6462ba8089ebfbd2dcbc7733a4608f53.png),惩罚是二次的。

分段定义,pλ(β) 是

68d2fbc9934678e1558218ed8f12cda9.png

在 Python 中,SCAD 惩罚及其导数可以定义如下:

  1. def scad:
  2. s_lar
  3. iudic =np.lgicand
  4. iscsat = (vl * laval) < np.abs
  5. lie_prt = md_val * pab* iliear
  6. return liprt + urtirt + cosaat

使用 SCAD 拟合模型

拟合惩罚最小二乘模型(包括 SCAD 惩罚模型)的一种通用方法是使用局部二次近似。这种方法相当于在初始点 β0 周围拟合二次函数 q(β),使得近似:

  • 关于 0 对称,

  • 满足 q(β0)=pλ(|β0|),

  • 满足 q ′ (β0) = p′λ (| β0 |)。

因此,逼近函数必须具有以下形式

e4f70a5dcf6dbc5ba48463e2be02ee97.png

对于不依赖于 β 的系数 a 和 b 。上面的约束为我们提供了一个可以求解的两个方程组:

4cdafacdb84bed33e66107c7200e22fc.png

为了完整起见,让我们来看看解决方案。重新排列第二个方程,我们有

a84fc109533d05b783abf96c422f2d88.png

将其代入第一个方程,我们有

5e5618922efa31e2c342516b40f74651.png

因此,完整的二次方程是

01e222d5e7970320ebcc31e66a4e6de9.png

现在,对于系数值的任何初始猜测 β0,我们可以使用上面的 q 构造惩罚的二次估计。然后,与初始 SCAD 惩罚相比,找到此二次方的最小值要容易得多。

从图形上看,二次近似如下所示:

e353c333b4f45643e8d8d84b676f6384.png

将 SCAD 惩罚的二次逼近代入完整的最小二乘目标函数,优化问题变为:

a113bb3f432a2861eb38553da7aa2c1f.png

忽略不依赖于 β 的项,这个最小化问题等价于

dd241e9037c24081b98b8e6353de3731.png

巧妙地,我们可以注意到这是一个岭回归问题,其中 

59a9504ab670475f24246575616d4e77.png

d63bfea162baf0ed11ce65d6010ef3d7.png

回想一下, 岭回归 是

d0f57ceebb52cb8c94a010547404bed2.png

这意味着近似的 SCAD 解是

055080626d07fcedf4e2bf66a04c75ba.png


3.Python中的Lasso回归之最小角算法LARS

假设我们期望因变量由潜在协变量子集的线性组合确定。然后,LARS算法提供了一种方法,可用于估计要包含的变量及其系数。
LARS解决方案没有给出矢量结果,而是由一条曲线组成,该曲线表示针对参数矢量L1范数的每个值的解决方案。该算法类似于逐步回归,但不是在每个步骤中都包含变量,而是在与每个变量的相关性与残差相关的方向上增加了估计的参数。

优点:

1.计算速度与逐步回归一样快。
2.它会生成完整的分段线性求解路径,这在交叉验证或类似的模型调整尝试中很有用。
3.如果两个变量与因变量几乎同等相关,则它们的系数应以大致相同的速率增加。该算法因此更加稳定。
4.可以轻松对其进行修改为其他估算模型(例如LASSO)提供解决方案。
5.在p  >>  n的情况下有效  (即,当维数明显大于样本数时)。

缺点:

1.因变量中有任何数量的噪声,并且自变量具有 多重共线性 ,无法确定选定的变量很有可能成为实际的潜在因果变量。这个问题不是LARS独有的,因为它是变量选择方法的普遍问题。但是,由于LARS基于残差的迭代拟合,因此它似乎对噪声的影响特别敏感。
2.由于现实世界中几乎所有高维数据都会偶然地在某些变量上表现出一定程度的共线性,因此LARS具有相关变量的问题可能会限制其在高维数据中的应用。

Python代码:

  1. import matplotlib.pyplot as plt # 绘图
  2. diabetes

查看数据 

7a5ddd9d4aef9e1dcbf86caf7cbf7eda.png

  1. x /= np.sqrt(np.sum((x)**2, axis=0)) # 归一化 x
  2. lars.steps() # 执行的步骤数
  3. est = lars.est() # 返回所有LARS估算值
  4. plt.show()

7c61be9ffa08114477868dc16e709751.png

数据获取

在公众号后台回复“棒球运动员”,可免费获取完整数据。


26ef9355c8b4a3d25edfa57a843b923c.jpeg

本文中分析的数据分享到会员群,扫描下面二维码即可加群!

1e2aad2897ab35bab88e30df18d2a364.png

ea62c5bccea7ed6b21862145cffc27ce.jpeg

点击文末“阅读原文”

获取全文完整代码数据资料。

本文选自《Python套索回归lasso、SCAD、LARS分析棒球运动员薪水3个实例合集》。

9ceff065c42142842d253a07f5e050b1.jpeg

5e1b26fc73ce714bded78643806fb0fe.png

点击标题查阅往期内容

R语言Bootstrap的岭回归和自适应LASSO回归可视化

R语言Lasso回归模型变量选择和糖尿病发展预测模型

R语言实现贝叶斯分位数回归、lasso和自适应lasso贝叶斯分位数回归分析

基于R语言实现LASSO回归分析

R语言用LASSO,adaptive LASSO预测通货膨胀时间序列

R语言自适应LASSO 多项式回归、二元逻辑回归和岭回归应用分析

R语言惩罚logistic逻辑回归(LASSO,岭回归)高维变量选择的分类模型案例

Python中的Lasso回归之最小角算法LARS

r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现

r语言中对LASSO回归,Ridge岭回归和Elastic Net模型实现

R语言实现LASSO回归——自己编写LASSO回归算法

R使用LASSO回归预测股票收益

python使用LASSO回归预测股票收益

c6373b86b706eb5cf3847b4ce96803db.png

93c56513637a0da384ca8af380250423.jpeg

f9caab95033b43e0b11fda0e255ec5e1.png

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号