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

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

本项目代码在个人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()
http://www.xdnf.cn/news/12069.html

相关文章:

  • Claude 写 PHP 项目的完整小白教程
  • GO协程(Goroutine)问题总结(待续)
  • 基于西门子S7-200 PLC、KEPServerEx、sql server2012 的闸门群OPC UA数据采集
  • docker快速部署OS web中间件 数据库 编程应用
  • FPGA点亮ILI9488驱动的SPI+RGB接口LCD显示屏(一)
  • 嵌入式学习之系统编程(十)网络编程之TCP传输控制协议
  • python打卡day45
  • OpenCV 图像通道的分离与合并
  • SpringBoot3项目架构设计与模块解析
  • CIFAR10的使用
  • 【Redis】Redis 的常见客户端汇总
  • 四六级监考《培训学习》+《培训考试》
  • linux 串口调试命令 stty
  • HTML中各种标签的作用
  • 储能数字化的第一步,是把直流能量“看清楚
  • 【Qt】之【Get√】【Bug】通过值捕获(或 const 引用捕获)传进 lambda,会默认复制成 const
  • 二叉树-104.二叉树的最大深度-力扣(LeetCode)
  • (头歌作业)-6.5 幻方(project)
  • 【大模型】MCP是啥?它和点菜、做菜、端菜有啥关系?
  • 【python深度学习】Day 45 Tensorboard使用介绍
  • [蓝桥杯]摆动序列
  • 深度强化学习驱动的智能爬取策略优化:基于网页结构特征的状态表示方法
  • Ubuntu ssh 永久添加私钥
  • Ubuntu ifconfig 查不到ens33网卡
  • 【Android基础回顾】三:Android启动流程
  • 使用Python提取PDF元数据的完整指南
  • 《棒球百科知识》1号位是什么位置·野球1号位
  • 三甲医院“AI平台+专家系统”双轮驱动模式的最新编程方向分析
  • 基于51单片机的天然气浓度检测报警系统
  • 第14节 Node.js 全局对象