案例介绍

在这个案例中,我们将使用波士顿房屋数据集来演示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 个特征。每个样本都有一个房屋价格中位数作为标签。

计算步骤

  1. 导入数据集并进行数据预处理。
  2. 拆分数据集为训练集和测试集。
  3. 初始化Lasso回归模型,并训练模型。
  4. 评估模型在测试集上的性能。
  5. 可选:调整超参数来改善模型性能。

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)

  • Python新手 2023年 12月 28日 上午10:42

    修补一下源代码,从本地读取数据文件,将源代码中的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()