教你如何在机器学习竞赛中更胜一筹
更多技术干活请关注:阿里云云栖社区 - 汇聚阿里技术精粹
作者:Team Machine Learning,这是一个机器学习爱好者团队,他们热衷于建立一个有希望在数据科学/机器学习方面建立事业的有抱负的年轻毕业生和专业人士的环境。
介绍
机器学习很复杂。你可能会遇到一个令你无从下手的数据集,特别是当你处于机器学习的初期。
在这个博客中,你将学到一些基本的关于建立机器学习模型的技巧,大多数人都从中获得经验。这些技巧由Marios Michailidis(a.k.a Kazanova),Kaggle Grandmaster在2016年3月5日现在排名第3位的在线研讨会上共享的。在线研讨会有三个方面:
1.视频(需FQ观看)
2.幻灯片——视频中使用的幻灯片由Marios分享。实际上,是一个丰富的机器学习知识汇编。
3.问答——本博客列出所有参与者在研讨会所问的问题。
成功的关键是坚持不懈。
问答
1.你解决ML问题的步骤是什么?请从头描述。
以下是解决任何ML问题时我所采取的步骤:
1.了解数据——下载数据后,开始探索功能。 查看数据类型。 检查变量类。 创建一些单变量-双变量图来了解变量的性质。
2.了解度量优化——每个问题都有独特的评估指标。你必须理解它,特别是它如何随着目标变量的变化而变化。
3.确定交叉验证策略——为避免过拟合,确定你在初期阶段已经设置了交叉验证策略。一个很好的CV策略将帮助你在排行榜上获得可靠的得分。
4.启动超参数调整——一旦CV在位,尝试使用超参数调整来提高模型的精度。 它还包括以下步骤:
- 数据转换:包括缩放、移除异常值、处理空值、变换分类变量、做特征选择、创建交互等步骤。
- 选择算法并调整其超参数:尝试多种算法来了解模型性能的变化。
- 保存结果:从上面训练的所有模型中,确保保存预测。 它们对于集成将是有用的。
- 组合模型:最后,集成模型,可能在多个层次上。 确保模型相关以获得最佳效果。
2.你解决问题时所采用的模型选择和数据处理技术是什么?
一般来说,我尝试(几乎)一切的大多数问题。原则上:
- 时间序列:我使用GARCH、ARCH、回归、ARIMA模型等。
- 图像分类:我在Python中使用深度学习(卷积网)。
- 声音分类:普通神经网络
- 高基数分类(如文本数据):我用线性模型、FTRL、Vowpal wabbit、LibFFM、libFM、SVD等。
对于其他一切,我使用渐变增压机(如XGBoost和LightGBM)和深入学习(如keras、Lasagne、caffe、Cxxnet)。 我决定使用特征选择技术来保留/删除元模型的模型。 我使用的一些特征选择技术包括:
- 向前(cv或否)——从空模型开始。 一次添加一个特征并检查CV精度。 如果改进保持变量,否则丢弃。
- 向后(cv或否)——从完整模型开始,逐个删除变量。 它通过删除任何变量来提高CV精度,丢弃它。
- 混合(或逐步)——使用以上混合技术。
- 排列
- 使用特征的重要性 ——使用随机森林、gbm、xgboost特征选择特征。
- 应用一些统计学的逻辑,如卡方检验、方差分析。
每个问题的数据操作可能不同:
- 时间序列:你可以计算移动平均数、导数。 去除异常值。
- 文本:有用的技术是tfidf、countvectorizers、word2vec、svd(维度降低)。 词干提取、拼写检查、稀疏矩阵、似然编码、一个热编码(或虚拟)、散列。
- 图像分类:你可以进行缩放、调整大小、去除噪点(平滑)、注释等
- 声音:计算Furrier变换,MFCC(Mel频率倒谱系数),低通滤波器等
- 其他一切:单变量特征变换(如数值数据的日志+1),特征选择,处理空值,去除异常值,将分类变量转换为数字。
3.你能详细说明交叉验证策略吗?
交叉验证意味着从我的主集中随机地创建了2个集。 我用第一个集建立(训练)我的算法(让我们称之为训练集),并用另一个评分(让我们称之为验证集)。 我重复此过程多次,并始终检查我的模型在测试集上对于我要优化的度量执行的方式。
过程可能如下所示:
- 10(你选择多少X)次
- 在训练中分组(原始数据的50%—90%)
- 和验证(原始数据的10%—50%)
- 然后在训练集上拟合算法
- 评分验证集。
- 保存与所选指标相关的得分结果。
- 计算这10个(x)次的平均值。
- 记住使用SEED能够复制这些X分裂
其他需要考虑的事情是KFold和KFold分层。 在这里阅读。对于时间敏感的数据,确保你在测试时总是有过去预测未来的规则。
4.你能解释一些用于交叉验证的技术吗?
- Kfold
- Kfold分层
- 随机X%分割
- 时间分割
- 对于大数据,仅一个验证集就足够了(如20%的数据——你不需要多次执行)。
5.你如何提高机器学习的技能? 你使用什么训练策略?
我在2做了资料的汇总。加上很多自己的研究。同时,编程和软件(java)和很多kaggling。
6.哪些是数据科学家最有用的python库?
以下是一些我发现最有用的解决问题的库:
- 数据操作
- Numpy
- Scipy
- Pandas
- 数据可视化
- Matplotlib
- 机器学习/深度学习
- Xgboost
- Keras
- Nolearn
- Gensim
- Scikit image
- 自然语言处理
- NLTK
7.当所有的变量本质上是明确的时,什么是有用的ML技术/策略来估算缺失值或预测分类标签。
估算缺失值是关键的一步。 有时你可能会发现缺失值的趋势。 以下是我使用的一些技巧:
- 使用均值、模式、中位数进行插补
- 在变量的正常值的范围之外使用值。如- 1,或- 9999等。
- 用一种可能性替换——例如与目标变量有关的事物。
- 用有意义的东西代替。例如:有时空可能意味着零
- 尝试基于已知值子集来预测缺失值
- 可以考虑删除具有许多空值的行
8.你可以详细说明你所做的硬件投资是什么,即你自己的PC / GPU设置用于深度学习相关任务? 还是使用更多的基于云的GPU服务?
到目前为止,我大多数使用自制解决方案(Java)。我的第一场比赛必须汇总三千万行的交易数据,所以我不得不解析数据,而且需要将内存使用率降至最低。
不过,从那时起,我做了一些很好的投资,成为排名第一。 现在,我可以访问linux服务器的32个内核和256 GBM内存。 我也有一个geforce 670机器(用于深度学习/ gpu任务)。 此外,我现在主要使用Python。 但是,如果你真的有兴趣获得最高的收益,你也可以考虑使用亚马逊的AWS,因为如果你使用它很多,成本可能会很高。
9.你是否使用像GPU这样的高性能机器。或者,例如你做关于随机森林参数的网格搜索,这需要大量的时间,所以你使用哪台机器?
对于每个深入学习的训练模式,我都使用GPU。 我必须指出,对于深度学习,GPU是必须的。 在CPU上训练神经网络需要很长时间,而普通的GPU可以使一个简单的神经网络(例如深度学习)快50-70倍。 我不喜欢网格搜索。 我这样做相当于手动。 我认为在一开始它可能会很慢,但过了一会儿,你可以获得相当好的解决方案与第一组参数! 那是因为你可以学习哪些参数最适合每一个问题,并且你可以更好地了解这些算法。
10.人们如何通过改变超参数调整建立大约80个模型?
这需要时间。我有一些过去工作的参数,我用这些值初始化,然后根据现在的问题开始调整它们。 显然,你需要强力探索更多的领域,并丰富这个库关于每个模型过去成功的超参数组合。 你应该考虑别人在做什么。不会只有一组最优的超参数。你可能会在完全不同的一组参数中得到一个和你所拥有的相比类似的分值。
11.如何提高Kaggle排名?
这不是一个一夜之间的事情。你只需要继续学习。 以下是我的一些建议:
- 学习更好的编程:如果你知道R那么学习python.
- 继续学习的工具(如下所列)
- 读一些书
- 参加“知识”比赛
- 看看其他人在内核中做什么或在过去的比赛中寻找“获胜解决方案”
- 与更多的有经验的人合作,但你需要在此之前稍微提高排名
- 创建一个代码库
- 多多参与!
12.你能告诉我们有关机器学习中使用的一些有用的工具吗?
以下是我最喜欢的工具的列表:
- Liblinear:线性模型
- 支持向量机的LibSvm
- 对于所有机器学习模型的Scikit Learn
- 用于快速可伸缩梯度提升的Xgboost
- LightGBM
- 用于快速记忆效率线性模型的Vowpal Wabbit
- 神经网络 encog
- H2O在R为许多型号
- LibFm
- LibFFM
- 使用Java的Weka
- 用于因式分解的Graphchi
- 含有大量资料的GraphLab
- Cxxnet:卷积神经网络中最好的实现之一。 难以安装,需要使用NVDIA显卡的GPU。
- RankLib:java中最好的适合于支持像NDCG这样的优化功能的排序算法(例如客户级产品)的库。
- Keras和Lasagne用于神经网络。前提你有Theano或Tensorflow。
13.如何从机器学习开始?
我从犹他大学的这些幻灯片中了解到有关机器学习的一些基本算法和概念。这本书关于python。不要忘记遵循scikit Learn文档。使用anaconda的jupyter笔记本。
你可以在kaggle找到许多很好的链接。
另外,你应该去上Andrew Ng的机器学习课程。 除此之外,你可以浏览一些好的博客,如mlwave,fastml,analyticsvidhya。 但最好的办法是亲自动手。 做一些kaggle! 先解决有“知识”标志的比赛,,然后开始解决一些主要的问题。 尝试解决一些过去的。
14.在Kaggle和一般的大数据集上哪些技术最好? 如何解决内存问题?
具有高基数的大数据集可以通过线性模型得到很好的解决。 考虑稀疏模型。像vowpal wabbit这样的工具。 FTRL、libfm、libffm、liblinear是python中的优秀的工具矩阵(像csr矩阵)。 考虑在数据的较小部分集成(如结合)模型的训练。
15.涉及机器学习的项目的SDLC(软件开发生命周期)是什么?
- 在一个工业项目上展开并采取步骤,以便我们能够了解如何使用它们。 基本上,我正在学习阶段,并期待获得行业水平的曝光。
- 商业问题:如何在线推荐产品以增加购买。
- 将其翻译成ml问题。 在客户可能会点击/购买时尝试预测顾客会买什么并给定一些可用的数据,给定一些历史风险的建议
- 建立一个测试/验证框架。
- 找到最佳的解决方案来预测客户最佳选择。
- 考虑时间/成本效率以及性能
- 导出模型参数/管道设置
- 将这些应用到联机环境中。暴露一些客户,但不是所有。保持测试组和对照组
- 评估算法的运行情况以及随着时间的推移进行调整。
16.你最喜欢的机器学习算法是哪一种?
当然是梯度提升决策树。但在不同的任务中,所有可能都是好的。
17.哪种语言最适合深入学习,R或Python?
我更喜欢Python。 我认为它更程序化。 R也很好。
18.在数据科学中转行的人需要从技术技能中获得什么?因为我没有开发人员背景,个人项目是展示我的知识的最好方式吗?
将业务问题转化为机器学习的能力,并将其转化为可解决的问题。
19.你是否同意在一般特征中工程(探索和重组的预测)比改进预测模型在提高准确度上更有效?
原则上是。我认为模型的多样性比一些真正强大的模型要好。但这取决于问题。
20.是否需要Kaggle排行榜顶尖的技能,也是你作为数据科学家日常工作所需的技能? 或者它们相交还是有些不同? 我可以认为数据科学家的工作是基于Kaggle比赛吗? 如果一个人在Kaggle上做得很好,那么她会在她的职业生涯中成为一名成功的数据科学家吗?
有一定比例的重叠,特别是在制作预测模型时,通过python / R处理数据并创建报告和可视化。Kaggle不提供(但你可以得到一些想法):
- 如何将业务问题转化为建模的问题
- 如何监控模型的部署
- 如何解释(多次)困难的概念给利益相关者。
我认为在业界总是留有优秀的kagglers的空间。 只是数据科学可以有许多可能的路线。 例如,不是每个人都倾向于自己创业,或者是面对客户,而是解决非常特殊的(技术)任务。
21.哪些机器学习概念必须在Kaggle比赛中表现良好?.
- 数据询问/探索
- 数据转换-预处理
- 掌握工具知识
- 熟悉度量和优化
- 交叉验证
- 模型校正
- 集成
22.你如何看待数据科学家工作的未来?自动化会扼杀这份工作吗?
不,我不这么认为。这就是他们过去曾说的自动化计算。但最终需要大量的开发人员来完成这项工作!数据科学家可能会专注于随着时间的推移,将业务问题翻译成ml问题,并且通常成为流程的指导者——如建模过程的经理/主管一样。
23.如何在R和Python中使用整体建模来提高预测的准确性。 请引用一些现实生活中的例子?
你可以看我的github脚本,它解释了不同的基于Kaggle比赛的机器学习方法。同时,核对这个集成指南。
24.什么是最好的python深度学习库或文本分析框架?
我喜欢Keras(因为现在支持稀疏数据),Gensim(对于word 2 vec)。
25.在现实生活中,通过这些竞赛获得的知识有多大价值? 我经常看到通过合并许多模型赢得的比赛...这是现实生活中的情况吗? 还是在真实的制作系统中解释模型比这些庞大的组合更有价值?
在某些情况下,是的——可解释或快速(或记忆效率)更重要。但随着时间的推移,这将很可能改变,因为人们将不再害怕黑盒子解决方案,并专注于准确性。
26.我应该学习关于机器学习算法的核心,还是继续尝试形成对算法的理解并使用它们(在比赛中,并解决现实生活中的商业问题)?
你不需要核心。 每天都有出现的新东西——有时很难跟踪它。 这就是为什么你应该专注于任何算法的正确使用,而不是投资于一个。
27.哪些是不平衡数据的最佳机器学习技术?
我在这里不做特别的处理。 这归功于优化正确的度量(对我来说)。用几句话来解释很难。有很多技术的抽样,但我从来没有使用过。 有些人正在使用Smote。 我认为试图更改目标变量的主分布是没有价值的。你只是最终得到增加或改变主要几率。 如果你真的想要一个界限来决定你是否应该采取行动 - 你可以根据主要几率进行设置。
我可能不是最好的回答这个问题的人。我个人从来没有发现它(显著)有助于改变目标变量的分布或目标变量中的几率的感知。可能只是其他算法在处理这个任务时比其他算法更好(例如基于树的应用程序应该能够处理这个)。
28.通常,营销研究问题主要通过标准回归技术来处理 - 线性和逻辑回归,聚类,因子分析等。我的问题是机器学习和深度学习技巧/算法对营销研究或业务问题有用吗? 例如,如何解释一个神经网络的输出到客户端是有用的?有什么资源可以参考吗?
它们在某种意义上是有用的,你可以很有可能提高准确度(在预测上我们说营销反应)与线性模型(如回归)。 解释输出是很困难的,在我看来,这不是必要的,因为我们一般都会走向更多的黑盒子和复杂的解决方案。
作为数据科学家,你应该努力确保有一种方法来测试一些不可观察(测试)数据的结果有多好,而不是想了解为什么你得到的预测类型。 我认为从复杂模型中解压缩信息是一个很好的话题(对研究有用),但是我不认为这是必要的。
另一方面,公司、人员、数据科学家、统计学家和一般可被归类为“数据科学玩家”的任何人都需要接受教育,接受黑箱解决方案是完全正常的。 这可能需要一段时间,所以运行一些回归以及你正在做的任何其他建模可能会很好,并且通常会尝试提供说明图和总结信息,以便为您的模型为什么执行此操作。
29.如何在Kaggle建立合作团队?
你可以在论坛(即kaggle)中询问。 在“人们可以信任你”之前,这可能需要几场比赛。 原因是他们害怕复制的帐户(违反竞争规则),所以人们更喜欢被证明是公平的人。 假设有一段时间过去了,你只需要想想你想玩的人,你认为你可以从中学习的人与可能和你采取不同的方法的人,所以你可以在组合方法时利用多样性的好处。
30.我已经完成了基本的机器学习课程(理论)。现在我开始了我的实践历程。你刚刚推荐通过scikit learn文档,现在人们都在说TENSORFLOW是下一个scikit learn,所以我应该通过scikit还是TF是一个不错的选择?
我不同意这个“人们在说TENSORFLOW是下一个scikit learn”的说法。 Tensorflow是一个完成某些机器学习任务(如深入学习)的框架。 我想你可以学习两者,但我会从scikit开始。 我个人不知道TensorFlow,但是我使用的是基于张量流的工具(例如Keras)。
31.我在任何比赛中面临的主要挑战是清理数据,使其可用于预测模型。 你如何克服呢?
我加入了俱乐部! 一段时间后,你将创建可以相对较快处理这个的管道。 但是,你总是需要在这方面花时间。
32.如何在没有强大的机器的情况下计算大数据?
你应该考虑一些如vowpal wabbit和在线解决方案的工具,可以逐一解析所有内容。 你需要在编程方面投入更多资源。
33.什么是特征工程?
简而言之,特征工程可以理解为:
- 特征变换(例如将数字或分类变量转换为其他类型)
- 特征选择
- 利用特征交互(比如我应该把变量A和变量B结合起来)
- 处理空值
- 处理异常值
34.哪些数学技能在机器学习中很重要?
一些基本概率以及线性代数(例如向量)。 然后一些统计数据也有帮助。 像平均值、频率、标准偏差等。
35.可以分享你以前的解决方案吗?
看一些代码和一些没有(只是一般的方法)。
Microsoft Malware Classification Challenge (BIG 2015)
Microsoft Malware Winners' Interview: 2nd place, Gert & Marios (aka KazAnova)
Dato Winners' Interview: 1st place, Mad Professors
Homesite Quote Conversion, Winners' Write-Up, 1st Place: KazAnova | Faron | clobber
https://mlwave.com/how-we-won-3rd-prize-in-crowdanalytix-copd-competition/
36.你需要多长时间来建立你的第一个机器学习预测器?
取决于问题(大小、复杂性、特征数量)。一般来说,一开始你可能会花费很多时间在稍后可以考虑的事情上。 考虑到编程,背景或其他经验,每个人的时间可能会有所不同。
37.你可以推荐一些知识竞赛吗,不一定在水平上竞争如kaggle但是可以为你的技能打基础?
看这里,titanic和数字识别器都是很好的比赛来开始。titanic更好,因为它假定一个平面文件。 数字识别器用于图像分类,因此可能会更先进。
38.你对于使用Weka或R 和Python来学习机器学习有什么看法?
我喜欢Weka。它有一个很好的文档——特别是如果你想学习算法。 不过我不得不承认,它不像R和Python的一些实现一样有效。 它有很好的覆盖。 Weka也有一些很好的可视化——特别是对于一些基于树的算法。 我可能会建议你把重点放在R和Python,除非你的背景完全是使用Java。
概要
简而言之,机器学习竞赛成功的关键在于学习新事物,花费大量的时间训练,特征工程和验证模型。 除此之外,在论坛上与社区进行互动,阅读博客并从其他竞争对手的方法中学习。