当前位置: 首页 > news >正文

机器学习监督学习实战四:九种回归算法对波士顿房价数据进行回归预测和评估方法可视化

本项目代码在个人github链接:https://github.com/KLWU07/Machine-learning-Project-practice/tree/main

处理流程

  • 1.导入波士顿房价数据集并进行预处理。
  • 2.使用 GradientBoostingRegressor 模型进行回归分析。
  • 3.通过交叉验证评估模型的性能,计算 MAE、MSE、MBE、RMSE 和 R^2 分数。
  • 4.使用 matplotlib 绘制训练集和测试集的真实值与预测值的折线图和散点图,直观展示模型的预测效果。

九种回归算法

英文名称 (代码调用)中文名称说明
LinearRegression线性回归最简单的回归算法,假设目标变量与特征之间存在线性关系。适用于线性可分的数据集。
ElasticNet弹性网络回归结合了 L1 和 L2 正则化,是 Lasso 和 Ridge 的结合。适用于特征数量较多且存在多重共线性的数据集。
LassoLasso 回归使用 L1 正则化,可以进行特征选择,使一些特征的系数为零。适用于特征数量较多且需要稀疏解的数据集。
Ridge岭回归使用 L2 正则化,可以处理多重共线性问题。适用于特征数量较多且存在多重共线性的数据集。
DecisionTreeRegressor决策树回归器基于决策树的回归算法,可以处理非线性关系。适用于特征数量较少且数据分布不均匀的数据集。
KNeighborsRegressorK 近邻回归器基于 K 近邻的回归算法,预测目标值是其最近邻点的平均值。适用于数据点分布较为均匀的数据集。
SVR支持向量回归器基于支持向量机的回归算法,可以处理非线性关系。适用于特征数量较多且数据分布复杂的数据集。
GradientBoostingRegressor梯度提升回归器基于梯度提升的回归算法,通过组合多个弱学习器来提高预测性能。适用于特征数量较多且数据分布复杂的数据集。
ExtraTreesRegressor额外树回归器基于随机森林的回归算法,通过组合多个决策树来提高预测性能。适用于特征数量较多且数据分布复杂的数据集。

一、数据集介绍

  波士顿房价数据集是机器学习领域中经典的回归分析数据集,用于房价预测,监督学习中的回归问题,目标是通过多个特征预测波士顿地区的房屋中位数价格(MEDV)。共 506 条样本(观测值),每条样本对应一个波士顿城镇的统计数据。典型的单变量回归任务,目标是通过 13 个特征预测MEDV。数据集字段(特征)说明如下

序号特征名称名称中文说明
1CRIM人均犯罪率城镇每千人犯罪次数
2ZN住宅用地比例25,000 平方英尺以上住宅用地比例(规划限制,非住宅用地比例)
3INDUS非零售商业用地比例城镇非零售商业用地比例(商业活动密度)
4CHAS查尔斯河虚拟变量1 = 邻近河流,0 = 不邻近
5NOX氮氧化物浓度ppm,空气质量指标
6RM平均房间数每套住宅的平均房间数
7AGE房龄较老房屋占比1940 年前建成的自住房屋比例
8DIS就业中心加权距离到波士顿 5 个就业中心的加权距离(通勤便利性)
9RAD辐射状公路可达性指数交通便利程度,指数越高表示越容易到达高速公路
10TAX房产税税率每 1 万美元房产的年税额
11PRTATIO师生比城镇师生比(教育资源指标)
12B黑人比例计算值公式:B = 1000(Bk - 0.63)^2,其中Bk为黑人比例
13LSTAT低收入人群比例%,社会经济地位指标
14MEDV房屋中位数价格单位:千美元,目标变量

1.各特征分布情况

在这里插入图片描述

二、算法评估

  尝试了数据标准化没有很大提升。

1.九种回归算法RMSE 和 R^2 比较

  图中的蓝色柱子表示 RMSE,红色柱子表示 R^2 分数。通过这个图,可以直观地比较不同模型的性能。
在这里插入图片描述

