CNTK-パフォーマンスの測定

この章では、CNKTでモデルのパフォーマンスを測定する方法について説明します。

モデルのパフォーマンスを検証するための戦略

MLモデルを構築した後、データサンプルのセットを使用してモデルをトレーニングしていました。このトレーニングにより、MLモデルはいくつかの一般的なルールを学習して導き出します。MLモデルのパフォーマンスは、新しいサンプル、つまりトレーニング時に提供されたものとは異なるサンプルをモデルにフィードするときに重要になります。その場合、モデルの動作は異なります。これらの新しいサンプルを適切に予測することは、より悪い場合があります。

ただし、本番環境ではトレーニング目的でサンプルデータを使用した場合とは異なる入力が得られるため、モデルは新しいサンプルでも適切に機能する必要があります。そのため、トレーニング目的で使用したサンプルとは異なるサンプルのセットを使用して、MLモデルを検証する必要があります。ここでは、NNを検証するためのデータセットを作成するための2つの異なる手法について説明します。

ホールドアウトデータセット

これは、NNを検証するためのデータセットを作成するための最も簡単な方法の1つです。名前が示すように、この方法では、トレーニングからのサンプルの1セット(たとえば20%)を抑制し、それを使用してMLモデルのパフォーマンスをテストします。次の図は、トレーニングサンプルと検証サンプルの比率を示しています-

ホールドアウトデータセットモデルは、MLモデルをトレーニングするのに十分なデータがあることを保証すると同時に、モデルのパフォーマンスを適切に測定するための妥当な数のサンプルを用意します。

トレーニングセットとテストセットに含めるには、メインデータセットからランダムサンプルを選択することをお勧めします。これにより、トレーニングセットとテストセットの間で均等に分散されます。

以下は、以下を使用して独自のホールドアウトデータセットを作成する例です。 train_test_split からの機能 scikit-learn 図書館。

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分割交差検定の動作は、次の手順を使用して理解できます。

Step 1−ハンドアウトデータセット手法と同様に、K分割交差検証手法では、最初にデータセットをトレーニングセットとテストセットに分割する必要があります。理想的には、比率は80〜20、つまりトレーニングセットの80%とテストセットの20%です。

Step 2 −次に、トレーニングセットを使用してモデルをトレーニングする必要があります。

Step 3−最後に、テストセットを使用してモデルのパフォーマンスを測定します。ホールドアウトデータセット手法と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-cross検証をサポートしていないため、独自のスクリプトを作成する必要があります。

過適合と過剰適合の検出

ハンドアウトデータセットを使用するか、k分割交差検定手法を使用するかにかかわらず、トレーニングに使用されるデータセットと検証に使用されるデータセットでは、メトリックの出力が異なることがわかります。

過剰適合の検出

過剰適合と呼ばれる現象は、MLモデルがトレーニングデータを非常にうまくモデル化するが、テストデータではうまく機能しない、つまりテストデータを予測できなかった状況です。

MLモデルがトレーニングデータから特定のパターンとノイズをある程度学習すると、トレーニングデータから新しいデータ(つまり、見えないデータ)に一般化するモデルの能力に悪影響を及ぼします。ここで、ノイズはデータセット内の無関係な情報またはランダム性です。

以下は、モデルが過剰適合しているかどうかを検出するための2つの方法です。

  • 過剰適合モデルは、トレーニングに使用したのと同じサンプルで良好に機能しますが、新しいサンプル、つまりトレーニングとは異なるサンプルでは非常にパフォーマンスが低下します。

  • テストセットのメトリックが同じメトリックよりも低い場合、検証中にモデルが過剰適合します。トレーニングセットで使用します。

アンダーフィッティングの検出

私たちのMLで発生する可能性のある別の状況は、不十分です。これは、MLモデルがトレーニングデータを適切にモデル化せず、有用な出力を予測できない状況です。最初のエポックのトレーニングを開始すると、モデルの適合度は低くなりますが、トレーニングが進むにつれて適合度が低くなります。

モデルが適合していないかどうかを検出する方法の1つは、トレーニングセットとテストセットのメトリックを調べることです。テストセットのメトリックがトレーニングセットのメトリックよりも高い場合、モデルは適合しません。