:损失函数的一阶导数(梯度)
:损失函数的二阶导数(曲率)
常用的超参数有:
max_depth:控制树的最大深度
n_estimators:控制树的数量
learning_rate:控制步长大小
subsample:随机抽样比率
colsample_bytree:每棵树采样的特征比例
lambda:L2 正则化项
alpha:L1 正则化项
1、 xgboost.train
xgboost.train是基于原生XGBoost API设计的,必须将输入数据转换为XGBoost专用的DMatrix
格式
,可
以自定义损失函数、监控训练过程,能更高效地处理大规模数据。
# 将数据转化为 DMatrix 格式
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)
# 设置参数
params = {
'objective': 'reg:squarederror', # 回归任务
'max_depth': 6, # 树的最大深度
'eta': 0.1, # 学习率
'subsample': 0.8, # 每次样本随机采样比例
'colsample_bytree': 0.8, # 每次特征随机采样比例
'lambda': 1.0, # L2 正则化
'alpha': 0.0 # L1 正则化
}
# 训练模型
model = xgb.train(
params,
dtrain,
num_boost_round=100,
evals=evallist, # 监控训练过程
early_stopping_rounds=10 # 如果 10 次迭代不再改进,则停止训练
)
# 预测和评估
y_pred = model.predict(dtest)
模型最终预测性能远不如LSTM,R^2=0.5598
2、xgboost.XGBRegressor
XGBReg
ressor
是基于Scikit-Learn风格的API设计的,适合与Scikit-Learn的工具(如交叉验证、网格搜索)集成。# 定义模型和参数
model = XGBRegressor(
max_depth=6,
learning_rate=0.1,
n_estimators=100, # 指定树的数量
reg_lambda=1, # L2正则化
reg_alpha=0.1, # L1正则化
gamma=0.5, # 分裂阈值控制
objective='reg:squarederror', # 损失函数
)
# 模型训练
model.fit(X_train, y_train)
# 预测
y_pred = model.predict(X_test)
GridSearchCV
对象,GridSearchCV
将遍历这些param中的所有可能组合:# 初始化 XGBoost 回归器,目标函数设置为均方误差
model = XGBRegressor(objective='reg:squarederror')
# 定义超参数网格
param = {
'n_estimators': [100, 150, 200, 250, 300],
'learning_rate': [0.001, 0.01, 0.05, 0.1],
'max_depth': [3, 4, 5, 6, 7, 8, 9],
'subsample': [0.6, 0.7, 0.8, 0.9, 1.0],
'colsample_bytree': [0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
}
# 创建 GridSearchCV 对象
grid = GridSearchCV(model, params, cv=3, scoring='neg_mean_squared_error', n_jobs=-1)
# 训练模型
grid.fit(X_train, y_train)
# 获取最佳参数和最佳模型
best_params = grid.best_params_
best_model = grid.best_estimator_
tree_method='gpu_hist'
,使用 GPU来加快训练过程。gpu_available = 'NVIDIA' in os.popen('nvidia-smi -L').read()
tree_method = 'gpu_hist' if gpu_available else 'hist'
from sklearn.model_selection import RandomizedSearchCV, KFold
# 定义超参数分布
param_distributions = {
'n_estimators': [100, 150, 200, 250, 300],
'learning_rate': [0.001, 0.01, 0.05, 0.1],
'max_depth': [3, 4, 5, 6, 7, 8, 9],
'subsample': [0.6, 0.7, 0.8, 0.9, 1.0],
'colsample_bytree': [0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
}
model = xgb.XGBRegressor(verbosity=0)
cv_splitter = KFold(n_splits=3, shuffle=True, random_state=42)
# 初始化 RandomizedSearchCV
random_search = RandomizedSearchCV(
estimator=model,
param_distributions=param_distributions,
n_iter=50, # 随机选择 50 组超参数组合
cv=cv_splitter,
scoring='neg_mean_squared_error',
verbose=0, # 关闭详细输出
n_jobs=-1, # 并行处理
random_state=42
)
random_search.fit(flat_seq_array, label_array.ravel())
# 找到最佳参数和结果
best_params = random_search.best_params_
best_score = -random_search.best_score_