技能手 比技能大赛结束语后如何改进出现的问题点

2014中药传统技能项目竞赛方案(2014.01)_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
2014中药传统技能项目竞赛方案(2014.01)
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩23页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢恰好我对三种棋都比较熟,尝试回答这个问题。&br&中象和国象应该都算入门,围棋差一些,也就业余1级的水平,估计还不到业余1段。&br&(ps:2013年10月-11月的一个多月里,围棋涨棋了,大约弈城3-4d水平,拿了个业余2段证——突然一下就开窍知道围棋应该怎么提升了;另,大学的时候国象大约1级棋士,象棋高中的时候也许是3级棋士吧——补充)&br&&br&&b&一、中象、国象、围棋这三种棋哪一种最好玩?最喜欢哪一种?&/b&&br&个人最喜欢围棋,毫无疑问认为围棋最好玩。&br&其实喜欢一个游戏,除了游戏本身的趣味程度,还和能不能在玩游戏过程中得到正反馈有关。往往是你越擅长某个游戏,你越喜欢玩,并越有动力去钻研。&br&而就我个人而言,围棋水平是最低的,却仍然最喜欢围棋,我觉得是因为围棋在趣味性上远超过中象和国象。为什么认为围棋更有趣呢?&br&1)&b&未知领域更多,使人更有探索的欲望和乐趣&/b&:以前无论是象棋和围棋都有“千古无同局”的说法,来形容棋局的变化之多——也就是之前有人提到的状态空间和决策空间的问题。但事实上中象和国象真正合棋理的下法都没有那么多,如果你把所有主要开具都梳理一遍,你就会发现来来去去就是这些下法,比如中象里面顺炮局几乎被现代棋手研究通透了——这个矿差不多被挖光了。这样导致一个结果:如果那些高手,比如特级大师下慢棋,深入思考,那么会经常下成和棋——手段就这么多;如果下快棋来避免和棋太多的问题,就会导致棋局粗糙,而且往往变成背棋谱。相比之下,围棋的棋局发展变化远远超过象棋。&br&2)&b&手段更丰富,优美&/b&:围棋下棋规则特别简单,但是手筋、招数、妙手极其丰富,相比之下中象国象的战术手段无非是捉双、抽射、闪击、解除防御、拦截、引离、引入、顿挫、腾挪、牵制……&br&3)&b&游戏过程中逻辑计算和理解感觉的成分非常平衡&/b&:下象棋逻辑计算的成分占90%,尽管对棋理的考量也很重要,但是相比计算而言,太微弱了——子力协调性、效率这种虚的成分都可以用计算明明白白搞清楚;而围棋很多地方是算不清楚的,这种算不清楚的地方就需要理解——厚薄、手段是否过分,形状和局面的要点等等,这种对于“理”的掌握在下围棋的实力构成中可能是50%(当然,没有计算作为支撑,所谓对棋理的理解只是花架子)。既有“理”的成分,又有“算”的成分,使得围棋非常生动——与之相反的例子是五子棋、黑白棋,基本上死算的部分占了99%以上,实在是很枯燥。&br&&br&&b&二、哪一种棋最难下好?&/b&&br&·围棋。&br&这里涉及:&br&&b&1、学棋需要投入的时间、精力和努力程度&/b&&br&&b&2、获取学习资源的难度&/b&&br&&b&3、什么叫做好?&/b&&br&&br&这里1、2项结合起来其实就是学棋的门槛。&br&&b&1、比较学棋需要投入的时间、精力和努力程度和获得学习资源的难度&/b&&br&1)中象:棋子虽然类型较多,但学规则不难,下棋目标和思路很明确,初学阶段就是杀王和吃对方棋子,布局也很简单,随便借鉴街头巷尾的人的布局,按照正常的逻辑进行很容易下得像模像样。而要真正入门也不难,有心的人,看通一本象棋入门,足够在一个镇里成为第一。&br&2)围棋:规则虽简单,但是要下得稍微像点模样——会基本的死活、手筋、定式、收官,没有特别多的俗手,需要学很多的基础知识。在资源上,个人认为除了不世出的天才,学围棋一定要有好师傅——像我这样看书自学的,在实战中学出一大堆的俗手和坏毛病。&br&3)国象:规则复杂程度跟中国象棋差不多,要真正入门也不难,看一本入门书就可以了。但是若不看书,系统学习开局的话,下的棋是很难看的——为什么呢?因为国际象棋共32个棋子,只有64个落子点,棋盘很拥挤(中象32个棋子90个落子点),兵的火力也比较强,所以开局阶段子力犬牙交错,如果没有系统学过开局,随时会出问题——而中象的子力比较舒展,开局不下大臭棋,除非遇到高手,并不容易脆败。学国象的麻烦之处在于,爱好者少,获得学习资源包括对手和老师的难度比象棋大——请个好的家教比围棋还难。&br&&br&&b&2、达到不同好的程度,各自难度如何?&/b&&br&&b&1)入门级:&/b&&br&这里的入门级指&b&中象、国象方面&/b&已经知道整局棋应该怎么下,掌握残局的所有经典杀法、组合杀法、能灵活运用中盘的各种战术,具有比较强的计算力,基本了解开局分类,熟练掌握几种开局,在开局阶段大体不会迅速失利,能够针对对方的棋形弱点拟定比较有利的中盘进攻组合手段。这种程度,下中象的话在一个镇里面差不多可以称王了,在县里面有机会拿一定名次。(国象下的人太少,在名次方面不好比较)&br&在围棋方面,棋力能达到业余1段,可以算入门了。&br&个人认为,达到入门的水平,综合考虑获得学习资源的难度和投入的时间、精力,难度大小是:&b&围棋&国象&中象。&/b&&br&&b&2)&/b&
在一个&b&地级市里面成为前三名&/b&&br&达到这样的程度,个人认为难度大小是:&b&围棋&中象&国象&/b&。&br&为什么在这里中象比国象难呢?因为中象的人口基数大,竞争比较激烈。在镇子这样小地方下棋的人,很多穷其一生都没有入门,而在地级市里面高手就很多了。&br&相比之下,一个地级市里面学国象的人口基数还是很小,所以在地级市这个级别成为业余高手还是相对容易的。&br&&br&&b&三、关于学习资料的推荐&/b&&br&&b&中象:&/b&&br&1、《象棋入门》,金盾出版社——个人认为编排非常好,天赋还可以的话看完这本书足够入门了。&a href=&//link.zhihu.com/?target=http%3A//product.dangdang.com/.html%23ddclick%3Fact%3Dclick%26pos%3D_1_q%26cat%3D%26key%3D%25CF%25F3%25C6%25E5%25C8%25EB%25C3%25C5%26qinfo%3D102_1_48%26pinfo%3D%26minfo%3D%26ninfo%3D%26custid%3D%26permid%3D%26ref%3Dhttp%253A%252F%252Fsearch.dangdang.com%252F%253Fkey%253D%5FA%2525BC%2525CA%2525CF%5C6%5C8%2525EB%5C5%26rcount%3D%26type%3D%26t%3D0& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&《象棋入门修订版》王国栋 等编著&/a&。我小学4年级的时候买了这本书自学,算是在小学称霸了。&br&2、《橘中秘探秘》,张强大师的视频——打谱不如看教学视频,学习古谱有一个好处是学习组合杀法和找对方的阵形弱点,借鉴进攻的思路。&br&3、关于残局的书——这个搜索一下现代名手系统性讲解基本残局书就好了,比如则一本王嘉良的书据说不错&a href=&//link.zhihu.com/?target=http%3A//product.dangdang.com/.html%23ddclick%3Fact%3Dclick%26pos%3D_2_q%26cat%3D%26key%3D%25CF%25F3%25C6%25E5%25B2%25D0%25BE%25D6%26qinfo%3D61_1_48%26pinfo%3D%26minfo%3D%26ninfo%3D%26custid%3D%26permid%3D%26ref%3Dhttp%253A%252F%252Fsearch.dangdang.com%252F%253Fkey%253D%5D0%5FA%2525CF%5C6%5B2%5BE%rcount%3D%26type%3D%26t%3D0& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&《象棋残局大全》王嘉良,李中健,王国顺 编著&/a&&br&4、关于中局的书——学习如何对中局破局进行构思,书很多,没有特别有印象了,搜搜就好了。&br&5、关于布局和布局陷阱的书——现代布局理论比古代完善了非常多,有必要系统的学习——如果看了《橘中秘》、《梅花谱》之类没有批判而是囫囵吞枣接受的话,布局容易跑偏,违背棋理,所以要系统学习现代布局理论;而为什么要看布局陷阱的书呢?这个是用来提高成绩的捷径,呵呵呵呵……&br&&br&&b&国象:&/b&&br&1、《国际象棋入门》,谢军和林峰编的,也是金盾出版社的。非常不错,学了以后足够到业余1级棋士的水平。&br&&a href=&//link.zhihu.com/?target=http%3A//product.dangdang.com/.html%23ddclick%3Fact%3Dclick%26pos%3D_1_q%26cat%3D%26key%3D%25B9%25FA%25BC%25CA%25CF%25F3%25C6%25E5%25C8%25EB%25C3%25C5%26qinfo%3D40_1_48%26pinfo%3D%26minfo%3D%26ninfo%3D%26custid%3D%26permid%3D%26ref%3Dhttp%253A%252F%252Fwww.dangdang.com%252F%26rcount%3D%26type%3D%26t%3D0& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&《国际象棋入门》谢军,林峰
编著&/a&&br&2、战术练习书,这个就不举例了,国外很多,反正战术大体就是抽子、捉双、引入、引离、拦截、牵制、顿挫、闪击……多做练习题就好了&br&3、对于布局和残局我没有太深的研究,只是入门级的,就不推荐。(ps:那些看起来简单的残局其实真的很复杂)&br&&br&&b&围棋:&/b&&br&1、&a href=&//link.zhihu.com/?target=http%3A//product.dangdang.com/.html%23ddclick%3Fact%3Dclick%26pos%3D_1_q%26cat%3D%26key%3D%25CE%25A7%25C6%25E5%25C8%25EB%25C3%25C5%26qinfo%3D140_1_48%26pinfo%3D%26minfo%3D%26ninfo%3D%26custid%3D%26permid%3D%26ref%3Dhttp%253A%252F%252Fsearch.dangdang.com%252F%253Fkey%253D%2525CF%5C6%5C8%2525EB%5C5%26rcount%3D%26type%3D%26t%3D0& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&《围棋入门(修订版)》&/a&——还是金盾出版社的,学了这本书还达不到业余1段,个人认为学围棋光看书不行,&b&一定得拜师&/b&——围棋需要理解的东西太多,这些道理看书远远没有真正懂的人给你讲来得清楚。&br&2、邱百瑞围棋入门,系列光盘——这个教学视频非常好,还没拜师之前可以看这个视频学习。&br&3、业余低段涨棋有基本书非常值得推荐:1)《围棋的筋和形》《围棋的棋形效率》-林海峰;2)《如何应对无理手》-小林光一;3)《围棋攻防技巧》-加藤正夫;4)《围棋技巧大全》-江铸久。(修改)&br&&br&ps:现在的国象、中象软件都很厉害,都是大师-特大级的,用来复盘相当于请了半个老师,推荐chess master(国象)、象棋巫师(中象)
恰好我对三种棋都比较熟,尝试回答这个问题。 中象和国象应该都算入门,围棋差一些,也就业余1级的水平,估计还不到业余1段。 (ps:2013年10月-11月的一个多月里,围棋涨棋了,大约弈城3-4d水平,拿了个业余2段证——突然一下就开窍知道围棋应该怎么提升了…
&p&目前于国内某上市公司从事&b&深度学习算法研发&/b&的工作,这个工作让我获得了一份满意的薪资,这份薪资是我本科毕业那时所不敢想象的,也未曾想过会如此之快的实现,能够让我承担起养家糊口的重任,因此,&b&也特别希望有越来越多的人往这个方向发展&/b&。&/p&&p&&b&/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////&/b&&/p&&p&//
突然好多赞,让我吓一跳,希望对大家有所帮助,,祝大家学习进步~同时也感谢大家参与我的live,有什么问题可以先在live里面&b&提问&/b&,我会一一作答~&/p&&p&//借Ng大牛(吴恩达)的一句话送给大家:&b&任何人都能成为机器学习专家&/b&&/p&&p&&b&/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////&/b&&/p&&p&回想起以前在学校学习深度学习的时候,游荡于各种深度学习的qq群以及csdn的各种博客上,有一次在服务器上配置深度学习框架时,出现了第三库编译错误的问题,折腾了两周时间还未能解决,后来在csdn上有幸受某位大厂的深度学习部门的大神悉心指导,从晚上八点教我各种排查错误一直到11点,我对于这位前辈来说,仅仅是一个&b&陌生人&/b&,而这位前辈却花了一个晚上悉心指导,实在令我感激涕零,这种品格也深深影响着我,我想,会有越来越多的人往这条路上奋勇前进,&b&在如何入门这个问题上,希望我的经历能给各位带来帮助~&/b&&/p&&p&&br&&/p&&p&&b&深度学习我个人觉得不是非得是计算机专业才能够学习的,说如何入门之前,先说说我的背景,以便给大家树立学好深度学习的信心~&/b&&/p&&p&&br&&/p&&p&&b&背景:&/b&&/p&&p&我本科是机械专业,普通二本,当时大二开始想学习C语言,没整明白,当年有一个心理障碍:搞计算机那是需要天赋的! 这个观念可把我害惨了,看C语言看到大四,才会一些简单的编码,算法啥的,想都不敢想~&/p&&p&&br&&/p&&p&本科毕业后,跟公司同事一起辞职考研,同样准备半年,同事考上了,我却连国家线都没过,每天复习12个小时左右,其中用在数学上的时间大概有一半,结果考了52&/p&&p&&br&&/p&&p&这两件事情是我大学到毕业一年之后所发生的事,正在本科同学都在各行各业开展自己的事业的时候,&b&我却开始怀疑自己的智商是不是有问题&/b&,发生的这两件事真的让我不知道我还能干什么,以后的路该怎么走下去,女朋友更是不敢谈,想着找家工厂,画画CAD图纸,工资饿不死就行,什么月薪过万的,只能是看看下辈子有没有机会了,哭~&/p&&p&&br&&/p&&p&&b&或许当一个人跌到谷底的时候,就会开始反弹&/b&&/p&&p&&br&&/p&&p&谁也没有想到,我会第二次辞去来之不易的工作,找同学借生活费维持考研期间的费用去准备第二次的考研,且顺利考到了&b&厦门大学&/b&,复试的时候,面试成绩还是专业第一&/p&&p&&br&&/p&&p&谁也没有想到,我会从一个C语言看了两年才会一些简单编码的计算机新手,经过两年之后,到上市公司去做&b&深度学习算法的研发工作&/b&,拿到的薪资是下下辈子才敢想的~目前已成家,工资在月供,剩下的钱基本上够我和家人生活开销,老婆的钱她自己存起来。&/p&&p&&br&&/p&&p&&br&&/p&&p&&b&好了,到这边,以上不是毒鸡汤,仅仅是一个事实,相信以我的基础情况,足够给大家树立学习深度学习的信心了吧!&/b&&/p&&p&&br&&/p&&p&&b&深度学习如何入门?&/b& &b&恩,我都能入门,你们肯定也行!&/b&&/p&&p&&br&&/p&&p&&b&进入正题:&/b&&/p&&p&&br&&/p&&p&&b&很多的回答算是比较老了,现在已经出现了越来越多好的学习资料&/b&&/p&&p&&br&&/p&&p&&b&1.数学基础&/b&:搞深度学习的学生一般是研究生,刚经历过考研,数学应该没什么问题,不是研究生当然也没关系,把高数的&b&求偏导&/b&那部分看下,做几道练习题,推荐张宇的《高等数学18讲》,以及《概率论9讲》,淘宝买的书一般会赠送对对应的视频课程,看不懂书可以看看视频,都讲得比较通俗了,并没有必要去看市面上各种&b&几百上千的培训班&/b&讲数学基础。凸优化属于进阶的内容了,我觉得入门阶段可以先不用看&/p&&p&&br&&/p&&p&&b&2.机器学习基础&/b&:机器学习本身是一个庞大的领域,单单一个svm的推导就能把我们虐死,而在深度学习或者能够在UFLDL教程中,Andrew Ng 已经告诉我们可以先看到逻辑回归就好,看II,III,IV章(到逻辑回归)&a href=&//link.zhihu.com/?target=http%3A//openclassroom.stanford.edu/MainFolder/CoursePage.php%3Fcourse%3DMachineLearning& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&openclassroom.stanford.edu&/span&&span class=&invisible&&/MainFolder/CoursePage.php?course=MachineLearning&/span&&span class=&ellipsis&&&/span&&/a& &/p&&p&&br&&/p&&p&&b&备注&/b&:由于ng的机器学习课程是英文的,觉得不习惯的同学,也可以参考台湾李宏毅老师的机器学习课程(网上搜索资源),一口台湾腔,讲得很棒啊,听懂没问题~&/p&&p&&br&&/p&&p&&b&3.深度学习与计算机视觉&/b&:有了上面的两个基础,可以把李飞飞老师的网易云课堂的公开课&a href=&//link.zhihu.com/?target=http%3A//study.163.com/course/introduction.htm%3FcourseId%3D%23/courseDetail%3Ftab%3D1& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&study.163.com/course/in&/span&&span class=&invisible&&troduction.htm?courseId=#/courseDetail?tab=1&/span&&span class=&ellipsis&&&/span&&/a&给刷了,最好自己把卷积的bp过程公式推导一下,参考&a href=&//link.zhihu.com/?target=http%3A//ufldl.stanford.edu/wiki/index.php/UFLDL%25E6%E7%25A8%258B& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&ufldl.stanford.edu/wiki&/span&&span class=&invisible&&/index.php/UFLDL%E6%95%99%E7%A8%8B&/span&&span class=&ellipsis&&&/span&&/a&
当然,也可以事先看看一些中文博客对卷积神经网络的通俗讲解~&/p&&p&&br&&/p&&p&&b&备注&/b&:同样,不习惯英文的同学可以参考台湾李宏毅老师的深度学习课程(网上搜索资源),我觉得李宏毅老师也算得上一个机器学习领域的新星,哈哈&/p&&p&&br&&/p&&p&&b&4.选择一个深度学习框架开始搞事情了&/b&:像caffe TensorFlow pytorch 这三个我个人比较看好,用caffe来作为一个入门是非常不错的选择,把caffe自带的几个example跑通之后,可以开始着手选择一个领域,看相关的论文,比如人脸检测,开始训练一些模型,其中会需要用到python或者matlab来处理一些数据集的格式,对应的编程语言要学习下&/p&&p&&br&&/p&&p&&b&5.&/b&近期大牛&b&吴恩达&/b&离开百度之后,自己创业,在网易云课堂发布了一系列的免费课程,是关于deeplearning 的,在你有过一些实战经验之后,可以好好刷一下,地址如下:&u&&a href=&//link.zhihu.com/?target=https%3A//study.163.com/courses-search%3Fkeyword%3D%25E5%%25E6%%25E8%25BE%25BE& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&study.163.com/courses-s&/span&&span class=&invisible&&earch?keyword=%E5%90%B4%E6%81%A9%E8%BE%BE&/span&&span class=&ellipsis&&&/span&&/a&&/u&&/p&&p&&br&&/p&&p&&b&6.&/b&学完上面的东西,也要花不少时间,因为每个人基础不一样,理解速度也不一样,所以也没必要强求跟别人比进度~尽心尽力就好&/p&&p&&br&&/p&&p&&b&7.初步学完了上面提到的内容,可以算是入门了&/b&,但是如果要在毕业后从事深度学习方向的职业,是需要更多其他方面的积累的,到底掌握什么技能才是企业真真正正需要的?在大型企业中,算法的研发流程又是怎么样的?&/p&&p&&b&8.今年5月份左右,好多师弟师妹在问我到底该掌握些什么技能才是企业实际需要的?他们导师也是刚接触深度学习方面的,对这块也不了解~哎,问题实在有点多,回答得有些累了,然后我就顺带把这些师弟师妹们的疑惑,以及我自己之前实习的经历整理成一个比较完整的体系:&/b&&/p&&p&&b&学习的资料都差不多,但是学习方法却有很大差别,好的方法会让我们少走弯路,而不好的方法,则会让我们在一个错误的方向越走越远~&/b&&/p&&p&&b&比如:当老板扔给你一篇论文,要你一个月内复现出来,但是这篇论文的领域是你还没接触过的,此时,你怎么办?你打算怎么做?&/b&&/p&&p&我在知乎上整理了一个live,&a href=&https://www.zhihu.com/lives/886720& class=&internal&&上市公司深度学习算法研发 实习生心得&/a& 分享我在这个行业的心得体会,&b&一方面&/b&帮助想往这个行业方向发展的同学指引方向,做一些有用的积累;&b&另一方面&/b&帮助已经在实习的同学少走弯路,成为一名优秀的实习生。&b&更重要的是&/b&:帮助大家用一个更有效的思路解决问题~&/p&&p&&br&&/p&&p&&b&大家从我的经历可以看出,我并不是一个聪明的人,我只能说在考上研与转行做深度学习算法研发,这两个事情里面,我找到的是一个正确的学习方法而已,是绝大多数数普通学生足以去复制的~&/b&&/p&
目前于国内某上市公司从事深度学习算法研发的工作,这个工作让我获得了一份满意的薪资,这份薪资是我本科毕业那时所不敢想象的,也未曾想过会如此之快的实现,能够让我承担起养家糊口的重任,因此,也特别希望有越来越多的人往这个方向发展。//////////////…
不知道你想干嘛,但无论如何python flask会比java web好很多。&br&具体我我晚上讲现在没空&br&&br&——大晚上跑来更新——&br&&br&对于楼主,学编程的动机、目的什么的都不说,我没法给出答案,所以这篇答案是general的。&br&&br&&br&推荐python的理由是应用广泛,简单易学。&br&&br&我不想说为何python之类的动态语言为什么比java web好,我就说说怎么学好web开发。&br&&br&我觉得ror也很好,如果可以我其实会推荐新手先用ror,但是ror的缺点在于「你找不到资料」,你能找到的所有资料都是过时的,因为它变化太快。&br&&br&如果我能有时间写一份step by step for ror教程,那真是再好不过,但是我似乎没有时间来做这件事,所以这里我们就说python。&br&&br&python有很多web框架,我认为flask拿来学习最好,你可以有不同意见,也可以去找你喜欢的,只要你能学好就行,找不到或者学失败了你就回来从flask入手。&br&&br&&br&&ul&&li&web有很多概念,python也有一些基础知识要补,&b&&u&不懂就搜,搜不到就记下来暂时跳过&/u&&/b&&/li&&br&&li&flask有一本书不错,中文版在此:&a href=&//link.zhihu.com/?target=http%3A//www.ituring.com.cn/book/1449& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&图灵社区 : 图书
: Flask Web开发:基于Python的Web应用开发实战&/a&&br&&/li&&li&书学完后可以做个知乎、微博、博客之类的网站练练手,不会设计可以去找模板&/li&&li&重点来了,&b&&u&把flask源代码看懂&/u&&/b&&/li&&/ul&完&br&&br&&br&这是我写得最直白的一篇答案,而且限定得很死,照做就是了。&br&&br&这样可以让你找到一份还过得去的工作,但是如果想要在编程道路上走得更宽更远,还是应该要补全基础知识。
不知道你想干嘛,但无论如何python flask会比java web好很多。 具体我我晚上讲现在没空 ——大晚上跑来更新—— 对于楼主,学编程的动机、目的什么的都不说,我没法给出答案,所以这篇答案是general的。 推荐python的理由是应用广泛,简单易学。 我不想说为…
&figure&&img src=&https://pic3.zhimg.com/v2-52af8e306a_b.jpg& data-rawwidth=&650& data-rawheight=&350& class=&origin_image zh-lightbox-thumb& width=&650& data-original=&https://pic3.zhimg.com/v2-52af8e306a_r.jpg&&&/figure&&p&这是我去年 4 月份参加完第一次 Kaggle 比赛并拿到前 5% 的成绩后写的总结。本文的英文版当时还被 Kaggle 的官方推特转发推荐。一年过去了,Kaggle 的赛制和积分体系等都发生了一些变化,不过本文中描述的依然是行之有效的入门 Kaggle 或者其他任何数据科学项目的方法。&/p&&p&&strong&本文采用&a href=&https://link.zhihu.com/?target=http%3A//creativecommons.org/licenses/by-nc-nd/3.0/cn/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&署名 - 非商业性使用 - 禁止演绎 3.0 中国大陆许可协议&/a&进行许可。&/strong&&br&&/p&&h2&I. General Approach&/h2&&p&在这一节中我会讲述一次 Kaggle 比赛的大致流程。&/p&&h3&1. Data Exploration&/h3&&p&在这一步要做的基本就是 &strong&EDA (Exploratory Data Analysis)&/strong&,也就是对数据进行探索性的分析,从而为之后的处理和建模提供必要的结论。&/p&&p&通常我们会用 &strong&&a href=&https://link.zhihu.com/?target=http%3A//pandas.pydata.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&pandas&/a&&/strong& 来载入数据,并做一些简单的可视化来理解数据。&/p&&h4&1.1 Visualization&/h4&&p&通常来说 &strong&&a href=&https://link.zhihu.com/?target=http%3A//matplotlib.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&matplotlib&/a&&/strong& 和 &strong&&a href=&https://link.zhihu.com/?target=https%3A//stanford.edu/%7Emwaskom/software/seaborn/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&seaborn&/a&&/strong& 提供的绘图功能就可以满足需求了。&/p&&p&比较常用的图表有:&/p&&ul&&li&查看目标变量的分布。当分布&a href=&https://link.zhihu.com/?target=http%3A//ieeexplore.ieee.org/stamp/stamp.jsp%3Farnumber%3D5128907& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&不平衡&/a&时,根据评分标准和具体模型的使用不同,可能会严重影响性能。&/li&&li&对 &strong&Numerical Variable&/strong&,可以用 &strong&Box Plot&/strong& 来直观地查看它的分布。&/li&&li&对于坐标类数据,可以用 &strong&Scatter Plot&/strong& 来查看它们的分布趋势和是否有离群点的存在。&/li&&li&对于分类问题,将数据根据 Label 的不同着不同的颜色绘制出来,这对 Feature 的构造很有帮助。&/li&&li&绘制变量之间两两的分布和相关度图表。&/li&&/ul&&p&&strong&&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/benhamner/d/uciml/iris/python-data-visualizations& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&这里&/a&有一个在著名的 Iris 数据集上做了一系列可视化的例子,非常有启发性。&/strong&&/p&&h4&1.2 Statistical Tests&/h4&&p&我们可以对数据进行一些统计上的测试来验证一些假设的显著性。虽然大部分情况下靠可视化就能得到比较明确的结论,但有一些定量结果总是更理想的。不过,在实际数据中经常会遇到非 i.i.d. 的分布。所以要注意测试类型的的选择和对显著性的解释。&/p&&p&在某些比赛中,由于数据分布比较奇葩或是噪声过强,&strong&Public LB&/strong& 的分数可能会跟 &strong&Local CV&/strong& 的结果相去甚远。可以根据一些统计测试的结果来粗略地建立一个阈值,用来衡量一次分数的提高究竟是实质的提高还是由于数据的随机性导致的。&/p&&h3&2. Data Preprocessing&/h3&&p&大部分情况下,在构造 Feature 之前,我们需要对比赛提供的数据集进行一些处理。通常的步骤有:&/p&&ul&&li&有时数据会分散在几个不同的文件中,需要 Join 起来。&/li&&li&处理 &strong&&a href=&https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Missing_data& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Missing Data&/a&&/strong&。&/li&&li&处理 &strong&&a href=&https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Outlier& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Outlier&/a&&/strong&。&/li&&li&必要时转换某些 &strong&&a href=&https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Categorical_variable& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Categorical Variable&/a&&/strong& 的表示方式。&/li&&li&有些 Float 变量可能是从未知的 Int 变量转换得到的,这个过程中发生精度损失会在数据中产生不必要的 &strong&Noise&/strong&,即两个数值原本是相同的却在小数点后某一位开始有不同。这对 Model 可能会产生很负面的影响,需要设法去除或者减弱 Noise。&/li&&/ul&&p&这一部分的处理策略多半依赖于在前一步中探索数据集所得到的结论以及创建的可视化图表。在实践中,我建议使用 &strong&&a href=&https://link.zhihu.com/?target=http%3A//ipython.org/notebook.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&iPython Notebook&/a&&/strong& 进行对数据的操作,并熟练掌握常用的 pandas 函数。这样做的好处是可以随时得到结果的反馈和进行修改,也方便跟其他人进行交流(在 Data Science 中 &a href=&https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Reproducibility& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Reproducible Results&/a& 是很重要的)。&/p&&p&下面给两个例子。&/p&&h4&2.1 Outlier&/h4&&figure&&img src=&https://pic4.zhimg.com/v2-d264b31df5aa92019a90e_b.jpg& data-rawwidth=&606& data-rawheight=&892& class=&origin_image zh-lightbox-thumb& width=&606& data-original=&https://pic4.zhimg.com/v2-d264b31df5aa92019a90e_r.jpg&&&/figure&&br&&p&这是经过 Scaling 的坐标数据。可以发现右上角存在一些离群点,去除以后分布比较正常。&/p&&h4&2.2 Dummy Variables&/h4&&p&对于 Categorical Variable,常用的做法就是 &a href=&https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/One-hot& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&One-hot encoding&/a&。即对这一变量创建一组新的伪变量,对应其所有可能的取值。这些变量中只有这条数据对应的取值为 1,其他都为 0。&/p&&p&如下,将原本有 7 种可能取值的 Weekdays 变量转换成 7 个 Dummy Variables。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-5bb23ec55a8d0262737e_b.jpg& data-rawwidth=&1054& data-rawheight=&718& class=&origin_image zh-lightbox-thumb& width=&1054& data-original=&https://pic1.zhimg.com/v2-5bb23ec55a8d0262737e_r.jpg&&&/figure&&br&&p&要注意,当变量可能取值的范围很大(比如一共有成百上千类)时,这种简单的方法就不太适用了。这时没有有一个普适的方法,但我会在下一小节描述其中一种。&/p&&h3&3. Feature Engineering&/h3&&p&有人总结 Kaggle 比赛是 &strong&“Feature 为主,调参和 Ensemble 为辅”&/strong&,我觉得很有道理。Feature Engineering 能做到什么程度,取决于对数据领域的了解程度。比如在数据包含大量文本的比赛中,常用的 NLP 特征就是必须的。怎么构造有用的 Feature,是一个不断学习和提高的过程。&/p&&p&一般来说,&strong&当一个变量从直觉上来说对所要完成的目标有帮助,就可以将其作为 Feature&/strong&。至于它是否有效,最简单的方式就是通过图表来直观感受。比如:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-718cdbf65c184d199adf48f_b.jpg& data-rawwidth=&381& data-rawheight=&271& class=&content_image& width=&381&&&/figure&&br&&h4&3.1 Feature Selection&/h4&&p&总的来说,我们应该&strong&生成尽量多的 Feature,相信 Model 能够挑出最有用的 Feature&/strong&。但有时先做一遍 Feature Selection 也能带来一些好处:&/p&&ul&&li&Feature 越少,训练越快。&/li&&li&有些 Feature 之间可能存在线性关系,影响 Model 的性能。&/li&&li&&strong&通过挑选出最重要的 Feature,可以将它们之间进行各种运算和操作的结果作为新的 Feature,可能带来意外的提高。&/strong&&/li&&/ul&&p&Feature Selection 最实用的方法也就是看 Random Forest 训练完以后得到的 &strong&Feature Importance&/strong& 了。其他有一些更复杂的算法在理论上更加 Robust,但是缺乏实用高效的实现,比如&a href=&https://link.zhihu.com/?target=http%3A//jmlr.org/papers/volume10/tuv09a/tuv09a.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&这个&/a&。从原理上来讲,增加 Random Forest 中树的数量可以在一定程度上加强其对于 Noisy Data 的 Robustness。&/p&&p&看 Feature Importance 对于某些数据经过&strong&&a href=&https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Data_anonymization& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&脱敏&/a&&/strong&处理的比赛尤其重要。这可以免得你浪费大把时间在琢磨一个不重要的变量的意义上。&/p&&h4&3.2 Feature Encoding&/h4&&p&这里用一个例子来说明在一些情况下 Raw Feature 可能需要经过一些转换才能起到比较好的效果。&/p&&p&假设有一个 Categorical Variable 一共有几万个取值可能,那么创建 Dummy Variables 的方法就不可行了。这时一个比较好的方法是根据 Feature Importance 或是这些取值本身在数据中的出现频率,为最重要(比如说前 95% 的 Importance)那些取值(有很大可能只有几个或是十几个)创建 Dummy Variables,而所有其他取值都归到一个“其他”类里面。&/p&&h3&4 Model Selection&/h3&&p&准备好 Feature 以后,就可以开始选用一些常见的模型进行训练了。Kaggle 上最常用的模型基本都是基于树的模型:&/p&&ul&&li&&strong&Gradient Boosting&/strong&&/li&&li&Random Forest&/li&&li&Extra Randomized Trees&/li&&/ul&&p&以下模型往往在性能上稍逊一筹,但是很适合作为 Ensemble 的 Base Model。这一点之后再详细解释。(当然,在跟图像有关的比赛中神经网络的重要性还是不能小觑的。)&/p&&ul&&li&SVM&/li&&li&Linear Regression&/li&&li&Logistic Regression&/li&&li&Neural Networks&/li&&/ul&&p&以上这些模型基本都可以通过 &strong&&a href=&https://link.zhihu.com/?target=http%3A//scikit-learn.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&sklearn&/a&&/strong& 来使用。&/p&&p&当然,这里不能不提一下 &strong&&a href=&https://link.zhihu.com/?target=https%3A//github.com/dmlc/xgboost& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Xgboost&/a&&/strong&。&strong&Gradient Boosting&/strong& 本身优秀的性能加上 &strong&Xgboost&/strong& 高效的实现,使得它在 Kaggle 上广为使用。几乎每场比赛的获奖者都会用 &strong&Xgboost&/strong& 作为最终 Model 的重要组成部分。在实战中,我们往往会以 Xgboost 为主来建立我们的模型并且验证 Feature 的有效性。顺带一提,&strong&在 Windows 上安装 &/strong&Xgboost&strong& 很容易遇到问题,目前已知最简单、成功率最高的方案可以参考我在&a href=&https://link.zhihu.com/?target=https%3A//dnc1994.com/2016/03/installing-xgboost-on-windows/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&这篇帖子&/a&中的描述&/strong&。&/p&&h4&4.1 Model Training&/h4&&p&在训练时,我们主要希望通过调整参数来得到一个性能不错的模型。一个模型往往有很多参数,但其中比较重要的一般不会太多。比如对 &strong&sklearn&/strong& 的 RandomForestClassifier 来说,比较重要的就是随机森林中树的数量 n_estimators 以及在训练每棵树时最多选择的特征数量 max_features。所以&strong&我们需要对自己使用的模型有足够的了解,知道每个参数对性能的影响是怎样的&/strong&。&/p&&p&通常我们会通过一个叫做 &a href=&https://link.zhihu.com/?target=http%3A//scikit-learn.org/stable/modules/generated/sklearn.grid_search.GridSearchCV.html%29& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Grid Search&/a& 的过程来确定一组最佳的参数。其实这个过程说白了就是根据给定的参数候选对所有的组合进行暴力搜索。&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&n&&param_grid&/span& &span class=&o&&=&/span& &span class=&p&&{&/span&&span class=&s1&&'n_estimators'&/span&&span class=&p&&:&/span& &span class=&p&&[&/span&&span class=&mi&&300&/span&&span class=&p&&,&/span& &span class=&mi&&500&/span&&span class=&p&&],&/span& &span class=&s1&&'max_features'&/span&&span class=&p&&:&/span& &span class=&p&&[&/span&&span class=&mi&&10&/span&&span class=&p&&,&/span& &span class=&mi&&12&/span&&span class=&p&&,&/span& &span class=&mi&&14&/span&&span class=&p&&]}&/span&
&span class=&n&&model&/span& &span class=&o&&=&/span& &span class=&n&&grid_search&/span&&span class=&o&&.&/span&&span class=&n&&GridSearchCV&/span&&span class=&p&&(&/span&&span class=&n&&estimator&/span&&span class=&o&&=&/span&&span class=&n&&rfr&/span&&span class=&p&&,&/span& &span class=&n&&param_grid&/span&&span class=&o&&=&/span&&span class=&n&&param_grid&/span&&span class=&p&&,&/span& &span class=&n&&n_jobs&/span&&span class=&o&&=&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&n&&cv&/span&&span class=&o&&=&/span&&span class=&mi&&10&/span&&span class=&p&&,&/span& &span class=&n&&verbose&/span&&span class=&o&&=&/span&&span class=&mi&&20&/span&&span class=&p&&,&/span& &span class=&n&&scoring&/span&&span class=&o&&=&/span&&span class=&n&&RMSE&/span&&span class=&p&&)&/span&
&span class=&n&&model&/span&&span class=&o&&.&/span&&span class=&n&&fit&/span&&span class=&p&&(&/span&&span class=&n&&X_train&/span&&span class=&p&&,&/span& &span class=&n&&y_train&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&&p&顺带一提,Random Forest 一般在 max_features 设为 Feature 数量的平方根附近得到最佳结果。&/p&&p&这里要重点讲一下 Xgboost 的调参。通常认为对它性能影响较大的参数有:&/p&&ul&&li&eta:每次迭代完成后更新权重时的步长。越小训练越慢。&/li&&li&num_round:总共迭代的次数。&/li&&li&subsample:训练每棵树时用来训练的数据占全部的比例。用于防止 Overfitting。&/li&&li&colsample_bytree:训练每棵树时用来训练的特征的比例,类似 RandomForestClassifier 的 max_features。&/li&&li&max_depth:每棵树的最大深度限制。与 Random Forest 不同,&strong&Gradient Boosting 如果不对深度加以限制,最终是会 Overfit 的&/strong&。&/li&&li&early_stopping_rounds:用于控制在 Out Of Sample 的验证集上连续多少个迭代的分数都没有提高后就提前终止训练。用于防止 Overfitting。&/li&&/ul&&p&一般的调参步骤是:&/p&&ol&&li&将训练数据的一部分划出来作为验证集。&/li&&li&先将 eta 设得比较高(比如 0.1),num_round 设为 300 ~ 500。&/li&&li&用 Grid Search 对其他参数进行搜索&/li&&li&逐步将 eta 降低,找到最佳值。&/li&&li&以验证集为 watchlist,用找到的最佳参数组合重新在训练集上训练。注意观察算法的输出,看每次迭代后在验证集上分数的变化情况,从而得到最佳的 early_stopping_rounds。&/li&&/ol&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&n&&X_dtrain&/span&&span class=&p&&,&/span& &span class=&n&&X_deval&/span&&span class=&p&&,&/span& &span class=&n&&y_dtrain&/span&&span class=&p&&,&/span& &span class=&n&&y_deval&/span& &span class=&o&&=&/span& &span class=&n&&cross_validation&/span&&span class=&o&&.&/span&&span class=&n&&train_test_split&/span&&span class=&p&&(&/span&&span class=&n&&X_train&/span&&span class=&p&&,&/span& &span class=&n&&y_train&/span&&span class=&p&&,&/span& &span class=&n&&random_state&/span&&span class=&o&&=&/span&&span class=&mi&&1026&/span&&span class=&p&&,&/span& &span class=&n&&test_size&/span&&span class=&o&&=&/span&&span class=&mf&&0.3&/span&&span class=&p&&)&/span&
&span class=&n&&dtrain&/span& &span class=&o&&=&/span& &span class=&n&&xgb&/span&&span class=&o&&.&/span&&span class=&n&&DMatrix&/span&&span class=&p&&(&/span&&span class=&n&&X_dtrain&/span&&span class=&p&&,&/span& &span class=&n&&y_dtrain&/span&&span class=&p&&)&/span&
&span class=&n&&deval&/span& &span class=&o&&=&/span& &span class=&n&&xgb&/span&&span class=&o&&.&/span&&span class=&n&&DMatrix&/span&&span class=&p&&(&/span&&span class=&n&&X_deval&/span&&span class=&p&&,&/span& &span class=&n&&y_deval&/span&&span class=&p&&)&/span&
&span class=&n&&watchlist&/span& &span class=&o&&=&/span& &span class=&p&&[(&/span&&span class=&n&&deval&/span&&span class=&p&&,&/span& &span class=&s1&&'eval'&/span&&span class=&p&&)]&/span&
&span class=&n&&params&/span& &span class=&o&&=&/span& &span class=&p&&{&/span&
&span class=&s1&&'booster'&/span&&span class=&p&&:&/span& &span class=&s1&&'gbtree'&/span&&span class=&p&&,&/span&
&span class=&s1&&'objective'&/span&&span class=&p&&:&/span& &span class=&s1&&'reg:linear'&/span&&span class=&p&&,&/span&
&span class=&s1&&'subsample'&/span&&span class=&p&&:&/span& &span class=&mf&&0.8&/span&&span class=&p&&,&/span&
&span class=&s1&&'colsample_bytree'&/span&&span class=&p&&:&/span& &span class=&mf&&0.85&/span&&span class=&p&&,&/span&
&span class=&s1&&'eta'&/span&&span class=&p&&:&/span& &span class=&mf&&0.05&/span&&span class=&p&&,&/span&
&span class=&s1&&'max_depth'&/span&&span class=&p&&:&/span& &span class=&mi&&7&/span&&span class=&p&&,&/span&
&span class=&s1&&'seed'&/span&&span class=&p&&:&/span& &span class=&mi&&2016&/span&&span class=&p&&,&/span&
&span class=&s1&&'silent'&/span&&span class=&p&&:&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span&
&span class=&s1&&'eval_metric'&/span&&span class=&p&&:&/span& &span class=&s1&&'rmse'&/span&
&span class=&p&&}&/span&
&span class=&n&&clf&/span& &span class=&o&&=&/span& &span class=&n&&xgb&/span&&span class=&o&&.&/span&&span class=&n&&train&/span&&span class=&p&&(&/span&&span class=&n&&params&/span&&span class=&p&&,&/span& &span class=&n&&dtrain&/span&&span class=&p&&,&/span& &span class=&mi&&500&/span&&span class=&p&&,&/span& &span class=&n&&watchlist&/span&&span class=&p&&,&/span& &span class=&n&&early_stopping_rounds&/span&&span class=&o&&=&/span&&span class=&mi&&50&/span&&span class=&p&&)&/span&
&span class=&n&&pred&/span& &span class=&o&&=&/span& &span class=&n&&clf&/span&&span class=&o&&.&/span&&span class=&n&&predict&/span&&span class=&p&&(&/span&&span class=&n&&xgb&/span&&span class=&o&&.&/span&&span class=&n&&DMatrix&/span&&span class=&p&&(&/span&&span class=&n&&df_test&/span&&span class=&p&&))&/span&
&/code&&/pre&&/div&&p&最后要提一点,所有具有随机性的 Model 一般都会有一个 seed 或是 random_state 参数用于控制随机种子。得到一个好的 Model 后,在记录参数时务必也记录下这个值,从而能够在之后重现 Model。&br&&/p&&h4&4.2 Cross Validation&/h4&&p&&a href=&https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Cross-validation_%28statistics%29& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Cross Validation&/a& 是非常重要的一个环节。它让你知道你的 Model 有没有 Overfit,是不是真的能够 Generalize 到测试集上。在很多比赛中 &strong&Public LB&/strong& 都会因为这样那样的原因而不可靠。当你改进了 Feature 或是 Model 得到了一个更高的 &strong&CV&/strong& 结果,提交之后得到的 &strong&LB&/strong& 结果却变差了,&strong&一般认为这时应该相信 CV 的结果&/strong&。当然,最理想的情况是多种不同的 &strong&CV&/strong& 方法得到的结果和 &strong&LB&/strong& 同时提高,但这样的比赛并不是太多。&/p&&p&在数据的分布比较随机均衡的情况下,&strong&5-Fold CV&/strong& 一般就足够了。如果不放心,可以提到 &strong&10-Fold&/strong&。&strong&但是 Fold 越多训练也就会越慢,需要根据实际情况进行取舍。&/strong&&/p&&p&很多时候简单的 &strong&CV&/strong& 得到的分数会不大靠谱,Kaggle 上也有很多关于如何做 &strong&CV&/strong& 的讨论。比如&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/telstra-recruiting-network/forums/t/19277/what-is-your-cross-validation-method& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&这个&/a&。但总的来说,靠谱的 &strong&CV&/strong& 方法是 Case By Case 的,需要在实际比赛中进行尝试和学习,这里就不再(也不能)叙述了。&/p&&h3&5. Ensemble Generation&/h3&&p&&a href=&https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Ensemble_learning& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Ensemble Learning&/a& 是指将多个不同的 Base Model 组合成一个 Ensemble Model 的方法。它可以&strong&同时降低最终模型的 Bias 和 Variance&/strong&(证明可以参考&a href=&https://link.zhihu.com/?target=http%3A//link.springer.com/chapter/10.-540-& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&这篇论文&/a&,我最近在研究类似的理论,可能之后会写新文章详述),&strong&从而在提高分数的同时又降低 Overfitting 的风险&/strong&。在现在的 Kaggle 比赛中要不用 Ensemble 就拿到奖金几乎是不可能的。&/p&&p&常见的 Ensemble 方法有这么几种:&/p&&ul&&li&Bagging:使用训练数据的不同随机子集来训练每个 Base Model,最后进行每个 Base Model 权重相同的 Vote。也即 Random Forest 的原理。&/li&&li&Boosting:迭代地训练 Base Model,每次根据上一个迭代中预测错误的情况修改训练样本的权重。也即 Gradient Boosting 的原理。比 Bagging 效果好,但更容易 Overfit。&/li&&li&Blending:用不相交的数据训练不同的 Base Model,将它们的输出取(加权)平均。实现简单,但对训练数据利用少了。&/li&&li&Stacking:接下来会详细介绍。&/li&&/ul&&p&从理论上讲,Ensemble 要成功,有两个要素:&/p&&ul&&li&&strong&Base Model 之间的相关性要尽可能的小。&/strong&这就是为什么非 Tree-based Model 往往表现不是最好但还是要将它们包括在 Ensemble 里面的原因。Ensemble 的 Diversity 越大,最终 Model 的 Bias 就越低。&/li&&li&&strong&Base Model 之间的性能表现不能差距太大。&/strong&这其实是一个 &strong&Trade-off&/strong&,在实际中很有可能表现相近的 Model 只有寥寥几个而且它们之间相关性还不低。但是实践告诉我们即使在这种情况下 Ensemble 还是能大幅提高成绩。&/li&&/ul&&h4&5.1 Stacking&/h4&&p&相比 Blending,Stacking 能更好地利用训练数据。以 5-Fold Stacking 为例,它的基本原理如图所示:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-84dbc338e11fb0ad69ceb_b.jpg& data-rawwidth=&1297& data-rawheight=&326& class=&origin_image zh-lightbox-thumb& width=&1297& data-original=&https://pic4.zhimg.com/v2-84dbc338e11fb0ad69ceb_r.jpg&&&/figure&&br&&p&整个过程很像 Cross Validation。首先将训练数据分为 5 份,接下来一共 5 个迭代,每次迭代时,将 4 份数据作为 Training Set 对每个 Base Model 进行训练,然后在剩下一份 Hold-out Set 上进行预测。&strong&同时也要将其在测试数据上的预测保存下来。&/strong&这样,每个 Base Model 在每次迭代时会对训练数据的其中 1 份做出预测,对测试数据的全部做出预测。5 个迭代都完成以后我们就获得了一个 #训练数据行数 x #Base Model 数量 的矩阵,这个矩阵接下来就作为第二层的 Model 的训练数据。当第二层的 Model 训练完以后,将之前保存的 Base Model 对测试数据的预测(&strong&因为每个 Base Model 被训练了 5 次,对测试数据的全体做了 5 次预测,所以对这 5 次求一个平均值,从而得到一个形状与第二层训练数据相同的矩阵&/strong&)拿出来让它进行预测,就得到最后的输出。&/p&&p&这里给出我的实现代码:&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&k&&class&/span& &span class=&nc&&Ensemble&/span&&span class=&p&&(&/span&&span class=&nb&&object&/span&&span class=&p&&):&/span&
&span class=&k&&def&/span& &span class=&nf&&__init__&/span&&span class=&p&&(&/span&&span class=&bp&&self&/span&&span class=&p&&,&/span& &span class=&n&&n_folds&/span&&span class=&p&&,&/span& &span class=&n&&stacker&/span&&span class=&p&&,&/span& &span class=&n&&base_models&/span&&span class=&p&&):&/span&
&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&n_folds&/span& &span class=&o&&=&/span& &span class=&n&&n_folds&/span&
&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&stacker&/span& &span class=&o&&=&/span& &span class=&n&&stacker&/span&
&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&base_models&/span& &span class=&o&&=&/span& &span class=&n&&base_models&/span&
&span class=&k&&def&/span& &span class=&nf&&fit_predict&/span&&span class=&p&&(&/span&&span class=&bp&&self&/span&&span class=&p&&,&/span& &span class=&n&&X&/span&&span class=&p&&,&/span& &span class=&n&&y&/span&&span class=&p&&,&/span& &span class=&n&&T&/span&&span class=&p&&):&/span&
&span class=&n&&X&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&array&/span&&span class=&p&&(&/span&&span class=&n&&X&/span&&span class=&p&&)&/span&
&span class=&n&&y&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&array&/span&&span class=&p&&(&/span&&span class=&n&&y&/span&&span class=&p&&)&/span&
&span class=&n&&T&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&array&/span&&span class=&p&&(&/span&&span class=&n&&T&/span&&span class=&p&&)&/span&
&span class=&n&&folds&/span& &span class=&o&&=&/span& &span class=&nb&&list&/span&&span class=&p&&(&/span&&span class=&n&&KFold&/span&&span class=&p&&(&/span&&span class=&nb&&len&/span&&span class=&p&&(&/span&&span class=&n&&y&/span&&span class=&p&&),&/span& &span class=&n&&n_folds&/span&&span class=&o&&=&/span&&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&n_folds&/span&&span class=&p&&,&/span& &span class=&n&&shuffle&/span&&span class=&o&&=&/span&&span class=&bp&&True&/span&&span class=&p&&,&/span& &span class=&n&&random_state&/span&&span class=&o&&=&/span&&span class=&mi&&2016&/span&&span class=&p&&))&/span&
&span class=&n&&S_train&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&zeros&/span&&span class=&p&&((&/span&&span class=&n&&X&/span&&span class=&o&&.&/span&&span class=&n&&shape&/span&&span class=&p&&[&/span&&span class=&mi&&0&/span&&span class=&p&&],&/span& &span class=&nb&&len&/span&&span class=&p&&(&/span&&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&base_models&/span&&span class=&p&&)))&/span&
&span class=&n&&S_test&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&zeros&/span&&span class=&p&&((&/span&&span class=&n&&T&/span&&span class=&o&&.&/span&&span class=&n&&shape&/span&&span class=&p&&[&/span&&span class=&mi&&0&/span&&span class=&p&&],&/span& &span class=&nb&&len&/span&&span class=&p&&(&/span&&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&base_models&/span&&span class=&p&&)))&/span&
&span class=&k&&for&/span& &span class=&n&&i&/span&&span class=&p&&,&/span& &span class=&n&&clf&/span& &span class=&ow&&in&/span& &span class=&nb&&enumerate&/span&&span class=&p&&(&/span&&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&base_models&/span&&span class=&p&&):&/span&
&span class=&n&&S_test_i&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&zeros&/span&&span class=&p&&((&/span&&span class=&n&&T&/span&&span class=&o&&.&/span&&span class=&n&&shape&/span&&span class=&p&&[&/span&&span class=&mi&&0&/span&&span class=&p&&],&/span& &span class=&nb&&len&/span&&span class=&p&&(&/span&&span class=&n&&folds&/span&&span class=&p&&)))&/span&
&span class=&k&&for&/span& &span class=&n&&j&/span&&span class=&p&&,&/span& &span class=&p&&(&/span&&span class=&n&&train_idx&/span&&span class=&p&&,&/span& &span class=&n&&test_idx&/span&&span class=&p&&)&/span& &span class=&ow&&in&/span& &span class=&nb&&enumerate&/span&&span class=&p&&(&/span&&span class=&n&&folds&/span&&span class=&p&&):&/span&
&span class=&n&&X_train&/span& &span class=&o&&=&/span& &span class=&n&&X&/span&&span class=&p&&[&/span&&span class=&n&&train_idx&/span&&span class=&p&&]&/span&
&span class=&n&&y_train&/span& &span class=&o&&=&/span& &span class=&n&&y&/span&&span class=&p&&[&/span&&span class=&n&&train_idx&/span&&span class=&p&&]&/span&
&span class=&n&&X_holdout&/span& &span class=&o&&=&/span& &span class=&n&&X&/span&&span class=&p&&[&/span&&span class=&n&&test_idx&/span&&span class=&p&&]&/span&
&span class=&c1&&# y_holdout = y[test_idx]&/span&
&span class=&n&&clf&/span&&span class=&o&&.&/span&&span class=&n&&fit&/span&&span class=&p&&(&/span&&span class=&n&&X_train&/span&&span class=&p&&,&/span& &span class=&n&&y_train&/span&&span class=&p&&)&/span&
&span class=&n&&y_pred&/span& &span class=&o&&=&/span& &span class=&n&&clf&/span&&span class=&o&&.&/span&&span class=&n&&predict&/span&&span class=&p&&(&/span&&span class=&n&&X_holdout&/span&&span class=&p&&)[:]&/span&
&span class=&n&&S_train&/span&&span class=&p&&[&/span&&span class=&n&&test_idx&/span&&span class=&p&&,&/span& &span class=&n&&i&/span&&span class=&p&&]&/span& &span class=&o&&=&/span& &span class=&n&&y_pred&/span&
&span class=&n&&S_test_i&/span&&span class=&p&&[:,&/span& &span class=&n&&j&/span&&span class=&p&&]&/span& &span class=&o&&=&/span& &span class=&n&&clf&/span&&span class=&o&&.&/span&&span class=&n&&predict&/span&&span class=&p&&(&/span&&span class=&n&&T&/span&&span class=&p&&)[:]&/span&
&span class=&n&&S_test&/span&&span class=&p&&[:,&/span& &span class=&n&&i&/span&&span class=&p&&]&/span& &span class=&o&&=&/span& &span class=&n&&S_test_i&/span&&span class=&o&&.&/span&&span class=&n&&mean&/span&&span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&)&/span&
&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&stacker&/span&&span class=&o&&.&/span&&span class=&n&&fit&/span&&span class=&p&&(&/span&&span class=&n&&S_train&/span&&span class=&p&&,&/span& &span class=&n&&y&/span&&span class=&p&&)&/span&
&span class=&n&&y_pred&/span& &span class=&o&&=&/span& &span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&stacker&/span&&span class=&o&&.&/span&&span class=&n&&predict&/span&&span class=&p&&(&/span&&span class=&n&&S_test&/span&&span class=&p&&)[:]&/span&
&span class=&k&&return&/span& &span class=&n&&y_pred&/span&
&/code&&/pre&&/div&&p&获奖选手往往会使用比这复杂得多的 Ensemble,会出现三层、四层甚至五层,不同的层数之间有各种交互,还有将经过不同的 Preprocessing 和不同的 Feature Engineering 的数据用 Ensemble 组合起来的做法。但对于新手来说,稳稳当当地实现一个正确的 5-Fold Stacking 已经足够了。&br&&/p&&h3&6. Pipeline&/h3&&p&可以看出 Kaggle 比赛的 Workflow 还是比较复杂的。尤其是 Model Selection 和 Ensemble。理想情况下,我们需要搭建一个高自动化的 Pipeline,它可以做到:&/p&&ul&&li&&strong&模块化 Feature Transform&/strong&,只需写很少的代码就能将新的 Feature 更新到训练集中。&/li&&li&&strong&自动化 Grid Search&/strong&,只要预先设定好使用的 Model 和参数的候选,就能自动搜索并记录最佳的 Model。&/li&&li&&strong&自动化 Ensemble Generation&/strong&,每个一段时间将现有最好的 K 个 Model 拿来做 Ensemble。&/li&&/ul&&p&对新手来说,第一点可能意义还不是太大,因为 Feature 的数量总是人脑管理的过来的;第三点问题也不大,因为往往就是在最后做几次 Ensemble。但是第二点还是很有意义的,手工记录每个 Model 的表现不仅浪费时间而且容易产生混乱。&/p&&p&&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/crowdflower-search-relevance& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Crowdflower Search Results Relevance&/a& 的第一名获得者 &a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/chenglongchen& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Chenglong Chen&/a& 将他在比赛中使用的 Pipeline &a href=&https://link.zhihu.com/?target=https%3A//github.com/ChenglongChen/Kaggle_CrowdFlower& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&公开了&/a&,非常具有参考和借鉴意义。只不过看懂他的代码并将其中的逻辑抽离出来搭建这样一个框架,还是比较困难的一件事。可能在参加过几次比赛以后专门抽时间出来做会比较好。&/p&&h2&II. Home Depot Search Relevance&/h2&&p&在这一节中我会具体分享我在 &a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/home-depot-product-search-relevance& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Home Depot Search Relevance&/a& 比赛中是怎么做的,以及比赛结束后从排名靠前的队伍那边学到的做法。关于这次比赛的代码我都放在 GitHub 上了,主要的工作都可以在这个 Jupyter Notebook 中找到:&a href=&https://link.zhihu.com/?target=https%3A//github.com/dnc1994/Kaggle-Playground/blob/master/home-depot/Preprocess.ipynb& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&github.com/dnc1994/Kagg&/span&&span class=&invisible&&le-Playground/blob/master/home-depot/Preprocess.ipynb&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&首先简单介绍这个比赛。Task 是&strong&判断用户搜索的关键词和网站返回的结果之间的相关度有多高&/strong&。相关度是由 3 个人类打分取平均得到的,每个人可能打 1 ~ 3 分,所以这是一个回归问题。数据中包含用户的搜索词,返回的产品的标题和介绍,以及产品相关的一些属性比如品牌、尺寸、颜色等。使用的评分基准是 &a href=&https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Root-mean-square_deviation& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&RMSE&/a&。&/p&&p&这个比赛非常像 &a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/c/crowdflower-search-relevance& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Crowdflower Search Results Relevance&/a& 那场比赛。不过那边用的评分基准是 &a href=&https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Cohen%2527s_kappa%23Weighted_kappa& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Quadratic Weighted Kappa&/a&,把 1 误判成 4 的惩罚会比把 1 判成 2 的惩罚大得多,所以在最后 Decode Prediction 的时候会更麻烦一点。除此以外那次比赛没有提供产品的属性。&/p&&h3&1. EDA&/h3&&p&由于加入比赛比较晚,当时已经有相当不错的 EDA 了。尤其是&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/briantc/home-depot-product-search-relevance/homedepot-first-dataexploreation-k& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&这个&/a&。从中我得到的启发有:&/p&&ul&&li&同一个搜索词/产品都出现了多次,&strong&数据分布显然不 i.i.d.&/strong&。&/li&&li&文本之间的相似度很有用。&/li&&li&产品中有相当大一部分缺失属性,要考虑这会不会使得从属性中得到的 Feature 反而难以利用。&/li&&li&产品的 ID 对预测相关度很有帮助,但是考虑到训练集和测试集之间的重叠度并不太高,利用它会不会导致 Overfitting?&/li&&/ul&&h3&2. Preprocessing&/h3&&p&这次比赛中我的 Preprocessing 和 Feature Engineering 的具体做法都可以在&a href=&https://link.zhihu.com/?target=https%3A//github.com/dnc1994/Kaggle-Playground/blob/master/home-depot/Preprocess.ipynb& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&这里&/a&看到。我只简单总结一下和指出重要的点。&/p&&ol&&li&利用 Forum 上的 &a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/steubk/home-depot-product-search-relevance/fixing-typos& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Typo Dictionary&/a& 修正搜索词中的错误。&/li&&li&统计属性的出现次数,将其中出现次数多又容易利用的记录下来。&/li&&li&将训练集和测试集合并,并与产品描述和属性 Join 起来。这是考虑到后面有一系列操作,如果不合并的话就要重复写两次了。&/li&&li&对所有文本能做 &strong&&a href=&https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Stemming& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Stemming&/a&&/strong& 和 &strong&&a href=&https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Text_segmentation%23Word_segmentation& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Tokenizing&/a&&/strong&,同时手工做了一部分&strong&格式统一化(比如涉及到数字和单位的)&/strong&和&strong&同义词替换&/strong&。&/li&&/ol&&h3&3. Feature&/h3&&ul&&li&&p&*Attribute Features&/p&&ul&&li&是否包含某个特定的属性(品牌、尺寸、颜色、重量、内用/外用、是否有能源之星认证等)&/li&&li&这个特定的属性是否匹配&/li&&/ul&&/li&&li&&p&Meta Features&/p&&ul&&li&各个文本域的长度&/li&&li&是否包含属性域&/li&&li&品牌(将所有的品牌做数值离散化)&/li&&li&产品 ID&/li&&/ul&&/li&&li&&p&简单匹配&/p&&ul&&li&搜索词是否在产品标题、产品介绍或是产品属性中出现&/li&&li&搜索词在产品标题、产品介绍或是产品属性中出现的数量和比例&/li&&li&*搜索词中的第 i 个词是否在产品标题、产品介绍或是产品属性中出现&/li&&/ul&&/li&&li&&p&搜索词和产品标题、产品介绍以及产品属性之间的文本相似度&/p&&ul&&li&&a href=&https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Bag-of-words_model& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&BOW&/a&&a href=&https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Cosine_similarity& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Cosine Similairty&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Tf%25E2%idf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&TF-IDF&/a& Cosine Similarity&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Jaccard_index& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Jaccard Similarity&/a&&/li&&li&*&a href=&https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Edit_distance& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Edit Distance&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Word2vec& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Word2Vec&/a& Distance(由于效果不好,最后没有使用,但似乎是因为用的不对)&/li&&/ul&&/li&&li&&p&&strong&&a href=&https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Latent_semantic_indexing& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Latent Semantic Indexing&/a&:通过将 BOW/TF-IDF Vectorization 得到的矩阵进行 &a href=&https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Singular_value_decomposition& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&SVD 分解&/a&,我们可以得到不同搜索词/产品组合的 Latent 标识。这个 Feature 使得 Model 能够在一定程度上对不同的组合做出区别,从而解决某些产品缺失某些 Feature 的问题。&/strong&&/p&&/li&&/ul&&p&值得一提的是,上面打了 * 的 Feature 都是我在最后一批加上去的。问题是,使用这批 Feature 训练得到的 Model 反而比之前的要差,而且还差不少。我一开始是以为因为 Feature 的数量变多了所以一些参数需要重新调优,但在浪费了很多时间做 Grid Search 以后却发现还是没法超过之前的分数。这可能就是之前提到的 Feature 之间的相互作用导致的问题。当时我设想过一个看到过好几次的解决方案,就是&strong&将使用不同版本 Feature 的 Model 通过 Ensemble 组合起来&/strong&。但最终因为时间关系没有实现。事实上排名靠前的队伍分享的解法里面基本都提到了将不同的 Preprocessing 和 Feature Engineering 做 Ensemble 是获胜的关键。&/p&&h3&4. Model&/h3&&p&我一开始用的是 RandomForestRegressor,后来在 Windows 上折腾 &strong&Xgboost&/strong& 成功了就开始用 XGBRegressor。&strong&XGB&/strong& 的优势非常明显,同样的数据它只需要不到一半的时间就能跑完,节约了很多时间。&/p&&p&比赛中后期我基本上就是一边台式机上跑 &strong&Grid Search&/strong&,一边在笔记本上继续研究 Feature。&/p&&p&这次比赛数据分布很不独立,所以期间多次遇到改进的 Feature 或是 &strong&Grid Search&/strong& 新得到的参数训练出来的模型反而 &strong&LB&/strong& 分数下降了。由于被很多前辈教导过要相信自己的 &strong&CV&/strong&,我的决定是将 5-Fold 提到 10-Fold,然后以 &strong&CV&/strong& 为标准继续前进。&/p&&h3&5. Ensemble&/h3&&p&最终我的 Ensemble 的 Base Model 有以下四个:&/p&&ul&&li&RandomForestRegressor&/li&&li&ExtraTreesRegressor&/li&&li&GradientBoostingRegressor&/li&&li&XGBRegressor&/li&&/ul&&p&第二层的 Model 还是用的 &strong&XGB&/strong&。&/p&&p&因为 &strong&Base Model&/strong& 之间的相关都都太高了(最低的一对也有 0.9),我原本还想引入使用 gblinear 的 XGBRegressor 以及 SVR,但前者的 RMSE 比其他几个 Model 高了 0.02(这在 &strong&LB&/strong& 上有几百名的差距),而后者的训练实在太慢了。最后还是只用了这四个。&/p&&p&&strong&值得一提的是,在开始做 &/strong&Stacking&strong& 以后,我的 CV 和 LB 成绩的提高就是完全同步的了。&/strong&&/p&&p&在比赛最后两天,因为身心疲惫加上想不到还能有什么显著的改进,我做了一件事情:用 20 个不同的随机种子来生成 Ensemble,最后取 &strong&Weighted Average&/strong&。这个其实算是一种变相的 Bagging。&strong&其意义在于按我实现 &/strong&Stacking&strong& 的方式,我在训练 Base Model 时只用了 80% 的训练数据,而训练第二层的 Model 时用了 100% 的数据,这在一定程度上增大了 Overfitting 的风险。而每次更改随机种子可以确保每次用的是不同的 80%,这样在多次训练取平均以后就相当于逼近了使用 100% 数据的效果。&/strong&这给我带来了大约 0.0004 的提高,也很难受说是真的有效还是随机性了。&/p&&p&比赛结束后我发现我最好的单个 Model 在 &strong&Private LB&/strong& 上的得分是 0.46378,而最终 Stacking 的得分是 0.45849。这是 174 名和 98 名的差距。也就是说,我单靠 Feature 和调参进到了 前 10%,而 &strong&Stacking&/strong& 使我进入了前 5%。&/p&&h3&6. Lessons Learned&/h3&&p&比赛结束后一些队伍分享了他们的解法,从中我学到了一些我没有做或是做的不够好的地方:&/p&&ul&&li&产品标题的组织方式是有 Pattern 的,比如一个产品是否带有某附件一定会用 With/Without XXX 的格式放在标题最后。&/li&&li&使用&strong&外部数据&/strong&,比如 &a href=&https://link.zhihu.com/?target=https%3A//wordnet.princeton.edu/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&WordNet&/a&,&a href=&https://link.zhihu.com/?target=https%3A//www.kaggle.com/reddit/reddit-comments-may-2015& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Reddit 评论数据集&/a&等来训练同义词和上位词(在一定程度上替代 Word2Vec)词典。&/li&&li&基于&strong&字母&/strong&而不是单词的 NLP Feature。这一点我让我十分费解,但请教以后发现非常有道理。举例说,排名第三的队伍在计算匹配度时,将搜索词和内容中相匹配的单词的长度也考虑进去了。这是因为他们发现&strong&越长的单词约具体,所以越容易被用户认为相关度高&/strong&。此外他们还使用了逐字符的序列比较(difflib.SequenceMatcher),因为&strong&这个相似度能够衡量视觉上的相似度&/strong&。像这样的 Feature 的确不是每个人都能想到的。&/li&&li&标注单词的词性,找出&strong&中心词&/strong&,计算基于中心词的各种匹配度和距离。这一点我想到了,但没有时间尝试。&/li&&li&将产品标题/介绍中 TF-IDF 最高的一些 Trigram 拿出来,计算搜索词中出现在这些 Trigram 中的比例;反过来以搜索词为基底也做一遍。这相当于是从另一个角度抽取了一些 Latent 标识。&/li&&li&一些新颖的距离尺度,比如 &a href=&https://link.zhihu.com/?target=http%3A//jmlr.org/proceedings/papers/v37/kusnerb15.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Word Movers Distance&/a&&/li&&li&除了 SVD 以外还可以用上 &a href=&https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Non-negative_matrix_factorization& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&NMF&/a&。&/li&&li&&strong&最重要的 Feature 之间的 Pairwise Polynomial Interaction&/strong&。&/li&&li&&strong&针对数据不 i.i.d. 的问题,在 CV 时手动构造测试集与验证集之间产品 ID 不重叠和重叠的两种不同分割,并以与实际训练集/测试集的分割相同的比例来做 CV 以逼近 LB 的得分分布&/strong&。&/li&&/ul&&p&至于 Ensemble 的方法,我暂时还没有办法学到什么,因为自己只有最简单的 Stacking 经验。&/p&&h2&7. Summary&/h2&&h3&7.1 Takeaways&/h3&&ol&&li&比较早的时候就开始做 Ensemble 是对的,这次比赛到倒数第三天我还在纠结 Feature。&/li&&li&很有必要搭建一个 Pipeline,至少要能够自动训练并记录最佳参数。&/li&&li&Feature 为王。我花在 Feature 上的时间还是太少。&/li&&li&可能的话,多花点时间去手动查看原始数据中的 Pattern。&/li&&/ol&&h3&7.2 Issues Raised&/h3&&p&我认为在这次比赛中遇到的一些问题是很有研究价值的:&/p&&ol&&li&在数据分布并不 i.i.d. 甚至有 Dependency 时如何做靠谱的 &strong&CV&/strong&。&/li&&li&如何量化 Ensemble 中 &strong&Diversity vs. Accuracy&/strong& 的 Trade-off。&/li&&li&如何处理 Feature 之间互相影响导致性能反而下降。&/li&&/ol&&h3&7.3 Beginner Tips&/h3&&p&给新手的一些建议:&/p&&ol&&li&选择一个感兴趣的比赛。&strong&如果你对相关领域原本就有一些洞见那就更理想了。&/strong&&/li&&li&根据我描述的方法开始探索、理解数据并进行建模。&/li&&li&通过 Forum 和 Scripts 学习其他人对数据的理解和构建 Feature 的方式。&/li&&li&&strong&如果之前有过类似的比赛,可以去找当时获奖者的 Interview 和 Blog Post 作为参考,往往很有用。&/strong&&/li&&li&在得到一个比较不错的 &strong&LB&/strong& 分数(比如已经接近前 10%)以后可以开始尝试做 Ensemble。&/li&&li&如果觉得自己有希望拿到奖金,开始找人组队吧!&/li&&li&&strong&到比赛结束为止要绷紧一口气不能断,尽量每天做一些新尝试。&/strong&&/li&&li&比赛结束后学习排名靠前的队伍的方法,思考自己这次比赛中的不足和发现的问题,&strong&可能的话再花点时间将学到的新东西用实验进行确认,为下一次比赛做准备&/strong&。&/li&&li&好好休息!&/li&&/ol&&h2&III. Reference&/h2&&ol&&li&&a href=&https://link.zhihu.com/?target=https%3A//www.google.com/url%3Fsa%3Dt%26rct%3Dj%26q%3D%26esrc%3Ds%26source%3Dweb%26cd%3D1%26cad%3Drja%26uact%3D8%26ved%3D0ahUKEwiPxZHewLbMAhVKv5QKHb3PCGwQFggcMAA%26url%3Dhttp%253A%252F%252Fwww.ke.tu-darmstadt.de%252Flehre%252Farbeiten%252Fstudien%252FFDong_Ying.pdf%26usg%3DAFQjCNE9o2BcEkqdnu_-lQ3EFD3eRAFWiw%26sig2%3DoiU8TCEH57EYF9v9l6Scrw%26bvm%3Dbv.Cd.dGo& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Beating Kaggle the Easy Way - Dong Ying&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=http%3A//rstudio-pubs-static.s3.amazonaws.com/d2f977fb095c0ef9357c6b.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Solution for Prudential Life Insurance Assessment - Nutastray&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//github.com/ChenglongChen/Kaggle_CrowdFlower/blob/master/BlogPost/BlogPost.md& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Search Results Relevance Winner’s Interview: 1st place, Chenglong Chen&/a&&/li&&/ol&
这是我去年 4 月份参加完第一次 Kaggle 比赛并拿到前 5% 的成绩后写的总结。本文的英文版当时还被 Kaggle 的官方推特转发推荐。一年过去了,Kaggle 的赛制和积分体系等都发生了一些变化,不过本文中描述的依然是行之有效的入门 Kaggle 或者其他任何数据科学…
&p&跟新&/p&&p&从DeepLearning Weekly中发现了Data Science Central这个非常棒的网址。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-0f3e3edd6e202a179efad6_b.jpg& data-rawwidth=&852& data-rawheight=&114& class=&origin_image zh-lightbox-thumb& width=&852& data-original=&https://pic3.zhimg.com/v2-0f3e3edd6e202a179efad6_r.jpg&&&/figure&&p&在搜索栏里搜索:interview questions&/p&&figure&&img src=&https://pic1.zhimg.com/v2-33be440b4ae4ea6b8d3b_b.jpg& data-rawwidth=&1001& data-rawheight=&614& class=&origin_image zh-lightbox-thumb& width=&1001& data-original=&https://pic1.zhimg.com/v2-33be440b4ae4ea6b8d3b_r.jpg&&&/figure&&p&随便点开哪个都可以作为在准备面试的过程中的自测题~&/p&&p&对于我这样的小白,这些问题够我喝一壶了....&/p&&hr&&p&面试官如何判断.....&/p&&p&这还得看是哪里的面试官....&/p&&p&记得前不久对面实验室一位师兄去阿里面试,直接先让他推导BP算法公式,除此之外貌似还有其他几个算法的公式....所以这段时间可以发现对面实验室怎么多了一个埋头苦读奋笔疾书的人,猛地一看,原来捧着西瓜书在推导公式呢&/p&&p&跑题回答一下自己开始学习的过程,由于导师年龄偏大基本已经不接项目,所以本人从研一开始就搜罗了大量PACKT、O‘Reilly和Springer出版社出版的关于机器/深度学习的原版书(好几本是17年新出的)并挑选着阅读。相比国内的教材,国外的教材风趣,生动,仔细,逼格高(和国内那种东拼西凑的三脚猫功夫教材相比)....说不定看着看着六级就过了....&/p&&p&看了下上面几位答主提到的面试问题,基本上书本作者也都会提到。&/p&&p&截个图:&/p&&p&关于机器学习的国外教材:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-640eaad9dba2a59a224195d_b.png& data-rawwidth=&399& data-rawheight=&423& class=&content_image& width=&399&&&/figure&&p&关于深度学习的国外教材:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-ff4a42e20eaabe32ac11b_b.png& data-rawwidth=&439& data-rawheight=&197& class=&origin_image zh-lightbox-thumb& width=&439& data-original=&https://pic4.zhimg.com/v2-ff4a42e20eaabe32ac11b_r.png&&&/figure&&p&上面的教材除了个别之外基本上都有源代码可以下载~如果要资源可以私,看完也可以一起交流阅读心得~(除了上面贴出来的应用性教材之外还包括了其他理论性的。不过我只下载了部分电子书的源代码,我自己是看几本下几本,但是基本上每本书的开头几页作者一般都会给出类似于下面截图示例代码的github链接的,如果没耐心的话可以直接搜索关键字搜~)&/p&&figure&&img src=&https://pic1.zhimg.com/v2-3b240eed8a8d1d449ce08_b.png& data-rawwidth=&939& data-rawheight=&147& class=&origin_image zh-lightbox-thumb& width=&939& data-original=&https://pic1.zhimg.com/v2-3b240eed8a8d1d449ce08_r.png&&&/figure&&p&&br&&/p&&p&关于深度学习的教材,上述两个出版社里,还有几本18年才出,流口水坐等,特别是医学图像处理方向的!(不过后来仔细一看貌似是本论文集....)&/p&&p&评论里有知友提到那本DL花书。我其实看了一半多一点,后来就放弃了...因为实在有点枯燥...不过如果想要扎实的理论基础,最好是好好读一遍(不过说实话我自己只看一遍的书,过几个月再拿起来看又像看新书一样了_(?3」∠)_所以书读百遍其义自见不是没有道理的)&/p&&p&另外推荐一个外文教材下载网站(几乎包括了CS所有领域,并且几乎每天更新,各种语言的程序员必备~):&/p&&p&&a href=&//link.zhihu.com/?target=http%3A//www.finelybook.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&finelybook&/a&&/p&&p&打好基础(原理公式,代码)才是硬道理吧。&/p&&p&面试好像捕鱼,趁着还没出海先好好织一张密密的、结实的渔网,因为不知道到时候哪个网眼会怼到鱼~&/p&
跟新从DeepLearning Weekly中发现了Data Science Central这个非常棒的网址。在搜索栏里搜索:interview questions随便点开哪个都可以作为在准备面试的过程中的自测题~对于我这样的小白,这些问题够我喝一壶了....面试官如何判断.....这还得看是哪…
&p&授人以鱼不如授人以渔,既然是如此针对的问题,我也乐意分享点自己的东西。&br&&/p&&br&摄影需要一个培养过程。&br&&b&对于初学者,一个好的态度和学习方法胜过一百种杂而不精的技巧。&/b&&br&&br&-&br&摄影网站(百度即可)。&br&国家地理中文网;玛格南图片社;sony/iphone手机摄影大赛官网以及,500px。&br&&br&前三个没啥好说的,被选入其中的作品本身就说明了拍摄水平,都是公认的好作品。&br&这些作品,有的看似普通,初看并无惊艳之感,其实技术以臻完美或者说自带技术风格,因此并不适合你去学习研究。&br&但这些作品反映的拍摄价值,趣味性以及作者为之注入的情感,就需要你时常观摩,体会感受,然后总结提炼,融入到自己的摄影体系中,逐步培养摄影感觉。&br&&br&再说下500px。&br&500px里的作品多有后期精准醇厚,角度新颖,制作考究的特点。这些品其实不够接地气,与普通人的生活有一定距离,所}

我要回帖

更多关于 技能大赛结束语 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信