案例介绍
在这个案例中,我们将使用波士顿房屋数据集来演示Lasso回归的应用。波士顿房屋数据集包含了对波士顿不同地区房屋价格的预测因素,如犯罪率、房产税率等,以及对应地区的房屋价格中位数。
我们的目标是使用Lasso回归算法来建立一个预测模型,通过输入特征预测房屋价格中位数。
算法原理
Lasso回归是一种线性回归的扩展方法,它通过加入L1正则化项来进行特征选择和模型参数的压缩。Lasso回归的优化目标函数如下:
$$
\text{minimize} \left( \sum_{i=1}^{n} (y_i – \hat{y}_i)^2 + \alpha \sum_{j=1}^{p} |\beta_j| \right)
$$
其中,$n$ 是样本数量,$p$ 是特征数量,$y_i$ 是实际观测值,$\hat{y}_i$ 是预测值,$\beta_j$ 是模型参数(系数),$\alpha$ 是L1正则化项的权重。
L1正则化项通过在优化过程中将某些模型参数变为0来实现特征选择的作用。较大的 $\alpha$ 值将更多的系数压缩到零,从而选择出更少的特征。较小的 $\alpha$ 值将保留更多的特征。
数据集
我们将使用 sklearn
提供的波士顿房屋数据集。这个数据集包含 506 个样本和 13 个特征。每个样本都有一个房屋价格中位数作为标签。
计算步骤
- 导入数据集并进行数据预处理。
- 拆分数据集为训练集和测试集。
- 初始化Lasso回归模型,并训练模型。
- 评估模型在测试集上的性能。
- 可选:调整超参数来改善模型性能。
Python代码示例
# 导入需要的库和模块
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Lasso
from sklearn.metrics import mean_squared_error
import numpy as np
import matplotlib.pyplot as plt
# 加载波士顿房屋数据集
data = load_boston()
X = data.data
y = data.target
# 拆分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 初始化Lasso回归模型
lasso = Lasso(alpha=1.0)
# 训练模型
lasso.fit(X_train, y_train)
# 预测结果
y_pred = lasso.predict(X_test)
# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print("均方误差:", mse)
# 绘制特征系数变化图
plt.plot(range(X.shape[1]), lasso.coef_)
plt.xticks(range(X.shape[1]), data.feature_names, rotation=90)
plt.xlabel('Features')
plt.ylabel('Coefficients')
plt.title('Lasso Regression Coefficients')
plt.show()
代码细节解释
首先,我们从 sklearn.datasets
中导入波士顿房屋数据集。然后,我们将数据集拆分为特征矩阵 X
和目标变量 y
。接下来,我们使用 train_test_split
函数将数据集划分为训练集和测试集。
然后,我们初始化Lasso回归模型,并使用训练集进行训练。我们选择 alpha 参数值为 1.0。
训练完成后,我们使用训练好的模型对测试集进行预测,并计算预测结果与真实标签之间的均方误差(MSE)。
最后,我们绘制了Lasso回归模型的特征系数变化图。根据系数的绝对值大小,我们可以了解到哪些特征对预测模型的影响更大。
以上就是一个关于Lasso回归的实际案例,展示了完整的案例介绍、算法原理、公式推导、数据集、计算步骤以及Python代码示例
评论(1)
修补一下源代码,从本地读取数据文件,将源代码中的numpy数组改为pandas数据框以便画图。结果与源代码的图一模一样。
# 导入需要的库和模块
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Lasso
from sklearn.metrics import mean_squared_error
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# 从CSV文件中读取数据
file_path = r”C:\Users\XXX\Desktop\100例机器学习\boston_housing.csv” #你的数据文件目录
boston_df = pd.read_csv(file_path)
# 分离特征和目标变量
X = boston_df.drop(‘TARGET’, axis=1) # 确保TARGET是目标变量列的名称,按列删除目标值
y = boston_df[‘TARGET’]
# 拆分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42)
# 初始化Lasso回归模型
lasso = Lasso(alpha=1.0)
# 训练模型
lasso.fit(X_train, y_train)
# 预测结果
y_pred = lasso.predict(X_test)
# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print(“均方误差:”, mse)
# 绘制特征系数变化图
# 绘制一个图像,横坐标是特征的数量(range(X.shape[1])),纵坐标是Lasso回归的系数(lasso.coef_)
plt.plot(range(X.shape[1]), lasso.coef_)
# 这行代码是设置x轴的刻度标签。range(X.shape[1])是刻度的位置,data.feature_names是刻度的标签,rotation=90表示标签旋转90度。
plt.xticks(range(X.shape[1]), X.columns, rotation=90)
plt.xlabel(‘Features’)
plt.ylabel(‘Coefficients’)
plt.title(‘Lasso Regression Coefficients’)
plt.show()