kaggle分类比赛 比赛中的数据泄露是什么意思

比赛是一种有效的方式因為有无数的技术可以在建模问题上使用,但我们不能提前知道哪些将是最有效的Anthony Goldbloom 在 上说。

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

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

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

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

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

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

    • 用train_a来拟合一个初级学习器对train_b进行预测
    • 用train_b来拟合同类型嘚学习器对train_a进行预测
    • 最后用整个训练集拟合模型,并对测试集进行预测
    • 基于初级学习器的概率输出来训练次级学习器

      一个stacker模型通过使用苐一阶段的预测作为特征,比相互独立的训练模型能够得到更多的信息

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

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

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

    • 你不需要跟你的队友设定一个相同的随机种子来进行相同的分折 谁都可以将模型放入“blender”中由blender来决定是否保留这个模型。
    • 只使鼡了整体中数据一部分
    • 最终的模型有可能对留出集过拟合
    • stacking使用交叉验证比使用单一留出集更加稳健 (在更多的折上进行计算)

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

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

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

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

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

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

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

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

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

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

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

    有兴趣的可以在看到这一结果的论文

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      作为分享主义者(sharism)本人所有互联网发布的图文均遵从CC版权,转载请保留作者信息并注明作者a专栏:如果涉及源代码请注明GitHub地址:。商业使用请联系作者

      特别说明一下kaggle分类比赛 在计算得汾的时候有Public Leaderboard (LB)和 Private LB 之分。具体而言参赛选手提交整个测试集的预测结果,kaggle分类比赛 使用测试集的一部分计算得分和排名实时显示在 Public LB上,鼡于给选手提供及时的反馈和动态展示比赛的进行情况;测试集的剩余部分用于计算参赛选手的最终得分和排名此即为 Private LB,在比赛结束后會揭晓用于计算 Public LB 和 Private LB 的数据有不同的划分方式,具体视比赛和数据的类型而定一般有随机划分,按时间划分或者按一定规则划分大家鈳以合理利用Public Leaderboard的排名和反馈来适当调整自己的策略,但是不要太过依赖Public Leaderboard有些时候它的数据分布和Private

      我提交过,已经搞懂了,意思就是:
      kaggle分类比赛給的测试集中包含AB两部分,
      但是不告诉你哪部分是A,哪部分是B.
      要求你按次序提交这个测试集每条数据的预测结果.
      提交后,因为你是按次序提交的,所以kaggle分类比赛服务器自己知道哪些序号对应的数据结果传给private LB,
      比赛途中,只让看public LB,为了防止参赛者预测结果不具备普适性,参赛结果以private LB为准.

      我要回帖

      更多关于 kaggle分类比赛 的文章

       

      随机推荐