@Author : Jasperyang
@School : BUPThtml
这篇文章同时在知乎里放着~python
Kaggle的数据挖掘比赛近年来很火,以致于中国兴起了不少不少相似的比赛,作了两个这种类型的比赛了,Jdata用户商品购买预测和用户位置精准预测,积累了至关多的比赛经验了,虽然两次成绩都不是特别好,59/4590 和 179/2844 。这些比赛的套路从根本上都是一毛同样的,我下面能够和你们探讨一个大体的作题套路以及怎么往高分走的方向,可是总结来讲这就是个拼体力的任务,和智力无关。(虽然锻炼了动手能力,极大强化了我在sklearn和pandas上的技能熟练度...)git
首先是看题目,是个什么样类型的预测?回归?二分类?多分类?
每种类型的预测会有一点点不一样,我的以为西瓜书仍是须要快速看一遍的,不必定说每一个公式都要仔仔细细去推导(推导公式对你作比赛基本没有什么帮助),你要知道什么是监督,半监督,非监督等等。github
关于多分类我有个入门blog,能够快速浏览一遍算法
而后就是繁复的特征工程了编程
通常这种比赛都有个这么样的流程:ubuntu
最重要的是在特征工程上,基本你会花上60%的时间在这里,由于在这里你须要作的是数据清洗,异常处理,变换,构造新特征等等,这一套有很详细的教程,给你们贴两个传送门(先别急着看)segmentfault
看完这两篇后,基本你就能作到驾轻就熟地处理数据。
可是,其实在作特征工程以前,你应该先去了解数据,怎么去了解数据呢?这就须要你熟练掌握pandas这个工具了,提到怎么熟悉这个工具,我想offer你下面这个学习流程。
安装anaconda,这个很简单,网上一搜就有(这个科学研究工具包含了基本全部你须要的,jupyter,pandas,numpy等等)固然你要作深度学习就须要tensorflow,pytorch之类的还得另外装。
因为后面咱们须要用到xgboost这款神器当模型,因此最好你的系统是ubuntu,由于在ubuntu中安装xgboost只须要pip install就行,在别的系统装起来可能你会想打人。
ok,有了环境,就用anaconda/bin/jupyter 来运行一个jupyter工做环境吧,在这个环境里你能够为所欲为随心所欲所欲为...(主要就是由于jupyter能够保存你以前执行的结果,很方便作实验,详细的你能够google)
学习pandas很简单,由于它就是像数据库对表操做同样。初学直接就看看官网的教程:10 min to learn,以后你要merge,concat,join等等复杂的操做再去一点点查,一点点啃。慢慢熟练了你就能对你的数据作任何你想要的变换,好比找出某些年份的大于某些数值的数据。
为何须要去了解数据呢?由于数据有分布,有不一样的业务意义,你经过整理作图能够更加深刻理解某些属性的意义,而后构造或是提取出有用的特征。
构造特征
在我看来,这算是特征工程的一部分,也是最最重要的一部分,你将会在这里花大量的时间!!(所谓特征就是feature,也就是你的训练数据集中除去label之外的全部列)
打个比方,好比一个商品预测的比赛,你能够将特征分红三类,从三种角度去整理分析。(感谢阿里移动推荐算法大赛总结的图片数据)
这种特征构造提取的过程对于每一种比赛都不同,我这里就不详细讲了,若是你须要更多的启发的思惟,建议你去搜索大量别人怎么从各类角度思考的资料。
在这里说起一句,通常来说,涉及时间的都会须要设计时间窗口这么一个东西,这个东西说复杂不复杂,可是实践起来很费精力。简单来说就是你须要对你的数据按照必定的时间划分。好比我以前的比赛用前五天的数据预测后一天的,可是总的数据集是两个月的,这时候你须要划分你的数据集分好训练集和验证集。
上面的1,2,3是三个训练集,后面带的小框是验证集,等于你须要训练好几个模型。
同时你能够想啊,更早以前的数据确定对如今的预测影响会更小,因此会有个权重的问题,也就是你获得了十个模型,最接近预测日的算model_0,最远的算model_9,那么给model_0权重0.7,给model_9的权重0.05。
你须要知道什么是训练集,验证集,测试集!!
有时候训练集的类别很不均衡
这个时候须要欠采样或是过采样。
欠采样 某个数据比较多的类别随机减小掉一些训练数据
过采样 找那些数据少的类别使用smote方法插值添加数据 smote算法
其实数据不平衡的处理也是特征工程的一部分,我这里只是提出来强调了一下,类别不平衡的处理其实还有不少,可是都不经常使用,你们能够去大概了解了解。
每一个特征你都应该取好名字,以防乱了。
另外,因为作模型融合时须要有特征多样性这么一说,因此也许你须要不一样的特征簇输入到不一样的模型中,因此作好你的文件管理十分重要!!!
我建议你的比赛工程文件以下。
result里面你需也要分好文件夹放不一样的结果,这样方便后面模型融合时咱们用投票器的方式。
experiment里面是你的jupyter实验文件,由于这类文件你会建立不少,因此最好有一个专门的文件夹来管理。
是否是很简单而且清晰明了,当你学会了sklearn中的pipeline以后,你就能够搭建一个能够轻易修改并给别人看讨论思考过程的工程代码。可是不能完成的是作成一个能够轻易复用到各类比赛的框架。由于每一个比赛的数据大不相同。再也不多言。
OK!! 走过上面的流程,咱们如今进入到part 2的训练阶段吧,这个阶段是最激动人心的,由于你将在这里碰见你特征工程以及模型的不足,而后调优,看着成绩慢慢提升~!
模型阶段,在这里,你须要对各类模型都有很清晰的了解,最好是你可以推导公式,不能也算了。
Logistic Regression
SVM
GDBT
Naive Bayes
Xgboost (这个能够说是最有用的)
Adaboost 等等
熟读西瓜书吧,里面从基础开始会让你懂不少,最好是李航的统计学习方法看一遍,这本书比较薄,涵盖的内容却很全,推导也好理解。
而后这些模型很高兴的是,一个都不用你去写~都有现成的库,并且基本集中在sklearn中。除了 lightGBM。
先看一下这篇简单调用: python sklearn经常使用分类算法模型的调用,你会发现模型用起来好容易好方便~是的,可是这只是开始,别忘记要保存模型哦,另外保存结果也要严格按照规定的文件路径,否则后面你就乱了。
sklearn的编程方式博大精深,可是api使用仍是很简单,你只须要花点时间好好学学,就能很熟练了,推荐 python之sklearn学习笔记,这个比官网的教程好看懂,毕竟是中文的嘛...流汗~
再来你还须要去对这些算法调参,这些我就再也不谈了,我想着重提一下xgboost,这是一个能够并行运算的回归树,在如今的比赛中用的十分频繁并且有效。
我翻译的官网的原理解释 : (XGBoost)提高树入门介绍(Inrtoduction to Boosted Trees)
看懂了后你就会知道为何这个东西这么牛逼了,固然前提是你须要知道决策树,随机森林的原理。
再说一句,安装xgboost在ubuntu系统上很方便,但别的系统真的很难受,本身体会吧,不想浪费时间最好都弄成ubuntu
xgboost运行后的效果通常就很好了,可是这不是最终的,由于xgboost有不少的参数,怎么去调参使得结果更优很重要。
调参也是个体力活,望各位保重身体!~
好了,part 2 也就讲到这里了,其实把这前两个部分好好作,就能取得好的成绩了,第三个部分是后期往上窜一窜的手段,固然不可不用。
模型融合
模型融合得看你是作什么样的预测,不一样的预测结果有不一样的融合方式。
bagging,voting,stacking都是ensembling的一种。
通常都是讲回归的,voting具体的方法没有讲,我这里有一段代码,你看看就懂怎么作voting。
# 投票器 def file_name(file_dir): filename = [] for root, dirs, files in os.walk(file_dir): filename.append(files) return filename\n", filename = file_name('./result/all_result/')[0] ''' * 文件名 * 票数 ['result_0.002_no_0.03_8steps_0.8964.csv', 9 'result_TL_ten_0.002_no_0.03_0.9062.csv', 10 'result_0.001_0.8917 .csv', 9 'result_LT_ten__0.001_no_0.03_0.9092.csv', 10 'result_LT_ten_0.0015_no_0.03_0.9051.csv', 10 'result_0.0015_0.9061.csv', 10 'result_AdaB_0.31.csv', 3 'result_feature_delexcep_0.002_tree.csv', 9 'result_rf_0.001_0.03_0.86.csv', 8 'result_lr_0.60.csv', 4 'result_rf_0.87.csv', 8 'result_0.002_no_0.03_6steps_0.8951.csv', 9 'result_0.002_no_0.03_0.9058.csv', 10 'result_gdbt_0.79.csv', 6 'result_xgb_91.csv', 11 'result_0.002__0.9046.csv', 10 ] ''' dic = {} index = list(re.iloc[:,0]) result = [] voting = [9,10,9,10,10,10,3,9,8,4,8,9,10,6,11,10,9] for t in list(re.iloc[:,0]): dic[t] = {} for i,shop in enumerate(list(re[re.row_id == t].iloc[0,1:])): # 创建字典 if shop not in dic[t].keys(): dic[t] = {re[re.row_id == t].iloc[0,1] : voting[i]} else: dic[t][shop] += voting[i] # 选出最高票者 , 得票相同的选后者 top = 0 score = 0 for x,y in dic[t].items(): if y > score: top = x score = y result.append(x) re = pd.DataFrame({'row_id':index,'shop_id':result})"
关于模型融合这一块就看你想怎么弄了,多标签分类这种比较局限,就是投票器,回归的话花样就多了,还能分层搞,因此不怕你想不到,就怕你不尝试。
为了加深你对模型融合的理解和使用,另外推荐三篇:
最后我讲两个trick吧。(没什么道理性的,有时候行,有时不行)
找比赛leak,这个就是钻空子吧。经过分析测试集的一些特性找出golden feature(就是一会儿能把成绩提升老多的feature)我听大牛的分享里有讲到可是我作比赛时没有想到,很惭愧。
利用GDBT或是XGBoost的叶子节点的信息建立出新的特征,通常来说能提升成绩,可是训练起来贼慢,像我借了好几台电脑,把训练集分散到不一样电脑上跑。累死了...
有人说跟一遍kaggle上的kernel一套就都会了,我以为挺好的,可是看了个人这篇呕心沥血的文章后,我想你的知识才是系统的!~
好了,终于到收官了,说实在的,这类型的比赛我暂时是不想参加了,咱们学校的大牛硬是打了10场,而后拿了两次冠军,我这参加了两次,成绩很差,可是已经身心俱疲了,没信心拿到奖了。何况,我认为深度学习才是如今的王道,我已经在图像识别和image caption中遨游了好些日子。有意思多了。
到此,祝你们好运。