这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战
当一个机器学习/深度学习模型训练完成后,我们需要使用特定的模型评估方法来对得到的模型进行验证。
本系列文章旨在为刚接触机器学习的读者提供一个入门教程,使读者能对机器学习模型的评估方法有一个初步的认识,并最终学会实战方法。
三类模型评估方法概述
因为真实的数据是没有label的,所以我们要评估得到的模型的精确度就需要通过现有的已标记数据来进行。基本思路是将现有数据分割成几部份,其中一部分或几部份拿来训练,剩下一部分或几部份拿来评估模型。
有三种方法可以进行上述的划分操作: 留出法、交叉验证法、自助法。
sklearn框架的model_selection库为我们封装好了上述方法,本文将使用该库进行实战讲解。
from sklearn import model_selection
1 留出法
留出法的想法很简单,将原始数据直接划分为互斥的两类,其中一部分用来训练模型,另外一部分用来测试。前者就是训练集,后者就是测试集。
在sklearn中,使用train_test_split可以实现留出法,将数据分为训练集和测试集,代码如下:
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB #算法用朴素贝叶斯
clf = GaussianNB()
X_train, X_test, y_train, y_test = train_test_split('数据', '标签', test_size='0-1的小数', random_state=0)
clf.fit(X_train,y_train)
print(clf.score(X_test, y_test))
留出法存在的问题:
如有些模型还需要进行超参数评估,这个时候还需要划分一类数据集,叫做验证集。最后数据集的划分划分变成了这样:训练集,验证集还有测试集。 训练集是为了进行模型的训练,验证集是为了进行参数的调整,测试集是为了看这个模型的好坏。
但是,上面的划分依然有问题,划分出来验证集还有测试集,那么我们的训练集会变小。并且还有一个问题,那就是我们的模型会随着我们选择的训练集和验证集不同而不同。所以这个时候,我们引入了交叉验证(cross-validation 简称cv)
2 交叉验证
交叉验证的基本思想是这样的:将数据集分为k等份,对于每一份数据集,其中k-1份用作训练集,单独的那一份用作测试集。
本篇笔记主要介绍该种方法,这也是最为主流的一种验证方法。
3 自助法
基本思想: 对于含有m个样本的数据集D,我们对它进行有放回的采样m次,最终得到一个含有m个样本的数据集D',这个数据集D'会有重复的数据,我们把它用作训练数据。按照概率论的思想,在m个样本中,有1/e的样本从来没有采到,将这些样本即D\D'当做测试集。具体的推导可见周志华的机器学习2.2.3。 自助法在数据集很小的时候可以使用,在集成学习中也有所应用。