当前位置:   article > 正文

Python银行信贷风控建模实战(xgb+lgb)_信贷风控建模实战(一)——建模流程总览

信贷风控建模实战(一)——建模流程总览

目录

一、数据读取及预处理

1、数据读取

2、数据预处理

二、模型构建及评估

三、划重点

少走10年弯路


一、数据读取及预处理

1、数据读取

        数据来源某比赛网站(下图仅为部分字段),数据集中包含银行借贷订单的金额、利息、账期、担保等基本信息,还有历史授信情况,数据类型同样包含数值型、类别型、日期等变量,同时存在缺失问题,适合初学者入门练习。文末获取数据

2、数据预处理

        (1)无效特征剔除:数据集中存在部分无效数据,唯一值数量仅为1、不包含有效信息,可以直接剔除;

        (2)日期、编码剔除:如下图,部分日期为脏数据,为方便处理直接剔除日期字段

        (4)类别型变量处理:使用xgb时特征输入需要为数值型,所以复制一份xgb建模数据集对类别型变量使用目标编码、即使用训练集(避免穿越)每类类别型变量对应的y均值进行编码;而对于lgb可以直接转为category类型输入。

        (5)FM交叉特征:针对lgb,数据集中存在部分类别型变量可以衍生二阶交叉特征、后续测试效果

  1. def init_data():
  2. df_fea=pd.read_excel('原始数据/trainX.xlsx')
  3. df_y=pd.read_excel('原始数据/trainY.xlsx')
  4. df=pd.concat([df_fea.drop(['id'],axis=1),df_y.drop(['id'],axis=1)],axis=1)
  5. return df
  6. df=init_data()
  7. def drop_useless_col(data):
  8. df_sta=data.nunique(dropna=False).to_frame()
  9. df_sta.columns=['unique_cnt']
  10. drop_col=list(df_sta[df_sta.unique_cnt<2].index)
  11. return data[[col for col in data.columns if col not in drop_col]]
  12. def data_pred(data):
  13. df=data.copy()
  14. df=df.pipe(drop_useless_col)
  15. drop_col=['jieju_next_anew_pricing_dt']
  16. drop_tmp=['kehu_tm_dpst_early_open_acct_dt','kehu_open_cust_tm','kehu_open_cust_dt']
  17. return df[[col for col in df.columns if col not in drop_col+drop_tmp]]
  18. df_pre=df.pipe(data_pred)
  19. from itertools import combinations
  20. def combine(df_pre,cate_col):
  21. df=df_pre.copy()
  22. comb=list(combinations(cate_col,2))
  23. cate_col_add=[]
  24. for col1,col2 in comb:
  25. df[col1+'_'+col2]=df[col1].astype('string').str.cat(df[col2],sep='&')
  26. cate_col_add.append(col1+'_'+col2)
  27. df[cate_col+cate_col_add]=df[cate_col+cate_col_add].astype('category')
  28. return df,cate_col_add
  29. df_pre_comb,cate_col_add=df_pre.pipe(combine,cate_col)
  30. def get_xgb_data(df_pre,y='jieju_dubil_status_desc',fea_list=cate_col+float_col):
  31. df=df_pre.copy()
  32. cate_col=df.select_dtypes(include=['category','string','object'])
  33. map_dict={}
  34. for col in cate_col:
  35. col_map=df.groupby([col])[y].mean().to_dict()
  36. df[col]=df[col].map(col_map)
  37. map_dict[col]=col_map
  38. df[fea_list]=df[fea_list].astype('float')
  39. return df,map_dict
  40. df_xgb,map_dict=get_xgb_data(df_pre,fea_list=cate_col+float_col)

