【机器学习】XGBClassifier的默认参数和调参总结

以下参数来自xgboost.sklearn 下的XGBClassifier。

一、参数含义

  1. n_estimators: 弱分类器的数量。

  2. booster:用于指定弱学习器的类型,默认值为 ‘gbtree’,表示使用基于树的模型进行计算。还可以选择为 ‘gblinear’ 表示使用线性模型作为弱学习器。

  3. learning_rate:指定学习率。默认值为0.3。推荐的候选值为:[0.01, 0.015, 0.025, 0.05, 0.1]

  4. gamma:指定叶节点进行分支所需的损失减少的最小值,默认值为0。设置的值越大,模型就越保守。推荐的候选值为:[0, 0.05 ~ 0.1, 0.3, 0.5, 0.7, 0.9, 1]

  5. reg_alpha:L1正则化权重项,增加此值将使模型更加保守。推荐的候选值为:[0, 0.01~0.1, 1]

  6. reg_lambda:L2正则化权重项,增加此值将使模型更加保守。推荐的候选值为:[0, 0.1, 0.5, 1]

  7. max_depth:指定树的最大深度,默认值为6,合理的设置可以防止过拟合。[3, 5, 6, 7, 9, 12]

  8. min_child_weight:就是叶子上的最小样本数。推荐的候选值为:。[1, 3, 5, 7]

  9. colsample_bytree: 列采样比例。在构建一棵树时,会采样一个特征集合,采样比例通过colsample_bytree控制,默认为1,即使用全部特征。

二、调参步骤

为了减少模型调仓时间,我是采用类似贪心算法,逐个参数调节,依次选择最优。

最佳的方法是利用GridSearch,选择最佳的参数组合。

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)调整正则化参数 reg_lambda , reg_alpha,这些参数的合适候选值为:
reg_alpha:L1正则华项参数。
reg_lambda: L2正则化项参数。
reg_alpha:[0, 0.01~0.1, 1]
reg_lambda :[0, 0.1, 0.5, 1]4)降低学习率,继续调整参数,学习率合适候选值为:[0.01, 0.015, 0.025, 0.05, 0.1]

三、查看xgboost中XGBClassifier默认参数的方法

from xgboost.sklearn import XGBClassifier
import numpy as np
x= np.array([[1,1,1], [1,1,0]])
y = np.array([1,0])
c = XGBClassifier()
c.fit(x,y)
print(c)

输出为:
XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=1,
              colsample_bynode=1, colsample_bytree=1, gamma=0, gpu_id=-1,
              importance_type='gain', interaction_constraints='',
              learning_rate=0.300000012, max_delta_step=0, max_depth=6,
              min_child_weight=1, missing=nan, monotone_constraints='()',
              n_estimators=100, n_jobs=12, num_parallel_tree=1, random_state=0,
              reg_alpha=0, reg_lambda=1, scale_pos_weight=1, subsample=1,
              tree_method='exact', validate_parameters=1, verbosity=None)

四、利用sklearn 的GridSearchCV搜索参数

from sklearn.pipeline import Pipeline
from xgboost.sklearn import XGBClassifier
import numpy as np
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer, make_column_selector
def train(params, train_x, train_y):
    # train_x: 是dataframe,除了以下三个类别特征,其余都是数值特征。
    # 类别特征
    categorical_features = ["video_language", "user_area_code", "shelf_area_code"]
    print(f"video_language ={train_x.video_language.value_counts().shape}")
    print(f"user_area_code ={train_x.user_area_code.value_counts().shape}")
    print(f"shelf_area_code={train_x.shelf_area_code.value_counts().shape}")
    categorical_transformer = OneHotEncoder(handle_unknown="ignore")
    # 特征数据预处理
    preprocessor = ColumnTransformer(
        transformers=[
            ("pass", "passthrough", make_column_selector(dtype_include=np.number)),
            ("cat", categorical_transformer, categorical_features),
        ]
    )
    pipe = Pipeline(
        steps=[("preprocessor", preprocessor), ("classifier", XGBClassifier(**params))]
    )
    # grid search 选择模型的超参数
    param_grid = {
        "classifier__n_estimators": [50,100,150,200,300], # 多少棵树
        "classifier__eta": [0.05, 0.1, 0,2, 0.3], # 学习率
        "classifier__max_depth": [3,4,5,6,7], # 树的最大深度
        "classifier__colsample_bytree": [0.4,0.6,0.8,1], # 选择多少列构建一个树
        "classifier__min_child_weight": [1,2,3,4] # 叶子节点最小样本数目
    }
    # 构建grid search 模型, 5折交叉验证。
    search = GridSearchCV(pipe, param_grid, n_jobs=2, scoring="roc_auc", cv=5)
    # search = RandomizedSearchCV(pipe, param_grid, n_jobs=2, scoring="roc_auc", cv=5)
    print(search.best_params_)
    return search

你可能感兴趣的:(机器学习系列文章,python,XGBoost,调参)