机器学习中一些建议,希望以后的自己可以参照模仿,(自己很懒,/doge)
1 在构建模型之前
?或许遇到数据你熊周周气昂昂的就要训练和评估模型。但是花时间思考一下自己要解决的问题,看看已经有的数据是能保证之后的工作顺利进行并满足预期的重要决定。
1.1 花时间理解你的数据
垃圾数据生产垃圾模型,数据是否可靠,质量如何,如果被很多论文使用也说明数据的信誉很好。 针对特定的目标进行特定的分析,比方说图像分类中的类别不平衡问题,目标检测中的框和物体的大小的问题。
1.2 别看所有的数据
小心不可测试陷阱,如果一开始你就使用了测试集合中的知识,这会导致整个的模型针对测试集进行拟合,当然竞赛除外。
1.3 确定你有足够的数据
一般的如果数据量比价小的情况下不容易训练泛化能力好的模型。 需要考虑数据中的信噪比的概念,太干净的数据总是没那多。 没有太多数据其实也有利于进行交叉验证分析,但是也限制了模型的泛化能力以及最好不要使用太多参数的模型。
1.4 查阅文献
你很大可能不是将ML引入这个你想要做的特定领域的人,学术的进步通常是一种迭代的过程。 不是第一个吃螃蟹的人同时也不容易中毒。或许有人已经帮你探好了前路已经给了指引性的建议。并在帮你试错。
如何可靠的建立模型
?建模是ML中最有魅力的部分。当时盲目的建模和实验是一个费时费力并且不容易整理和评价有效性的方式,因此有组织有计划的构建模型非常重要。
2.1 尝试使用不同的模型
我相信没有免费的午餐定理,你完全可以尝试各种不同的模型(现在的开源库非常丰富)。 稳定的旧算法或许只是刷榜没优势,在新数据集中的表现或许不差。
2.2 最优化你的超参
很多模型都带有超参数,随机搜寻和网格搜寻都可以对很好的进行搜索。
2.3 在优化超惨和选择特征需要注意的
超参是训练的一部分而不是数据的一部分,不同的模型和训练策略往往有不同的最优超参。 在模型训练的之前或许会进行特征筛选,如果在测试集中做特征筛选也是另一种形式的信息泄露。特征选择也应该是跟着模型走的。 嵌套交叉验证,在循环中使用k折进行进行参数优化,内循环使用交叉验证,这种方式得到的误差更加准确。评估的方式更加科学。
3 如何鲁邦的评价模型
有效的评价可以减少学术注水。
3.1 划分适当的test set
模型在训练集中的表现很多时候只能判断模型是否在拟合数据,测试集才是反应模型实际性能的表现。 测试集不应该和训练集重叠。同时测试集也应分布规律。
3.2 使用验证集
验证集的作用是用来指导训练,如果单纯的使用测试集来指导训练,那么超参和训练过程其实也相当于对测试集的过拟合,在实际使用中往往并不能保证泛化性能。 验证集应该和训练集分布一致,使用验证集可以很好的判断是否模型正在过拟合,从而可以提早结束。
3.3 评估与一个模型多次
评估一个模型多次可以更好的反应模型的性能,建议把模型的每次表现进行记录,然后最终模型的效果记录可以进行统计学的分析例如均值和方差,这些分析也是判断一个模型稳定性的很好指标。
如何公正的比较模型
比较模型时使用统计检验
别总相信社区标准
大家一般都是用imagenet等数据库来判断模型的好坏,但是不保证有些人对测试集进行了拟合。
使用模型融合方式
不同的模型探索不同的权衡,通过梳理他们可以使用一个模型的优势来弥补另一个模型的缺点,反之亦然这称之为集成学习。 一般有两种不同的融合方式
- 第一种采用相同的基本模型,例如很多决策树,通过简单的投票,或者复杂的采样,或者使用另外第一个机器学习模型来使用集合的结果。
- 第二种方式使用堆叠或者堆叠泛化的方式。
如何报告结果
透明
使用更多种方式报告
使用多个数据集和其他模型进行评估和比较可以全面的展示你的模型的效果和性能,让模型更加有说服力。这有助于客服与个人数据相关的任何缺陷。 为每个数据集报告多个指标,不同的指标可以呈现不同的对结果的看法,并提高工作的透明度。
别随便超出数据进行泛化总结
你的错误的推导可能会误导别人,因此可以说推导但是需要严谨的说而不是简单的就直接确定。 数据不足不足以代表真实世界,多个数据集也不是完全独立的。并且可能有类似的偏差。
相对于使用阈值,更好实用
|