教你如何在机器学习竞赛中更胜一筹(上)
更多深度文章,请关注云计算频道:https://yq.aliyun.com/cloud
作者:Team Machine Learning,这是一个机器学习爱好者团队,他们热衷于建立一个有希望在数据科学/机器学习方面建立事业的有抱负的年轻毕业生和专业人士的环境。
介绍
机器学习很复杂。你可能会遇到一个令你无从下手的数据集,特别是当你处于机器学习的初期。
在这个博客中,你将学到一些基本的关于建立机器学习模型的技巧,大多数人都从中获得经验。这些技巧由Marios Michailidis(a.k.a Kazanova),Kaggle Grandmaster在2016年3月5日现在排名第3位的在线研讨会上共享的。在线研讨会有三个方面:
1.视频(需翻墙观看)
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.你是否同意在一般特征中工程(探索和重组的预测)比改进预测模型在提高准确度上更有效?
原则上是。我认为模型的多样性比一些真正强大的模型要好。但这取决于问题。
在下一节中继续回答有关机器学习竞赛的另19个问题。
以上为译文
本文由北邮@爱可可-爱生活老师推荐,阿里云云栖社区组织翻译。
文章原标题《Winning Tips on Machine Learning Competitions by Kazanova, Current Kaggle #3》,作者:Team Machine Learning,译者:tiamo_zn,审校:海棠。
文章为简译,更为详细的内容,请查看原文:https://yq.aliyun.com/articles/73755