1、树的分裂过程
XGBoost算法中,构建回归树的树分裂过程是通过优化目标函数来完成的,目标函数包括预测误差和树的复杂度。先初始化每棵树,开始时只有一个根节点,包含了所有训练数据。然后通过贪婪算法选择每个特征的最佳分裂点,评估增益以决定分裂。然后,执行分裂操作,将节点分成两个子节点,并更新每个子节点的数据集。在递归地对每个新生成的子节点重复分裂过程,直到满足停止条件。最后,通过比较未分裂树与分裂后树的性能,决定是否进行剪枝。
import xgboost as xgb
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
# 加载数据
data = load_diabetes()
X = data.data
y = data.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建XGBoost特有的DMatrix
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)
# 设置参数
params = {
'max_depth': 3,
'eta': 0.1,
'objective': 'reg:squarederror',
'eval_metric': 'rmse'
}
# 训练模型
bst = xgb.train(params, dtrain, num_boost_round=200, evals=[(dtest, 'test')])
# 使用模型进行预测
preds = bst.predict(dtest)
2、叶子节点权重的计算
XGBoost算法中,计算叶子节点权重的方法是基于梯度提升框架中的一阶和二阶导数信息。权重计算是优化过程的一部分,用于最小化给定的损失函数。在分裂结束后,需要计算叶子节点的权重,即叶子节点对应的输出值。
def calculate_leaf_weight(gradient_sum, hessian_sum, regularization_param):
"""
计算叶子节点的权重
参数:
- gradient_sum: 叶子节点的一阶导数之和
- hessian_sum: 叶子节点的二阶导数之和
- regularization_param: 正则化参数
返回:
- leaf_weight: 叶子节点的权重
"""
leaf_weight = - gradient_sum / (hessian_sum + regularization_param)
return leaf_weight
3、回归树的构建
使用XGBoost算法对糖尿病数据集进行回归分析。糖尿病数据集是一个常用的机器学习数据集,包含了442名患者的10个生理特征(年龄、性别、体重指数、平均血压等)和一年后疾病级别的量化指标。xgb.XGBRegressor
常用参数如下,
参数名称 | 描述及典型用例 |
---|---|
booster | 模型的类型, 典型用例: gbtree , gblinear , dart |
n_estimators | 树的数量, 典型用例: 数值范围,例如100, 200, 300等 |
learning_rate | 学习率,控制每棵树的影响力, 典型用例: 常用值如0.01, 0.1, 0.2等 |
base_score | 所有实例的初始预测分数, 典型用例: 通常默认为0.5 |
max_depth | 树的最大深度, 典型用例: 例如3, 5, 10等 |
min_child_weight | 决定最小叶子节点样本权重和, 典型用例: 数值较大如6, 8, 10等 |
gamma | 节点分裂所需的最小损失减少量, 典型用例: 如0.1, 0.2, 0.5等 |
subsample | 控制每棵树随机采样的比例, 典型用例: 例如0.7, 0.8, 0.9等 |
colsample_bytree | 建立树时对特征采样的比例, 典型用例: 常见值0.5, 0.7, 0.9等 |
colsample_bylevel | 决定每个级别分裂时,对列数的下采样比例, 典型用例: 例如0.6, 0.7, 0.8等 |
colsample_bynode | 每个分裂时进行的列采样比例, 典型用例: 例如0.7, 0.8等 |
lambda | L2 正则化项的系数, 典型用例: 调整范围如1, 1.5, 2等 |
alpha | L1 正则化项的系数,典 型用例: 常用值0.5, 1, 1.5等 |
objective | 定义学习任务及相应的学习目标, 典型用例: 默认为 reg:squarederror |
eval_metric | 评估模型性能的指标, 典型用例: 如 rmse (均方根误差)、mae (平均绝对误差)等 |
seed / random_state | 随机数种子,用于结果的可重复性, 典型用例: 例如1, 42, 100等 |
n_jobs | 并行运行的线程数, 典型用例: -1表示使用所有可用的线程 |
verbosity | 输出打印的详细程度, 典型用例: 从0(silent)到3(debug) |
示例代码:
import numpy as np
import xgboost as xgb
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
# 加载糖尿病数据集
diabetes = load_diabetes()
X = diabetes.data
y = diabetes.target
# 分割数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建XGBoost回归模型
xgb_model = xgb.XGBRegressor(objective='reg:squarederror', colsample_bytree=0.3, learning_rate=0.1,
max_depth=5, alpha=10, n_estimators=10)
# 训练模型
xgb_model.fit(X_train, y_train)
# 预测测试集
y_pred = xgb_model.predict(X_test)
# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse:.2f}")