参加的这次kaggle比赛是一个关于客户购买预测的机器学习的比赛,最终Public和Private榜综合计算后名次是458/8800,这也是第一个完成度最高的比赛,以往天池的比赛都是跟进几天就不再做了。亲自看着从参加此比赛时的几百个队伍到最终的9000多个队伍,官方清理和结算一些违规和小号之后最终队伍数是8800个,很可惜的是440名以前就可以拿到银牌,但还是差了一些名次,因为是solo也没人一起玩,所以这个比赛成绩还是挺满意的。
同学之前也经常交流机器学习应该怎么学,我觉得最好的方式就是边打比赛边学习,kaggle(目前数据竞赛最好的平台之一)和天池(国内最好的数据竞赛平台之一,由阿里巴巴负责)里有很多人会分享经验,这些对于快速入门是非常有帮助的。如果没有这些比赛,我对机器学习的模型了解还停留在SVM、决策树、贝叶斯、逻辑回归等传统的模型中(也不是说这些模型不好,也见过别人用传统的贝叶斯,成绩也非常好),但是经过这些比赛,知道了很多数据处理与特征提取的方法,也对目前的比赛常用模型有了一定的了解。目前机器学习比赛也可以说是特征工程大战(相比深度学习比赛主要是模型上的一些改进),模型上大家上来基本都会用Random Forest(bagging的集成学习)、XGBOOST、LightGBM、Catboost(boost的集成学习),关于bagging与boost集成学习的区别,在之前的博客中有提及。
XGBoost在连续几年间几乎拿下了所有kaggle机器学习的冠军,但是XGBoost最大的一个缺点是速度过慢,后来微软提出了LightGBM,俄罗斯Yandex 开源 了CatBoost,目前几乎所有机器学习比赛都有用到这三种算法,关于这三个算法的一些介绍可以参考下面这些文章:
通俗理解kaggle比赛大杀器xgboost
从结构到性能,一文概述XGBoost、Light GBM和CatBoost的同与不同
当然也有很多人会尝试用神经网络来做,用上目前神经网络训练的一些tricks很多人也会得到特别好的结果。而且当把这些模型调到单模型最优后,可以在最终比赛快结束时进行模型的融合。例如同一个模型不同的参数、同一个模型同参数但不同特征、不同模型(比如boost与NN),将这些不同的模型再进行基于贝叶斯的stack或者简单的加权平均,一般来说都会提高较高的百分点。但是正如大佬们所提及,机器学习中“数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已”。我们都知道神经网络最大的优点之一就是特征工程的耗时减少,但是在这些机器学习比赛中一般在把样本送入神经网络之前都要进行一些特征提取,一般官方给的原始特征是无法得到特别好的结果的。
特征工程是机器学习中最难的一个环节,不仅需要有丰富的理论基础,而且很多比赛也需要专业的知识,之前有一个移动客户信用分预测的比赛,TOP-1%的队伍构造的特征就非常具有此领域的一些专业知识。如何快速高效的做特征工程,这需要在实践中不断探索。
这次比赛中其他的不想多讲,主要是想分享一下比较有用的技巧。
(1)首先是在做模型前对数据的分布一定要了解,特别是样本分布不均衡时一定要进行适当的样本增强和合理的采样。
(2)整个代码中的seed一定要进行合理的设置,否则每次训练的结果很可能不一样,对将来的结果复现是会有影响的。
(3)在每次各个版本提交时也尽量进行合理的存档,以便知道每次做了什么更改,比如下面的代码:
# 以时间为标记存储源代码和输出文件
import datetime
import shutil
import os #导入相应的包
my_submission= pd.DataFrame({"ID_code" : id_code_test, "target" : predictions}) #要提交的测试结果
mk_new_dir = True #不想这样存储时可以改成False
if mk_new_dir==True:
time_str = datetime.datetime.now().strftime('%m_%d_%H_%M')
new_dir = '../{}_SCT/'.format(time_str) #注意SCT是我自己设置的本次比赛的一个比赛名标志
os.mkdir(new_dir)
my_submission.to_csv(new_dir+"submit{}.csv".format(time_str), index=False, header=True) #将结果加上时间进行存储
shutil.copyfile('SCT.ipynb', '../{}_SCT/{}.ipynb'.format(time_str, time_str)) #将所有jupyter notebook的源代码加上时间戳进行保存
(4)赛后可以看到大神们的操作,kaggle最大的好处就是社区做的特别棒,Kernels和Discussion中每天都有大神们分享自己的一些tricks和代码,而且比赛完后基本所有TOP队伍都会分享自己的一些Magic,这次比赛赛后看了大神们的分享,其实感觉差距最大的还是特征的处理上。
目前没有太多时间整理所有代码,比赛时写的也挺乱的而且放在了一个jupyter文件中并没有进行结构化编写,如果有时间可能会放到Github上,当然其实也没多少参考价值,毕竟目前的自我评价就是一个误入计算机的不会写代码的小可爱。
2019年4月17日
沙坡村职业技术学院