随笔 - 384  文章 - 0  评论 - 35  阅读 - 142万

调参汇总

什么网格搜索、贝叶斯调参,就不做赘述。

本次简单记录一下工作积累的调参经验。

n_estimators:和多个参数相互影响,比如learning_rate,一般来说,树越简单,n_estimators越大,树越复杂,n_estimators越小,简单对应的是树分得很粗糙,max_depth较小,min_child_weight较大。一般建议>=30

min_child_weight:即是树枝的样本数,值越大,越不容易过拟合,一般建议训练样本的5%。

max_depth:即是树的层数,一般建议2-5,越小越不容易过拟合。

scale_pos_weight:1-10都OK,常用1-3。

其余的参数调整无多大意义,使用常用的即可。

主要调整的参数是n_estimators,min_child_weight,调整的衡量指标是训练集测试集oot的ks的值以及差值。

一、下面这种主要使用与数据中所有变量的效果都不好(最高iv不超过2%),初跑模型时,训练集和测试集的ks相差较大。

复制代码
def xgb_train(xtrain,ytrain,xtest,ytest,xoot,yoot,n_estimators,min_child_weight):
    xgb_param1 ={'max_depth': 3,
     'n_estimators': n_estimators,
     'learning_rate': 0.02,
     'min_child_weight': min_child_weight,
     'subsample': 0.7,
     'colsample_bytree': 0.7,
     'objective': 'binary:logistic',
    #  'alpha': 6.04,
    #  'lambda':20.21,
    # 'gamma':0.001,
    'random_state':2023,
     'n_jobs': -1}
    xgb_clf = xgb.XGBClassifier(**xgb_param1)
    xgb_clf.fit(xtrain,ytrain)

    xgb_train_pred = xgb_clf.predict_proba(xtrain)[:,1]
    fpr_train,tpr_train,_ = roc_curve(ytrain,xgb_train_pred)
    train_ks = abs(fpr_train - tpr_train).max()
    train_auc = roc_auc_score(ytrain,xgb_train_pred)



    xgb_val_pred = xgb_clf.predict_proba(xtest)[:,1]
    fpr_val,tpr_val,_ = roc_curve(ytest,xgb_val_pred)
    val_ks = abs(fpr_val - tpr_val).max()
    val_auc = roc_auc_score(ytest,xgb_val_pred)
    
    xgb_oot_pred = xgb_clf.predict_proba(xoot)[:,1]
    fpr_oot,tpr_oot,_ = roc_curve(yoot,xgb_oot_pred)
    oot_ks = abs(fpr_oot - tpr_oot).max()
    oot_auc = roc_auc_score(yoot,xgb_oot_pred)



    val_PSI=cal_psi(xgb_train_pred,xgb_val_pred)
    return train_ks,val_ks,oot_ks

list1 = []
list2 = []
list3 = []
list4 = []
list5 = []
for n in range(20,100,1):
    for k in range(30,300,1):
        train_ks,val_ks,oot_ks= xgb_train(train_xgb[l],train_xgb['target'],val_xgb[l],val_xgb['target'],oot_xgb[l],oot_xgb['target'],n,k)
#         if (val_ks>=0.32) and (train_ks - val_ks)<0.04:
#             print(n,k)
#         else:
#             continue
        list4.append(n)
        list5.append(k)
        list1.append(train_ks)
        list2.append(val_ks)
        list3.append(oot_ks)
xgb_df = pd.DataFrame({'n_estimators':list4,'min_child_weight':list5,
                   'train_ks':list1,"test_ks":list2,"oot_ks":list3})
xgb_df['ks_diff_test'] = xgb_df['train_ks'] - xgb_df['test_ks'] 
xgb_df['ks_diff_oot'] = xgb_df['train_ks'] - xgb_df['test_ks'] 
复制代码

最终根据测试集效果以及训练集和测试集、训练集和oot的ks差值选取较有的参数。

xgb_df_ks = xgb_df[(xgb_df['test_ks']>=0.16) & (xgb_df['ks_diff_test']<0.04)&(xgb_df['ks_diff_oot']<0.04)] # 这里面的阈值可以根据你的数据去设定
xgb_df_ks

 最终从这些结果中选出比较优的参数。

 

posted on   小小喽啰  阅读(245)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示