这是本系列的第二篇,也是机器学习概览的下半部分。
1. 机器学习的主要挑战
在介绍基于模型学习算法的流程的时候,对于预测结果不好的问题分析,主要说了是数据问题还是模型问题,这同时也就是机器学习的效果不好的两个主要原因,即错误的数据和错误的算法。
1.1 训练数据量不足
第一个问题就是训练数据的数量问题,这是非常重要的问题。
因为即使是简单的问题,一般也需要数千的样本,这还是因为简单的问题一般采用简单的算法就可以解决,对于复杂的图像或语音问题,通常需要数百万的样本,特别是如果采用现在非常热门的深度学习算法,比如卷积神经网络模型,这些复杂的模型如果没有足够的数据量支持,非常容易陷入过拟合的情况。
实际上更多数量的训练集也是为了获得更有代表性的数据,能够学习到这类数据的所有特征。
但是,应该注意到,小型和中型的数据集仍然是非常常见的,获得额外的训练数据并不总是轻易和廉价的,所以不要抛弃算法。
1.2 没有代表性的训练数据
无论采用基于实例还是基于模型的学习,让训练数据对新数据具有代表性是非常重要的。如果训练集没有代表性,那么训练得到的模型就是不可能得到准确性的模型,比如人脸识别中,模型没有学习到某个人最明显的代表性的特征,比如高鼻梁或者没有眉毛等突出特征,那么模型对这个人的识别率就不会很高。
使用具有代表性的训练集对于推广到新案例是非常重要的。但是做起来比说起来要难:如果样本太小,就会有样本噪声(即会有一定概率包含没有代表性的数据),但是即使是非常大的样本也可能没有代表性,如果取样方法错误的话。这叫做样本偏差。
1.3 低质量的数据
低质量的数据指的是数据有错误、带有过多噪声或者是出现异常值等的数据,这种数据会影响系统整体的性能,因此,数据清洗对于构建一个机器学习系统或者一个机器学习项目来说都是必不可少的步骤。
对于这些低质量的数据,通常可以按照如下做法处理:
- 如果一些实例是明显的异常值,最好删掉它们或尝试手工修改错误;
- 如果一些实例缺少特征(比如,你的 5% 的顾客没有说明年龄),你必须决定是否忽略这个属性、忽略这些实例、填入缺失值(比如,年龄中位数),或者训练一个含有这个特征的模型和一个不含有这个特征的模型,等等。
1.4 不相关的特征
不相关的特征对于整个机器学习系统是有着反作用的效果,训练数据必须包含足够多的相关特征、非相关特征不多的情况下,才能训练出一个性能不错的模型。机器学习项目成功的关键之一是用好的特征进行训练。这个过程称作特征工程,包括:
- 特征选择:在所有存在的特征中选取最有用的特征进行训练。
- 特征提取:组合存在的特征,生成一个更有用的特征(如前面看到的,可以使用降维算法)。
- 收集新数据创建新特征。
1.5 过拟合
上述四种情况都是坏数据的情况,接下来是两种算法问题,也是机器学习最常见的两种算法方面的问题,过拟合和欠拟合。
过拟合就是指算法模型在训练集上的性能非常好,但是泛化能力很差,即在测试集上的效果却很糟糕的情况。比如下图,采用一个高阶多项式回归模型来预测生活满意度和人均 GDP 的关系,很明显看出来,这个模型过拟合了训练数据,其预测效果并不会达到在训练数据上这么好的效果。
通常对于比较复杂的模型,比如深度神经网络,它能够检测和识别到数据中比较细微的规律和特征,但是如果训练集包含噪声,或者训练集数量太少(数量太少会引入样本噪声),这种情况下,模型同样会学习这种噪声,从而导致模型的泛化能力的下降。
一般解决过拟合的方法有:
- 简化模型,这包括了采用简单点的模型、减少特征数量以及限制模型,即采用正则化;
- 增加训练数据
- 减小训练数据的噪声,即数据清洗,比如修正数据错误和去除异常值等
其中正则化方法是比较常用的方法,它的作用就是限制模型,不让模型过于复杂,从而降低过拟合的风险或者是缓和过拟合的程度。常用的正则化方法是 L2 和 L1 正则化。正则化方法通常会采用一个超参数来控制其限制模型的强度。超参数是一个学习算法的参数(而不是模型的)。这样,它是不会被学习算法本身影响的,它优于训练,在训练中是保持不变的。如何调节超参数也是构建一个机器学习算法模型非常重要的一个步骤,也是让性能能够进一步提升的做法。
1.6 欠拟合
欠拟合和过拟合刚好相反,它就是模型的性能非常差,在训练数据和测试数据上的性能都不好。
通常也是因为模型过于简单,没有能够很好学习到数据的有效的相关的特征,解决方法有:
- 选择一个更强大的模型,带有更多参数
- 用更好的特征训练学习算法(特征工程)
- 减小对模型的限制(比如,减小正则化超参数)
2. 测试和评估
当训练好一个机器学习模型后,接下来就需要对模型进行预测和评估,判断得到的模型是否可用,是否还能进行提升,并进行错误分析等操作。
一般在训练模型前,我们会将数据集分成两个集合,分别是训练集和测试集,通常 8:2 的比例,也就是 80% 的数据作为训练集,剩余是测试集。然后采用训练集训练模型,在测试集上用按照学习的问题采用对应评估指标评估模型的性能,比如分类问题,一般就是采用分类的准确率或者错误率作为评估的标准。
但这种划分数据集的方法,存在一个问题,就是如果需要调节超参数,比如对于正则化的超参数、学习率等,继续采用测试集来进行评估不同超参数对模型性能的影响,这会导致最后在测试集上测试得到性能最好的模型,实际上是过拟合了测试集,那么模型的泛化能力也不会太好。
所以,为了解决这个问题,我们还需要为调节超参数划分一个专门的数据集,测试集应该是用于测试最终得到的模型的性能。因此,我们再划分一个叫做验证集的数据集。
一种做法是可以将所有数据按照一定比例划分为训练集、验证集和测试集,比如按照 6:2:2 的比例划分;当然更通常的做法是采用交叉验证:训练集分成互补的子集,每个模型用不同的子集训练,再用剩下的子集验证。一旦确定模型类型和超参数,最终的模型使用这些超参数和全部的训练集进行训练,用测试集得到推广误差率。
3. 小结
最后我们总结下:
机器学习的四个主要挑战是
- 数据量太少
- 数据问题,包括没有代表性数据和质量差
- 不相关特征
- 模型过拟合或者欠拟合
- 过拟合的解法方法有:
- 简化模型,包括采用更简单的模型和更少的参数
- 正则化方法降低模型的复杂度
- 收集或者采用更大的数据集
- 数据清洗,去除噪声和异常值等
- 欠拟合的解决方法:
- 采用更强大的模型,包含更多的参数和学习能力
- 降低正则化的强度
- 使用更好的特征提取方法,即使用或者改善特征工程的工作
- 采用交叉验证方法进行超参数条件和模型的选择
以上就是本文的主要内容和总结,欢迎关注我的微信公众号—一个算法汪的技术成长之路或者扫描下方的二维码,和我分享你的建议和看法,指正文章中可能存在的错误,大家一起交流,学习和进步!