以下参数来自xgboost.sklearn
下的XGBClassifier。
n_estimators
: 弱分类器的数量。
booster
:用于指定弱学习器的类型,默认值为 ‘gbtree’,表示使用基于树的模型进行计算。还可以选择为 ‘gblinear’ 表示使用线性模型作为弱学习器。
learning_rate
:指定学习率。默认值为0.3。推荐的候选值为:[0.01, 0.015, 0.025, 0.05, 0.1]
gamma
:指定叶节点进行分支所需的损失减少的最小值,默认值为0。设置的值越大,模型就越保守。推荐的候选值为:[0, 0.05 ~ 0.1, 0.3, 0.5, 0.7, 0.9, 1]
reg_alpha
:L1正则化权重项,增加此值将使模型更加保守。推荐的候选值为:[0, 0.01~0.1, 1]
reg_lambda
:L2正则化权重项,增加此值将使模型更加保守。推荐的候选值为:[0, 0.1, 0.5, 1]
max_depth
:指定树的最大深度,默认值为6,合理的设置可以防止过拟合。[3, 5, 6, 7, 9, 12]
min_child_weight
:就是叶子上的最小样本数。推荐的候选值为:。[1, 3, 5, 7]
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]
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)
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