有效应用XGBoost需要了解其Python接口。该库提供两种主要的模型构建方式:其原生Python API和符合Scikit-Learn API的包装类。首先将介绍原生API,因为它展现了库的主要组成部分,并提供了更大的灵活性。主要数据结构:DMatrix与直接使用NumPy数组或Pandas DataFrame的Scikit-Learn估计器不同,XGBoost的原生API使用一种名为DMatrix的内部数据结构。这是一种内存效率高、性能优化的数据容器,专门为该库的算法设计。将数据转换为DMatrix是原生工作流程的第一步。您可以从多种数据类型创建DMatrix,包括NumPy数组、SciPy稀疏矩阵和Pandas DataFrame。为训练创建DMatrix时,您需要使用label参数提供特征矩阵(您的X数据)和目标向量(您的y数据)。import xgboost as xgb import numpy as np import pandas as pd # 生成样本训练数据 X_train_data = np.random.rand(100, 5) y_train_data = np.random.rand(100) # 从NumPy数组创建DMatrix dtrain = xgb.DMatrix(X_train_data, label=y_train_data) print(f"创建对象的类型: {type(dtrain)}")dtrain对象现在以适合高速训练的格式保存了我们的数据。对于预测数据,您以相同的方式创建DMatrix,但省略label参数,因为目标是未知的。指定模型超参数在原生API中,超参数不作为参数传递给模型构造函数。相反,它们在一个Python字典中定义。这个字典包含键值对,其中键是参数名称(例如,'max_depth'),值是其设置。这种方法使得管理、保存和修改参数集变得容易。我们来为一个回归任务定义一个基本的参数字典。# 在字典中定义模型的超参数 params = { 'objective': 'reg:squarederror', # 要最小化的损失函数 'max_depth': 3, # 每棵决策树的最大深度 'eta': 0.1, # 学习率,也称为 'learning_rate' 'eval_metric': 'rmse' # 用于在验证集上评估的指标 }objective参数是最主要的参数之一,因为它指定了学习任务。常见的objective包括用于回归的reg:squarederror、用于二元分类的binary:logistic和用于多元分类的multi:softmax。eta参数是学习率的同义词,它控制每个提升迭代的步长。使用 xgb.train 训练模型将训练数据放入DMatrix中,并将参数放入字典后,您可以使用xgb.train()函数训练模型。该函数至少需要三个参数:params:超参数字典。dtrain:包含训练数据的DMatrix。num_boost_round:要构建的树的总数,相当于Scikit-Learn中的n_estimators。# 设置提升轮数 num_boost_round = 50 # 训练模型 bst = xgb.train(params, dtrain, num_boost_round)该函数返回一个已训练的模型对象,我们将其命名为bst。此对象现在可用于对新数据进行预测。生成预测要进行预测,首先将测试数据集转换为DMatrix(不带label)。然后,在已训练的模型对象上调用.predict()方法。# 生成样本测试数据 X_test_data = np.random.rand(20, 5) # 将测试数据转换为DMatrix dtest = xgb.DMatrix(X_test_data) # 生成预测 predictions = bst.predict(dtest) print("样本预测:") print(predictions[:5])输出是一个NumPy数组,包含模型对测试集中每个样本的预测。下图总结了原生API的工作流程。digraph G { rankdir=TB; node [shape=box, style="rounded,filled", fillcolor="#a5d8ff", fontname="Arial"]; edge [fontname="Arial"]; graph [bgcolor="transparent"]; data [label="训练数据\n(NumPy / Pandas)"]; params [label="超参数\n(Python 字典)"]; model [label="已训练的\nXGBoost 模型", fillcolor="#96f2d7"]; preds [label="预测结果", fillcolor="#ffec99"]; subgraph cluster_prep { label = "数据准备"; style=filled; color="#e9ecef"; data; params; } dmatrix [label="xgb.DMatrix", fillcolor="#bac8ff"]; subgraph cluster_train { label = "模型训练"; style=filled; color="#e9ecef"; train_func [label="xgb.train()", shape=ellipse, fillcolor="#fcc2d7"]; } subgraph cluster_predict { label = "模型预测"; style=filled; color="#e9ecef"; predict_func [label="model.predict()", shape=ellipse, fillcolor="#fcc2d7"]; test_data [label="测试数据"]; test_dmatrix [label="xgb.DMatrix", fillcolor="#bac8ff"]; } data -> dmatrix; dmatrix -> train_func; params -> train_func; train_func -> model; test_data -> test_dmatrix; model -> predict_func; test_dmatrix -> predict_func; predict_func -> preds; }原生XGBoost API工作流程的总结,从数据准备到预测。Scikit-Learn 封装器 API虽然原生API提供了全面控制,但XGBoost也包含一个与Scikit-Learn兼容的封装器。如果您已经熟悉Scikit-Learn的.fit()和.predict()语法,或者您想将XGBoost集成到Scikit-Learn的Pipeline或超参数搜索工具(如GridSearchCV)中,这将非常方便。主要类包括用于回归的XGBRegressor和用于分类的XGBClassifier。超参数直接传递给模型的构造函数,就像其他Scikit-Learn估计器一样。让我们使用XGBRegressor来复现我们的回归任务。from xgboost import XGBRegressor from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error # 使用之前相同的数据 X, y = X_train_data, y_train_data X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 使用Scikit-Learn语法实例化模型 # 参数作为构造函数的参数传递 xgb_reg = XGBRegressor( objective='reg:squarederror', n_estimators=50, learning_rate=0.1, # 请注意这里使用的是 'learning_rate' 而非 'eta' max_depth=3, random_state=42 ) # 使用熟悉的 .fit() 方法拟合模型 xgb_reg.fit(X_train, y_train) # 使用 .predict() 方法进行预测 predictions_sklearn = xgb_reg.predict(X_test) # 评估模型 rmse = np.sqrt(mean_squared_error(y_test, predictions_sklearn)) print(f"使用 Scikit-Learn 封装器的 RMSE: {rmse:.4f}")如您所见,这种方法所需的代码更少,并且与标准的Scikit-Learn工作流程完全一致。您无需手动创建DMatrix对象;封装器在内部处理数据转换。对于许多应用,特别是涉及交叉验证和自动化调优的应用,Scikit-Learn封装器是更实际的选择。下一节提供了一个实践机会,可以将这些API应用于解决一个完整的建模问题。