赞
踩
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参数来比较不同参数对模型性能的影响。这有助于我们找到最佳的参数组合以提高模型的性能。
我们使用图形方式展示了模型的预测效果,将测试值和预测值进行了可视化展示。这有助于我们直观地了解模型的拟合效果。这个实验为我们提供了一个深入了解线性回归和模型评估的机会,使我们能够更好地理解如何选择和调整不同的线性回归方法以解决实际问题。这些技能在实际数据分析和建模中非常有用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。