【机器学习小实验1】线性回归实现波士顿房价预测

一、实验目的

1.掌握线性回归算法。
2.熟悉sklearn 线性回归相关API。
3.掌握不同线性回归函数的调用和调参。

二、代码及结果

1.加载sklearn自带的波士顿房价预测数据集(from sklearn.datasets import load_boston),读取数据并显示前5行
展示代码:

from sklearn.datasets import load_boston
import pandas as pd 
boston = load_boston()
data = pd.DataFrame(boston.data,columns = boston.feature_names)
data['MEDV']= boston.target
data.head()

结果展示:
在这里插入图片描述

2.使用info函数展示数据信息,看是否有缺失值
展示代码:

data.info()

结果展示:

在这里插入图片描述

3.使用describe函数返回数据的统计变量
展示代码:

data.describe()

结果展示:
在这里插入图片描述

4.使用corr函数计算不同数据序列之间的相关系数
展示代码:

data.corr()

结果展示:
在这里插入图片描述

5.画出不同变量在不同值之间的分布直方图
展示代码:

import matplotlib.pyplot as plt
 #设置图形的大小
plt.figure(figsize=(15, 10))
# 绘制每个变量的分布直方图
for i, feature in enumerate(boston.feature_names):
    plt.subplot(3, 5, i + 1)
    plt.hist(data[feature], bins=20, edgecolor='k')
    plt.title(feature)
    plt.xlabel('Value')
    plt.ylabel('Frequency')

# 调整子图之间的间距
plt.tight_layout()

# 显示图形
plt.show()

结果展示:
在这里插入图片描述

6.使用LinearRegression、Ridge、Lasso和ElasticNet建模。
展示代码:

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression, Ridge, Lasso, ElasticNet
import numpy as np

X = boston.data
y = boston.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

#线性回归模型
lr_model = LinearRegression()
lr_model.fit(X_train, y_train)

# 建立Ridge回归模型
ridge_model = Ridge(alpha=1.0, solver='svd') 
ridge_model.fit(X_train, y_train)

# 建立Lasso回归模型
lasso_model = Lasso(alpha=1.0) 
lasso_model.fit(X_train, y_train)

# 建立ElasticNet模型
elasticnet_model = ElasticNet(alpha=1.0, l1_ratio=0.5)  
elasticnet_model.fit(X_train, y_train)

7.使用MSE,MAE,R-square函数评估模型的性能:
展示代码:

from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score

# 预测
y_pred_lr = lr_model.predict(X_test)
y_pred_ridge = ridge_model.predict(X_test)
y_pred_lasso = lasso_model.predict(X_test)
y_pred_elasticnet = elasticnet_model.predict(X_test)

# 评估
mse = mean_squared_error(y_test, y_pred_lr)
mae = mean_absolute_error(y_test, y_pred_lr)
r2 = r2_score(y_test, y_pred_lr)
print(f"linear Regression - MSE: {mse}, MAE: {mae}, R-squared: {r2}")

mse = mean_squared_error(y_test, y_pred_ridge)
mae = mean_absolute_error(y_test, y_pred_ridge)
r2 = r2_score(y_test, y_pred_ridge)
print(f"Ridge Regression - MSE: {mse}, MAE: {mae}, R-squared: {r2}")

mse = mean_squared_error(y_test, y_pred_lasso)
mae = mean_absolute_error(y_test, y_pred_lasso)
r2 = r2_score(y_test, y_pred_lasso)
print(f"Lasso Regression  - MSE: {mse}, MAE: {mae}, R-squared: {r2}")

mse = mean_squared_error(y_test, y_pred_elasticnet)
mae = mean_absolute_error(y_test, y_pred_elasticnet)
r2 = r2_score(y_test, y_pred_elasticnet)
print(f"ElasticNet - MSE: {mse}, MAE: {mae}, r2: {r2}")

结果展示:
在这里插入图片描述

8.打印上述代码结果,并且调整Ridge、Lasso和ElasticNet中的正则化力度alpha,选用不同的值,例如alpha=1、alpha=10、alpha=20的时候测试结果。ElasticNet函数修改l1_ratio参数的值为0.2和0.8,查看实验结果。
展示代码:

