精华内容
下载资源
问答
  • 机器学习比赛网站

    千次阅读 2018-12-06 10:02:00
    机器学习比赛网站列表 Kaggle: Your Home for Data Science biendata 科赛 - Kesci.com 首页-DataCastle大数据竞赛平台 AI Challenger - 全球AI挑战赛 DF,CCF指定专业大数据竞赛平台 JDATA竞赛详情页 天池大赛列表页...

    机器学习比赛网站列表

    Kaggle: Your Home for Data Science

    biendata

    科赛 - Kesci.com

    首页-DataCastle大数据竞赛平台

    AI Challenger - 全球AI挑战赛

    DF,CCF指定专业大数据竞赛平台

    JDATA竞赛详情页

    天池大赛列表页

    腾讯广告算法大赛

    BdRace数睿思_数据挖掘竞赛平台

    改编世界-习悦编程挑战赛

    携程旅行网: 云海竞赛平台

    Matplotlib tutorial

    Plotly · Make charts and dashboards online

    杨培文

    零基础入门深度学习(5) - 循环神经网络 - 作业部落 Cmd Markdown 编辑阅读器

    2018机器阅读理解技术竞赛

    CIPS-SOGOU问答比赛

    Quickstart tutorial — NumPy v1.13.dev0 Manual

    10 Minutes to pandas — pandas 0.20.3 documentation

    JDDC

    拍拍贷AI开发平台-第三届魔镜杯大赛

    AI开发者大赛 - 讯飞开放平台

    爱奇艺AI竞赛平台

    论文列表 - TinyMind

    军事智能·机器阅读

    Zalo AI Challenge

    Ricequant & 课程 - RiceQuant米筐量化交易平台

    数愿

    中国研究生创新实践系列大赛管理平台

    拍拍贷AI开发平台-魔镜杯大赛

    第三届融360天机智能金融算法挑战赛

    首页 - TinyMind -专注人工智能的技术社区

    Hackathons | Analytics Vidhya

    比赛| SIGNATE - 数据科学竞赛

    Competitions

    CodaLab - Competitions

    DataHunter可视化之星大赛

    ATEC蚂蚁开发者大赛

    第一届Z-HACK算法创新大赛

    SODA-2018 - 首页

    Тренировки ML

    Topcoder Challenges

    crowdAI

    Chahub Beta

    CrowdANALYTIX:A crowdsourced analytics platform to solve data-driven business problems

    Datascience.net - Accueil

    Data mining challenges, competition, contest | TunedIT

    Correlation and Regression Lines - A Quick Recap #1 | HackerRank

    Challenge Center | InnoCentive

    Data Science Challenge

    JDDiscovery 2018京东数字科技全球探索者大赛

    【JDD空间站】技能大赛科技创新大赛人工智能大赛-京东

    赛氪-大学生竞赛活动社区

    展开全文
  • 机器学习比赛—杀入Kaggle Top 1%

    千次阅读 多人点赞 2018-08-14 09:49:56
    最近准备参加一个算法比赛,想把自己所学的知识拿来用一用...不知道你有没有这样的感受,在刚刚入门机器学习的时候,我们一般都是从MNIST、CIFAR-10这一类知名公开数据集开始快速上手,复现别人的结果,但总觉得过于...

    最近准备参加一个算法比赛,想把自己所学的知识拿来用一用,在比赛初始自己没一点思路,突然看到知乎上有一个大神写了一篇博文,非常适合我这种刚入门的小白。

    本文转载来自:https://zhuanlan.zhihu.com/p/27424282

    不知道你有没有这样的感受,在刚刚入门机器学习的时候,我们一般都是从MNIST、CIFAR-10这一类知名公开数据集开始快速上手,复现别人的结果,但总觉得过于简单,给人的感觉太不真实。因为这些数据太“完美”了(干净的输入,均衡的类别,分布基本一致的测试集,还有大量现成的参考模型),要成为真正的数据科学家,光在这些数据集上跑模型却是远远不够的。而现实中你几乎不可能遇到这样的数据(现实数据往往有着残缺的输入,类别严重不均衡,分布不一致甚至随时变动的测试集,几乎没有可以参考的论文),这往往让刚进入工作的同学手忙脚乱,无所适从。

    Kaggle则提供了一个介于“完美”与真实之间的过渡,问题的定义基本良好,却夹着或多或少的难点,一般没有完全成熟的解决方案。在参赛过程中与论坛上的其他参赛者互动,能不断地获得启发,受益良多。即使对于一些学有所成的高手乃至大牛,参加Kaggle也常常会获得很多启发,与来着世界各地的队伍进行厮杀的刺激更让人欲罢不能。更重要的是,Kaggle是业界普遍承认的竞赛平台,能从Kaggle上的一些高质量竞赛获取好名次,是对自己实力极好的证明,还能给自己的履历添上光辉的一笔。如果能获得金牌,杀入奖金池,那更是名利兼收,再好不过。

    1 比赛篇

    为了方便,我们先定义几个名词:

    1. Feature 特征变量,也叫自变量,是样本可以观测到的特征,通常是模型的输入
    2. Label 标签,也叫目标变量,需要预测的变量,通常是模型的标签或者输出
    3. Train Data 训练数据,有标签的数据,由举办方提供。
    4. Train Set 训练集,从Train Data中分割得到的,用于训练模型(常用于交叉验证)。
    5. Valid Set 验证集,从Train Data中分割得到的,为了能找出效果最佳的模型,使用各个模型对验证集数据进行预测,并记录模型准确率。选出效果最佳的模型所对应的参数,即用来调整模型参数(常用于交叉验证)。
    6. Test Data 测试数据,通过训练集和验证集得出最优模型后,使用测试集进行模型预测。用来衡量该最优模型的性能和分类能力,标签未知,是比赛用来评估得分的数据,由举办方提供。

    1.1 分析题目

    拿到赛题以后,第一步就是要破题,我们需要将问题转化为相应的机器学习问题。其中,Kaggle最常见的机器学习问题类型有:

    1. 回归问题
    2. 分类问题(二分类、多分类、多标签) 多分类只需从多个类别中预测一个类别,而多标签则需要预测出多个类别

    比如Quora的比赛就是二分类问题,因为只需要判断两个问句的语义是否相似。

    1.2 数据分析(Data Exploration)

    所谓数据挖掘,当然是要从数据中去挖掘我们想要的东西,我们需要通过人为地去分析数据,才可以发现数据中存在的问题和特征。我们需要在观察数据的过程中思考以下几个问题:

    1. 数据应该怎么清洗和处理才是合理的?
    2. 根据数据的类型可以挖掘怎样的特征?
    3. 数据中的哪些特征会对标签的预测有帮助?

    1.2.1 统计分析

    对于数值类变量(Numerical Variable),我们可以得到min,max,mean,meduim,std等统计量,用pandas可以方便地完成,结果如下:

    从上图中可以观察Label是否均衡,如果不均衡则需要进行over sample少数类,或者down sample多数类。我们还可以统计Numerical Variable之间的相关系数,用pandas就可以轻松获得相关系数矩阵

    观察相关系数矩阵可以让你找到高相关的特征,以及特征之间的冗余度。而对于文本变量,可以统计词频(TF),TF-IDF,文本长度等等,更详细的内容可以参考这里

    1.2.2 可视化

    人是视觉动物,更容易接受图形化的表示,因此可以将一些统计信息通过图表的形式展示出来,方便我们观察和发现。比如用直方图展示问句的频数:

    或者绘制相关系数矩阵:

    常用的可视化工具有 matplotlib 和 seaborn。当然,你也可以跳过这一步,因为可视化不是解决问题的重点。

    1.3 数据预处理(Data Preprocessing)

    刚拿到手的数据会出现噪声,缺失,脏乱等现象,我们需要对数据进行清洗与加工,从而方便进行后续的工作。针对不同类型的变量,会有不同的清洗和处理方法:

    1. 数值型变量(Numerical Variable),需要处理 离群点,缺失值,异常值 等情况,尽管动手去试,numerical填充max ,min,mean ,median std、离散化、Hash分桶,categorical 填充众数,都拿去训练 看看哪个效果好。
    2. 类别型变量(Categorical Variable),可以转化为 one-hot 编码。
    3. 文本数据 ,是较难处理的数据类型,文本中会有垃圾字符,错别字(词),数学公式,不统一单位和日期格式等。我们还需要处理标点符号,分词,去停用词,对于英文文本可能还要 词性还原(lemmatize),抽取词干(stem)等等。
    4. 数据采样,一般用 随机采样,和 分层采样 的办法。如果正样本多于负样本,且量都挺大,则可以采用下采样(downsampling)。如果正样本大于负样本,但量不大,则可以采集更多的数据,或者上采样 oversampling(比如图像识别中的镜像和旋转),以及修改损失函数/loss function的办法来处理正负样本不平衡的问题。
    5. 数据归一化,可以提高梯度下降法求最优解速度,否则很难收敛或不收敛;还可提高模型的精度数据如何进行归一化?

    1.4 特征工程(Feature Engineering)

    都说 特征为王,特征是决定效果最关键的一环。我们需要通过探索数据,利用人为先验知识,从数据中总结出特征。

    1.4.1 特征抽取(Feature Extraction)

    我们应该尽可能多地抽取特征,只要你认为某个特征对解决问题有帮助,它就可以成为一个特征。特征抽取需要不断迭代,是最为烧脑的环节,它会在整个比赛周期折磨你,但这是比赛取胜的关键,它值得你耗费大量的时间。

    那问题来了,怎么去发现特征呢?光盯着数据集肯定是不行的。如果你是新手,可以先耗费一些时间在Forum上,看看别人是怎么做Feature Extraction的,并且多思考。虽然 Feature Extraction 特别讲究经验,但其实还是有章可循的:

    1. 对于Numerical Variable,可以通过线性组合、多项式组合来发现新的Feature。
    2. 对于文本数据,有一些常规的Feature。比如,文本长度,词频,Embeddings,TF-IDF,LDA,LSI等,你甚至可以用深度学习提取文本特征(隐藏层)。
    3. 如果你想对数据有更深入的了解,可以通过思考数据集的构造过程来发现一些 magic feature,这些特征有可能会大大提升效果。在Quora这次比赛中,就有人公布了一些 magic feature。
    4. 通过错误分析也可以发现新的特征(见1.5.2小节)。

    1.4.2 特征选择(Feature Selection)

    在做特征抽取的时候,我们是尽可能地抽取更多的Feature,但过多的 Feature 会造成 冗余(部分特征的相关度太高了,消耗计算性能),噪声(部分特征是对预测结果有负影响),容易过拟合等问题,因此我们需要进行 特征筛选。特征选择可以加快模型的训练速度,甚至还可以提升效果。

    特征选择的方法多种多样,最简单的是相关度系数(Correlation coefficient),它主要是衡量两个变量之间的线性关系,数值在[-1.0, 1.0]区间中。数值越是接近0,两个变量越是线性不相关。但是数值为0,并不能说明两个变量不相关,只是线性不相关而已也可用 互信息距离相关度来计算。

    我们通过一个例子来学习一下怎么分析相关系数矩阵:

    相关系数矩阵是一个对称矩阵,所以只需要关注矩阵的左下角或者右上角。我们可以拆成两点来看:

    1. Feature 和 Label 的相关度可以看作是该Feature的重要度,越接近1或-1就越好。
    2. Feature 和 Feature 之间的相关度要低,如果两个Feature的相关度很高,就有可能存在冗余。

    除此之外,还可以训练模型来筛选特征,比如带L1或L2惩罚项的Linear Model、Random Forest、GBDT等,它们都可以输出特征的重要度。在这次比赛中,我们对上述方法都进行了尝试,将不同方法的 平均重要度 作为最终参考指标,筛选掉得分低的特征。

    如何进行特征选择,可点击这

    1.5 建模(Modeling)

    终于来到机器学习了,在这一章,我们需要开始炼丹了。

    1.5.1 模型

    机器学习模型有很多,建议均作尝试,不仅可以测试效果,还可以学习各种模型的使用技巧。其实,几乎每一种模型都有回归和分类两种版本,常用模型有:

    幸运的是,这些模型都已经有现成的工具(如scikit-learn、XGBoost、LightGBM等)可以使用,不用自己重复造轮子。但是我们应该要知道各个模型的原理,这样在调参的时候才会游刃有余。当然,你也使用PyTorch/Tensorflow/Keras等深度学习工具来定制自己的Deep Learning模型,玩出自己的花样。

    1.5.2 错误分析

    人无完人,每个模型不可能都是完美的,它总会犯一些错误。为了解某个模型在犯什么错误,我们可以观察被模型误判的样本,总结它们的共同特征,我们就可以再训练一个效果更好的模型。这种做法有点像后面 Ensemble 时提到的 Boosting,但是我们是人为地观察错误样本,而Boosting是交给了机器。通过 错误分析->发现新特征->训练新模型->错误分析,可以不断地迭代出更好的效果,并且这种方式还可以培养我们对数据的嗅觉。

    举个例子,这次比赛中,我们在错误分析时发现,某些样本的两个问句表面上很相似,但是句子最后提到的地点不一样,所以其实它们是语义不相似的,但我们的模型却把它误判为相似的。比如这个样本:

    • Question1: Which is the best digital marketing institution in banglore?
    • Question2: Which is the best digital marketing institute in Pune?

    为了让模型可以处理这种样本,我们将两个问句的 最长公共子串(Longest Common Sequence)去掉,用剩余部分训练一个新的深度学习模型,相当于告诉模型看到这种情况的时候就不要判断为相似的了。因此,在加入这个特征后,我们的效果得到了一些提升。

    1.5.3 调参

    在训练模型前,我们需要预设一些参数来确定模型结构(比如树的深度)和优化过程(比如学习率),这种参数被称为超参(Hyper-parameter),不同的参数会得到的模型效果也会不同。总是说调参就像是在“炼丹”,像一门“玄学”,但是根据经验,还是可以找到一些章法的:

    1. 根据经验,选出对模型效果 影响较大的超参
    2. 按照经验设置超参的搜索空间,比如 学习率 的搜索空间为[0.001,0.1]。
    3. 选择搜索算法,比如Random Search、Grid Search和一些启发式搜索的方法。
    4. 验证模型的泛化能力(详见下一小节)。

    1.5.4 模型验证(Validation)

    在Test Data的标签未知的情况下,我们需要自己构造测试数据来验证模型的泛化能力,因此把Train Data分割成Train Set和Valid Set两部分,Train Set用于训练,Valid Set用于验证。

    • 简单分割

    将Train Data按一定方法分成两份,比如随机取其中70%的数据作为Train Set,剩下30%作为Valid Set,每次都固定地用这两份数据分别训练模型和验证模型。这种做法的缺点很明显,它没有用到整个训练数据,所以验证效果会有偏差。通常只会在训练数据很多,模型训练速度较慢的时候使用。

    • 交叉验证

    交叉验证是将整个训练数据随机分成K份,训练K个模型,每次取其中的K-1份作为Train Set,留出1份作为Valid Set,因此也叫做K-fold。至于这个K,你想取多少都可以,但一般选在3~10之间。我们可以用 K 个模型得分的 mean 和 std,来评判模型得好坏(mean体现模型的能力,std体现模型是否容易过拟合),并且用K-fold的验证结果通常会比较可靠

    如果数据出现 Label 不均衡情况,可以使用 Stratified K-fold分层采样,确保训练集,测试集中各类别样本的比例与原始数据集中相同),这样得到的 Train Set 和 Test Set 的 Label 比例是大致相同。

    1.6 模型集成(Ensemble)

    曾经听过一句话,”Feature为主,Ensemble为后”Feature决定了模型效果的上限,而Ensemble就是让你更接近这个上限。Ensemble讲究“好而不同”,不同是指模型的学习到的侧重面不一样。举个直观的例子,比如数学考试,A的函数题做的比B好,B的几何题做的比A好,那么他们合作完成的分数通常比他们各自单独完成的要高。

    常见的Ensemble方法有Bagging、Boosting、Stacking、Blending

    1.6.1 Bagging

    Bagging是将多个模型(基学习器)的预测结果简单地 加权平均 或者 投票。Bagging的好处在于可以 并行 地训练基学习器,其中 Random Forest 就用到了Bagging的思想。举个通俗的例子,如下图:

    老师出了两道加法题,A同学和B同学答案的加权要比A和B各自回答的要精确。

    Bagging通常是没有一个明确的优化目标的,但是有一种叫Bagging Ensemble Selection的方法,它通过 贪婪算法 来Bagging多个模型来优化目标值。在这次比赛中,我们也使用了这种方法。 

    1.6.2 Boosting

    Boosting的思想有点像知错能改,每训练一个基学习器,是为了弥补上一个基学习器所犯的错误。其中著名的算法有 AdaBoost,Gradient Boost。Gradient Boost Tree 就用到了这种思想。

    我在1.2.3节(错误分析)中提到 Boosting,错误分析->抽取特征->训练模型->错误分析,这个过程就跟Boosting很相似。

    1.6.3 Stacking

    Stacking是用 新的模型(次学习器)去学习怎么组合那些基学习器,它的思想源自于Stacked Generalization这篇论文。如果把Bagging看作是多个基分类器的线性组合,那么Stacking就是多个基分类器的非线性组合。Stacking可以很灵活,它可以将学习器一层一层地堆砌起来,形成一个网状的结构,如下图:

    举个更直观的例子,还是那两道加法题:

    这里A和B可以看作是基学习器C、D、E都是次学习器

    • Stage1: A和B各自写出了答案。
    • Stage2: C和D偷看了A和B的答案,C认为A和B一样聪明,D认为A比B聪明一点。他们各自结合了A和B的答案后,给出了自己的答案。
    • Stage3: E偷看了C和D的答案,E认为D比C聪明,随后E也给出自己的答案作为最终答案。

    在实现 Stacking 时,要注意的一点是,避免标签泄漏(Label Leak)。在训练次学习器时,需要上一层学习器对 Train Data 的测试结果作为特征,如果我们在Train Data上训练,然后在Train Data上预测,就会造成Label Leak。为了避免Label Leak,需要对每个学习器使用K-fold,将K个模型对Valid Set的预测结果拼起来,作为下一层学习器的输入。如下图:

    由图可知,我们还需要对Test Data做预测。这里有两种选择,可以将K个模型对Test Data的预测结果求平均,也可以用所有的Train Data重新训练一个新模型来预测Test Data。所以在实现过程中,我们最好把每个学习器对Train Data和对Test Data的测试结果都保存下来,方便训练和预测。

    对于Stacking还要注意一点,固定 K-fold 可以尽量避免Valid Set过拟合,也就是全局共用一份K-fold,如果是团队合作,组员之间也是共用一份K-fold。如果想具体了解 为什么需要固定K-fold,请看这里

    1.6.4 Blending

    Blending 与 Stacking 很类似,它们的区别可以参考这里

    1.7 后处理

    有些时候在确认没有过拟合的情况下,验证集上做校验时效果挺好,但是将测试结果提交后的分数却不如人意,这时候就有可能是训练集的分布与测试集的分布不一样而导致的。这时候为了提高LeaderBoard的分数,还需要对测试结果进行分布调整

    比如这次比赛,训练数据中正类的占比为0.37,那么预测结果中正类的比例也在0.37左右,然后Kernel上有人通过测试知道了测试数据中正类的占比为0.165,所以我们也对预测结果进行了调整,得到了更好的分数。具体可以看这里

    2 经验篇

    2.1 我们的方案(33th)

    深度学习具有很好的模型拟合能力,使用深度学习可以较快得获取一个不错的Baseline,对这个问题整体的难度有一个初始的认识。虽然使用深度学习可以免去繁琐的手工特征,但是它也有能力上限,所以提取传统手工特征还是很有必要的。我们尝试Forum上别人提供的方法,也尝试自己思考去抽取特征。总结一下,我们抽取的手工特征可以分为以下4种:

    1. Text Mining Feature,比如 句子长度;两个句子的 文本相似度,如 N-gram的编辑距离,Jaccard距离等;两个句子共同的名词,动词,疑问词等。
    2. Embedding Feature,预训练好的 词向量 相加求出 句子向量,然后求两个句子向量的距离,比如 余弦相似度、欧式距离等等。
    3. Vector Space Feature,用 TF-IDF矩阵 来表示句子,求相似度。
    4. Magic Feature,是Forum上一些选手通过思考数据集构造过程而发现的Feature,这种 Feature 往往与 Label 有强相关性,可以大大提高预测效果。
    5. 我们的系统整体上使用了Stacking的框架,如下图:

    FNN,CNN,RNN的区别

    • Stage1: 将两个问句与Magic Feature输入Deep Learning中,将其输出作为下一层的特征(这里的Deep Learning相当于特征抽取器)。我们一共训练了几十个Deep Learning Model。
    • Stage2: 将 Deep Learning特征 与 手工抽取的几百个传统特征 拼接在一起,作为输入。在这一层,我们训练各种模型,有成百上千个(通过改变参数么得到不同种类模型,用hyperopt的默认策略来搜索参数空间,将中间结果全保留下来)。
    • Stage3: 上一层的输出进行Ensemble Selection。

    比赛中发现的一些深度学习的局限:

    通过对深度学习产生的结果进行错误分析,并且参考论坛上别人的想法,我们发现深度学习没办法学到的特征大概可以分为两类:

    1. 对于一些数据的Pattern,在 Train Data 中出现的频数不足以让深度学习学到对应的特征,所以我们需要通过手工提取这些特征。
    2. 由于 Deep Learning 对样本做了独立同分布假设(iid),一般只能学习到每个样本的特征,而学习到数据的全局特征,比如 TF-IDF 这一类需要统计全局词频才能获取的特征,因此也需要手工提取这些特征。

    传统的机器学习模型和深度学习模型之间也存在表达形式上的不同。虽然传统模型的表现未必比深度学习好,但它们学到的Pattern可能不同,通过Ensemble来取长补短,也能带来性能上的提升。因此,同时使用传统模型也是很有必要的。

    2.2 第一名的解决方案

    比赛结束不久,第一名也放出了他们的解决方案,我们来看看他们的做法。他们的特征总结为三个类别:

    1. Embedding Feature
    2. Text Mining Feature
    3. Structural Feature(他们自己挖掘的 Magic Feature)

    并且他们也使用了 Stacking 的框架,并且使用 固定的k-fold

    • Stage1: 使用了 Deep Learning,XGBoost,LightGBM,ExtraTree,Random Forest,KNN等300个模型
    • Stage2: 用了 手工特征 和 第一层的预测 和 深度学习模型的隐藏层,并且训练了150个模型。
    • Stage3: 使用了分别是带有 L1 和 L2 的两种线性模型。
    • Stage4: 将第三层的结果 加权平均。

    我们模型存在不足:

    • 对比以后发现我们没有做 LDA、LSI 等特征
    •  N-gram 的粒度没有那么细(他们用了8-gram),还有他们对 Magic Feature的挖掘更加深入。
    • 还有一点是他们的 Deep Learning 模型设计更加合理,他们将筛选出来的 手工特征 也输入到深度学习模型当中,我觉得这也是他们取得好效果的关键。因为显式地将手工特征输入给深度学习模型,相当于告诉“它你不用再学这些特征了,你去学其他的特征吧”,这样模型就能学到更多的语义信息。所以,我们跟他们的差距还是存在的。

    3. 工具篇

    工欲善其事,必先利其器。

    Kaggle 的上常工具除了大家耳熟能详的XGBoost之外, 这里要着重推荐的是一款由微软推出的LightGBM,这次比赛中我们就用到了。LightGBM的用法与XGBoost相似,两者使用的区别是XGBoost调整的一个重要参数是树的高度,而LightGBM调整的则是叶子的数目。与XGBoost 相比, 在模型训练时速度快, 单模型的效果也略胜一筹。

    调参也是一项重要工作,调参的工具主要是Hyperopt,它是一个使用搜索算法来优化目标的通用框架,目前实现了Random Search和Tree of Parzen Estimators (TPE)两个算法。

    对于 Stacking,Kaggle 的一位名为Μαριος Μιχαηλιδης的GrandMaster使用Java开发了一款集成了各种机器学习算法的工具包StackNet,据说在使用了它以后你的效果一定会比原来有所提升,值得一试。

    以下总结了一些常用的工具:

    • Numpy | 必用的科学计算基础包,底层由C实现,计算速度快。
    • Pandas | 提供了高性能、易用的数据结构及数据分析工具。
    • NLTK | 自然语言工具包,集成了很多自然语言相关的算法和资源。
    • Stanford CoreNLP | Stanford的自然语言工具包,可以通过NLTK调用。
    • Gensim | 主题模型工具包,可用于训练词向量,读取预训练好的词向量。
    • scikit-learn | 机器学习Python包 ,包含了大部分的机器学习算法。
    • XGBoostLightGBM | Gradient Boosting 算法的两种实现框架。
    • PyTorchTensorFlowKeras | 常用的深度学习框架。
    • StackNet | 准备好特征之后,可以直接使用的Stacking工具包。
    • Hyperopt | 通用的优化框架,可用于调参。

    4. 总结与建议

    1. 在参加某个比赛前,要先衡量自己的机器资源能否足够支撑你完成比赛。比如一个有几万张图像的比赛,而你的显存只有2G,那很明显你是不适合参加这个比赛的。当你选择了一个比赛后,可以先“热热身”,稍微熟悉一下数据,粗略地跑出一些简单的模型,看看自己在榜上的排名,然后再去慢慢迭代。
    2. Kaggle有许多大牛分享Kernel, 有许多Kernel有对于数据精辟的分析,以及一些baseline 模型, 对于初学者来说是很好的入门资料。在打比赛的过程中可以学习别人的分析方法,有利于培养自己数据嗅觉。甚至一些Kernel会给出一些data leak,会对于比赛提高排名有极大的帮助。
    3. 其次是Kaggle已经举办了很多比赛, 有些比赛有类似之处, 比如这次的Quora比赛就与之前的Home Depot Product Search Relevance 有相似之处,而之前的比赛前几名已经放出了比赛的 idea 甚至 代码,这些都可以借鉴。
    4. 另外,要足够地重视 Ensemble,这次我们组的最终方案实现了paper " Ensemble Selection from Libraries of Models" 的想法,所以有些比赛可能还需要读一些paper,尤其对于深度学习相关的比赛,最新paper,最新模型的作用就举足轻重了。
    5. 而且,将比赛代码的流程自动化,是提高比赛效率的一个关键,但是往往初学者并不能很好地实现自己的自动化系统。我的建议是初学者不要急于构建自动化系统,当你基本完成整个比赛流程后,自然而然地就会在脑海中形成一个框架,这时候再去构建你的自动化系统会更加容易。
    6. 最后,也是最重要的因素之一就是时间的投入,对于这次比赛, 我们投入了差不多三个多月,涉及到了对于各种能够想到的方案的尝试。尤其最后一个月,基本上每天除了睡觉之外的时间都在做比赛。所以要想在比赛中拿到好名次,时间的投入必不可少。另外对于国外一些介绍 kaggle比赛的博客(比如官方博客)也需要了解学习,至少可以少走弯路,本文的结尾列出了一些参考文献,都值得细细研读。
    7. 最后的最后,请做好心理准备,这是一场持久战。因为比赛会给你带来压力,也许过了一晚,你的排名就会一落千丈。还有可能造成出现失落感,焦虑感,甚至失眠等症状。但请你相信,它会给你带来意想不到的惊喜,认真去做,你会觉得这些都是值得的。

    解答

    1. 请问在Stacking中,你们如何得知可以这样组合? 以及如何验证其效果跟正确度呢?

           对于这个问题我们第一时间想到的是用deep learning,然后再抽手工特征,这就组成了stage1,在stage2的时候想要发挥stack的能力当然是要上非线性模型,然后在进入stage3,而stack层数越深,所用的模型需要更简单,不然很容易过拟合,因此用了bagging ensemble selection,当然你也可以像第一名的做法,去训练带惩罚项的线性模型。至于magic feature为什么要放在deeplearning的输入,那是因为我们发现deep learning会容易过拟合到某些特征,加入magic feature可以显式地告诉它“你已经有这些特征了,你可以去挖掘其他的语义特征”,其实你甚至可以把所有的 手工特征 也加入deeplearning的输入,这样效果可能会更好,第一名就是这么做的

             如何验证stacking的效果,很简单啊,用那份固定的kfold做交叉验证。但是要注意,stacking有过拟合到  valid set 的风险,所以最好的评判当然是leaderborad啦。

    2. stage2中的非线性模型,是任何的非线性模型皆可吗? 还是需要数学验证呢?  

    使用 Ensemble 的时候秘诀就是多尝试,不能吊死在一棵树上,如果你认为xgboost是里面表现最好的,不需要尝试其他模型了,那就太可惜了。我们不能保证一种模型一定能够学习到所有的方面,所以需要去尝试其他模型,尽量让学出来的模型好而不同,这样可以让各种模型发挥自己的长处。所以,不仅仅是非线性模型可以,就算是线性模型也可以,当然我们还要考虑时间、资源等因素进行一些取舍。

    如果我们追求的只是实用性和准确性,只要实验的效果出色即可,如果要严谨地用数学证明再去使用,说不定等你证明完比赛已经结束了。

    每次学习感觉都醍醐灌顶,在此感谢知乎大神分享

    参考文献:

    1. Paper: Ensemble Selection from Libraries of Models

    2. Kaggle 数据挖掘比赛经验分享

    3. Kaggle Ensembling Guide

    展开全文
  • 从...怎样赢得机器学习比赛:你拿别人的结果和你自己的结果与做集成。 —— Vitaly Kuznetsov NIPS2014。 集成模型是一种能在各种的机器学习任务上提高准确率的强有力技术。在这篇文章中,我会...

    https://mlwave.com/kaggle-ensembling-guide/翻译过来,对目前kaggle竞赛中使用的模型融合方法和效果进行了分析,并给出了使用模型融合的指导思想。

    怎样赢得机器学习比赛:你拿别人的结果和你自己的结果与做集成。

    —— Vitaly Kuznetsov NIPS2014。

    集成模型是一种能在各种的机器学习任务上提高准确率的强有力技术。在这篇文章中,我会分享我在Kaggle比赛中的集成方法。

    在第一部分中,我们会讨论从提交文件中建立集成。主要包括:

    • 投票集成
    • 平均
    • 排名平均
    •  

    第二部分我们会讨论 通过 generalization/blending等方法来创建集成。

    我会在后续回答为什么集成能够减少泛化误差。最后我会展示不同的集成方法,包括它们的结果以及代码以供你自己去尝试。

    对提交文件进行集成

    最简单方便的办法就是对Kaggle提交的csv文件直接进行集成。你只需要模型在测试集上的预测结果,而不需要重新训练一个模型。它简单快速,只需使用已有模型的预测结果,是拼队的理想选择。

    投票集成(预测结果为类别时)

    我们先看一下简单的投票集成方法。来看看为什么集成模型能够减少错误率,和为什么它能在模型间相关度较低时能取得更好的结果。

    纠错码

    在航天任务中,所有的信号都被正确的传达是非常重要的。

    如果我们有一个二进制字符串形式的信号,如:

    1110110011101111011111011011

    如果信号在传输过程中有一位发生了翻转(第二位),变成了

    1010110011101111011111011011

    •  

    那这可能是致命的。

    在纠错码中有一个编码 解决方案。在最简单的情况下,即纠错码是重复码时:以同样大小的数据块多次传递信号,并进行投票(以少数服从多数原则)。

    Original signal:

    1110110011

    Encoded:

    10, 3101011001111101100111110110011

    Decoding:

    101011001111101100111110110011

    Majority vote:

    1110110011

    •  

    信号失真很少发生且通常在局部发生,因此,多次投票依然出错的可能性就更小了。

    只要信号失真不是完全不可预测的(有50%的几率发生),信号就能被修复。

    一个机器学习的例子

    假设我们的测试集有10个样本,正确的情况应该都是1:

    1111111111

    我们有3个正确率为70%的二分类器记为A,B,C。你可以将这些分类器视为伪随机数产生器,以70%的概率产生”1”,30%的概率产生”0”。

    下面我们会展示这些伪分类器通过投票集成的方法得到78%的正确率。

    涉及到一点数学

    我们看到有44%的概率投票可以校正大部分错误。大部分投票集成会使最终的准确率变成78%左右(0.3429 + 0.4409 = 0.7838)。

    投票个数

    跟重复码相似,随着编码重复次数的增加对错误的校正能力也会增加,因此集成通常可以通过提高集成成员的个数来提升准确率。

    同样利用上面数学的数学公式:对5个有70%准确率的伪随机分类器进行投票集成会得到83%的准确率。在大约66%的情况下投票可以校正1或2个错误编码。(0.36015 + 0.3087)

    相关性

    在我第一次组队参加2014年KDD杯比赛时,Marios Michailidis (KazAnova)提出了一些奇特的东西,他对我们所有的提交文件计算 皮尔逊相关系数,并且挑选出一些性能较好且相关系数较低的模型。

    从这些挑选出来的文件中创建平均集成模型,给我们在排行榜上带来了巨大的提升,50名的飞跃。不相关的预测结果的集成明显比相关的集成结果要好,这是为什么?

    为了说明这一点,我们再举3个简单的模型。正确的情况仍然是全是1:

    Kaggle案例:森林植被类型预测

    当评价指标需要有力的预测时,比如多分类问题的准确率,少数服从多数投票法具有重要意义。

    森林植被类型预测 比赛https://www.kaggle.com/c/forest-cover-type-prediction

    使用 UCI Forest CoverType 数据集。这个数据集有54个属性,6种分类类型。

    https://archive.ics.uci.edu/ml/datasets/Covertype

    我们建立一个有500棵树的随机森林模型作为 起始模型,然后我们再建立更多的模型,并挑选出最好的一个。在这个问题中,我们选择的一个ExtraTreesClassifier 模型表现得最好。

    加权

    接下来,我们讨论加权投票。为什么要加权?通常我们希望模型越好,其权重就越高。所以,在这里,我们将表现最好的模型的投票看作3票,其它的4个模型只看作1票。

    原因是:当表现较差的模型需要否决表现最好的模型时,唯一的办法是它们集体同意另一种选择。我们期望这样的集成能够对表现最好的模型进行一些修正,带来一些小的提高。

    表一是5个模型训练出来的结果,包括结果得分以及加权的得分。

    Kaggle案例:CIFAR-10 图像检测

    CIFAR-10是另一个用准确率衡量的多分类kaggle比赛。

    这个比赛中,我们队的队长Phil Culliton,从dr. Graham那复制了一个好的模型,并第一个发现最好的参数设置。

    然后他对大约30个提交文件使用了投票集成的方法(所有的准确率得分在90%以上)。在集成模型中最好的单模型的得分为 0.93170.

    对30个模型的投票集成得分为0.94120.大约降低了0.01错误率的,使得其识别结果超过人类 estimated human classification accuracy.

    代码

    我们有一个简单的投票脚本

    https://github.com/MLWave/Kaggle-Ensemble-Guide/tree/master/src

    kaggle_vote.py

    在 MLWave Github repo中找到. 它在kaggle的提交目录中运行,并负责创建一个新的提交文件。更新:Armando Segnini 已经加上了加权部分的代码。

    Ensembling.训练10个神经网络并平均它们的预测结果,这是一个相当简单的技术,却有相当大的性能改进。

    这里可能会有疑惑:为什么平均会有如此大的帮助?这有一个对于平均有效的简单的原因。假设我们有2个错误率70%的分类器,当2者结果一样时,那就是这个结果;当2者发生分歧时,那么如果其中一个分类器总是正确的,那么平均预测结果就会设置更多的权重在那个经常正确的答案上。

    这个作用会特别强,whenever the network is confident when it’s right and unconfident when it’s wrong.——Ilya Sutskever在深度学习的简单概述中说道。

    平均

    平均可以很好的解决一系列问题(二分类与回归问题)与指标(AUC,误差平方或对数损失)。

    与其说平均,不如说采用了多个个体模型预测值的平均。一个在Kaggle中经常听到的词是“bagging submissions”。

    平均预测常常会降低过拟合。在类与类间,你想要理想的平滑的将其分离,而单一模型的预测在边界间可能会有一些粗糙。

    上面这幅图片来自这个kaggle比赛:不要过拟合!图中黑线比绿线有更好的分割,绿色线已经从数据点中学习了一些噪声。但不用担心,平均多个不同的绿线应该使我们更接近黑线。

    记住,我们的目标不仅是去记住这些训练数据(这里有比在随机森林里更加有效的方法来存储数据),而且还要去对我们没有看到的数据进行良好的泛化。

    Kaggle案例: Bag of Words Meets Bags of Popcorn

    这是一个电影情感分析竞赛,在以前的文章中,我们使用 在线感知机脚本

    https://mlwave.com/online-learning-perceptron/

    得到了0.952的AUC.

    这个感知机是一个线性分类器,在数据线性可分的情况下一定能找到一个分隔。这是一个受人喜欢的性质,但是你要意识到一旦达到这种分隔,分类器就会停止学习。它不一定会是新数据的最好的分隔。

    那当我们随机初始化5个感知机的权重,并通过平均来组合预测会发生什么?结果是我们在测试集上的结果得到了提升,但这是为什么呢?

    以上结果还能说明,集成能(暂时)使您不必了解特定机器学习算法的更精细的细节与内部工作原理。如果集成起作用,那很好,如果没起作用,那并无大碍。

    就算你平均10个相同的线性回归的结果也没事。Bagging一个糟糕的交叉验证与过拟合的提交有可能会增加多样性从而给你带来一点提高。

    代码

    我们已经在Github上发布了一个 平均脚本,

    https://github.com/MLWave/Kaggle-Ensemble-Guide/tree/master/src

    kaggle_avg.py

    它以.csv文件作为输入并得到一个平均的提交结果。

    更新:Dat Le已经添加了一个 几何平均的脚本。

    kaggle_geomean.py

    几何平均能比普通平均表现的更好。

    排名平均

    当平均多个来自不同模型的输出时,会出现一些问题。并不是所有的预测器的结果是完美 校准的, 它们可能会产生过高或过低的预测概率,或者预测在一定的范围里非常混乱。

    在极端情况下,你可能会有一个这样一个提交:

    历史排名

    排名需要一个测试集,所以当你要预测一个新样本时,你该怎么办?你可以与老的测试集一起,重新计算排名,但这会增加你的解决方案的复杂性。

    一个解决方案是使用历史排名。存储旧的测试集预测及其排名,现在当你预测一个新的测试样例如“0.35000110”,你去找到最接近的历史预测并取其历史排名(在这里最接近的历史预测是“0.35000111”其历史排名为“3”)。

    Kaggle使用案例:获得有价值的顾客挑战赛

    排名平均在基于排名和基于阈值的指标(如AUC)和搜索引擎质量指标(如k平均精度)上表现良好。

    这个 挑战赛的目标 是对一个购物者成为一个重复顾客的概率进行排名。

    https://www.kaggle.com/c/acquire-valued-shoppers-challenge

    我们队首先将多个Vowpal Wabbit中的模型与一个R语言的GLMNet模型进行取平均,然后我们使用排名平均来提高完全相同的集成的情况。

    我已经在 Avito挑战赛中写过排名平均给了我们大幅的提升 。

    finnally, when weighted rank averaging the bagged perceptrons from the previous chapter (1x) with the new bag-of-words tutorial (3x) on fastML.com we improve that model’s performance from 0.96328 AUC to 0.96461 AUC.

    代码

    排名平均脚本 已被添加到了MLWave Github repos上。

    比赛是一种有效的方式,因为有无数的技术可以在建模问题上使用,但我们不能提前知道哪些将是最有效的。Anthony Goldbloom 在 Data Prediction Competitions — Far More than Just a Bit of Fun上说。

    Stacked Generalization & Blending

    对预测文件进行平均既简单又好用,但这并不是顶级kaggle选手使用的唯一方法。stacking与blending也能让你颇受收益。做好心理准备,接来下将要给你介绍屠龙技。

    Netflix

    Netdlix公司曾组织并普及了第一次数据科学比赛,在电影推荐挑战赛中,参赛者们将集成发展成为了一门艺术,可能是太极端了以至于Netfilx公司决定不将获胜方案应用到产品中。 因为这实施起来太复杂了。

    不过,这个比赛涌现了很多论文与新颖的方法:

    • Feature-Weighted Linear Stacking
    • Combining Predictions for Accurate Recommender Systems
    • The BigChaos Solution to the Netflix Prize

    这些论文都比较有趣且可以阅读的,当你想要提高你在Kaggle比赛中的成绩时,可以点进去阅读一下。

    这是我工作这么多年以来,最令人印象深刻的集成和看到的最好的成果,它融合了上百个预测模型来得到最终结果。我们在线下使用了一些新方法重新评估了一番,但是我们测试认为该模型对准确率提升效果似乎并不值得将它引入到生产环境——-Netflix 的工程师说。

    Stacked generalization

    Wolpert在1992的论文中对stacked generalization进行了介绍,比Breiman的论文 “Bagging Predictors“早了2年。Wolpert的另一成名的机器学习理论是:“没有免费午餐定理”

    stacked generalization背后的基本思想是使用大量基分类器,然后使用另一种分类器来融合它们的预测,旨在降低泛化误差。

    下面来说下2折stacking:

    • 将训练集分成2部分: train_a 与 train_b
    • 用train_a来拟合一个初级学习器对train_b进行预测
    • 用train_b来拟合同类型的学习器对train_a进行预测
    • 最后用整个训练集拟合模型,并对测试集进行预测
    • 基于初级学习器的概率输出,来训练次级学习器 一个stacker模型通过使用第一阶段的预测作为特征,比相互独立的训练模型能够得到更多的信息。

    我们通常希望在第0层泛化器是全类型的,而不仅仅是彼此的简单变化(比如我们想要 surface-fitters, Turing-machine builders, statistical extrapolators等等.)这样,所有可能学习到训练集规律的方法都会被使用到, 这就是所谓的初级学习器应该“跨越空间”意思的一部分.

    […]stacked generalization是将非线性泛化器组合从而形成新的泛化器的手段,是为了尝试最好的集成每个初级泛化器。每个学习器信息越多(在其他学习器上没有重复),stacked generalization的结果就越好

    Wolpert (1992) Stacked Generalization

    Blending

    Blending 一词是Netflix的获胜者们引入的。它与stacked generalization非常像,但更简单并且信息泄露风险更小。一些研究者们交换着使用“stacked ensembling”与“blending”这2个词。

    通过Blinding,不需要对训练集创建折外预测(out-of-fold predictions ),你只需创建一个小的留出集,比如10%的训练集做为留出。stacker模型只在留出集里面进行训练。

    Blending的优势:

    • 比stacking更加简单
    • 能够防止信息泄露:generalizers和stackers使用不同的数据
    • 你不需要跟你的队友设定一个相同的随机种子来进行相同的分折 谁都可以将模型放入“blender”中,由blender来决定是否保留这个模型。

    缺点:

    • 只使用了整体中数据一部分
    • 最终的模型有可能对留出集过拟合
    • stacking使用交叉验证比使用单一留出集更加稳健 (在更多的折上进行计算)。

    至于性能,两种技术的得到的结果差不多,取决于你的个人喜好以及你更倾向于哪种技能。就我自己而言,我更喜欢stacking。

    如果你不能做选择的话,你可以同时选择这2种,使用stacked泛化器创建stacked集成和折外预测。然后使用留出集在第三层进一步结合这些stacked模型。

    Stacking with logistic regression

    使用逻辑斯谛回归做融合是一个非常经典的stacking方法。我找到一个脚本很好的帮助我理解了这一方法。

    当创建一个用于预测的测试集时,你可以一次性完成该操作,或者利用折外估计的模型(out-of-fold predictors)完成。当然为了减少模型和代码的复杂性,我更倾向于一次性完成。

    kaggle案例:“Papirusy z Edhellond”

    在这个比赛中,我使用上面的blend.py脚本,结合了8个模型(不同评价指标的ET RF GMB),然后使用逻辑斯谛回归给了我第2名的成绩。

    Kaggle案例: KDD-cup 2014

    使用这个脚本,我将Yan XU的AUC评分从0.605提高到了0.625。

    Stacking with non-linear algorithms

    目前流行用于Stacking的非线性算法有GBM,KNN,NN,RF和ET。

    非线性的Stacking在多分类任务中,使用原始特征就能产生令人惊讶的提升。显然,在第一阶段中的预测提供了非常丰富的信息并得到了最高的特征重要性。非线性算法有效地找到了原始特征与元模型特征之间的关系。

    Kaggle案例: TUT Headpose Estimation Challenge

    在TUT Headpose Estimation比赛中,可以当做是一个多分类,多标签的问题。

    对于每一个标签,将分别训练一个独立的集成模型。

    接下来的表格显示了每个独立模型的得分表现,以及当他们使用extremely randomized trees来做stacking时提高的得分。

    我们看到使用了stack后,误差减少了将近30%

    有兴趣的可以在Computer Vision for Head Pose Estimation: Review of a Competition看到这一结果的论文。

    代码

    你可以在 out-of-fold probability predictions的MLWave Github repo中找到一个函数去使用out-of-fold probability predictions。你也可以使用numpy horizontal stacking (hstack)去创建融合数据。

    Feature weighted linear stacking

    t线性加权stacking就是,先将提取后的特征用各个模型进行预测,然后使用一个线性的模型去学习出哪个个模型对于某些样本来说是最优的,通过将各个模型的预测结果加权求和完成。使用线性的算法可以非常简单快捷地去验证你的模型,因为你可以清楚地看到每个模型所分配的权重。

    Vowpal Wabbit对于线性加权stacking提出了一种创新性的用法。比如我们有以下训练集,它有两个特征空间,一个是f,一个是s:

    1|f f_1:0.55 f_2:0.78 f_3:7.9 |s RF:0.95 ET:0.97 GBM:0.92

    我们可以通过-q fs来构造二次方的特征,它是 s-特征空间和f-特征空间的交互项。在f-特征空间中的特征可以是原始的特征,也可以是例子中的元特征。

    Quadratic linear stacking of models

    这方法并没有名字,所以我给他造了一个。这方法跟线性stacking非常像,但它在线性的基础上,额外构造了一系列模型之间预测结果的组合。这一方法在许多次实验中都对评分有很大的提高。最值得提到的是在DrivenData上的比赛: Modeling Women’s Healthcare Decision competition

    我们同样使用之前提到的VW训练集:

    1|f f_1:0.55 f_2:0.78 f_3:7.9 |s RF:0.95 ET:0.97 GBM:0.92

    •  

    我们可以使用-q ss 训练从而创建出s-特征空间中模型预测之间的二阶特征交互项(如RF*GBM)。

    它与线性加权stacking可以非常简单地结合起来,比如说先算f和s的交互项,再加上s和s的交互项:-q fs -q ss

    So now you have a case where many base models should be created. You don’t know apriori which of these models are going to be helpful in the final meta model. In the case of two stage models, it is highly likely weak base models are preferred.

    So why tune these base models very much at all? Perhaps tuning here is just obtaining model diversity. But at the end of the day you don’t know which base models will be helpful. And the final stage will likely be linear (which requires no tuning, or perhaps a single parameter to give some sparsity). Mike KimTuning doesn’t matter. Why are you doing it?

    Stacking 分类和回归

    Stacking可以允许你使用分类器来完成回归问题,反之亦然。比如说,在一个二分类问题中,有人可能会尝试使用线性分位回归 来完成分类任务。一个好的stacker应该可以从预测中提取出你想要的信息,尽管回归通常并不是一个好的分类器。

    而使用一个分类器做回归就有点棘手。你先离散化:将y均匀地分为几个的类别。那么一个要求你预测工资的回归问题就可以转换为这样的一个多分类的问题:

    • 所有低于20k的为类别1
    • 所有20k到40k之间的为类别2
    • 所有大于40k的为类别3

    使用分类器预测出来的概率可以帮助回归函数取得更好的预测效果。

    Stacking无监督特征学习

    没有任何人说过我们使用stacking的时候一定要是有监督的。事实上你可以使用stacking技术来处理无监督学习的问题。

    k-means聚类是最为流行的无监督算法。Sofia-ML实现了一个快速的在线k-means算法适用于这里。

    其他有意思的方法是 t-SNE:通过把数据降维2到3维,然后将它放到非性融合器来融合。使用留出集的方法感觉上是最安全的选择。可以看看由 Mike Kim提出的解决方案,他使用了t-SNE向量,然后结合了xgboost: 0.41599 via t-SNE meta-bagging

    Piotr给出的 t-SNE在分类任务中的可视化表现

    Online Stacking

    我花了大量时间去研究一个叫online stacking的想法:首先从一个哈希二值映射中创建一个小型的随机树。如果树预测正确则增加其收益,反之减少其收益。然后我们将收益最大的树,和收益最小树的预测作为特征。

    它确实有效,然而只限于人造的数据,它确实可以把异或问题(XOR-problem)学习出来。但是它没有在任何真实数据集上成功过,相信我,我已经试过了。所以,从此之后,对于只使用人造数据去验证它们的新算法的论文,我都会持怀疑的态度。

    一个相似的想法在一篇论文中是有效的: random bit regression。在这里,从特征中构造了多个随机的线性函数,最好的函数是由很强的正则项中产生的。这个方法我曾经在一些数据集上成功过。这会是我将来发表的主题。

    一个(半)online stacking更加具体的例子是广告点击预测问题。模型会在用户近期行为的数据中预测更准,也就是当数据集具有时间效应的时候,你可以使用Vowpal Wabbit去训练整个数据集,并使用一个更加复杂的工具比如说xgboost去训练最后几天的数据。你只需将xgboost的结果与样本进行堆叠(stack),并让Vowpal Wabbit尽其所能:优化损失函数。

    The natural world is complex, so it figures that ensembling different models can capture more of this complexity. Ben Hamner ‘Machine learning best practices we’ve learned from hundreds of competitions’ (video)

    一切皆为超参数(hyper-parameter)

    当我们使用stacking/blending/meta-modeling时,一个良好的想法就是所有的行为都是融合模型的参数。

    比如说:

    • 不标准化数据
    • 使用z标准化
    • 使用0-1标准化

    这些都是可以去调从而提高集成的效果。同样的,使用多少个基模型的数量也是可以去调整优化的。特征选择(前70%)或数据填补(缺失填补)也是一系列的参数。

    使用随机网格搜索就是一个比较好的调参方法,它在调整这些参数的时候确实是有起到作用的。

    模型选择

    你还可以通过组合多个集成模型来继续优化你评分。

    • 这有一个特别的方法:使用平均,投票,或秩平均等方法来手动选择表现好的集成模型。
    • 贪婪前向模型选择 (Caruana et al.)。先使用一个或几个好的模型作为基集成模型。然后不断地增加使得评分提升最大的模型。当然你也可以在期间允许把模型放回去,这样的话一个模型可能会被选择很多次。
    • 使用遗传算法来做选择,用交叉验证得分作为适应度评分函数。可以看 inversion‘s solution 的解决方案:‘Strategy for top 25 position‘.
    • 受Caruana的启发,我使用一个完全随机的方法:通过随机选择集成(无放回),创建一个100或其他个数的集成。然后选择其中评分最高的模型。

    自动化操作

    当我在 Otto product classification比赛中,使用了stacking策略,我很快的得到了前十的成绩。我通过不断的添加越来越多的基分类器,和bagging多个stack集成我的分数得到不断的提高。

    当我达到了7个基模型,用了6个stacker,一阵恐惧和忧郁的感觉向我袭来。我是否能够把所有这些都重现?这些复杂而又笨重的模型让我偏离了快速而又简单的机器学习的初衷。

    我在后续的比赛中,都将时间花在了建造一个自动化stacking的方法。我们去训练那些具有纯随机参数的纯随机算法的基模型。我们写了一个与Scikit-learn的Api协同工作的封装器去负责训练分类模型VW, Sofia-ML, RGF, MLP and XGBoost。

    并行自动stacker的草稿

    使用自动化stacking可以让你轻松的打败那些对该问题设计特定算法的领域专家,各个模型的训练都是可以分布式和并行化的。

    你也可以在这里看到自动化融合的代码:MLWave Github repo: “Hodor-autoML“.

    在Otto product 分类比赛中,第1名和第2名融合了超过1000个不同的模型 可以在这里看到更多: first place 和 second place。

    我们为什么要使用如此复杂的集成方法?

    使用stacking,组合1000多个模型,计算几十个小时这也太疯狂了吧。这..确实是的。但是,这些怪物般的集成方法同样有着它的用处:

    • 它可以使你赢得kaggle比赛
    • 它可以帮你打败当前学术界性能最好的算法
    • You can then compare your new-and-improved benchmark with the performance of a simpler, more production-friendly model
    • 总有一天,虽然现在的计算机和云端还是很弱。你将做好准备
    • 我们有可能将集成的知识迁移到到简单的分类器上(Hinton’s Dark Knowledge, Caruana’sModel Compression)
    • 不是所有基模型都要按时完成的。因为在集成方法中,即使损失一两个模型也是可以接受的。
    • 自动化的大型集成策略可以通过添加正则项有效的对抗过拟合,而且并不需要太多的调参和特征选择。所以从原则上讲,stacking非常适合于那些“懒人”
    • 这是目前提升机器学习效果最好的方法,或者说是最效率的方法human ensemble learning
    • 每1%精度的提升,或许就可以使得你的投资减少大量的损失。更严肃的说:在医疗行业中,每1%的提升,你就能多拯救几个生命。
    •  

    这一论文的代码在:https://github.com/MLWave/Kaggle-Ensemble-Guide上

    https://blog.csdn.net/a358463121/article/details/53054686#t18

    参考文献链接

    英文版本

    http://mlwave.com/kaggle-ensembling-guide/

    这个是上面英文翻译过来的汉语翻译版本

    kaggle比赛集成指南

    http://m.blog.csdn.net/article/details?id=53054686

    搜狗比赛第五名的stacking思路

    http://prozhuchen.com/2016/12/28/CCF%E5%A4%A7%E8%B5%9B%E6%90%9C%E7%8B%97%E7%94%A8%E6%88%B7%E7%94%BB%E5%83%8F%E6%80%BB%E7%BB%93/

    kaggle官方博客 stacking融合

    http://blog.kaggle.com/2016/12/27/a-kagglers-guide-to-model-stacking-in-practice/

    汉语版翻译如下

    Kaggler的“实践中模型堆叠指南”

    介绍

    堆叠(也称为元组合)是用于组合来自多个预测模型的信息以生成新模型的模型组合技术。通常,堆叠模型(也称为二级模型)因为它的平滑性和突出每个基本模型在其中执行得最好的能力,并且抹黑其执行不佳的每个基本模型,所以将优于每个单个模型。因此,当基本模型显著不同时,堆叠是最有效的。关于在实践中怎样的堆叠是最常用的,这里我提供一个简单的例子和指导。

    本教程最初发布在Ben的博客GormAnalysis上。

    https://github.com/ben519/MLPB/tree/master/Problems/Classify%20Dart%20Throwers

    请随意借鉴本文中使用的来自机器学习问题参考书的相关代码和数据集。

    另外的python 版本的blending

    https://github.com/emanuele/kaggle_pbr

    动机

    假设有四个人在板子上投了187个飞镖。对于其中的150个飞镖,我们可以看到每个是谁投掷的以及飞镖落在了哪。而其余的,我们只能看到飞镖落在了哪里。我们的任务就基于它们的着陆点来猜测谁投掷的每个未标记的飞镖。

    K最近邻(基本模型1)

    让我们使用K最近邻模型来尝试解决这个分类问题。为了选择K的最佳值,我们将使用5重交叉验证结合网格搜索,其中K =(1,2,… 30)。在伪代码中:

    1.将训练数据分成五个大小相等的数据集。调用这些交叉测试。

    2.对于K = 1,2,… 10

    1.对于每个交叉测试

    1.组合其他四个交叉用作训练交叉

    2.在训练交叉上使用K最近邻模型(使用K的当前值)

    3.对交叉测试进行预测,并测量所得预测的准确率

    2.从五个交叉测试预测中计算平均准确率

    3.保持K值具有最好的平均CV准确率

    使用我们的虚构数据,我们发现K = 1具有最佳的CV性能(67%的准确性)。使用K = 1,我们现在训练整个训练数据集的模型,并对测试数据集进行预测。 最终,这将给我们约70%的分类精度。

    支持向量机(基本型2)

    现在让我们再次使用支持向量机解决这个问题。此外,我们将添加一个DistFromCenter功能,用于测量每个点距板中心的距离,以帮助使数据线性可分。 使用R的LiblineaR包,我们得到两个超参数来调优:

    类型

    1.L2-正则化L2丢失支持向量分类(双重)

    2.L2正则化L2丢失支持向量分类(原始)

    3.L2-正则化L1损失支持向量分类(双重)

    4.Crammer和Singer的支持向量分类

    5.L1正则化L2丢失支持向量分类

    成本

    正则化常数的倒数

    我们将测试的参数组合网格是5个列出的SVM类型的笛卡尔乘积,成本值为(.01,.1,10,100,1000,2000)。 那是

    使用与我们的K最近邻模型相同的CV +网格搜索方法,这里我们找到最好的超参数为type = 4,cost = 1000。再次,我们使用这些参数训练的模型,并对测试数据集进行预测。这将在测试数据集上给我们约61%的CV分类精度和78%的分类准确性。

    堆叠(元组合)

    让我们来看看每个模型分为Bob,Sue,Mark或Kate的板区域。

    不出所料,SVM在分类Bob的投掷和Sue的投掷方面做得很好,但是在分类Kate的投掷和Mark的投掷方面做得不好。对于最近邻模型,情况正好相反。 提示:堆叠这些模型可能会卓有成效。

    一共有几个思考如何实现堆叠的派别。在我们的示例问题中我是根据自己的喜好来应用的:

    1.将训练数据分成五个交叉测试

    2.创建一个名为“train_meta”的数据集,其具有与训练数据集相同的行ID和交叉ID、空列M1和M2。 类似地,创建一个名为“test_meta”的数据集,其具有与测试数据集相同的行ID、空列M1和M2

    3.对于每个交叉测试

    {Fold1,Fold2,… Fold5}

    3.1组合其他四个交叉用作训练交叉

    3.2对于每个基本模型

    M1:K-最近邻(k = 1)

    M2:支持向量机(type = 4,cost = 1000)

    3.2.1将基本模型交叉训练,并在交叉测试进行预测。 将这些预测存储在train_meta中以用作堆叠模型的特征

    train_meta与M1和M2填补fold1

    4.将每个基本模型拟合到完整训练数据集,并对测试数据集进行预测。 将这些预测存储在test_meta内

    5.使用M1和M2作为特征,将新模型S(即,堆叠模型)适配到train_meta,可选地,包括来自原始训练数据集或特征工程的其他特征。

    S:逻辑回归(来自LiblineaR包,类型= 6,成本= 100)。 适配train_meta

    6.使用堆叠模型S对test_meta进行最终预测

    test_meta与堆叠模型预测

    主要观点是,我们使用基础模型的预测作为堆叠模型的特征(即元特征)。 因此,堆叠模型能够辨别哪个模型表现良好,哪个模型表现不佳。还要注意的是,train_meta的行i中的元特征不依赖于行i中的目标值,因为它们是在使用基本模型拟合过程中排除target_i的信息中产生的。

    或者,我们可以在测试数据集适合每个交叉测试之后立即使用每个基本模型进行预测。 在我们的例子中,这将产生五个K-最近邻模型和五个SVM模型的测试集预测。然后,我们将平均每个模型的预测以生成我们的M1和M2元特征。 这样做的一个好处是,它比第一种方法耗时少(因为我们不必在整个训练数据集上重新训练每个模型)。 它也有助于我们的训练元特征和测试元特征遵循类似的分布。然而,测试元M1和M2在第一种方法中可能更准确,因为每个基础模型在全训练数据集上训练(相对于训练数据集的80%,在第二方法中为5次)。

    堆栈模型超参数调优

    那么,如何调整堆叠模型的超参数? 关于基本模型,就像我们以前做的,我们可以使用交叉验证+网格搜索调整他们的超参数。 我们使用什么交叉并不重要,但使用我们用于堆叠的相同交叉通常很方便。调整堆叠模型的超参数是让事情变得有趣的地方。在实践中,大多数人(包括我自己)只需使用交叉验证+网格搜索,使用相同的精确CV交叉用于生成元特征。 这种方法有一个微妙的缺陷 - 你能找到它吗?

    事实上,在我们的堆叠CV过程中有一点点数据泄漏。 想想堆叠模型的第一轮交叉验证。我们将模型S拟合为{fold2,fold3,fold4,fold5},对fold1进行预测并评估效果。但是{fold2,fold3,fold4,fold5}中的元功能取决于fold1中的目标值。因此,我们试图预测的目标值本身就嵌入到我们用来拟合我们模型的特征中。这是泄漏,在理论上S可以从元特征推导出关于目标值的信息,其方式将使其过拟合训练数据,而不能很好地推广到袋外样本。 然而,你必须努力工作来想出一个这种泄漏足够大、导致堆叠模型过度拟合的例子。 在实践中,每个人都忽略了这个理论上的漏洞(坦白地说,我认为大多数人不知道它甚至存在!)

    堆叠模型选择和特性

    你如何知道选择何种型号作为堆叠器以及元特征要包括哪些功能? 在我看来,这更像是一门艺术而不是一门科学。 你最好的办法是尝试不同的东西,熟悉什么是有效的,什么不是。另一个问题是,除了元特征,你应该为堆叠模型包括什么其他功能(如果有)?这也是一种艺术。看看我们的例子,很明显,DistFromCenter在确定哪个模型将会很好地发挥作用。KNN似乎在分类投掷于中心附近的飞镖上做得更好,SVM模型在分类远离中心的飞镖上表现得更好。 让我们来看看使用逻辑回归来堆叠我们的模型。 我们将使用基本模型预测作为元特征,并使用DistFromCenter作为附加功能。

    果然,堆叠模型的性能优于两种基本模型 - 75%CV精度和86%测试精度。 就像我们对基本模型一样,现在让我们来看看它的覆盖训练数据的分类区域。

    这里的好处是,逻辑回归堆叠模型捕获每个基本模型的最好的方面,这就是为什么它的执行优于任何孤立的基本模型。

    实践中的堆叠

    为了包装,让我们来谈谈如何、何时、以及为什么在现实世界中使用堆叠。 就个人而言,我大多在Kaggle的机器学习竞赛中使用堆叠。一般来说,堆叠产生小的收益与大量增加的复杂性不值得为大多数企业使用。 但堆叠几乎总是富有成果,所以它几乎总是用于顶部Kaggle解决方案。 事实上,当你有一队人试图在一个模型上合作时,堆叠对Kaggle真的很有效。采用一组单独的交叉,然后每个团队成员使用那些交叉建立他们自己的模型。 然后每个模型可以使用单个堆叠脚本组合。这是极好的,因为它防止团队成员踩在彼此的脚趾,尴尬地试图将他们的想法拼接到相同的代码库。

    最后一位。 假设我们有具有(用户,产品)对的数据集,并且我们想要预测用户在购买给定产品的情况下,他/她与该产品一起展示广告的几率。一个有效的功能可能是,使用培训数据,有多少百分比的产品广告给用户,而他实际上在过去就已经购买?因此,对于训练数据中的样本(user1,productA),我们要解决一个像UserPurchasePercentage这样的功能,但是我们必须小心,不要在数据中引入泄漏。 我们按照接下来这样做:

    1.将训练数据拆分成交叉

    2.对于每个交叉测试

    1.标识交叉测试中的唯一一组用户

    2.使用剩余的交叉计算UserPurchasePercentage(每个用户购买的广告产品的百分比)

    3.通过(fold id,用户id)将UserPurchasePercentage映射回培训数据

    现在我们可以使用UserPurchasePercentage作为我们的梯度提升模型(或任何我们想要的模型)的一个特性。我们刚刚做的是有效地建立一个预测模型,基于user_i在过去购买的广告产品的百分比,预测他将购买product_x的概率,并使用这些预测作为我们的真实模型的元特征。这是一个微妙而有效并且我经常在实践和Kaggle实现的有效的堆叠形式 - 。

    https://blog.csdn.net/a358463121/article/details/53054686#t18

    https://blog.csdn.net/u014356002/article/details/54376138

    《统计学习方法》中每一章的算法实现一遍

    展开全文
  • 客户流失预测:用于预测电信公司客户流失的机器学习实现
  • 图19 LSTM训练误差图 3.4 模型融合与总结 模型融合是一种非常有效的技术,可以在大部分的机器学习任务中提高回归或者分类的准确性。可以直接使用不同模型的结果文件进行融合,也可以使用一个模型的预测结果作为另一...

    我们使用“DataInsight”作为队伍名参加了“2018创客中国-国家电投大数据及智能应用创新创业大赛”中的光伏发电量预测这一赛题。在比赛中我们使用的核心模型为:XGBoost+LightGBM+LSTM。最终在初赛A榜和B榜分别获得第一名,决赛获得第二名。本文将介绍比赛过程中,我们队的基本思路以及使用的一些方法和技巧,希望能给和我们一样刚接触比赛的同学提供一些基本技巧和入门级的实现代码。 
    目录
    1 数据探索与数据预处理 2
    1.1 赛题回顾 2
    1.2 数据探索性分析与异常值处理 2
    1.3 相关性分析 5
    2 特征工程 8
    2.1 光伏发电领域特征 8
    2.2 高阶环境特征 11
    2.3 特征选择 11
    3 模型构建与调试 11
    3.1 预测模型整体结构 11
    3.2 基于LightGBM与XGBoost的模型构建与调试 12
    3.3 基于LSTM的模型构建与调试 13
    3.4 模型融合与总结 15
    4 总结与展望 15
    参考文献 16

    1 数据探索与数据预处理
    1.1 赛题回顾
     赛题背景
    作为世界第一大清洁能源的太阳能相对煤炭石油等能源来说是可再生、无污染的,只要有太阳就有太阳能,所以太阳能的利用被很多国家列为重点开发项目。但太阳能具有波动性和间歇性的特性,太阳能电站的输出功率受光伏板本体性能、气象条件、运行工况等多种因素影响,具有很强的随机性,由此带来的大规模并网困境严重制约着光伏发电的发展。通过对未来光伏发电功率的短期准确预测并设定调度计划是解决此问题的关键。目前,光伏发电功率预测技术多仅围绕气象条件和历史数据建模,而忽略了光伏板本体性能和实际运行工况对发电效率的影响,因此无法保障短期发电功率预测精度。
     赛题任务
    在分析光伏发电原理的基础上,论证了辐照度、光伏板工作温度等影响光伏输出功率的因素,通过实时监测的光伏板运行状态参数和气象参数建立预测模型,预估光伏电站瞬时发电量,根据光伏电站DCS系统提供的实际发电量数据进行对比分析,验证模型的实际应用价值。
    1.2 数据探索性分析与异常值处理
    光伏电站的发电量,可以看到发电量是一个周期的连续变量,周期在180到200之间,周期大小与时令有关。总共17000个ID可以大致算出是100个周期,图1画出了发电量的若干个连续周期。根据赛题信息,我们推断训练数据集的时间跨度为三个月,那么我们可以肯定一个周期代表一天,然而,因为在北半球,所以一天的光照周期会变大,并且可以在图中可以看到,形状呈正弦函数的一半,如图2所示,形状不完整的是由于,每天的天气不一样,导致光照强度的形状改变,从而发电量形状改变。

    在这里插入图片描述 在这里插入图片描述
    图1 发电量的周期特性          图2 发电量单个周期
    在这里插入图片描述
    图3 光照强度随ID的变化趋势
    在训练集和测试集合并后,光照强度等多个特征都是随着 ID而大致上连续变化,并且ID本身在合并后本身就连续,所以有理由相信,测试集和训练集在同一个数据集里面随机抽取形成两个集合。这张图可以看出,光照强度会随着ID的增大,峰值会随着增大,由于题目提示了这些数据是2月14后的数据,所以可以推测,赛题中光伏电站在北半球。

    图4 温度,平均功率,电压A及转换效率的异常值
    图4绘制了几个变量的散点图,我们从图中发现,这几个特征都存在异常值和离群点,例如温度是-6000,电压大于6万,平均功率大于25000,风向大于360(根据常识这个量纲肯定是360°),还有转换效率1万到3万这些离群点,发现有些异常值是几个特征同时出现。
    图5绘制了“平均功率”和“转换效率”这两个特征的数值分布图,分别体现了两类不同的分布:符合周期性的特征,会呈现如下图平均功率一样的双峰分布,其余特征会呈现正态分布,因此我们对于异常值的判定是数据超出平均值上下三个标准差之外部分,异常值使用本列前一个值代替,因为数据具有连续性和周期性。
    另一方面,由于每天日落后光伏板不在发电,我们发现有一些停止发电的点,发电量是固定值,我们并未利用此漏洞。
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
    图5 平均功率和转换效率的数值分布
    1.3 相关性分析
    首先我们观察了各特征与发电量的皮尔森相关系数,结果记录在表1中,这可以在一定程度上判断特征对于预测的作用。
    在这里插入图片描述
    通过数据可视化,我们发现光照强度/40的曲线基本和发电量的曲线一致,如图6所示。平均功率除以480的曲线基本和发电量的曲线一致,如图7。电流和发电量也基本一直,如图8所示。
    在这里插入图片描述
    图6 光照强度/40
    在这里插入图片描述
    图7 平均功率/480

    图8 电流A*1.4
    板温和现场温度与发电量的相关性虽然没强特征那么高,但趋势也是大致一样,电压基本稳定在一个范围没有呈现周期性,风向也是稳定在一个值附近,说明这三个月吹的是定向风,而风速分布没有什么规律。转换效率和发电量基本上是负相关,而发电量和光照强度相关性极高,那么可以知道,当光照强度越强,转换效率越低,查阅文献得知这是因为光照提高温度,而温度在一定范围外,升高会降低效率。图8画出了以上三个特征与发电量的对比情况。
    在这里插入图片描述
    在这里插入图片描述
    图8 板温、电压、转换效率,风速,风向,现场温度与发电量变化趋势对比
    2 特征工程
    2.1 光伏发电领域特征
    光伏电站利用电池板的光生伏特效应将光转化为电能。分析光伏发电系统的工作原理、功率输入输出特征后,可以对影响光电出力的因素进行建模,并且利用已有的数据产生新的特征用于光电出力预测[1]。
    关键特征1:二极管正向电流 。

    在这里插入图片描述
    图9 光伏电站等效电路示意图
    (1)其中, 为光伏电池二极管PN结反向饱和电流
    (2)关键特征2:前一时刻功率
    光照强度以及光伏电站的设备状况随时间变化较为缓慢,使用前一时刻的功率作为特征具有一定的参考价值。
    关键特征3:距离周期内峰值的距离(dis2peak)、相同距离的平均功率(mean)、标准差(std)
    在这里插入图片描述
    图10 根据发电量的周期特性添加“峰值距离”特征
    关键特征4:温差(板温-环境温度)
    板温,现场温度会发电量影响发电量,二者的变化趋势如图11所示,它们差值和发电量也有较强的关系,如图12所示。
    在这里插入图片描述
    图11 板温、现场温度与发电量的变化趋势对比

    图12 温差与发电量的变化趋势对比
    关键特征5: 电压A/转换效率=实际板面所受光照
    由于一天中日照角度的变化,已经提供的光照强度不能直接反应板面所受光照。通过查阅有关资料,转换效率计算方法为光伏板输出功率/日照功率, 其中光伏板输出功率我们用电压A代表,已知转换效率的情况下,电压A/转换效率可以表示板面实际光光照。

    在这里插入图片描述

    图12 温差与发电量的变化趋势对比
    关键特征6: 功率/该节点的风速
    通过论文《风力发电机风速、功率、功率曲线的分析》得知,风速能够影响发电机的输出功率,从而进一步的影响发电量,因此我们构造出特征每个节点的功率/该节点的风速。
    2.2 高阶环境特征
    特种工程中一种思想是利用已有特征的组合,计算其高阶特征, 经过特征选择我们发现 ‘板温’,‘现场温度’,‘光照强度’,‘风速’,‘风向’ 即环境因素的两两之间的2阶交互项可以提供较好的预测效果。
    2.3 特征选择
    在比赛中,我们的基本思路是,不同模型使用不同的特征。这是由于在比赛过程中,我们发现在某个模型上十分有效的特征在另外一个模型上并不一定能够得到很好的结果。
    此外,我们在比赛中使用了“前向特征选择”的方法。这种方法基本的过程是,先选择一个预测性能最好参数,然后在剩下的特征中继续选择一个与已有的特征一起作为特征集,使得分最高。以此类推,直到达到预先设定的最大特征数量或者全部特征集。
    图13绘制了前向特征选择过程中,陆续加入特征,模型的得分情况。测试过程使用的是LightGBM模型(详细参数见所提交的代码)。
    在这里插入图片描述
    图13 前向特征选择得分曲线
    3 模型构建与调试
    3.1 预测模型整体结构
    这是一个连续目标变量回归预测问题,很多模型都能有效的解决此类问题。但是,不同的模型原理和所得结果之间是存在差异的。在比赛中我们借鉴了Stacking的思想,融合了LightGBM、XGBoost以及LSTM三个模型。其中前两类可以看作是树模型,LSTM为神经网络模型。这两类模型原理相差较大,产生的结果相关性较低,融合有利于提高预测准确性。具体的模型结构如图14及说明如下:

    在这里插入图片描述
    图14 预测模型整体结构

    我们使用Xgboost_1对特征组合F1进行学习,得到Xgboost_1的预测结果(包括对于训练集和测试集的预测结果),该结果会作为新特征,加入特征组合F2,F3中,分别作为第二层LightGBM_1 和 LightGBM_2的输入特征,LightGBM_1的结果再次作为新特征,加入特征组合F4中,作为第三层Xgboost_2的输入特征,同时第三层包含一个LSTM模型,该模型使用特征组合F5训练,第二层LightGBM_2的结果则与第三层Xgboost_2,LSTM的预测结果进行加权融合作为最终结果。
    3.2 基于LightGBM与XGBoost的构建与调试
    在本问题中,一个严重的问题是过拟合,我们发现模型在训练样本中表现优越,但是在验证数据集以及测试数据集中表现不佳,在采取了特征,样本抽样进入训练,减少树深度和正则化参数后等有效方法后,我们发现和验证以下创新的方法可以进一步减少过拟合。

    1. 重复使用部分特征
      在Light GBM模型中,我们对于环境特征(板温,现场温度,光照强度,风速,风向)执行了一次复制,即这些特征会在训练中出现两次,结果显示训练集误差几乎一致,但是线上线下验证集误差都更小,也就是说,使用重复特征,减少了过拟合的程度,使得模型的泛化,预测效果更佳。
      对比加入重复特征的训练集与普通训练集的训练曲线,如图15,可见使用重复特征的模型验证误差小于不使用重复特征的模型,而两者的训练误差几乎相同的。
      在这里插入图片描述
      图15 重复特征下的交叉验证误差曲线
      很多文献和实验[5]表明特征选择时去除相关性高的特征是有利的,但是在本问题中我们发现重复特征虽然和已有特征的相关性很高,但是这种做法是可以提高预测准确度的,我们认为这有可能与单个树模型在抽样特征的时候,重复特征会有更大的机率被抽到有关。
      关于这一点发现是否具有通用性,需要其他数据集的实验验证。
      2.在每折交叉验证后进行预测
      单模型的参数调整对于模型的表现有很大的影响,我们使用了网格搜索,交叉验证的方法,获得规定参数范围内最优的参数组合,在确定参数后,对于单模型再次在训练中使用交叉验证,一方面是可以对比不同模型的效果,一方面是我们在4折交叉验证中,每折训练结束后,都对测试集用本折交叉验证得到的模型进行一次预测。具体的说,比如对Xgboost模型,4折交叉验证,得到4个不同的“Xgboost模型”,用这4个模型分别对测试集做一次预测,最后Xgboost的预测结果是4次预测结果的平均值,这个过程可以看作是对于训练集合的一次抽样,Xgboost最终结果实际上是4个子模型结果的融合,抽样和融合可以减少过拟合,我们发现这样的处理对于本题目的预测精度有提高。
      3.每个单模型所使用的特征都不同
      每个单模型(包括LSTM),我们有90%的特征是一致的,还有大约10%特征是每个单模型独有的,通过这种方式增加模型间的差异性,摆脱对于单一特征组合的依赖,增加了模型的泛化能力,可以获得更好的融合效果。
      3.3 基于LSTM的模型构建与调试
      长短期记忆网络(Long Short-Term Memory, LSTM)是一种循环神经网络[6],能够处理一些由长时信息引起的问题。在LSTM中,Cell是基本的单元,图16画出了LSTM中的基本单元以及有这些基本单元连接而成的网络。
      在一个Cell中,包含一个称为“门”的结构,如图17。Sigmoid( )函数输出在0到1之间,如果与上一个Cell的输出相乘,这样就决定了多少信息量可以通过。
      在这里插入图片描述在这里插入图片描述
      图16 LSTM示例                  图17 “门”结构

    在本次比赛中,我们使用了一个包含200个单元的LSTM单层网络,结构如图18。
    在这里插入图片描述
    图18 比赛中使用的LSTM网络结构
    网络的训练和验证集误差曲线如图19。
    在这里插入图片描述
    图19 LSTM训练误差图
    3.4 模型融合与总结
    模型融合是一种非常有效的技术,可以在大部分的机器学习任务中提高回归或者分类的准确性。可以直接使用不同模型的结果文件进行融合,也可以使用一个模型的预测结果作为另一个模型的特征进行训练,然后得到新的预测结果。我们在比赛中,综合使用了这两种融合方法。

    不同类型的模型学习训练的原理不同,所学到的知识也不一样。不同的模型可能在不同的方面学习能力不一样。在本赛题中,通过参赛过程中的提交可以发现,树模型(XGBoost和LightGBM)以及LSTM单模型的学习能力都较强,在对几个模型进行线性融合之后,预测能力进一步增强。融合模型取得了了比赛中最好的成绩。
    4 总结与展望
    非常感谢国家电投和DF平台举办这样一个比赛,在比赛中,我们收获了友谊和知识,锻炼了能力,开拓了视野。
    在比赛中,我们认为以下方面的因素使得我们比赛过程中不断超越自我,获得好成绩。
    从团队方面来看,我们始终彼此相互信任,勤于沟通,分工协作,不轻言放弃。这些团队因素在整个比赛中支撑着我们全程不管是落后多人或者领跑全榜,始终在查找新的文献资料,始终在思考性的突破口。正是一次又一次的尝试,让我们的特征更加强效,模型更加完善,最终产出高分结果。
    从技术层面来看,有以下几个方面:
     合理的数据预处理
    我们观察到了数据中的异常点,并将训练数据和测试数据使用相同的方式进行异常值修复(前值填充)
     高效的特征构造与选择
    我们通过查阅光伏发电领域文献与资料,构造了如二极管节点流,计算转换效率等强有力的特征。此外我们使用了较为科学的特征选择方法——前向特征选择。
     精心设计融合模型
    基于LightGBM、XGBoost和LSTM三种模型而构造的融合模型,可以综合三种模型的互补优势,同时减小过拟合的影响。

    代码地址:
    链接: https://pan.baidu.com/s/1UYMqwARTi6343j5MSDOH4Q 提取码: iusx

    参考文献
    [1] 王坤. 考虑多重不确定性因素的光伏出力预测研究[D]. 华北电力大学, 2013.
    [2] 王玉清. PN结反向饱和电流的实验研究[J]. 延安大学学报(自然科学版), 2010, 29(1):53-55.
    [3] 吕学梅, 孙宗义, 曹张驰. “电池板温度及辐射量对光伏发电量影响的趋势面分析.” 创新驱动发展 提高气象灾害防御能力——S6短期气候预测理论、方法与技术 2013:922-927.
    [4] 窦砚林. 风力发电机风速、功率、功率曲线的分析[J]. 科学导报, 2014(z2)
    [5] Hall M A. Correlation-based feature selection for machine learning[J]. 1999.
    [6] http://colah.github.io/posts/2015-08-Understanding-LSTMs/

    展开全文
  • 机器学习竞赛汇总

    千次阅读 2019-12-05 15:21:53
    一、竞赛|数据竞赛Top解决方案开源整理 ...二、复盘所有NLP比赛的TOP方案 https://github.com/zhpmatrix/nlp-competitions-list-review 三、CDCS 中国数据竞赛优胜解集锦 https://github.com/geek...
  • 机器学习预测NBA比赛杰出球员
  • 1 文本分类 是自然语言处理(NLP)领域里一项基本任务。而文本呢的长度过长对文本智能解析带来了巨大的挑战。 ...特征决定了机器学习的上限,而机器学习算法只是逼近这个上限。 2 常用的机器...
  • 1.关于比赛流程和leaderboard 基本是 数据分析、数据清洗、特征工程、模型训练、验证调参与优化 这样一些基本环节,下面再细说。 特别说明一下Kaggle 在计算得分的时候,有Public Leaderboard (LB)和 Private LB ...
  • 浅谈机器学习中的缺失值及其填充处理
  • 本压缩包包括6个机器学习实战案例及代码,包括kaggle的泰坦尼克号分析,用朴素贝叶斯实现语种检测以及聊天机器人等,有完整代码和案例分析,对于机器学习有兴趣的同学很有帮助
  • Python 机器学习经典实例

    千次阅读 多人点赞 2018-04-12 10:41:40
    本书首先通过实用的案例介绍机器学习的基础知识,然后介绍一些稍微复杂的机器学习算法,例如支持向量机、极端随机森林、隐马尔可夫模型、条件随机场、深度神经网络,等等。 用最火的Python语言、通过各种各样的机器...
  • 数据挖掘、机器学习、大数据比赛罗列

    万次阅读 多人点赞 2016-06-09 14:40:38
    最近自己想参加一些如题类型的比赛,却发现找不到。自己知道的比赛平台要么已经截止报名,要么就是快结束了,内心真是一万匹马在奔腾。好不容易选了个阿里音乐预测的比赛,花了两天时间初步实现了一种方法,提交结果...
  • 堵塞 Block是使用Python进行科学计算的快速直观的软件包。
  • ©首发于机器学习竞赛小喇叭(微信公众号ID:ML_xiaolaba) 知乎:机器学习小喇叭     写在前面: 想从事算法类岗位却又缺少实际项目经验?参与机器学习的竞赛是一个不错的选择。在高质量的比赛中,拿到top...
  • 机器学习评价指标AUC计算公式

    千次阅读 2020-06-29 22:22:14
    1.什么是AUC? AUC(are under curve)是一个模型的评价指标,用于分类任务。 那么这个指标代表什么呢?这个指标想表达的含义,简单来说其实就是随机抽出一对样本(一个正样本,一个负样本),然后用训练得到的分类器...
  • Kaggle 上的竞争非常激烈(有些比赛有数千名参赛者,并提供数百万美元的奖金),而且涵盖了各种类型的机器学习问题,所以它提供了一种现实方法来评判哪种方法有效、哪种方法无效。那么哪种算法能够可靠地赢得竞赛呢...
  • 采用 Python 机器学习预测足球比赛结果 足球是世界上最火爆的运动之一,世界杯期间也往往是球迷们最亢奋的时刻。比赛狂欢季除了炸出了熬夜看球的铁杆粉丝,也让足球竞猜也成了大家茶余饭后最热衷的话题。甚至连原来...
  • 使用机器学习预测足球比赛结果:在Jupyter Notebook中使用机器学习算法进行足球比赛预测
  • 比赛成绩 本次华为赛的机器学习赛道在初赛的时候包含两个题目:ctr预估和搜索相关性预测。我们在两个题目的A/B榜上都保持了长久的第一,其中ctr预估题目的第一名从8月24日持续到9月30日,搜索相关性预测题目的第一名...
  • 使用机器学习方法预测排球比赛。 分类 预测获胜球队。 鉴于国家之间841 场排球比赛的数据集和各种统计数据,我训练了预测比赛获胜者的模型。 我使用了大约 70:30 的训练和测试示例。 训练部分被进一步划分,再次按 ...
  • 一、【干货】Kaggle 数据挖掘比赛经验分享github:https://github.com/ChenglongChen/Kaggle_HomeDepot1、了解数据分布◆ 分析特征变量的分布 ◇ 特征变量为连续值:如果为长尾分布并且考虑使用线性模型,可以对变量...
  • 在今年进行学习的《机器学习》这门课程中我学到最多的并不是与机器学习相关的内容,而是接受了一种全新的自学模式。我想这种学习模式对于我们的求知欲和创造性的激发是正常上课所给与不了的,也和国外的教学模式...
  • 机器学习竞赛(代码)

    千次阅读 2016-10-23 21:33:15
    1. kaggle Kaggle Competition Past Solutions Kaggle 机器学习竞赛冠军及优胜者的源代码汇总
  • 机器学习竞赛技巧

    万次阅读 多人点赞 2016-05-15 20:56:54
    我最近完成了第一次比赛,在 2125 个参赛队伍中排名第 98 位(~ 5%)。因为是第一次参赛,所以对这个成绩我已经很满意了。在 Kaggle 上一次比赛的结果除了排名以外,还会显示的就是 Prize Winner,10% 或是 25% 这三...
  • ,使用统计/机器学习/数据挖掘等知识,建立算法模型,得出结果并提交,排名top的可能会有奖金哦! 那么这里更多就是我们想要的实战了。 这里就拿里面最知名、参与者最多的 泰坦尼克号问题 来做示例。 泰坦尼克号是...
  • 天池金融风控-贷款违约预测赛题分析1. 赛题背景2. 赛题数据3. 评价指标4. 赛题流程5. 代码示例5.1 数据读取pandas5.2 分类指标评价计算示例6. 经验总结7....1. 赛题背景 ...比赛地址:https://tianchi.aliyu
  • 机器学习预测足球联赛获胜队伍

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 37,693
精华内容 15,077
关键字:

机器学习比赛