2.训练集和测试集预测值和真实值可视化

  梯度提升回归树模型GradientBoostingRegressor和随机搜索最佳参数,均方根误差RMSE为2.725 (0.540),决定系数R2为 0.903 (0.035)。
在这里插入图片描述
在这里插入图片描述

3.训练集和测试集预测值和真实值散点图

在这里插入图片描述

Best parameters: {'learning_rate': 0.12829684257109286, 'max_depth': 5, 'max_features': 'log2', 'min_samples_leaf': 3, 'min_samples_split': 5, 'n_estimators': 122, 'random_state': 42}
Best cross-validation score: -7.715896901281501
MAE: -1.943 (0.285)
MSE: -7.716 (3.060)
MBE: 0.008 (0.223)
RMSE: 2.725 (0.540)
R2: 0.903 (0.035)

4.特征重要性

在这里插入图片描述

5.加入主成分分析PCA降维

  评估结果不好,不适合使用降维方法。(pca = PCA
  n_components=3 # 降维到 3 个主成分
  X_pca = pca.fit_transform(X))

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Model: GradientBoostingRegressor
MAE: -4.632 (0.564)
MSE: -48.134 (15.559)
MBE: -0.023 (0.886)
RMSE: 6.845 (1.202)
R2: 0.413 (0.152)

6.网格搜索(Grid Search)最佳参数组合

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Best parameters: {'learning_rate': 0.1, 'max_depth': 6, 'max_features': 'sqrt', 'n_estimators': 160, 'random_state': 7}
Best cross-validation score: -8.265665640433037
MAE: -1.951 (0.287)
MSE: -8.266 (3.460)
MBE: -0.011 (0.315)
RMSE: 2.813 (0.595)
R2: 0.897 (0.039)

7.随机搜索(Random Search)

在前参数范围基础上寻找更好一点参数。结果在最前面1

