XGBoost全名叫做eXtreme Gradient Boosting,是一种基于GBDT的高效、灵活、可扩展的梯度提升算法。近年来,在各种数据科学竞赛中,XGBoost屡创佳绩,成为众多数据科学家和算法工程师的新宠。本文将从原理和实战两个方面,带领大家深入了解XGBoost。
XGBoost的基础是GBDT(Gradient Boosting Decision Tree),所以我们先简单回顾一下GBDT。
GBDT是一种迭代的决策树算法,通过不断地添加决策树来拟合残差,不断强化模型的预测能力。在每轮迭代中,需要解决的问题是如何构建一个新的决策树来拟合上一轮模型的残差。GBDT采用梯度下降的思想,将残差的拟合问题转化为梯度拟合问题。
XGBoost在GBDT的基础上进行了很多改进,主要包括以下几点:
接下来,我们将使用Python的XGBoost库在一个实际数据集上进行实战演示。
首先,确保已经安装了Python及相应的科学计算库。然后,通过pip安装xgboost库:
pip install xgboost
我们使用UCI的波士顿房价数据集进行实战。这个数据集包含506个样本,13个特征,目标是预测波士顿地区房价的中位数。
首先,加载数据集并进行预处理:
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_boston
# 加载数据
data = load_boston()
X, y = data.data, data.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
使用XGBoost库训练模型:
import xgboost as xgb
# 将数据转换为DMatrix格式
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)
# 设置参数
params = {
'objective': 'reg:squarederror',
'eval_metric':'rmse',
'max_depth': 3,
'learning_rate': 0.1,
'n_estimators': 100,
'silent': True,
'n_jobs': -1,
'random_state': 42
}
# 训练模型
num_rounds = 100
watchlist = [(dtrain, 'train'), (dtest, 'test')]
bst = xgb.train(params, dtrain, num_rounds, watchlist)
from sklearn.metrics import mean_squared_error
# 预测
y_pred = bst.predict(dtest)
# 计算RMSE
rmse = np.sqrt(mean_squared_error(y_test, y_pred))
print("RMSE: {:.4f}".format(rmse))
cv_results = xgb.cv(params, dtrain, num_boost_round=1000, nfold=5, early_stopping_rounds=50, verbose_eval=True)
# 找到最佳迭代次数
best_num_rounds = cv_results.shape[0]
print("Best number of rounds: {}".format(best_num_rounds))
bst_best = xgb.train(params, dtrain, best_num_rounds, watchlist)
# 预测
y_pred_best = bst_best.predict(dtest)
# 计算RMSE
rmse_best = np.sqrt(mean_squared_error(y_test, y_pred_best))
print("Best RMSE: {:.4f}".format(rmse_best))