当前位置:   article > 正文

如何使用Lasso算法降维?_lassocv

lassocv

1、引言

Lasso算法是一种经典的线性回归算法,被广泛应用于特征选择和降维问题。相较于传统的线性回归算法,Lasso算法能够在保持预测准确性的同时,自动筛选出对目标变量影响较大的特征变量,从而达到降低模型复杂度、提高泛化性能的效果。

其中,Lasso算法作为一种基于L1正则化的稀疏学习方法,能够通过对系数进行惩罚,实现对特征的筛选和压缩,进而达到降维的目的。

本篇文章将介绍基于Lasso算法的降维方法,并利用Python编程实践,来帮助读者深入理解Lasso算法的原理和应用。

本期内容『数据+代码』已上传百度网盘。有需要的朋友可以关注公众号【小Z的科研日常】,后台回复关键词[Lasso降维]获取

2、数据分析和数据预处理

在机器学习模型的开发过程中,最重要的一步就是对数据进行分析和预处理。好的数据预处理能够使模型更加准确地预测结果,提高模型的泛化性能。

本篇文章中使用的数据集是波士顿房价数据集,该数据集包含506个样本和14个特征,其中包括了城镇犯罪率、每栋住宅平均房间数等信息。我们需要对这些信息进行探索性数据分析,并对数据进行必要的预处理操作。

  1. # 读取数据集
  2. data = pd.read_csv("HousingData.csv")
  3. fig, axs = plt.subplots(ncols=7, nrows=2, figsize=(20, 10))
  4. index = 0
  5. axs = axs.flatten()
  6. for k,v in data.items():
  7. sns.boxplot(y=k, data=data, ax=axs[index])
  8. index += 1
  9. plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=5.0)
  10. fig.savefig('boxplots.png', dpi=300)

运行上述代码后,我们可以使用箱线图对各特征的分布情况进行可视化展示:

 

从上图可以看出,有几个特征(如ZN、B等)存在异常值或者较大的离群点。因此,在接下来的数据预处理过程中,我们需要对这些异常值进行处理。

然后,我们可以使用直方图对各特征的分布情况进行可视化展示:

  1. fig, axs = plt.subplots(ncols=7, nrows=2, figsize=(20, 10))
  2. index = 0
  3. axs = axs.flatten()
  4. for k,v in data.items():
  5. sns.distplot(v, ax=axs[index])
  6. index += 1
  7. plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=5.0)
  8. fig.savefig('density_plots.png', dpi=300)

 

从上图可以看出,有几个特征(如CRIM、DIS等)呈现出类似于正态分布的形态,而有一些特征(如RAD、TAX等)则呈现出明显的偏态分布。这些分布情况可能会对后续的模型训练产生影响,因此需要在模型训练前对数据进行必要的转换操作。

最后,我们需要检查数据中是否存在缺失值,如果存在,则需要进行填充操作。在本次实验中,我们使用线性插值法对缺失值进行填充,保证填充后的数据与原始数据之间的趋势是相似的。

  1. if data.isnull().values.any():
  2. # 对缺失值进行插值法填充
  3. data = data.interpolate(method='linear', limit_direction='forward')

本篇文章仅对数据进行简要分析,未对异常值进行处理。如需了解异常值检测及处理请关注后续文章。

3、基于Lasso算法的降维

Lasso算法是一种常用的特征选择方法之一,它通过对目标函数进行正则化,将某些特征的系数压缩为0,从而达到特征选择和降维的效果。

Lasso算法的应用场景非常广泛,比如在图像处理、语音识别、生物信息学等领域都有着广泛的应用。那么,在本次实验中,我们将使用Lasso算法对波士顿房价数据集进行特征选择和降维操作。

首先,我们需要初始化一个LassoCV模型,设置5折交叉验证,并拟合模型:

  1. # 将数据集分为特征矩阵X和目标变量y
  2. X = data.drop('MEDV', axis=1)
  3. y = data['MEDV']
  4. # 初始化LassoCV模型
  5. lasso_cv = LassoCV(cv=5)
  6. # 拟合模型
  7. lasso_cv.fit(X, y)
  8. # 获取最佳的alpha值
  9. best_alpha = lasso_cv.alpha_

然后,我们可以根据得到的最佳alpha值来初始化一个Lasso模型,并拟合模型:

  1. # 拟合模型
  2. lasso.fit(X, y)
  3. # 打印特征系数
  4. print("Feature weights:")
  5. for feature, weight in zip(X.columns.values, lasso.coef_):
  6. print(f"{feature}: {weight}")
  7. # 绘制特征系数水平柱状图
  8. fig, ax = plt.subplots(figsize=(8, 6))
  9. coefficients = pd.Series(lasso.coef_, index=X.columns)
  10. coefficients.plot(kind="barh", ax=ax)
  11. ax.set_title("Feature Coefficients - LASSO Regression", fontsize=18)
  12. ax.set_xlabel("Coefficient Value", fontsize=16)
  13. ax.set_ylabel("Feature", fontsize=16)
  14. ax.tick_params(axis="both", labelsize=14)
  15. plt.tight_layout()
  16. plt.show()

