【486】机器学习的通用工作流程
参考:Python深度学习 P89
目录
- 定义问题,收集数据集
- 选择衡量成功的指标
- 确定评估方法
- 准备数据
- 开发比基准更好的模型
- 扩大模型规模:开发过拟合的模型
- 模型正则化与调节超参数
一、定义问题,收集数据集
首先,你必须定义所面对的问题。
- 你的输入数据是什么?你要预测什么?
- 你面对的是什么类型的问题?是二分类问题、多分类问题、标量回归问题、向量回归问题,还是多分类、多标签问题?
只有明确了输入、输出以及所使用的数据,你才能进入下一阶段。注意这一阶段所做的假设。
- 假设输出是可以根据输入进行预测的。
- 假设可用数据包含足够多的信息,足以学习输入和输出之间的关系。
并不是所有的问题都可以解决,例如股票价格走势预测。非平稳问题(nonstationary problem)是无法解决的问题。
请记住,机器学习只能用来记忆训练数据中存在的模式。你只能识别出曾经见过的东西。在过去的数据上训练机器学习来预测未来,这里存在一个假设,就是未来的规律与过去相同。但事实往往并非如此。
二、选择衡量成功的指标
要控制一件事物,就需要能够观察它。要取得成功,就必须给出成功的定义:精度?准确率(precision)和召回率(recall)?衡量成功的指标将指引你选择损失函数,即模型要优化什么。ROC、AUC
三、确定评估方法
- 留出验证集。数据量很大时可以采用这种方法
- K折交叉验证。如果留出验证的样本量太少,无法保证可靠性,那么应该选择这种方法
- 重复的K折验证。如果可用数据很少,同时模型评估有需要非常准确,那么应该使用这种方法
四、准备数据
- 应该将数据格式化为张量
- 这些张量的取值通常应该缩放为较小的值,比如在 [-1, 1] 区间或 [0, 1] 区间
- 如果不同的特征具有不同的取值范围(异质数据),那么应该做数据标准化
- 可能需要做特征工程,尤其是对于小数据问题
准备好输入数据和目标数据的张量后,就可以开始训练模型了
五、开发比基准更好的模型
开发一个小型模型,它能够打败纯随机的基准(dumb baseline)。在 MNIST 数字分类的例子中,任何精度大约 0.1 的模型都可以说具有统计功效。之后需要选择三个关键参数来构建第一个工作模型。
- 最后一层的激活(sigmoid,softmax)
- 损失函数(binary_crossentropy,mse)
- 优化配置(优化器、学习率,rmsprop 及其默认的学习率就是稳妥的)
问题类型 | 最后一层激活函数 | 损失函数 |
二分类问题 | sigmoid | binary_crossentropy |
多分类、单标签问题 | softmax | categorical_crossentropy |
多分类、多标签问题 | sigmoid | binary_crossentropy |
回归到任意值 | 无 | mse |
回归到0~1范围内的值 | sigmoid | mse 或 binary_crossentropy |
六、扩大模型规模:开发过拟合的模型
首先搞清楚你需要多大的模型,就必须开发一个过拟合的模型,这很简单。
- 添加更多的层
- 让每一层变得更大
- 训练更多的轮次
要始终监控训练损失和验证损失,以及你所关心的指标的训练值和验证值。如果你发现模型在验证数据上的性能开始下降,那么就出现了过拟合。
下一阶段将开始正则化和调节模型,以便尽可能地接近理想模型,既不过拟合也不欠拟合。
七、规则正则化与调节超参数
这一步是最费时间的:你将不断地调节模型、训练、在验证数据上评估(这里不是测试数据)、再次调节模型,然后重复这一过程,直到模型达到最佳性能。你应该尝试一下几项。
- 添加 dropout
- 尝试不同的架构:增加或者减少层数
- 添加 L1 和/或 L2 正则化
- 尝试不同的超参数(比如每层的单元数或优化器的学习率),以找到最佳配置。
- (可选)反复做特征工程:添加新特征或删除没有信息量的特征。
如果系统性地迭代多次,最终会导致模型对验证过程过拟合(即使模型并没有直接在验证数据上训练)。这会降低验证过程的可靠性。如果测试集上的性能比验证集上差很多,那么这可能意味着你的验证流程不可靠,或者你在调节模型参数时在验证数据上出现了过拟合。在这种情况下,你可能需要换用更可靠的评估方法,比如重复的 K 折验证。