您将使用核心Python API训练您的第一个XGBoost模型,从而实现其功能。内容包括加载数据、监督训练、进行预测以及结果解读。此次练习将应用到DMatrix数据结构和目标函数使用等主要概念。我们将使用加州房价数据集,这是一个经典的回归问题,目标是根据多个特征预测加州某区域的房屋中位数价值。环境与数据准备首先,请确保您已安装所需的库。您需要xgboost、用于数据集和评估指标的scikit-learn,以及用于数据操作的pandas。我们先加载数据集并将其分为训练集和测试集。这是一个标准步骤,用于将模型训练数据与评估模型在未见过示例上表现的数据分开。import xgboost as xgb import pandas as pd from sklearn.datasets import fetch_california_housing from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error import numpy as np # 加载数据集 housing = fetch_california_housing() X = pd.DataFrame(housing.data, columns=housing.feature_names) y = pd.Series(housing.target) # 创建训练集和测试集划分 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) print("训练集形状:", X_train.shape) print("测试集形状:", X_test.shape)将数据转换为DMatrix格式如前所述,XGBoost有其自己的优化数据结构,名为DMatrix。它在内存使用和训练速度方面都非常高效。在进行训练之前,我们需要将pandas DataFrame和Series转换为这种格式。# 将数据集转换为DMatrix dtrain = xgb.DMatrix(X_train, label=y_train) dtest = xgb.DMatrix(X_test, label=y_test) print("已为训练集和测试集创建DMatrix对象。")定义参数和训练模型数据准备就绪后,下一步是定义模型的超参数。这些参数在一个Python字典中设置。对于这个初始模型,我们将定义一个目标函数、一个评估指标,以及一些控制学习过程和树结构的参数。objective:'reg:squarederror'表明我们正在执行回归任务,并希望使实际值与预测值之间的平方差最小化。eval_metric:'rmse'(均方根误差)将用于在训练期间监督模型在评估集上的表现。eta:这是学习率,用于调整每棵树的贡献。较低的值会使提升过程更加保守。max_depth:这控制每棵决策树的最大深度,有助于防止过拟合。我们还将创建一个观察列表(watchlist),它是一个DMatrix对象列表。模型将在每个提升轮次后报告其在这些数据集上的表现,使我们能实时观察其学习情况。# 指定模型参数 params = { 'objective': 'reg:squarederror', 'eval_metric': 'rmse', 'eta': 0.1, 'max_depth': 4, 'seed': 42 } # 指定提升轮次数量 num_boost_round = 100 # 创建观察列表以监督表现 watchlist = [(dtrain, 'train'), (dtest, 'test')] # 训练模型 bst = xgb.train( params, dtrain, num_boost_round=num_boost_round, evals=watchlist, verbose_eval=10 # 每10轮打印评估结果 )当您运行此代码时,XGBoost将每10轮打印训练集和测试集的RMSE。您应该会看到两个集合的RMSE都在减小。如果测试集的RMSE开始增加而训练集的RMSE持续减小,这是过拟合的迹象。使用观察列表是确定最佳提升轮次数量的有效方法。进行预测和评估表现模型训练完成后,我们可以用它对测试数据进行预测。predict方法接受DMatrix作为输入,并返回一个预测数组。然后,我们可以使用与训练期间监督的相同指标(RMSE)将这些预测与实际值(y_test)进行比较。# 对测试集进行预测 preds = bst.predict(dtest) # 评估模型 rmse = np.sqrt(mean_squared_error(y_test, preds)) print(f"测试集上的最终RMSE: {rmse:.4f}")所得的RMSE提供了一个数值,用于衡量模型的预测误差。例如,RMSE为0.5意味着模型的预测平均误差约为$500,000,因为目标变量的单位是$100,000。通过特征重要性解释模型XGBoost这类基于树的模型的一个主要优点是其可解释性。我们可以轻松查看模型在进行预测时认为哪些特征最重要。XGBoost提供了一种简单的方法来获取这些重要性分数,甚至可以将其绘制出来。默认的重要性类型'weight'衡量一个特征在树中出现的次数。# 获取特征重要性分数 importance_scores = bst.get_score(importance_type='weight') print(importance_scores) # 使用XGBoost内置函数绘制特征重要性 # 需要安装matplotlib # xgb.plot_importance(bst) # plt.show()可视化特征重要性使得理解模型行为变得容易得多。下面的图表显示了我们训练模型的特征重要性分数,表明哪些房屋特征对其预测影响最大。{"layout": {"title": {"text": "XGBoost 特征重要性"}, "xaxis": {"title": {"text": "F-分数(频率)"}}, "yaxis": {"title": {"text": "特征"}, "categoryorder": "total ascending"}, "margin": {"l": 120, "r": 20, "t": 60, "b": 60}, "template": "plotly_white", "height": 400}, "data": [{"type": "bar", "x": [35, 45, 62, 75, 88, 110, 150, 205], "y": ["HouseAge", "AveBedrms", "Population", "AveOccup", "Longitude", "Latitude", "AveRooms", "MedInc"], "orientation": "h", "marker": {"color": "#228be6"}}]}F-分数表示每个特征在决策树中用于创建分裂的次数。值越高表示越重要。在此例中,中位数收入(MedInc)是使用最频繁的特征。您现在已经成功训练、评估并解释了一个XGBoost模型。此工作流程构成了几乎所有梯度提升任务的基础。在接下来的章节中,我们将了解其他强大的库,并学习如何系统地调整模型的超参数以获得更好的表现。