快乐机器学习
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.5 模型选择

在实践中,在选择一个模型时通常需要考虑以下5点[4]

(1)精度(Accuracy)

(2)简单(Simplicity)

(3)可解释(Interpretability)

(4)高效(Efficiency)

(5)可扩展(Scalability)

精度:假设有P个模型h1h2,…,hP,如何选取一个最佳模型(即误差最小的模型)?

快捷方法:将数据集随机按80∶20的比例划分为训练集和测试集,用训练集来训练P个模型,计算每个模型的测试误差,选一个测试误差最小的模型,如下图所示。

用最小测试误差来选择模型

这个方法最大的缺点就是会过拟合测试集,因为测试集会不知不觉地帮助你选择了模型。因此不推荐使用该方法!

正统方法:在训练集之外创建两个数据集:用调解参数来选择模型的数据集被叫作验证集;用来评估最佳模型的实际推广能力的数据集被叫作测试集。再随机按6∶2∶2的比例来划分训练集、验证集和测试集,如下图所示。

用最小验证误差来选择模型

先把20%的测试集划分出来,再在剩下的80%数据中选择75%的数据当训练集,25%的数据当验证集。将random_state设为0是为了能复现结果。之后选择参数λ的步骤与上面的代码一样,只需要注意在计算误差e时用验证集vali,而不是测试集test。

在吴恩达的Machine Learning Yearning一书中介绍过,划分训练集、验证集和测试集的方法可由数据的多少来决定。

● 在大数据时代之前,当样本数量还是上万个时,将训练集、验证集和测试集的比例设为6∶2∶2,例如随机将10000个数据中的6000个数据用来训练,2000个数据用来验证,2000个数据用来测试。

● 在大数据时代来临时,当样本数量达到百万个时,将训练集、验证集和测试集的比例设为98∶1∶1,例如随机将1000000个数据中的980000个数据用来训练,10000个数据用来验证,10000个数据用来测试。

对于验证集大小的设定,应该遵循的准则是该数量能够检测不同算法或模型的区别,以便选出更好的模型。例如模型A和B的精度是90%和90.1%,两者相差0.1%。那么,对于开发集:

● 100个数据不够,因为100×0.1%=0.1个数据,所以也无法分辨模型A和B的差异。

● 1000个数据也不够,因为1000×0.1%=1个数据,所以比较难分辨模型A和B的差异。

● 10000个数据够了,因为10000×0.1%=10个数据,所以容易分辨模型A和B的差异。

对于测试集大小的设定,传统上是设为全部数据的20%~30%。在大数据时代不再按百分比设定,而是设定一个绝对数值,比如1000~10000个。

在传统的机器学习中,如果数据不够多,则可以使用K折交叉验证法,如下图所示。

用最小交叉验证误差来选择模型

上面所示的k_fold_CV函数的输入data上是事先需要被shuffle函数随机打乱的,因此这里写为k_fold_CV(5,0.1,shuffle(data))

简单:永远从简单模型开始,然后根据需求再增加模型的复杂度。通过提高模型的复杂度,可以提高模型的精度,但是提高精度的幅度在递减。鉴于此,在选择模型时不要总要求模型是最精准的,有时还必须考虑其他因素。

可解释:给定一个应用程序,你需要在模型的精度和可解释性之间进行折中。通常人工神经网络(ANN)和SVM的预测精度高,但是它们对非专业人士来说就是一个“黑盒子”。当预测性能是首要目标,并且不需要解释模型是如何工作和预测时,可以优先选择复杂的黑盒算法。然而在某些情况下,模型的可解释性是首要考虑因素,有时甚至是法律强制的。比如金融机构中的信用卡申请应用程序,如果申请人被拒绝申请信用卡并投诉金融机构,则金融机构需要解释他们是如何做出该决定的。如果使用的是ANN或SVM那么这几乎是不可能实现的,但如果使用的是决策树却很容易实现。

高效和可扩展:在一些应用程序中,高效和可扩展是关键因素,特别是在广泛使用、接近实时分析的应用程序(电子商务站点)中,当输入一个新数据时,模型就需要快速更新,并且基于大数据进行预测。

综上所述,应该优选简单的模型(除非提高模型的精度对模型有显著的增益,才会选择复杂的模型)。简单模型通常更高效、更容易扩展,也更容易解释。