大家好~
今天围绕XGBoost,给大家介绍一个案例:利用XGBoost预测房价:基于历史数据的精准分析
简单介绍以下XGBoost ,XGBoost (Extreme Gradient Boosting) 是一种基于梯度提升决策树(GBDT)的增强机器学习算法。它在多个数据科学竞赛中脱颖而出,因其高效、灵活和精准的特性被广泛应用。XGBoost 通过并行计算和正则化处理提升了模型的性能,在大规模数据集上的表现尤为突出。它提供了基于树的学习算法,适合处理分类、回归、排序和时序问题。
XGBoost 的关键特性包括:
正则化:通过 L1(Lasso)和 L2(Ridge)正则化减少过拟合问题。 处理缺失值:XGBoost 能自动处理数据中的缺失值。 树模型优化:采用了启发式算法,以减少模型构建的时间复杂度。 并行处理:支持多线程加速计算。
接下来,我们将基于Kaggle提供的房价预测数据集,通过XGBoost来预测房价。
案例背景:利用XGBoost预测房价
这个案例中,我们使用XGBoost模型预测房价。数据来自Kaggle上著名的“House Prices: Advanced Regression Techniques”竞赛,数据集包含多个影响房价的特征(如房屋面积、房龄、位置等)。我们的目标是使用这些特征来构建一个高精度的回归模型来预测房屋价格。
数据集获取:点击名片,回复「数据集」即可~
我们将进行以下几个步骤:
数据加载与预处理。 特征工程。 XGBoost 模型训练。 模型调优与评估。 数据可视化分析,包含 4 个以上的分析图表,解释各个特征与房价之间的关系。
案例实现步骤
数据加载与预处理
我们首先从Kaggle数据集中加载房价数据,进行必要的清理和转换,确保模型能够有效处理。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import xgboost as xgb
from xgboost import plot_importance
from sklearn.preprocessing import LabelEncoder
# 加载数据
df_train = pd.read_csv("./house-prices-advanced-regression-techniques/train.csv")
# 简要查看数据集
print(df_train.head())
# 检查缺失值
missing = df_train.isnull().sum()
missing = missing[missing > 0]
missing.sort_values(inplace=True)
# 绘制缺失值情况
plt.figure(figsize=(10,6))
sns.barplot(x=missing.index, y=missing)
plt.xticks(rotation=90)
plt.title('Missing Values in Train Data')
plt.show()
# 填充缺失值或删除含缺失值的列
df_train = df_train.drop(['Alley', 'PoolQC', 'Fence', 'MiscFeature'], axis=1) # 删除缺失值超过一定百分比的列
df_train = df_train.fillna(df_train.mean()) # 数值型数据填充均值
df_train = df_train.fillna('None') # 类别型数据填充'None'
# 标签编码:将类别型数据转为数值型
labelencoder = LabelEncoder()
for col in df_train.select_dtypes(include=['object']).columns:
df_train[col] = labelencoder.fit_transform(df_train[col])
# 查看处理后的数据集
print(df_train.head())
特征工程
为了提高模型的表现,我们对原始数据进行特征工程,创建新特征或对现有特征进行处理。
# 创建一些新特征,例如房龄和装修年份差
df_train['HouseAge'] = df_train['YrSold'] - df_train['YearBuilt']
df_train['RemodAge'] = df_train['YrSold'] - df_train['YearRemodAdd']
# 选择一些重要的特征进行分析
features = ['OverallQual', 'GrLivArea', 'GarageCars', 'TotalBsmtSF', 'FullBath', 'HouseAge', 'RemodAge']
# 绘制特征与房价的关系
plt.figure(figsize=(12, 8))
for i, feature in enumerate(features):
plt.subplot(2, 4, i+1)
sns.scatterplot(x=df_train[feature], y=df_train['SalePrice'], palette='coolwarm')
plt.title(f'{feature} vs SalePrice')
plt.tight_layout()
plt.show()
# 选择特征用于训练模型
X = df_train[features]
y = df_train['SalePrice']
XGBoost 模型训练
现在我们来构建XGBoost模型,进行训练,并使用交叉验证评估模型的表现。
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# XGBoost模型
xg_reg = xgb.XGBRegressor(objective ='reg:squarederror', colsample_bytree = 0.3, learning_rate = 0.1,
max_depth = 5, alpha = 10, n_estimators = 100)
# 训练模型
xg_reg.fit(X_train, y_train)
# 预测
preds = xg_reg.predict(X_test)
# 计算RMSE
rmse = np.sqrt(mean_squared_error(y_test, preds))
print("RMSE: %f" % (rmse))
# 绘制重要特征
plt.figure(figsize=(10,8))
plot_importance(xg_reg, height=0.8, color='green')
plt.title('Feature Importance')
plt.show()
模型调优
我们使用网格搜索(Grid Search)进行参数调优,进一步优化XGBoost模型的表现。
from sklearn.model_selection import GridSearchCV
# 定义参数网格
param_grid = {
'max_depth': [3, 5, 7],
'learning_rate': [0.01, 0.1, 0.3],
'n_estimators': [100, 200, 300]
}
# 使用网格搜索进行调参
grid_search = GridSearchCV(estimator=xg_reg, param_grid=param_grid, cv=5, scoring='neg_mean_squared_error', verbose=1)
grid_search.fit(X_train, y_train)
# 输出最佳参数
best_params = grid_search.best_params_
print(f"Best parameters found: {best_params}")
# 使用最佳参数训练模型
xg_reg_optimized = xgb.XGBRegressor(**best_params)
xg_reg_optimized.fit(X_train, y_train)
# 预测
optimized_preds = xg_reg_optimized.predict(X_test)
# 计算优化后的RMSE
optimized_rmse = np.sqrt(mean_squared_error(y_test, optimized_preds))
print("Optimized RMSE: %f" % (optimized_rmse))
可视化分析
本案例中,我们生成4个及以上的图形来解释模型预测和数据的相关性。
# 实际房价与预测房价的对比
plt.figure(figsize=(10, 6))
plt.scatter(y_test, preds, c='blue', label='Predicted', alpha=0.5)
plt.scatter(y_test, y_test, c='red', label='Actual', alpha=0.5)
plt.title('Actual vs Predicted SalePrice')
plt.xlabel('Actual SalePrice')
plt.ylabel('Predicted SalePrice')
plt.legend()
plt.show()
# 房价分布直方图
plt.figure(figsize=(8,6))
sns.histplot(y_test, color='red', label='Actual Price', kde=True)
sns.histplot(preds, color='blue', label='Predicted Price', kde=True)
plt.title('Distribution of Actual and Predicted SalePrice')
plt.legend()
plt.show()
# 特征重要性条形图
plt.figure(figsize=(10,8))
plot_importance(xg_reg_optimized, height=0.8, color='blue')
plt.title('Optimized Feature Importance')
plt.show()
1. 实际房价与预测房价的对比
2. 房价分布直方图
3. 特征重要性条形图
整个过程,我们成功地应用了XGBoost算法来预测房价。
进行了数据清理与预处理,处理了缺失值和类别数据; 通过特征工程构建了新的特征,提升了模型的性能; 通过XGBoost模型进行了训练,并通过交叉验证优化了模型的参数; 可视化了数据与预测结果,直观展示了模型的表现。
XGBoost模型表现出很高的准确性,特别是在处理大规模数据时,它的并行计算能力和高效的内存管理使其成为机器学习回归问题的一个有力工具。