二、模型构建及评估

        分别使用lgb、xgb构建二分类模型,其中lgb分别训练是否添加FM交叉特征版本用于对比,使用ks、auc进行评估

  1. def init_params(model_select='lgb'):
  2. params_xgb={
  3. 'objective':'binary:logistic',
  4. 'eval_metric':'auc',
  5. # 'silent':0,
  6. 'nthread':4,
  7. 'n_estimators':500,
  8. 'eta':0.02,
  9. # 'num_leaves':10,
  10. 'max_depth':4,
  11. 'min_child_weight':20,
  12. 'scale_pos_weight':1,
  13. 'gamma':0,
  14. 'reg_alpha':0,
  15. 'reg_lambda':0,
  16. 'subsample':0.8,
  17. 'colsample_bytree':0.8,
  18. 'seed':123
  19. }
  20. params_lgb={
  21. 'boosting_type': 'gbdt',
  22. 'objective': 'binary',
  23. 'metric':'auc',
  24. 'n_jobs': 4,
  25. 'n_estimators':500,
  26. 'learning_rate': 0.03,
  27. 'max_depth':4,
  28. 'num_leaves': 12,
  29. 'max_bin':255,
  30. 'subsample_for_bin':100000, # 构建直方图的样本量
  31. 'min_split_gain':0,
  32. 'min_child_samples':30,
  33. 'colsample_bytree': 0.8,
  34. 'subsample': 0.8,
  35. 'subsample_freq': 1, # 每 k 次迭代执行bagging
  36. 'feature_fraction_seed':2,
  37. 'bagging_seed': 1,
  38. 'reg_alpha':0,
  39. 'reg_lambda':0,
  40. 'scale_pos_weight':1, # 等价于is_unbalance=False
  41. 'silent':True,
  42. 'random_state':1,
  43. 'verbose':-1, # 控制模型训练过程的输出信息,-1为不输出信息
  44. }
  45. if model_select=='xgb':
  46. return params_xgb
  47. elif model_select=='lgb':
  48. return params_lgb
  49. def ks_auc_value(y_value,df,model):
  50. y_pred=model.predict_proba(df)[:,1]
  51. fpr,tpr,thresholds= roc_curve(list(y_value),list(y_pred))
  52. ks=max(tpr-fpr)
  53. auc= roc_auc_score(list(y_value),list(y_pred))
  54. return ks,auc
  55. def model_train_sklearn(model_label,train,y_name,model_var,model_select='lgb',params=None):
  56. if params is None:
  57. params=init_params(model_select)
  58. x_train,x_test, y_train, y_test =train_test_split(train[model_var],train[y_name],test_size=0.2, random_state=123)
  59. if model_select=='xgb':
  60. model=XGBClassifier(**params)
  61. elif model_select=='lgb':
  62. model=lgb.LGBMClassifier(**params)
  63. model.fit(x_train,y_train,eval_set=[(x_train, y_train),(x_test, y_test)],verbose=False) # 调参时设verbose=False
  64. train_ks,train_auc=ks_auc_value(y_train,x_train,model)
  65. test_ks,test_auc=ks_auc_value(y_test,x_test,model)
  66. # model_sklearn=model.fit(train[model_var],train[y_name]) # 全集数据训练
  67. all_ks,all_auc=ks_auc_value(train[y_name],train[model_var],model)
  68. dic={
  69. 'model_label':model_label,
  70. 'train_good':(y_train.count()-y_train.sum()),'train_bad':y_train.sum(),
  71. 'test_good':(y_test.count()-y_test.sum()),'test_bad':y_test.sum(),
  72. 'all_good':train[train[y_name]==0].shape[0],'all_bad':train[train[y_name]==1].shape[0],
  73. 'train_ks':train_ks,'train_auc':train_auc,
  74. 'test_ks':test_ks,'test_auc':test_auc,
  75. 'all_ks':all_ks,'all_auc':all_auc,
  76. }
  77. return dic,model

三、划重点

少走10年弯路

        关注威信公众号 Python风控模型与数据分析,回复 银行风控实战 获取本篇数据及代码

        还有更多理论、代码分享等你来拿

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/97324
推荐阅读
相关标签
  

闽ICP备14008679号