三、完整代码

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LinearRegression, ElasticNet, Lasso, Ridge
from sklearn.tree import DecisionTreeRegressor
from sklearn.neighbors import KNeighborsRegressor
from sklearn.svm import SVR
from sklearn.ensemble import GradientBoostingRegressor, ExtraTreesRegressor
from sklearn.metrics import mean_squared_error
import numpy as np
import matplotlib.pyplot as plt# 导入数据
filename = 'housing.csv'
names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS','RAD', 'TAX', 'PRTATIO', 'B', 'LSTAT', 'MEDV']
data = read_csv(filename, names=names, delim_whitespace=True)# 将数据分为输入数据和输出结果
array = data.values
X = array[:, 0:13]  # 输入特征
Y = array[:, 13]    # 输出目标变量# 设置交叉验证参数
n_splits = 10
seed = 7
kfold = KFold(n_splits=n_splits, shuffle=True, random_state=seed)# 定义多个回归模型
models = {'LinearRegression': LinearRegression(),'ElasticNet': ElasticNet(),'Lasso': Lasso(),'Ridge': Ridge(),'DecisionTreeRegressor': DecisionTreeRegressor(),'KNeighborsRegressor': KNeighborsRegressor(),'SVR': SVR(),'GradientBoostingRegressor': GradientBoostingRegressor(),'ExtraTreesRegressor': ExtraTreesRegressor()
}# 定义评分标准
scoring = ['neg_mean_absolute_error', 'neg_mean_squared_error', 'r2']# 定义自定义评分函数
def mean_bias_error(y_true, y_pred):return np.mean(y_pred - y_true)def root_mean_squared_error(y_true, y_pred):return np.sqrt(mean_squared_error(y_true, y_pred))# 评估每个模型
model_names = []
rmse_scores = []
r2_scores = []for name, model in models.items():print(f"Model: {name}")# 计算MAEresult_mae = cross_val_score(model, X, Y, cv=kfold, scoring=scoring[0])print('MAE: %.3f (%.3f)' % (result_mae.mean(), result_mae.std()))# 计算MSEresult_mse = cross_val_score(model, X, Y, cv=kfold, scoring=scoring[1])print('MSE: %.3f (%.3f)' % (result_mse.mean(), result_mse.std()))# 计算R^2result_r2 = cross_val_score(model, X, Y, cv=kfold, scoring=scoring[2])print('R2: %.3f (%.3f)' % (result_r2.mean(), result_r2.std()))# 计算MBE和RMSEmbe_scores = []rmse_scores_temp = []for train_index, test_index in kfold.split(X):X_train, X_test = X[train_index], X[test_index]Y_train, Y_test = Y[train_index], Y[test_index]model.fit(X_train, Y_train)Y_pred = model.predict(X_test)mbe_scores.append(mean_bias_error(Y_test, Y_pred))rmse_scores_temp.append(root_mean_squared_error(Y_test, Y_pred))print('MBE: %.3f (%.3f)' % (np.mean(mbe_scores), np.std(mbe_scores)))print('RMSE: %.3f (%.3f)' % (np.mean(rmse_scores_temp), np.std(rmse_scores_temp)))print("-" * 50)# 保存模型名称、RMSE 和 R^2 分数model_names.append(name)rmse_scores.append(np.mean(rmse_scores_temp))r2_scores.append(np.mean(result_r2))# 绘制柱状图
fig, ax1 = plt.subplots(figsize=(12, 8))# 设置柱状图的位置
bar_width = 0.35
index = np.arange(len(model_names))# 绘制 RMSE 柱状图
ax1.bar(index, rmse_scores, bar_width, label='RMSE', color='tab:blue')
ax1.set_xlabel('Model')
ax1.set_ylabel('RMSE', color='tab:blue')
ax1.tick_params(axis='y', labelcolor='tab:blue')# 创建第二个坐标轴
ax2 = ax1.twinx()# 绘制 R^2 柱状图
ax2.bar(index + bar_width, r2_scores, bar_width, label='R^2', color='tab:red')
ax2.set_ylabel('R^2', color='tab:red')
ax2.tick_params(axis='y', labelcolor='tab:red')# 添加标题和标签
ax1.set_title('Comparison of RMSE and R^2 for Different Models')
ax1.set_xticks(index + bar_width / 2)
ax1.set_xticklabels(model_names, rotation=45, ha='right')
ax1.legend(loc='upper left')
ax2.legend(loc='upper right')plt.tight_layout()
plt.show()

相关文章:

  • 如何轻松将视频从安卓设备传输到电脑?
  • 【机器学习】主成分分析 (PCA)
  • 视频汇聚平台EasyCVR“明厨亮灶”方案筑牢旅游景区餐饮安全品质防线
  • 新成果:GaN基VCSEL动态物理模型开发
  • Java Lambda表达式深度解析:从入门到实战
  • AIGC-SD9、知识点
  • 老年生活照护实训室建设规划:照护质量评估与持续改进实训体系
  • Flask-Babel 使用示例
  • ECB(电子密码本,Electronic Codebook) 和 CBC(密码分组链接,Cipher Block Chaining)区分于用途
  • 操作系统中的设备管理,Linux下的I/O
  • 指针的使用——基本数据类型、数组、结构体
  • Rust Floem UI 框架使用简介
  • 【HarmonyOS 5】 影视与直播详以及 开发案例
  • Kafka深度解析与原理剖析
  • 实现单例模式的常见方式
  • 虚实共生时代的情感重构:AI 恋爱陪伴的崛起、困局与明日图景
  • React从基础入门到高级实战:React 实战项目 - 项目一:在线待办事项应用
  • windows server2019 不成功的部署docker经历
  • 使用 Docker Compose 安装 PostgreSQL 16
  • SSH/RDP无法远程连接?腾讯云CVM及通用服务器连接失败原因与超全排查指南
  • 大连哪个公司做网站开发的/针对大学生推广引流
  • 电脑做网站怎么解析域名/长尾词挖掘工具爱站网
  • 惠州网站建设找惠州邦/杭州优化排名哪家好
  • 软件开发兼职网站/婚恋网站排名前三
  • 寮步镇网站仿做/四川seo
  • 网站建设费用怎么入账/建网站的流程