1、XGBoost的优点:
灵活性:支持自定义损失函数和评估指标。
高效性:采用并行处理和近似算法,使得计算速度更快。
鲁棒性强:对于缺失值和异常值具有较好的鲁棒性。(相对于深度学习模型不需要精细调参便能取得较好的拟合效果。)
自动特征选择:通过分析特征的重要性,自动选择最优特征。自身可实现树模型的迭代,表现为自动处理缺失值。
2、XGBoost的缺点:
相对于深度学习模型,无法对时空位置建模,不能灵敏捕获图像、语音、文本等高维数据。
3、调参时需要知道的几个重要参数
参数 | 范围 | 释义 | 效果 |
n_estimators | int | 基本学习器的数量 | 值越大,模型越复杂,越容易过拟合 |
max_depth | 0,∞ | 基本学习器的深度 | 值越大,模型越复杂,越容易过拟合 |
learning_rate | [0,1] | 学习率 | 每个基模型的惩罚项,降低单个模型的影响;值越接近1越容易或拟合,越接近0精度越低 |
gamma | C | 损失减少阈值 | 值越小模型越复杂,越容易过拟合(在决策树中,只有损失下降的值超过该值,才会继续分裂节点) |
reg_alpha | Float | L1正则化 | L1正则化用于对叶子的个数进行惩罚(减少模型过度拟合) |
reg_lambda | Float | L2正则化 | L2正则化用于对叶子节点的得分进行惩罚,L1和L2正则化项共同惩罚树的复杂度,值越小模型的鲁棒性越高(减少模型过度拟合) |
min_child_weight | 0,∞ | 子集最小权重(最小样本的权重之和) | 样本的权重之和小于该值,将不再分裂 |
subsample | (0,1] | 样本子采样 | 训练集对样本实例的采样率,用于防止过拟合 |
colsample_bytree | (0,1] | 列子采样 | 每棵树对特征的采样率,用于防止过拟合 |
4、XGBoost的4种调参方法
手动调参;网格搜索;随机搜索;贝叶斯搜索
由于随机搜索效率较高,速度较快,此次主要以随机搜索为例调参
#随机搜索调参,效率高于网格搜索和贝叶斯搜索,贝叶斯搜索更为全面
from xgboost.sklearn import XGBRegressor
from sklearn.model_selection import RandomizedSearchCV
import pandas as pd
import numpy as np
from math import sqrt
from sklearn.metrics import mean_squared_error
#1.以CSV形式导入数据集
df_train = pd.read_csv(r"训练数据集")
df_test = pd.read_csv(r"测试数据集")
X_train = df_train[[i for i in df_train.columns.tolist() if i not in ["label"]]] #训练集
y_train = df_train["label"] #训练标签
X_test =df_test[[i for i in df_test.columns.tolist() if i not in ["label"]]] #测试集
y_test = df_test["label"] #测试标签
#2.参数集定义
param_grid = {
'max_depth': [2, 3, 4, 5, 6, 7, 8],
'n_estimators': [30, 50, 100, 300, 500, 1000,2000],
'learning_rate': [0.1, 0.2, 0.3, 0.4, 0.01, 0.02, 0.03, 0.05, 0.5],
"gamma":[0.0, 0.1, 0.2, 0.3, 0.4],
"reg_alpha":[0.0001,0.001, 0.01, 0.1, 1, 100],
"reg_lambda":[0.0001,0.001, 0.01, 0.1, 1, 100],
"min_child_weight": [2,3,4,5,6,7,8],
"colsample_bytree": [0.6, 0.7, 0.8, 0.9],
"subsample":[0.6, 0.7, 0.8, 0.9]}
#3.随机搜索并打印最佳参数
gsearch1 = RandomizedSearchCV(XGBRegressor(scoring='ls',seed=27), param_grid, cv=5)
gsearch1.fit(X_train, y_train)
print("best_score_:",gsearch1.best_params_,gsearch1.best_score_)
#4.用最佳参数进行预测
y_test_pre= gsearch1.predict(X_test)
#5.打印测试集RMSE
rmse = sqrt(mean_squared_error(np.array(list(y_test)), np.array(list(y_test_pre))))
print("rmse:",rmse)
5、调参思路
(1)选择较高的学习率,例如0.1,这样可以减少迭代用时。
(2)然后对 max_depth , min_child_weight , gamma , subsample, colsample_bytree 这些参数进行调整。这些参数的合适候选值为:
max_depth:[3, 5, 6, 7, 9, 12, 15, 17, 25]
min_child_weight:[1, 3, 5, 7]
gamma:[0, 0.05 ~ 0.1, 0.3, 0.5, 0.7, 0.9, 1]
subsample:[0.6, 0.7, 0.8, 0.9, 1]
colsample_bytree:[0.6, 0.7, 0.8, 0.9, 1]
(3)调整正则化参数 lambda , alpha,这些参数的合适候选值为:
alpha:[0, 0.01~0.1, 1]
lambda :[0, 0.1, 0.5, 1]
(4)降低学习率,继续调整参数,学习率合适候选值为:[0.01, 0.015, 0.025, 0.05, 0.1]