PDF 物理页索引 250
文件中的第 251 页 · 印刷页码:234
8.2.7 离群值处理
正如4.3.2节中所阐述的,数据集总会有一些离群值(outlier)。执行下面的代码来查看一下这些离群值。下面的代码是用直方图画出roomsperperson特征值(如图8-27所示)。
人工智能与大数据技术导论
plt.subplot(1, 2, 2)
= california housing dataframe["rooms per person"].hist()
234
PDF 物理页索引 251
文件中的第 252 页 · 印刷页码:235
从上图看出,大多数rooms per person是小于5的。对于超过5的数据,修剪(clip)为5,代码如下:
结果如图8-28所示。
下面我们再次训练数据:
第8章 TensorFlow
235
PDF 物理页索引 252
文件中的第 253 页 · 印刷页码:236
相关数据如图8-29、图8-30所示。
人工智能与大数据技术导论
236
PDF 物理页索引 253
文件中的第 254 页 · 印刷页码:237
8.3 过拟合处理
我们在第5章中讲到了一个过拟合的例子。在如图8-31所示的分类问题中,我们的目标是找到一个分类器,分割两种标签的数据。用肉眼不难看出,蓝色标签的点(圆圈)集中在图的右上区域,中间的图是最为合适的分类器。左图用一条直线分割平面,模型过于简单,对直线右侧的红色标签数据(叉叉)刻画较差,属于欠拟合;而右图则用了比较复杂的模型,把样本集的数据全部照顾到,属于过拟合。
虽然所有训练样本在图8-31右图上都已完全正确分类,但是这时候会有过拟合的问题。问题就是,如果加入新的样本,会怎么样?最终可能会遇到一些新样本,对于这些样本,模型无法很好地进行预测。从某种意义上讲,这个模型最初可能过拟合了训练数据,而无法很好地对之前未出现的新数据进行分类。所以,如果模型过于复杂,那么过拟合真的会成为问题。我们再来看一个例子,如图8-32所示。
左图上有蓝色(集中在右上)和黄色(集中在左下)两种点。这可能代表两个类别,比如健康和不健康。中图是某一种模型,看上去误差很小,虽然这个模型有点复杂,但是在中图上有效地区分了这两类点。右图上加入了更多的测试数据,我们发现,这个模型对不少新数据的分类是错误的。对于这个模型,我们认为它过拟合了。这个过拟合模型在训练时的误差小,但是在预测新数据时误差大。
第8章 TensorFlow
237
PDF 物理页索引 254
文件中的第 255 页 · 印刷页码:238
8.3.1训练集和测试集
如何才能确保在实践中模型不会过拟合呢?在理想情况下,我们希望能够对数据样本进行训练,然后知道这个模型会很好地预测新样本。简单来说,一个好的模型应尽可能简单。这个称为“泛化(generalization)理论”。过拟合往往是模型太复杂造成的。一个基本原则是拟合数据刚刚好,而且尽量简单。在机器学习中,我们利用的是经验。我们的策略是,使用测试集。我们从整个数据集中抽取一批数据,对这些数据进行训练,这就是训练集(trainingset)。我们再从同一个数据集中另外抽取一批数据,称为测试集(test set),如果测试集的预测效果好,即预测测试集和预测训练集的效果一样好,我们就可以满意地确定,模型可以很好地泛化到未来的新数据。在这里,要注意以下事项(这也是机器学习的一些细则):
我们要以独立且一致(independently and identically)的方式从整个数据集抽取样本,不以任何方式主动产生偏差。训练集和测试集应该是随机抽取的,而不是相同的数据子集。同时测试集要足够大。
●整个数据集是平稳的(stationary),不会随时间发生变化。
●训练集和测试集始终从同一个数据集中提取样本,在当中不会从其他数据集中提取样本。
以上是一些非常关键的假设,我们在监督式机器学习中,所做的许多工作都是以这些假设为基础的。但是在实践中,有时会违反这些假设。比如,我们有时可能会违反平稳性假设,例如用户的购物行为在节假日或夏季是不同的。如果我们只是用节假日数据建立了模型,那么该模型可能对夏季数据是不准的。因此,我们必须密切关注各项指标,在违反上述假设时,就能立即知晓。
如果只有一个数据集,该怎么办?我们可以将这个大型数据集分成两个小数据集:一个用于训练;另一个用于测试。测试集数据要能够代表整个数据集,训练集和测试集具有相同的特性,如图8-33所示。
这两个数据集需要相互独立。我们可能需要先进行随机化,再拆分数据。这样才能避免发生诸如意外将全部节假日数据归入训练数据集,而将全部夏季数据归入测试数据集之类的糟糕情况。那么我们该怎么拆分一个数据集呢?有两点需要注意:
●训练集规模越大,模型的学习效果就越好。
●测试集规模越大,我们对于评估指标的信心越充足,置信区间就越窄。
人工智能与大数据技术导论
238
PDF 物理页索引 255
文件中的第 256 页 · 印刷页码:239
如果数据集规模非常大,这是好事。如果我们有十亿样本,可以使用其中的10%\~15%进行测试,置信区间(confidenceintervals)依然会很窄。如果数据集规模很小,我们可能需要执行诸如交叉验证之类较为复杂的操作。一个典型的错误是,测试集中的数据也在训练集中,即对测试数据进行训练。这会让你发现测试数据的准确率达到100%。这时,请反复检查自己有没有意外地对测试数据进行了训练。一个原因可能是整个数据集中有重复的数据,这些重复的数据分别分到了测试集和训练集。这样就是在一些测试数据上训练,当使用测试集测试模型时,就无法正确评估模型了。
8.3.2 验证集
8.3.1节阐述了测试集和训练集的用法。我们用训练数据训练一种模型,然后使用测试数据对模型进行测试并观察其指标。如图8-34所示,如果把训练和测试做成迭代,每次迭代调整一些设置,比如步长(或学习速率),然后重新尝试前面的操作(训练和测试),看看能否提高测试集的准确率。我们可能会添加一些特征,也可能会去除一些特征,并继续迭代,直到根据测试集指标找出最佳模型为止。这样有问题吗?有的,那就是针对测试数据的特性进行了过拟合。
如图8-35所示,我们可以使用另一种方法来解决这个问题:除了训练集和测试集外,分出一些数据来创建第三个数据集,即验证集。
如图8-36所示,我们使用一种增幅小的新迭代方法对训练数据进行迭代训练,然后仅基于验证数据进行评估。始终将测试数据搁置一旁,完全不使用测试数据。我们将不断迭代、调整各种参数或对模型进行任何更改,直到根据验证数据得出比较理想的结果。只有这时,我们才会拿测试数据测试模型。我们要确保测试数据集得出的结果符合验证数据集得出的结果。如果不符合,那么我们可能对验证集进行了过拟合。
第8章 TensorFlow
239
PDF 物理页索引 256
文件中的第 257 页 · 印刷页码:240
8.3.3 过拟合实例
在这个例子中,我们使用多个特征变量来提升模型的效率,并使用测试集来检查模型是否过拟合验证数据。
人工智能与大数据技术导论
240
PDF 物理页索引 257
文件中的第 258 页 · 印刷页码:241
下面创建训练集和验证集。整个数据集为17000个样本。训练集来自数据集的前面12000个样本,而验证集来自数据集的后面5000个样本。
训练集如图8-37所示。
第8章 TensorFlow
241
PDF 物理页索引 258
文件中的第 259 页 · 印刷页码:242
训练集样本数据如图8-38所示。
验证集如图8-39所示。
从上面的结果看出,我们有9个可用的输入特征变量。
人工智能与大数据技术导论
242
PDF 物理页索引 259
文件中的第 260 页 · 印刷页码:243
在上面9个输入特征变量中,有两个关于房屋街区的地理坐标:Latitude和Longitude。如果按照经纬度来画点,那么应该组合成一个加州地图。然后使用不同颜色标示房屋中位价(红色为高价区)。其代码如下:
结果如图8-41所示。我们发现,训练数据的图形看上去像个加州地图(这是1990年的房屋销售价格数据,当年洛杉矶附近和旧金山比较高,硅谷还没起来),但是验证数据的图形不太像。所以,验证数据有一些问题。也就是说,在把整个数据集分割为训练数据子集和验证数据子集时出现了一些问题,数据分布得不均匀。一般而言,机器学习中的调试主要是数据的调试,而不是代码的调试。如果数据有问题,那么,再先进的机器学习也没用。
第8章 TensorFlow
243