📜  CNTK-评估效果

📅  最后修改于: 2020-12-10 05:04:46             🧑  作者: Mango


本章将说明如何在CNKT中测量模型性能。

验证模型性能的策略

建立ML模型后,我们通常使用一组数据样本对其进行训练。由于进行了这种培训,我们的机器学习模型学习并得出了一些通用规则。当我们向模型提供新样本(即与训练时提供的样本不同)时,ML模型的性能至关重要。在这种情况下,模型的行为会有所不同。对这些新样本做出好的预测可能会更糟。

但是该模型也必须适用于新样本,因为在生产环境中,我们将获得与用于训练目的的样本数据不同的输入。因此,我们应该使用一组不同于训练目的的样本来验证ML模型。在这里,我们将讨论用于创建用于验证NN的数据集的两种不同技术。

保持数据集

它是创建数据集以验证NN的最简单方法之一。顾名思义,在这种方法中,我们将从训练中保留一组样本(例如20%),并将其用于测试ML模型的性能。下图显示了训练样本和验证样本之间的比率-

保持数据集

保持数据集模型可确保我们有足够的数据来训练我们的ML模型,同时我们将有合理数量的样本来获得对模型性能的良好衡量。

为了将其包含在训练集和测试集中,从主数据集中选择随机样本是一个好习惯。它确保训练和测试集之间的均匀分配。

以下是一个示例,其中我们使用scikit-learn库中的train_test_split函数来生成自己的保留数据集。

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)

输出

Predictions: ['versicolor', 'virginica']

使用CNTK时,我们每次训练模型时都需要对数据集的顺序进行随机化处理,因为-

  • 深度学习算法受随机数生成器的影响很大。

  • 我们在训练期间将样本提供给NN的顺序极大地影响了其性能。

使用保留数据集技术的主要缺点是,它不可靠,因为有时我们会得到很好的结果,但是有时我们会得到不好的结果。

K折交叉验证

为了使我们的ML模型更可靠,有一种称为K折交叉验证的技术。本质上,K折交叉验证技术与以前的技术相同,但是会重复几次,通常约为5到10次。下图表示其概念-

K折交叉验证

K折交叉验证的工作

可以通过以下步骤了解K折交叉验证的工作方式-

步骤1-像分发数据集技术一样,在K折交叉验证技术中,首先我们需要将数据集分为训练和测试集。理想情况下,该比率为80-20,即训练集的80%和测试集的20%。

步骤2-接下来,我们需要使用训练集来训练我们的模型。

步骤3-最后,我们将使用测试集来衡量模型的性能。 Hold-out数据集技术和k-cross验证技术之间的唯一区别是,上述过程通常重复5到10次,最后在所有性能指标上计算平均值。该平均值将是最终的性能指标。

让我们看一个带有小数据集的示例-

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]))

输出

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交叉验证,因此我们需要编写自己的脚本来这样做。

检测不足和过度拟合

无论是使用分发数据集还是k倍交叉验证技术,我们都会发现,用于训练的数据集和用于验证的数据集的指标输出会有所不同。

检测过度拟合

这种称为过拟合的现象是我们的机器学习模型对训练数据建模得异常出色的情况,但是对测试数据的表现不佳,即无法预测测试数据。

当ML模型从训练数据中学习到特定的模式和噪声达到一定程度时,就会发生这种情况,从而会对模型从训练数据推广到新的即看不见的数据的能力产生负面影响。在这里,噪声是数据集中的无关信息或随机性。

以下是两种方法可以帮助我们检测模型是否过拟合的天气-

  • 过拟合模型在我们用于训练的相同样本上将表现良好,但在新样本(即不同于训练的样本)上将表现非常差。

  • 如果测试集上的指标低于相同指标(我们在训练集中使用),则该模型在验证期间过拟合。

检测欠拟合

我们的机器学习中可能出现的另一种情况是拟合不足。在这种情况下,我们的ML模型无法很好地对训练数据进行建模,并且无法预测有用的输出。当我们开始训练第一个纪元时,我们的模型将变得不合适,但是随着训练的进行,模型将变得更少。

检测我们的模型是否欠拟合的一种方法是查看训练集和测试集的指标。如果测试集上的指标高于训练集上的指标,我们的模型将不适合。