1.6.2 模型评估

要评估算法,必须在未用于训练模型的数据上来判断算法的性能。因此,通常将数据拆分为训练集和测试集。训练集用于训练模型,即用于查找算法的参数。例如,训练决策树将决定创建树的分支拆分的值和变量。测试集在训练期间是完全保密的。这意味着所有操作(例如特征工程或特征缩放)必须仅在训练集中进行,然后应用于测试集,如以下示例所示。

通常,数据集的70%~80%会是训练集,而其余的是测试集:

交叉验证是离线评估有监督学习算法最常见的方法。这种技术将数据集多次拆分为测试集和训练集,并使用一部分进行训练,另一部分进行测试。这样不仅可以检测是否过拟合,还可以评估损失的方差。

对于无法随机划分数据的问题(例如时间序列),scikit-learn还有其他拆分方法,例如TimeSeriesSplit类。

在Keras中,可以指定一种简单的方法来在拟合过程中直接进行训练集/测试集拆分:

如果数据不能在内存中运行,也可以使用train_on_batch和test_on_batch。

在Keras中,对于图像数据,还可以使用文件夹结构来创建训练集和测试集并指定标签。要做到这一点,重要的是要使用flow_from_directory函数,该函数将按照指定的标签和训练集/测试集拆分来加载数据。我们需要以下目录结构:

使用以下函数:

TensorBoard

TensorFlow提供了一种方便的方式来对网络的各个重要方面做可视化处理。要使用这个有效的工具,Keras需要创建一些TensorBoard可读取的日志文件。

一种方法是使用回调(callback)。回调是模型训练期间在指定阶段应用的一组函数。我们可以在训练过程中使用回调函数来查看模型的内部状态和统计信息,也可以将回调函数列表传递给Keras模型的.fit()方法。然后,每个训练阶段都会调用回调的相关方法。

回调示例如下:

然后,我们就可以启动TensorBoard界面将图形可视化,也可以用可视化方式显示指标、损失,甚至词嵌入。

如果要从终端窗口启动TensorBoard,只需输入以下内容:

上述命令将启动一个服务器,并且从http://localhost:6006进行访问。通过TensorBoard,我们可以轻松比较不同网络架构或参数的性能(如图1-7所示)。

图1-7 运行中的TensorBoard截图