接下来,我们可以打印出特征系数,并进行可视化展示:

 

从上图中可以看出,有些特征的系数值为0,这意味着这些特征对模型的预测结果没有太大的贡献。因此,我们可以将这些特征删除,从而达到降维的效果。

通过以上操作,我们成功地使用Lasso算法对波士顿房价数据集进行了特征选择和降维操作。在实际应用中,Lasso算法也可以用于处理高维数据和避免过拟合问题。

4、模型评估和结果分析

本次实验中,我们使用了Lasso算法进行特征选择和降维操作,并将剩余的特征用于训练线性回归模型,从而实现波士顿房价的预测。那么,如何对模型的性能进行评估呢?

我们可以采用均方误差(MSE)和R平方(R2)这两个指标对模型进行评估。其中,MSE表示预测值与真实值之间的差异程度,R2则表示模型的拟合程度。

代码如下:

  1. # 将数据集分为训练集和测试集
  2. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
  3. # 预测训练集和测试集的输出
  4. y_train_pred = lasso.predict(X_train)
  5. y_test_pred = lasso.predict(X_test)
  6. # 计算训练集和测试集的均方误差
  7. train_mse = ((y_train - y_train_pred) ** 2).mean()
  8. test_mse = ((y_test - y_test_pred) ** 2).mean()
  9. # 计算训练集和测试集的R平方
  10. train_r2 = r2_score(y_train, y_train_pred)
  11. test_r2 = r2_score(y_test, y_test_pred)
  12. # 打印结果
  13. print(f"Best alpha: {best_alpha:.2f}")
  14. print("==="*20)
  15. print(f"Train MSE: {train_mse:.2f}")
  16. print(f"Test MSE: {test_mse:.2f}")
  17. print(f"Train R^2: {train_r2:.2f}")
  18. print(f"Test R^2: {test_r2:.2f}")

最终输出的评估结果为:

MSE: 22.38

R2: 0.69

从上述结果可以看出,该模型的MSE较小,R2接近于1,说明模型预测的性能较好,可以较为准确地预测波士顿房价。同时,我们也发现,在数据预处理和特征选择等环节都需要仔细考虑和调整,才能得到更好的模型性能。

最后,我们可以通过可视化展示来更好地分析模型的结果。下图展示了模型预测结果与真实结果之间的关系:

  1. sns.set(style="whitegrid", palette="dark")
  2. plt.rcParams.update({
  3. 'font.family': 'serif',
  4. 'font.serif': ['Times New Roman'],
  5. 'xtick.labelsize': 12,
  6. 'ytick.labelsize': 12,
  7. 'axes.labelsize': 14,
  8. 'axes.grid': True,
  9. 'grid.alpha': 0.5,
  10. 'grid.color': 'white'
  11. })
  12. # 绘制训练集和测试集的真实值与预测值之间的关系
  13. fig, ax = plt.subplots(figsize=(8, 6))
  14. sns.scatterplot(x=y_train, y=y_train_pred, label="Train", ax=ax, s=70, alpha=0.8)
  15. sns.scatterplot(x=y_test, y=y_test_pred, label="Test", ax=ax, s=70, alpha=0.8)
  16. sns.lineplot(x=[0, 50], y=[0, 50], color='gray', linestyle='--',linewidth=2.5, ax=ax)
  17. ax.set_xlabel("True Values", fontsize=16)
  18. ax.set_ylabel("Predictions", fontsize=16)
  19. ax.set_title("Lasso Regression - True vs Predicted Values", fontsize=18)
  20. plt.tight_layout()
  21. plt.show()

 

从上图中可以看出,预测值与真实值之间有一定的误差,但整体而言,模型能够比较准确地预测波士顿房价。同时,我们也可以通过观察特征系数来进一步分析模型的结果,找出对于房价预测影响最大的特征。

综上所述,本次实验使用Lasso算法进行了特征选择和降维操作,得到了一个较为准确的线性回归模型,预测波士顿房价的效果较好。在实际应用中,我们还可以通过调整模型参数和优化数据预处理等环节,进一步提高模型性能。

感谢您阅读这篇文章,希望对您有所帮助。如果您对机器学习等方面的内容感兴趣,可以关注我的微信公众号[小Z的科研日常],我会持续分享最新的科研日常和应用案例。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/598929
推荐阅读
  

闽ICP备14008679号