在风控模型中,由于业务考虑,特征会有非常强烈的先验,那么可以增加单调约束来提高模型的性能和可解释性,如
demo:
bst_params = {'seed': 456,
'colsample_bytree': 0.4,
'learning_rate': 0.02,
'max_depth': 4,
'min_child_weight': 35,
'gamma': 4,
'n_estimators': 300,
'reg_alpha': 7,
'reg_lambda': 11,
'scale_pos_weight': 1,
'subsample': 0.6,}
model = xgb.XGBClassifier(objective='binary:logistic', monotone_constraints='(0,-1,1)',**bst_params)
model.fit(data_train[mod_feature], data_train['target'], verbose=True)
mod_feature 中第1个特征不加约束;第2个特征约束为特征值越大,逾期概率就越低;第3个特征约束为特征值越大,逾期概率就越高。
需要注意的是,在xgboost不同版本中,monotone_constraints的参数格式会有不同,最新版本是支持字典形式的:{“f0”: 1, “f2”: -1},我的版本是1.0.2,只支持str,也可直接设置为(0,-1,1)。
monotone_constraints : {Optional[Union[Dict[str, int], str]]}
一些发现:
- 当tree_method设置为hist、approx时,启用单调约束可能会产生不必要的浅树,这是因为 “hist” 方法减少了在每次分割时需要考虑的候选分割数量。单调约束可能会消除所有可用的分割候选,在这种情况下不会进行分割。为了减少这种影响,可增加 “max_bin” 参数以考虑更多的分割候选。
- xgboost版本在1.3.0前后有个较大的变化,需要用到1.3.0后包最新功能的可能会造成加载旧模型报错。