5.6模型的评估

构建模型很重要,模型的评估同样非常重要,模型的评估就是判断拟合出来的模型是否优秀。

在很多情况下,比如多维度的时候,我们是很难直观的判别模型的好坏(正确性或者是精度),那我们应该怎样来判别呢?

在低维度的时候最简单的方法就是观察函数图形,观察函数图形是否很好的拟合了训练数据,如图5-6-1所示:

模型评估方法有机器学习 如何进行模型评估_人工智能

图5-6-1

但在高维度的问题中不能直观的在图上画出来,所以这个方法也就不可行了。既然不能用图形来表示高维度的问题,那我们需要定量的表示模型的精度,这就是我们通常意义下的模型的评估。

5.6.1回归问题的处理

通常情况下我们对回归模型的训练会把获取的全部训练数据分成两份,一份用于训练,一份用于测试。然后用后者来评估模型。一般情况下我们要让用于训练的数据多于用于测试的数据。如图5-6-2所示,我们随意将训练数据分为两份:

模型评估方法有机器学习 如何进行模型评估_算法_02

 

图5-6-2

我们先用一次函数f(x)=θ0+θ1*x1来拟合试一试,如图5-6-3所示:

模型评估方法有机器学习 如何进行模型评估_算法_03

 

图5-6-3

用一次函数来拟合只用了划分出来的训练数据,再观察测试数据与拟合出来的模型的位置,似乎效果还不错。那如果我们考虑用二次函数f(x)=θ0+θ1*x^2来进行拟合呢?如图5-6-4所示:

模型评估方法有机器学习 如何进行模型评估_人工智能_04

 

图5-6-4

效果似乎不是那么理想,如果只看训练数据,那么二次函数比一次函数拟合的更好,但是如果将测试数据考虑进去,那么二次函数的展现出的效果就完全不尽人意了,这就我们常说的过拟合了,即过度优化训练数据的模型却忽略了测试数据,导致拟合出来的效果与我们的意向背道而驰了。变相的说明模型评估的重要性。目前所讲的还是低维度能用图形表示的情况,但如果我们来拟合高维度的模型就必须要定量的来评估了。对于回归的情况,我们一般是用均方误差(MSE)来衡量模型的好坏,即在训练好的模型上计算测试数据的误差的平方,可理解为预测值与实际值之间差值的平方,再取其平均值即可。假设数据有n个,那么就可以这样计算:

模型评估方法有机器学习 如何进行模型评估_人工智能_05

 

这样以来均方误差的值越小,说明精度就越高,模型就越好。实际上这就是在求回归函数时的误差函数,不过误差函数是用于拟合模型,而这里的均方误差是用于定量的评估模型的优劣的。

5.6.2分类问题的处理

与回归的时候一样,我们先考虑数据集的分配,一些数据集用于当作训练模型,剩下的数据集用于作为模型的测试,姑且如图5-6-5这样分配吧:

模型评估方法有机器学习 如何进行模型评估_python_06

 

图5-6-5

假设我们在训练逻辑回归的分类模型的时候,θTx是简单的一次函数,那么只根据训练数据进行训练后,决策边界应该是如图5-6-6所示的这样:

模型评估方法有机器学习 如何进行模型评估_算法_07

 

图5-6-6

 我们可以直观的看到,分类效果很好,但是如果θTx更加复杂,可能就会如图5-6-7一样紧贴着训练数据进行分类:

模型评估方法有机器学习 如何进行模型评估_人工智能_08

 

图5-6-7

这也是一种过拟合的状态了,过度的对训练数据的模型进行优化了,虽然可以对训练数据完美地进行分类,却完全忽视了测试数据,导致了模型的过拟合。

那么如何来判别分类模型的优劣呢?回归是连续值,所以可以从误差入手分析,但是在分类中我们只需要考虑数据分类是否正确即可,那么我们可以从很多方面入手,比如分类正确的数据占所有数据的比例,或者是测试数据中某一类数据被正确分类占该类数据的比例等。