ridge_r2_best = 0
alpha_values = [1, 10, 20]
for alpha in alpha_values:
    ridge_model = Ridge(alpha=alpha, solver='svd')
    ridge_model.fit(X_train, y_train)
    y_pred_ridge = ridge_model.predict(X_test)
    mse = mean_squared_error(y_test, y_pred_ridge)
    mae = mean_absolute_error(y_test, y_pred_ridge)
    r2 = r2_score(y_test, y_pred_ridge)
    print(f"Ridge Regression (alpha={alpha}) - MSE: {mse}, MAE: {mae}, R-squared: {r2}")
    if r2 > ridge_r2_best:
        rigde_r2_best = r2
        ridge_best_y_pred = y_pred_ridge
        ridge_best_alpha = alpha
        

lasso_r2_best = 0
for alpha in alpha_values:
    lasso_model = Lasso(alpha=alpha)
    lasso_model.fit(X_train, y_train)
    y_pred_lasso = lasso_model.predict(X_test)
    mse = mean_squared_error(y_test, y_pred_lasso)
    mae = mean_absolute_error(y_test, y_pred_lasso)
    r2 = r2_score(y_test, y_pred_lasso)
    print(f"Lasso Regression (alpha={alpha}) - MSE: {mse}, MAE: {mae}, R-squared: {r2}")
    if r2 > lasso_r2_best:
        lasso_r2_best = r2
        lasso_best_y_pred = y_pred_ridge
        lasso_best_alpha = alpha

elasticnet_r2_best = 0
l1_ratio_values = [0.2, 0.8]
for alpha in alpha_values:
    for l1_ratio in l1_ratio_values:
        elasticnet_model = ElasticNet(alpha=alpha, l1_ratio=l1_ratio)
        elasticnet_model.fit(X_train, y_train)
        y_pred_elasticnet = elasticnet_model.predict(X_test)
        mse = mean_squared_error(y_test, y_pred_elasticnet)
        mae = mean_absolute_error(y_test, y_pred_elasticnet)
        r2 = r2_score(y_test, y_pred_elasticnet)
        print(f"ElasticNet (alpha={alpha}, l1_ratio={l1_ratio}) - MSE: {mse}, MAE: {mae}, r2: {r2}")
        if r2 > elasticnet_r2_best:
            elasticnet_r2_best = r2
            elasticnet_best_y_pred = y_pred_ridge
            elasticnet_best_alpha = alpha
            elasticnet_best_l1_ratio = l1_ratio
print(f"Ridge Regression (alpha={ridge_best_alpha}) ")
print(f"Lasso Regression (alpha={lasso_best_alpha})")
print(f"ElasticNet (alpha={elasticnet_best_alpha}, l1_ratio={elasticnet_best_l1_ratio})")

结果展示:
在这里插入图片描述

9.以x轴为测试值,y轴为预测值画图展示。绘制LinearRegression和使用不同alpha的Ridge、Lasso和ElasticNet拟合效果最好的四幅图。并标注出对应的图是哪个模型和哪些参数。
展示代码:

# 绘制四幅图
plt.figure(figsize=(16, 12))

# Linear Regression
plt.subplot(2, 2, 1)
plt.scatter(y_test, y_pred_lr)
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], 'r-', lw=2)
plt.xlabel('True Values')
plt.ylabel('Predictions')
plt.title('Linear Regression')

# Ridge Regression
plt.subplot(2, 2, 2)
plt.scatter(y_test, ridge_best_y_pred)
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], 'r-', lw=2)
plt.xlabel('True Values')
plt.ylabel('Predictions')
plt.title(f'Ridge Regression (alpha={ridge_best_alpha})')

# Lasso Regression
plt.subplot(2, 2, 3)
plt.scatter(y_test, lasso_best_y_pred)
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], 'r-', lw=2)
plt.xlabel('True Values')
plt.ylabel('Predictions')
plt.title(f'Lasso Regression (alpha={lasso_best_alpha})')

