Microsoft Cognitive Toolkit 简明教程
CNTK - Measuring Performance
本章将解释如何在 CNKT 中度量模型性能。
Strategy to validate model performance
在构建 ML 模型后,我们通常使用一组数据样本对它进行训练。由于这种训练,我们的 ML 模型得以学习并推导出一些一般规则。当我们向模型输入新的样本(即与训练时提供的样本不同的样本)时,ML 模型的性能至关重要。在这种情况下,该模型的行为不同。对于这些新样本,它在做出良好的预测方面可能表现不佳。
但是,该模型也必须对新样本表现良好,因为在生产环境中,我们将获得与用于训练目的的样本数据不同的输入。这就是我们应该使用与用于训练目的的样本不同的样本集来验证 ML 模型的原因。在这里,我们将讨论用于为神经网络创建数据集的两种不同的技术。
Hold-out dataset
这是用于创建数据集以验证神经网络的最简单的方法之一。顾名思义,在此方法中,我们将保留一组用于训练的样本(例如 20%),并使用它来测试 ML 模型的性能。下图显示了训练样本和验证样本之间的比率 −
保留数据集模型确保我们拥有足够的数据来训练我们的 ML 模型,同时我们将有合理数量的样本来获得模型性能的良好度量。
为了包含在训练集中和测试集中,从主数据集中选择随机样本是一种良好的做法。它确保了训练集和测试集之间的平均分布。
下面是一个示例,我们在其中使用 train_test_split 函数从 scikit-learn 库中生成自己的保留数据集。
Example
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)
# Here above test_size = 0.2 represents that we provided 20% of the data as test data.
from sklearn.neighbors import KNeighborsClassifier
from sklearn import metrics
classifier_knn = KNeighborsClassifier(n_neighbors=3)
classifier_knn.fit(X_train, y_train)
y_pred = classifier_knn.predict(X_test)
# Providing sample data and the model will make prediction out of that data
sample = [[5, 5, 3, 2], [2, 4, 3, 5]]
preds = classifier_knn.predict(sample)
pred_species = [iris.target_names[p] for p in preds] print("Predictions:", pred_species)
K-fold cross validation
为了使我们的 ML 模型更可靠,有一种称为 K 折叠交叉验证的技术。在本质上,K 折叠交叉验证技术与前一种技术相同,但它会重复多次 —— 通常是 5 到 10 次。下图表示其概念 −
Working of K-fold cross validation
K 折叠交叉验证的工作原理可以通过以下步骤理解 −
Step 1 —— 与保留数据集技术类似,在 K 折叠交叉验证技术中,我们首先需要将数据集拆分为训练集和测试集。理想情况下,比率为 80-20,即 80% 的训练集和 20% 的测试集。
Step 2 —— 接下来,我们需要使用训练集来训练我们的模型。
Step 3 —— 最后,我们将使用测试集来衡量我们模型的性能。保留数据集技术和 K 交叉验证技术之间的唯一区别在于,上述过程通常会重复 5 到 10 次,最后计算所有性能指标的平均值。该平均值将是最终的性能指标。
让我们看一个小数据,集的示例 −
Example
from numpy import array
from sklearn.model_selection import KFold
data = array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0])
kfold = KFold(5, True, 1)
for train, test in kfold.split(data):
print('train: %s, test: %s' % (data[train],(data[test]))
Output
train: [0.1 0.2 0.4 0.5 0.6 0.7 0.8 0.9], test: [0.3 1. ]
train: [0.1 0.2 0.3 0.4 0.6 0.8 0.9 1. ], test: [0.5 0.7]
train: [0.2 0.3 0.5 0.6 0.7 0.8 0.9 1. ], test: [0.1 0.4]
train: [0.1 0.3 0.4 0.5 0.6 0.7 0.9 1. ], test: [0.2 0.8]
train: [0.1 0.2 0.3 0.4 0.5 0.7 0.8 1. ], test: [0.6 0.9]
如我们所见,由于使用了更贴近现实的训练和测试方案,K 折叠交叉验证技术为我们提供了更稳定的性能度量,但在缺点方面,在验证深度学习模型时需要花费大量时间。
CNTK 不支持 K 交叉验证,因此我们需要编写自己的脚本来完成此操作。
Detecting underfitting and overfitting
无论我们使用保留数据集还是 K 折叠交叉验证技术,我们都会发现指标的输出对于用于训练的数据集和用于验证的数据集将不同。