如何避免机器学习陷阱:一份给研究员的指南(2) How to avoid machine learning pitfalls: a guide for academic researchers

上文:如何避免机器学习陷阱:一份给研究员的指南(1)


如何避免机器学习陷阱:一份给研究员的指南(2)

How to avoid machine learning pitfalls: a guide for academic researchers

Michael A. Lones*

3. 如何稳定建模

建立模型是机器学习最有趣的部分之一,在现代机器学习框架下,轻而易举的就能遍历一遍所有方法并看看哪个有效。但这样会导致实验一团糟,而且很难进行论证也没法写下什么。因此,以一种有序的方式构建模型,正确的使用数据,并慎重考虑模型的选择很重要。

3.1 别让测试数据泄露到训练过程中

持有可以衡量模型泛化程度的数据是至关重要的。一个常见问题是,这些测试数据泄露到模型的配置、训练或者选择过程中。一旦发生这样的情况,测试数据便无法可靠的衡量模型的泛化性,而且这通常也是模型无法在实践中工作良好的原因。泄露测试数据的原因有很多,其中一些甚至看上去没啥危害。例如,数据准备阶段,使用了整个数据集的均值与范围对数据进行缩放。为了防止数据泄露,这项工作只能基于训练数据进行。其他常见的原因是划分数据集前进行特征选择,以及用同一个测试数据集测试不同的模型。最好是在项目开始前划分一个子集独立出来,项目结束时,用这个子集赖验证模型的泛化性【看这里和这里有相关讨论】。

3.2 尝试不同模型

通常来说,没有最好的机器学习模型。实际上根据没有免费午餐理论,没有某种机器学习方法能在所有问题是都好于其他方法【看这里】。所以你的工作就是找到在你关注的问题上表现好的方法。通常会有许多先验知识,比如相关的高质量研究工作,但大多时候你都是摸黑前进。幸运的是,python的机器学习库能够让你微调你的代码就能尝试不同的模型,理所当然应该尝试不同的模型并找到效果最好的那个。没有免费午餐理论告诉我们,避免‘非原创不使用’综合征。一开始就只想用自己原创的模型结构,可能让你错过能解决问题的最好模型。

3.3 别用不合适的模型

尝试不同模型的门槛降低,也导致容易套用不合适的模型。例如将输入类别的模型使用在连续变量数据集上,或者尝试在没有相关性的数据上建立模型。发表时也需要注意,使用不恰当的模型会给审稿人消极印象。另一个例子是避免使用不必要的复杂模型。例如,你只有少量数据,或者领域已有的知识表明模式很简单,或者模型需要可解释,那深度神经网络就不是个好选择。最后,不要把发表时间作为选择模型的标准,旧的,已发表的模型经常好于新推出的模型。

3.4 优化模型超参

许多模型都有超参,影响模型配置。例如SVM中的核函数,随机森林里的树的数量,神经网络的结构。这些超参会显著影响模型性能,而且没有一刀切的方法。也就是说,为了最大化模型效果,你需要在你的数据集上进行适配。虽然进行超参的调整工作非常诱人,但这可能不是最佳方法。使用某种超参优化策略要好得多,当你写论文时也能更好的进行论证。基础的优化策略是随机搜索和网格搜索,但当超参数量范围很大或训练成本很高时不太适用,因此有必要使用更智能的方法进行超参搜索【看这里】。还可以使用AutoML技术进行模型选择和超参调整【看这里】。

3.5 谨慎选择特征与超参

另一个常见阶段是特征选择【看这里】。重要的是,将特征选择与超参调整视为训练模型的一部分,而不是训练模型前独立的模块。一个常见错误是在训练开始前,就基于整个数据集进行特征选择,这导致测试集信息泄露到训练过程中。所有你优化模型超参和进行特征选择时,应基于你训练模型用的数据集,而非整个数据集。一种常见技术是嵌套交叉验证(双交叉验证),设计到交叉验证主循环外特征选择与超参调整的额外循环。【看这里】