# ElasticNet
plt.subplot(2, 2, 4)
plt.scatter(y_test, elasticnet_best_y_pred)
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], 'r-', lw=2)
plt.xlabel('True Values')
plt.ylabel('Predictions')
plt.title(f'ElasticNet (alpha={elasticnet_best_alpha}, l1_ratio={elasticnet_best_l1_ratio})')

plt.tight_layout()
plt.show()

结果展示:
在这里插入图片描述

10.(选做)写出参数经过标准化后的模型训练过程,与参数未经标准化的模型进行比较
展示代码:

from sklearn.preprocessing import StandardScaler

#标准化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)


#线性回归模型
lr_model = LinearRegression()
lr_model.fit(X_train_scaled, y_train)
y_pred_lr = lr_model.predict(X_test_scaled)

ridge_r2_best = 0
alpha_values = [1, 10, 20]
for alpha in alpha_values:
    ridge_model = Ridge(alpha=alpha, solver='svd')
    ridge_model.fit(X_train_scaled, y_train)
    y_pred_ridge = ridge_model.predict(X_test_scaled)
    mse = mean_squared_error(y_test, y_pred_ridge)
    mae = mean_absolute_error(y_test, y_pred_ridge)
    r2 = r2_score(y_test, y_pred_ridge)
    print(f"Ridge Regression (alpha={alpha}) - MSE: {mse}, MAE: {mae}, R-squared: {r2}")
    if r2 > ridge_r2_best:
        rigde_r2_best = r2
        ridge_best_y_pred = y_pred_ridge
        ridge_best_alpha = alpha
        

lasso_r2_best = 0
for alpha in alpha_values:
    lasso_model = Lasso(alpha=alpha)
    lasso_model.fit(X_train_scaled, y_train)
    y_pred_lasso = lasso_model.predict(X_test_scaled)
    mse = mean_squared_error(y_test, y_pred_lasso)
    mae = mean_absolute_error(y_test, y_pred_lasso)
    r2 = r2_score(y_test, y_pred_lasso)
    print(f"Lasso Regression (alpha={alpha}) - MSE: {mse}, MAE: {mae}, R-squared: {r2}")
    if r2 > lasso_r2_best:
        lasso_r2_best = r2
        lasso_best_y_pred = y_pred_ridge
        lasso_best_alpha = alpha

elasticnet_r2_best = 0
l1_ratio_values = [0.2, 0.8]
for alpha in alpha_values:
    for l1_ratio in l1_ratio_values:
        elasticnet_model = ElasticNet(alpha=alpha, l1_ratio=l1_ratio)
        elasticnet_model.fit(X_train_scaled, y_train)
        y_pred_elasticnet = elasticnet_model.predict(X_test_scaled)
        mse = mean_squared_error(y_test, y_pred_elasticnet)
        mae = mean_absolute_error(y_test, y_pred_elasticnet)
        r2 = r2_score(y_test, y_pred_elasticnet)
        print(f"ElasticNet (alpha={alpha}, l1_ratio={l1_ratio}) - MSE: {mse}, MAE: {mae}, r2: {r2}")
        if r2 > elasticnet_r2_best:
            elasticnet_r2_best = r2
            elasticnet_best_y_pred = y_pred_ridge
            elasticnet_best_alpha = alpha
            elasticnet_best_l1_ratio = l1_ratio
print(f"Ridge Regression (alpha={ridge_best_alpha}) ")
print(f"Lasso Regression (alpha={lasso_best_alpha})")
print(f"ElasticNet (alpha={elasticnet_best_alpha}, l1_ratio={elasticnet_best_l1_ratio})")

# 绘制四幅图
plt.figure(figsize=(16, 12))

# Linear Regression
plt.subplot(2, 2, 1)
plt.scatter(y_test, y_pred_lr)
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], 'r-', lw=2)
plt.xlabel('True Values')
plt.ylabel('Predictions')
plt.title('Linear Regression')

