总结写晚了,一个多月过去才想起来写。
言归正传,比赛是行里的预测,给了个人信息、历史贷款等数据,让预测贷款是否逾期的概率。模型我尝试了xgb,lgb。一开始走了很多弯路,包括使用SMOTE和ONE-HOT并且填充多种特殊值进行尝试,后面发现其实xgb,lgb都有自己对空值,对需要进行onehot的行列进行特殊处理。在这篇博客记录一下自己所走的弯路
1.初情况分析
拿到数据后,第一件事是应该先看我们的训练集输入、训练集输出表格的行列数。对于一对多、多对一的表格数据,对于表格内的聚合,表格外的关联与聚合,都要仔细考虑。并且根据列的性质,考虑采用哪几种参数合并计算,进行哪种计算。
在做聚合时,有两种策略,一种是尽可能多的计算参数种类(平均数、中位数、最大值、最小值、极差、方差…等等)。即,在训练模型时建立尽量多的列,可以这样先跑一次模型,后面做featrue score时,取出权重最高的前N列的列名(N的值需要多次尝试,再欠拟合和过拟合之前寻找最佳模型),再拿去喂给模型,使得这些真正影响模型的featrues更高的权重。
例如在agg 多对一的表格时定义以下15种参数计算:
def featureagg(train_history_concat1,features):
H=pd.DataFrame()
for i in features:
H['{}_mean'.format(i)]=train_history_concat1.groupby('历史申请编号')[i].mean()
H['{}_max'.format(i)]=train_history_concat1.groupby('历史申请编号')[i].max()
H['{}_min'.format(i)]=train_history_concat1.groupby('历史申请编号')[i].min()
H['{}_std'.format(i)]=train_history_concat1.groupby('历史申请编号')[i].std()
H['{}_var'.format(i)]=train_history_concat1.groupby('历史申请编号')[i].var()
H['{}_median'.format(i)]=train_history_concat1.groupby('历史申请编号')[i].median()
H['{}_sum'.format(i)]=train_history_concat1.groupby('历史申请编号')[i].sum()
H['{}_skew'.format(i)]=train_history_concat1.groupby('历史申请编号')[i].skew</