赞
踩
Lasso算法是一种经典的线性回归算法,被广泛应用于特征选择和降维问题。相较于传统的线性回归算法,Lasso算法能够在保持预测准确性的同时,自动筛选出对目标变量影响较大的特征变量,从而达到降低模型复杂度、提高泛化性能的效果。
其中,Lasso算法作为一种基于L1正则化的稀疏学习方法,能够通过对系数进行惩罚,实现对特征的筛选和压缩,进而达到降维的目的。
本篇文章将介绍基于Lasso算法的降维方法,并利用Python编程实践,来帮助读者深入理解Lasso算法的原理和应用。
本期内容『数据+代码』已上传百度网盘。有需要的朋友可以关注公众号【小Z的科研日常】,后台回复关键词[Lasso降维]获取。
在机器学习模型的开发过程中,最重要的一步就是对数据进行分析和预处理。好的数据预处理能够使模型更加准确地预测结果,提高模型的泛化性能。
本篇文章中使用的数据集是波士顿房价数据集,该数据集包含506个样本和14个特征,其中包括了城镇犯罪率、每栋住宅平均房间数等信息。我们需要对这些信息进行探索性数据分析,并对数据进行必要的预处理操作。
- # 读取数据集
- data = pd.read_csv("HousingData.csv")
- fig, axs = plt.subplots(ncols=7, nrows=2, figsize=(20, 10))
- index = 0
- axs = axs.flatten()
- for k,v in data.items():
- sns.boxplot(y=k, data=data, ax=axs[index])
- index += 1
- plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=5.0)
- fig.savefig('boxplots.png', dpi=300)
运行上述代码后,我们可以使用箱线图对各特征的分布情况进行可视化展示:
从上图可以看出,有几个特征(如ZN、B等)存在异常值或者较大的离群点。因此,在接下来的数据预处理过程中,我们需要对这些异常值进行处理。
然后,我们可以使用直方图对各特征的分布情况进行可视化展示:
- fig, axs = plt.subplots(ncols=7, nrows=2, figsize=(20, 10))
- index = 0
- axs = axs.flatten()
- for k,v in data.items():
- sns.distplot(v, ax=axs[index])
- index += 1
- plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=5.0)
- fig.savefig('density_plots.png', dpi=300)
从上图可以看出,有几个特征(如CRIM、DIS等)呈现出类似于正态分布的形态,而有一些特征(如RAD、TAX等)则呈现出明显的偏态分布。这些分布情况可能会对后续的模型训练产生影响,因此需要在模型训练前对数据进行必要的转换操作。
最后,我们需要检查数据中是否存在缺失值,如果存在,则需要进行填充操作。在本次实验中,我们使用线性插值法对缺失值进行填充,保证填充后的数据与原始数据之间的趋势是相似的。
- if data.isnull().values.any():
- # 对缺失值进行插值法填充
- data = data.interpolate(method='linear', limit_direction='forward')
本篇文章仅对数据进行简要分析,未对异常值进行处理。如需了解异常值检测及处理请关注后续文章。
Lasso算法是一种常用的特征选择方法之一,它通过对目标函数进行正则化,将某些特征的系数压缩为0,从而达到特征选择和降维的效果。
Lasso算法的应用场景非常广泛,比如在图像处理、语音识别、生物信息学等领域都有着广泛的应用。那么,在本次实验中,我们将使用Lasso算法对波士顿房价数据集进行特征选择和降维操作。
首先,我们需要初始化一个LassoCV模型,设置5折交叉验证,并拟合模型:
- # 将数据集分为特征矩阵X和目标变量y
- X = data.drop('MEDV', axis=1)
- y = data['MEDV']
- # 初始化LassoCV模型
- lasso_cv = LassoCV(cv=5)
- # 拟合模型
- lasso_cv.fit(X, y)
- # 获取最佳的alpha值
- best_alpha = lasso_cv.alpha_
然后,我们可以根据得到的最佳alpha值来初始化一个Lasso模型,并拟合模型:
- # 拟合模型
- lasso.fit(X, y)
- # 打印特征系数
- print("Feature weights:")
- for feature, weight in zip(X.columns.values, lasso.coef_):
- print(f"{feature}: {weight}")
- # 绘制特征系数水平柱状图
- fig, ax = plt.subplots(figsize=(8, 6))
- coefficients = pd.Series(lasso.coef_, index=X.columns)
- coefficients.plot(kind="barh", ax=ax)
- ax.set_title("Feature Coefficients - LASSO Regression", fontsize=18)
- ax.set_xlabel("Coefficient Value", fontsize=16)
- ax.set_ylabel("Feature", fontsize=16)
- ax.tick_params(axis="both", labelsize=14)
- plt.tight_layout()
- plt.show()
接下来,我们可以打印出特征系数,并进行可视化展示:
从上图中可以看出,有些特征的系数值为0,这意味着这些特征对模型的预测结果没有太大的贡献。因此,我们可以将这些特征删除,从而达到降维的效果。
通过以上操作,我们成功地使用Lasso算法对波士顿房价数据集进行了特征选择和降维操作。在实际应用中,Lasso算法也可以用于处理高维数据和避免过拟合问题。
本次实验中,我们使用了Lasso算法进行特征选择和降维操作,并将剩余的特征用于训练线性回归模型,从而实现波士顿房价的预测。那么,如何对模型的性能进行评估呢?
我们可以采用均方误差(MSE)和R平方(R2)这两个指标对模型进行评估。其中,MSE表示预测值与真实值之间的差异程度,R2则表示模型的拟合程度。
代码如下:
- # 将数据集分为训练集和测试集
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
-
- # 预测训练集和测试集的输出
- y_train_pred = lasso.predict(X_train)
- y_test_pred = lasso.predict(X_test)
-
- # 计算训练集和测试集的均方误差
- train_mse = ((y_train - y_train_pred) ** 2).mean()
- test_mse = ((y_test - y_test_pred) ** 2).mean()
-
- # 计算训练集和测试集的R平方
- train_r2 = r2_score(y_train, y_train_pred)
- test_r2 = r2_score(y_test, y_test_pred)
-
- # 打印结果
- print(f"Best alpha: {best_alpha:.2f}")
- print("==="*20)
- print(f"Train MSE: {train_mse:.2f}")
- print(f"Test MSE: {test_mse:.2f}")
- print(f"Train R^2: {train_r2:.2f}")
- print(f"Test R^2: {test_r2:.2f}")
最终输出的评估结果为:
MSE: 22.38
R2: 0.69
从上述结果可以看出,该模型的MSE较小,R2接近于1,说明模型预测的性能较好,可以较为准确地预测波士顿房价。同时,我们也发现,在数据预处理和特征选择等环节都需要仔细考虑和调整,才能得到更好的模型性能。
最后,我们可以通过可视化展示来更好地分析模型的结果。下图展示了模型预测结果与真实结果之间的关系:
- sns.set(style="whitegrid", palette="dark")
- plt.rcParams.update({
- 'font.family': 'serif',
- 'font.serif': ['Times New Roman'],
- 'xtick.labelsize': 12,
- 'ytick.labelsize': 12,
- 'axes.labelsize': 14,
- 'axes.grid': True,
- 'grid.alpha': 0.5,
- 'grid.color': 'white'
- })
- # 绘制训练集和测试集的真实值与预测值之间的关系
- fig, ax = plt.subplots(figsize=(8, 6))
- sns.scatterplot(x=y_train, y=y_train_pred, label="Train", ax=ax, s=70, alpha=0.8)
- sns.scatterplot(x=y_test, y=y_test_pred, label="Test", ax=ax, s=70, alpha=0.8)
- sns.lineplot(x=[0, 50], y=[0, 50], color='gray', linestyle='--',linewidth=2.5, ax=ax)
- ax.set_xlabel("True Values", fontsize=16)
- ax.set_ylabel("Predictions", fontsize=16)
- ax.set_title("Lasso Regression - True vs Predicted Values", fontsize=18)
- plt.tight_layout()
- plt.show()
-
从上图中可以看出,预测值与真实值之间有一定的误差,但整体而言,模型能够比较准确地预测波士顿房价。同时,我们也可以通过观察特征系数来进一步分析模型的结果,找出对于房价预测影响最大的特征。
综上所述,本次实验使用Lasso算法进行了特征选择和降维操作,得到了一个较为准确的线性回归模型,预测波士顿房价的效果较好。在实际应用中,我们还可以通过调整模型参数和优化数据预处理等环节,进一步提高模型性能。
感谢您阅读这篇文章,希望对您有所帮助。如果您对机器学习等方面的内容感兴趣,可以关注我的微信公众号[小Z的科研日常],我会持续分享最新的科研日常和应用案例。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。