这个四月参加了招行的数据赛道比赛,感觉氛围不错学到了很多知识。最后在1800+人中拿到了A榜43名,B榜310名的成绩。虽然最终无缘面试,但还是值得复盘分析。
本次比赛为参赛选手提供了两个数据集,即训练数据集(train)和测试数据集(test_A榜/ test_B榜)。通过有效的特征提取,使用分类算法构建公司客户存款流失预测模型,并将模型应用在测试数据集上,输出对测试数据集中公司客户存款流失概率的预测。
训练数据集中共包含4万条脱敏数据,
B榜测试数据与训练数据有很大不同,导致线上线下差异极大,很长一段时间线下都是完全过拟合的状态。最后导致了较差的结果
简述:将来自训练集的标签赋值为1,测试集的样本标签为0,训练一个学习器判断这样本来自哪一个集合
对于A榜数据
valid_0's auc: 0.492741
AUC约为0.5,表明分类器无法区分样本是来自训练集还是测试集
对于B榜数据
valid_0's auc: 0.969135 valid_0's l2: 0.0640045 valid_0's auc: 0.978514 valid_0's l2: 0.0516688 valid_0's auc: 0.982417 valid_0's l2: 0.0461824 valid_0's auc: 0.984529 valid_0's l2: 0.0429678 valid_0's auc: 0.98615 valid_0's l2: 0.040339 valid_0's auc: 0.986933 valid_0's l2: 0.0388808 Early stopping, best iteration is: valid_0's auc: 0.987338 valid_0's l2: 0.0381312
很明显A榜的训练集和测试集就是从一个数据集中划分得来,而B榜的测试集来自另一个数据集。
而后采用这一分类器从训练集中选择与测试集类似的样本,有助于减少过拟合。
赛后参考一些大佬的开源后发现B榜关键在于删除会导致过拟合的特征
验证集上的KS/AUC相对较高,测试集上天然会存在decay的现象
训练集与测试集差异明显的典型例子很容易发生在Kaggle比赛,或者国内高水平的比赛上,比赛前期显示的都是在公榜上成绩,最后的评判的却是的额外的私榜上,就会产生很大喜闻乐见的地震。如Kaggle比赛LANL Earthquake Prediction
,在public Leaderboard中排名第一的,在private Leaderboard却掉到了2734,而后面一大票老哥却冲到了前排,上演数据世界的地震。
我们发现线下的K折验证无法反映线上效果时该怎么办
对抗验证作为一种特征筛选方法时,可以找出时序波动明显的特征,帮我们快速找到在训练集和测试集上不稳定的特征。步骤如下:
auc | l2 | |
---|---|---|
0 | 0.951297 | 0.0694433 |
1 | 0.951351 | 0.0713171 |
2 | 0.951684 | 0.0707 |
3 | 0.945938 | 0.0745949 |
4 | 0.950595 | 0.0725664 |
数据:采用第一次提交的数据
特征:使用autogulon,没调任何参数
线下auc:0.952672
线下实验
实验一:
label='LABEL' save_path = '../usrdata/automl' # specifies folder to store trained models predictor = TabularPredictor(label=label, problem_type='binary', eval_metric='roc_auc', path=save_path).fit(x_train)
输入数据为第二次提交的数据,即做了数值特征统计的数据,验证集最优分数为0.952989
,hyperparameters='multimodal', num_bag_folds=5, num_stack_levels=1
数据(以下处理按顺序进行):
predictor = TabularPredictor(label=label, problem_type='binary', eval_metric='roc_auc', path=save_path).fit(x_train,)
线下auc:0.952419
model | score_val | |
---|---|---|
0 | WeightedEnsemble_L2 | 0.952419 |
1 | CatBoost | 0.951544 |
2 | LightGBMXT | 0.950950 |
3 | LightGBMLarge | 0.950814 |
4 | LightGBM | 0.0725664 |
还可以考虑的点 |
数据:根据catboost筛选特征,取重要性大于0的特征
模型:取boost系列一共五个模型,基模型内部做平均。基模型之间做stack
rawdata=pd.read_parquet('../usrdata/data_stat_cross_cat.par') x_train,x_test=train_test_split(rawdata) label='LABEL' save_path = '../usrdata/automl' # specifies folder to store trained models predictor = TabularPredictor(label=label, problem_type='binary', eval_metric='roc_auc', path=save_path).fit(x_train, num_bag_folds=5, num_bag_sets=5, excluded_model_types = ['KNN', 'NN_TORCH','FASTAI','XT','RF'] # hyperparameters='multimodal', # presets='best_quality' )
线下auc:0.953084
model | score_val | |
---|---|---|
0 | WeightedEnsemble_L2 | 0.953084 |
1 | CatBoost | 0.952732 |
2 | LightGBMXT | 0.952622 |
3 | LightGBMLarge | 0.952592 |
4 | LightGBM | 0.952578 |
5 | CatBoost_BAG_L1 | 0.951938 |
还可以考虑的点: |
数据:加入类别特征组合(这里的数据有问题,类别特征组合不正确)
模型:
predictor = TabularPredictor(label=label, problem_type='binary', eval_metric='roc_auc', path=save_path).fit(x_train, excluded_model_types = ['KNN', 'NN_TORCH','FASTAI','XT','RF'])
线下AUC:0.953336
model | score_val | |
---|---|---|
0 | WeightedEnsemble_L2 | 0.953336 |
1 | LightGBMXT | 0.952803 |
2 | LightGBM | 0.952675 |
3 | CatBoost | 0.951666 |
4 | LightGBMLarge | 0.950629 |
5 | XGBoost | 0.950304 |
特征选择后的结果 | ||
![[aa0ba6d4-2676-4d0d-bc78-37e1517be678.png]]-= |
数据:加入类别特征组合后用catboost做特征选择
模型:
predictor = TabularPredictor(label=label, problem_type='binary', eval_metric='roc_auc', path=save_path).fit(x_train, num_bag_folds=5, num_bag_sets=5, excluded_model_types = ['KNN', 'NN_TORCH','FASTAI','XT','RF'])
基本没什么突破,该用的招差不多都用完了
就是把前几次提交中比较好的按0.2,0.2,0.6的比例重新融合
submit-cat_cross_5-2022-05-02-22-05.txt | submit-cross_5-2022-05-01-19-51.txt | submit-auto_ml_with_num_stat-2022-04-30-18-12.txt | 融合成绩 | |
---|---|---|---|---|
单模成绩 | 0.95501 | 0.95482 | 0.95476 | |
融合比例 | 0.6 | 0.2 | 0.2 | 0.95506 |
0.6 | 0.3 | 0.1 | 0.95503 | |
0.7 | 0.3 | 0 | 0.95499 | |
最后成绩0.95506 |
特征:在类别特征中取三个交叉(之前是两两交叉),用5折lightgbm做特征选择,取5次交叉的特征重要性之和>10的特征
最后得到2326个特征
模型:AutoGulon常规的13个模型
线下auc:0.9541
融合之前的提交
submit-2022-05-03-12-31-3_fusion.txt | submit-2022-05-05-09-51-stat_3_combine_cross_cat.txt | 融合成绩 | |
---|---|---|---|
单模成绩 | 0.95511 | 0.95513 | |
融合比例 | 0.4 | 0.6 | 0.955271 |
0.3 | 0.7 | 0.955243 | |
0.5 | 0.5 | 0.955278 | |
0.55 | 0.45 | 0.955275 |
还可以考虑的方向
核心思想是结合分类准确率和对抗验证AUC综合进行筛选, 通过middle_sort对所有特征进行排序,筛选有用的特征
middle_sort= np.where(importance_sort == i)+ np.where(AUC_sort == i)* 2 # auc_gain