目录
- 1. 作者介绍
- 2. 梯度提升树回归算法介绍
- 2.1 算法原理
- 2.2 算法讲解与分析
- 3. 实验过程
- 3.1 数据集介绍
- 3.2 代码介绍
- 3.3 完整代码实现
- 3.4 测试结果
- 参考文献
1. 作者介绍
雷强,男,西安工程大学电子信息学院,2023级研究生
研究方向:机器视觉与人工智能
电子邮件:3160698422@qq.com
孙思伟,男,西安工程大学电子信息学院,2023级研究生
研究方向:深度强化学习与人工智能
电子邮件:sunsiwei0109@163.com
2. 梯度提升树回归算法介绍
2.1 算法原理
梯度提升树回归算法的原理是通过迭代地训练多棵决策树,每棵树基于前一棵树的残差进行学习,以最小化预测误差,并将它们的预测结果进行加权融合,从而提高对连续变量的预测精度。
当使用梯度提升树回归算法(Gradient Boosting Decision Tree, GBDT)来估计房地产价格时,原理是通过迭代地训练多棵决策树模型,并将它们的预测结果进行加权融合。在每一轮迭代中,都会基于前一轮模型对房地产价格的预测残差来训练一棵新的决策树,这个残差表示了真实价格与当前模型预测价格之间的差异。通过这种方式,GBDT能够逐步减小预测误差,提升对房地产价格的预测准确性。这个过程不断重复,直至达到预设的迭代次数或模型性能提升不再显著,最终得到一个强大的预测模型,能够有效地估计房地产价格。
2.2 算法讲解与分析
3. 实验过程
3.1 数据集介绍
数据集来源于UCI机器学习存储库。这个存储库包含了从各种领域收集的真实世界和模拟生成的数据集,用于支持机器学习算法的开发、测试、评估和比较。选取台湾新北市新店区房地产数据进行房地产价格估计。
为了使估计结果更准确,这里使用一个包含交易日期、房龄、到最近捷运站的距离、便利店的数量、经度、维度、多个特征和对应房屋销售价格的数据集。这些数据集会包含大量的样本和多个特征,以便机器学习算法能够学习到房屋价格与特征之间的复杂关系
根据房地产数据表,选取以下6个特征:
X1交易日期(时间)
X2房龄(年)
X3到最近捷运站的距离(米 )
X4便利店数量(个)
X5经度(度)
X6维度(度)
Y商品房平均销售价格(万元/平方米)
3.2 代码介绍
先查看基本数据分布:
划分数据集:
得到特征重要性:
构建梯度回归树模型预测房价:
对模型进行评估:
3.3 完整代码实现
import pandas as pd
import numpy as np
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.metrics import mean_squared_error, mean_absolute_error
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
# 读取数据数据,查看数据基本分布
house = pd.read_csv('D:/AAD/datads.csv', index_col=0, encoding='gb2312')
print(house.shape)
print(house.describe())
# 清理列名
house.columns = [col.strip() for col in house.columns]
# 定义特征和标签
features_tree = ['X1', 'X2', 'X3', 'X4', 'X5', 'X6']
target = 'Y'
# 检查特征是否存在于数据集中
if not all(feature in house.columns for feature in features_tree):
print("以下列名在 DataFrame 中不存在:", set(features_tree) - set(house.columns))
else:
# 划分数据集为训练集和测试集
house_train, house_test = train_test_split(house, test_size=0.3, random_state=0)
print('训练集描述性统计:')
print(house_train[features_tree + [target]].describe().round(2))
print('测试集描述性统计:')
print(house_test[features_tree + [target]].describe().round(2))
# 提取特征和标签
X_train = house_train[features_tree]
y_train = house_train[target]
X_test = house_test[features_tree]
y_test = house_test[target]
# 构建梯度提升树回归模型预测房价
gbr = GradientBoostingRegressor(n_estimators=100, learning_rate=0.1, max_depth=3, random_state=0)
gbr.fit(X_train, y_train)
# 在训练集和测试集上进行预测
y_gbr_train = gbr.predict(X_train)
y_gbr_test = gbr.predict(X_test)
# 评估模型在测试集上的性能
mse_test = mean_squared_error(y_test, y_gbr_test)
mae_test = mean_absolute_error(y_test, y_gbr_test)
print(f"测试集均方误差: {mse_test:.2f}")
print(f"测试集平均绝对误差: {mae_test:.2f}")
# 得到特征重要性
plt.barh(range(len(features_tree)), gbr.feature_importances_, tick_label=features_tree)
plt.xlabel('Feature Importance')
plt.ylabel('Feature')
plt.title('Feature Importances')
plt.show()
# 使用训练好的模型对原始数据集进行预测
data_pre = pd.read_csv('D:/AAD/datads.csv', index_col=0, encoding='gb2312')
data_pre.columns = [col.strip() for col in data_pre.columns]
gbr_pre = gbr.predict(data_pre[features_tree])
# 创建结果DataFrame
house_result_reg = pd.DataFrame()
house_result_reg[u'梯度提升树回归预测'] = gbr_pre
house_result_reg[u'真实值'] = data_pre[target] # 注意:这里的真实值可能包含训练集数据
# 打印结果DataFrame的前几行
print(house_result_reg.head())
# 保存预测结果到CSV文件
house_result_reg.to_csv('D:/AAD/datads_predictions_.csv', encoding='gb2312')
3.4 测试结果
参考文献
[1]用python构建线性回归和决策树模型实现房价预测
[2]基于梯度提升树实现波士顿房价预测
[3]梯度提升树(GBDT)原理小结