4. 如何稳定评估模型

你需要验证你的结果,并得出可靠结论,你的工作才有贡献。但人们容易对机器学习模型进行不公平的评估,使得一切变得混乱模糊。所以谨慎考虑如何使用数据,如何评估模型真实性能,以及如何意义明确信息充分的报告这些结果。

4.1 使用合适的测试集

首先,用测试集对ML模型的泛化性进行衡量。模型在训练集上效果多好往往是没啥意义的,一个非常复杂的模型能够完全学习训练集,但泛化性很差。同时,测试的数据也应是适当的,不应与训练集重叠,而且代表着更广泛的人群。例如一个照片的数据集,训练集与测试集都是晴天户外拍摄的。相同的天气意味着测试集与训练集并不独立,而且没有覆盖更广泛的天气条件,测试集也没有代表性。类似的情况也会发生在同一设备采集的数据集上,模型过度学习到设备特性,而没法泛化其他设备,不恰当的测试集无法测出这些问题。

4.2 使用验证集

训练多个模型,根据上一个模型表现,指导调整训练下一个模型是常见的做法。当进行模型调整时,避免使用测试集,相应的,需要有个验证集衡量模型效果。验证集的数据并不直接用于训练,但是用于指导训练。如果你使用测试集指导训练,那么测试集就隐式的成为了训练的一部分,测试集不再具备衡量模型泛化性的能力,即你的模型逐渐的在你的数据集上过拟合【看这里】。另一个使用验证集的好处是,你在训练过程中能够‘早停’,当你训练一个模型时,每次迭代训练后,模型都会在验证集上验证效果。当验证效果下降时,模型的训练就应该停下来,不然模型就开始过拟合了。

4.3 多次评估模型

许多机器学习模型是不稳定的。不稳定就是说,你多训练模型几次,或者稍微改变一下训练数据,模型的效果都显著变化。这意味着简单的评估一次模型是不太可靠的,可能会高估或者低估模型的真正潜力。因此,多次评估模型很有必要。有很多方法能做到这一点,其中大多数都是使用训练数据的不同子集对模型进行多次训练。交叉验证是特别常用的方法,也有许多变型【看这里】。标准做法是10折交叉验证,也就是训练进行10次,你也可以每次基于不同的数据划分以获得更严苛的交叉验证结果。如果你的数据中某些类别数据很少,那对数据分层是很重要的(译者:可能就是保证类别均衡存在于训练集、验证集),以确保该类别在每次的交叉验证中充分表达。报告多次评估的平均值和标准差是普遍做法,也建议保留每次的分数记录,以便后期比较模型时的统计验证。

4.4 保留部分数据验证最终模型实例

我们非常宽泛的使用模型这一名词,但有个重要区别需要明确,就是这个模型结构的潜力与这个模型的表现是不同的东西,前者是这个这个神经网络能解决问题到什么程度,后者是你某次训练出来的模型实例的表现。交叉验证能很好的表示前者,但不擅长说明后者。比如说你进行了10折交叉验证,你得到了10个模型,你最终选择了在测试fold上表现最好的那个模型用于实际处理问题。你要如何说明模型的效果呢?也许你认为测试fold上的分数是非常可靠的评估方式,但也许它不是。首先,只进行一个fold的数据量是相对较小的,其次,得分最高的实例可能是恰好测试fold里都是容易处理的例子,因此分数是不可靠的。想要获得模型可靠估计,需要另一个测试集,如果你有足够的数据,最好保留一些,只在最终选择模型时使用一次,进行无偏估计。(译者:和4.1好像有些重复,还是强调要有独立的测试集)


下文:如何避免机器学习陷阱:一份给研究员的指南(3)

你可能感兴趣的:(如何避免机器学习陷阱:一份给研究员的指南(2) How to avoid machine learning pitfalls: a guide for academic researchers)