# Ridge Regression
plt.subplot(2, 2, 2)
plt.scatter(y_test, ridge_best_y_pred)
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], 'r-', lw=2)
plt.xlabel('True Values')
plt.ylabel('Predictions')
plt.title(f'Ridge Regression (alpha={ridge_best_alpha})')

# Lasso Regression
plt.subplot(2, 2, 3)
plt.scatter(y_test, lasso_best_y_pred)
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], 'r-', lw=2)
plt.xlabel('True Values')
plt.ylabel('Predictions')
plt.title(f'Lasso Regression (alpha={lasso_best_alpha})')

# ElasticNet
plt.subplot(2, 2, 4)
plt.scatter(y_test, elasticnet_best_y_pred)
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], 'r-', lw=2)
plt.xlabel('True Values')
plt.ylabel('Predictions')
plt.title(f'ElasticNet (alpha={elasticnet_best_alpha}, l1_ratio={elasticnet_best_l1_ratio})')

plt.tight_layout()
plt.show()

结果展示:
在这里插入图片描述
在这里插入图片描述

三、结果分析

在本实验中,我们比较了不同线性回归模型以及不同alpha值对模型性能的影响。下面是不同模型及其对应的MSE(均方误差)、MAE(平均绝对误差)和R-squared(R平方)的结果分析:
1.Linear Regression:线性回归模型的性能表现良好,具有相对低的均方误差和平均绝对误差,以及较高的R平方值,说明模型对数据的拟合效果较好。
2.Ridge Regression:
当alpha=1时,MSE为24.48,MAE为3.13,R-squared为0.67。
当alpha=10时,MSE为24.65,MAE为3.13,R-squared为0.66。
当alpha=20时,MSE为24.39,MAE为3.13,R-squared为0.67。
结果分析:Ridge回归模型在不同alpha值下的性能差异较小,且具有较高的R-squared值,表示模型较好地拟合了数据。

2.Lasso Regression:
当alpha=1时,MSE为24.41,MAE为3.25,R-squared为0.67。
当alpha=10时,MSE为34.69,MAE为4.11,R-squared为0.53。
当alpha=20时,MSE为40.28,MAE为4.45,R-squared为0.45。
结果分析:Lasso回归模型在不同alpha值下的性能差异较大,且具有较低的R-squared值,表示模型拟合效果较差。
3.ElasticNet Regression:
当alpha=1且l1_ratio=0.2时,MSE为23.83,MAE为3.24,R-squared为0.68。
当alpha=1且l1_ratio=0.8时,MSE为24.19,MAE为3.25,R-squared为0.67。
当alpha=10且l1_ratio=0.2时,MSE为30.28,MAE为3.82,R-squared为0.59。
当alpha=10且l1_ratio=0.8时,MSE为33.96,MAE为4.07,R-squared为0.54。
当alpha=20且l1_ratio=0.2时,MSE为33.95,MAE为4.05,R-squared为0.54。
当alpha=20且l1_ratio=0.8时,MSE为38.23,MAE为4.30,R-squared为0.48。
结果分析:ElasticNet回归模型在不同alpha和l1_ratio值下的性能变化较大。alpha=1且l1_ratio=0.2时具有较低的MSE和较高的R-squared,表示拟合效果较好。

四、实验总结

通过这个实验,我们实现了线性回归模型并使用不同的线性回归函数进行了建模。我们学会了如何使用sklearn库来加载数据、建立模型和评估模型性能。这个实验帮助我们更好地理解了线性回归的基本原理以及不同线性回归方法的区别。
我们还进行了参数调优实验,通过修改Ridge、Lasso和ElasticNet中的正则化强度参数alpha以及修改ElasticNet中的l1_ratio参数来比较不同参数对模型性能的影响。这有助于我们找到最佳的参数组合以提高模型的性能。
我们使用图形方式展示了模型的预测效果,将测试值和预测值进行了可视化展示。这有助于我们直观地了解模型的拟合效果。这个实验为我们提供了一个深入了解线性回归和模型评估的机会,使我们能够更好地理解如何选择和调整不同的线性回归方法以解决实际问题。这些技能在实际数据分析和建模中非常有用。

  • 6
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值