首先就拿刚才提到的,分类正确的数据占所有数据的比例,这被称为叫做分类的精度(Accuracy),假如总共有100个数据,其中80个被正确分类了,那么精度表达为:

模型评估方法有机器学习 如何进行模型评估_python_09

 

用计算数据来计算这个值,乍一看值越高精度越高,就意味着模型越好,但实际上是有条件的,试想一下,测试数据有100个,只有5个是一类,其余95个是另一类,那么模型将100个测试数据全部分为95个所在的那一类,那么精度也是达到了95%,虽然精度很高,但是将5个测试数据全部分类成了另一类数据,这精度值似乎并不能说服我们。所以说,我们在用精度来衡量模型的优劣的时候,测试的两类数据的数量要尽量相近,这样才能更好的评估模型的优劣。

 

那么除了精度我们还有哪些指标来定量的衡量模型的优劣呢?除了精度我们还有精确率和召回率来衡量模型的优劣。精确率(Precision)即被模型分为某一类的数据中,被正确分类的比例,如图5-6-8所示的阴影部分:

模型评估方法有机器学习 如何进行模型评估_模型评估方法有机器学习_10

 

图5-6-8

精确率的计算如下:

模型评估方法有机器学习 如何进行模型评估_模型评估方法有机器学习_11

 

这个值越高,说明分类的错误越少。如图5-6-8的阴影部分所示,3个数据中,只有一个被正确分类了,所以计算出来的精确率较低。

还有一个指标叫召回率(Recall)即测试数据中的一类数据被模型分类后,分类正确比例,如图5-6-9所示:

模型评估方法有机器学习 如何进行模型评估_模型评估方法有机器学习_12

 

图5-6-9

召回率的计算如下:

模型评估方法有机器学习 如何进行模型评估_python_13

 

这个值越高,说明被正确分类的数据越多。拿这个例子来说,阴影部分的5个同一类数据,只有1个被正确分类了,所以召回率也比较低。

同时基于这两个指标来考虑模型的优劣是比较好的选择,不过一般来说,精确率和召回率会一个高一个低,需要取舍,有些麻烦。那么两个指标都考虑会如何呢?

5.6.3 F值

如果按照正常思维的话,取精确率和召回率的平均值效果怎么样呢?假设有两个模型,如表5-6-10所示:

模型评估方法有机器学习 如何进行模型评估_模型评估方法有机器学习_14

 

表5-6-10

模型B非常极端,召回率虽然是达到100%,但是精确率只有2%,也就是说所有数据(圆和叉)都被分类为圆,对圆求召回率就很高,但精确度就很低了。虽然平均值模型B更优,但是实际上模型B并不是个好模型,所有只看平均值确实无法知道模型的好坏。那该如何通过这两个指标来进行模型优劣的判断呢?我们当然是希望精确率和召回率两个都高,如果两个都高,那模型一定是优秀的,那么我们这里引入一个评定综合性能的指标F值,Fmeasure就是F值,Precision就是前面说的精确率,Recall就是召回率,表达式如下:

模型评估方法有机器学习 如何进行模型评估_模型评估方法有机器学习_15

 

这样精确率和召回率只要有一个低,就会拉低F值。现在按照这个公式计算前两个模型的F值如下表5-6-11所示:

 

模型评估方法有机器学习 如何进行模型评估_python_16

表5-6-11

和简单的取平均值得到的结果不同,模型A的F值更高,事实上确实是模型A更优一点。说明这个F值考虑到了精确率和召回率的平衡。

5.6.4 交叉验证

把全部训练数据分为测试数据和训练数据的做法称为交叉验证,之前我们使用到的将一些数据集用于当作训练模型,剩下的数据集用于作为模型的测试的做法就是交叉验证。在交叉验证中需要重点介绍的就是K折交叉验证。假设我们要进行4折交叉验证,那么就会这样测量精度,如图5-6-12所示:

模型评估方法有机器学习 如何进行模型评估_机器学习_17

 

图5-6-12

这种方法得到的模型精度会比较准确,但是坏处是如果全部训练数据的量较大,不切实际地增加K值会非常耗费时间,所以我们要确定好一个合理的K值。