Microsoft-cognitive-toolkit-measuring-performance

提供:Dev Guides
移動先:案内検索

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

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

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

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

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

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

これは、NNを検証するためのデータセットを作成する最も簡単な方法の1つです。 名前が示すように、この方法では、トレーニングからの1セットのサンプル(たとえば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 = [[preds = classifier_knn.predict(sample)
pred_species = [iris.target_names[p] for p in preds] print("Predictions:", pred_species)

出力

Predictions: ['versicolor', 'virginica']

CNTKを使用している間、モデルをトレーニングするたびにデータセットの順序をランダム化する必要があります。

  • 深層学習アルゴリズムは、乱数ジェネレーターの影響を強く受けます。
  • トレーニング中にNNにサンプルを提供する順序は、NNのパフォーマンスに大きく影響します。

ホールドアウトデータセットテクニックを使用する主な欠点は、非常に良い結果が得られることもあれば、悪い結果が得られることもあるため、信頼性が低いことです。

K分割交差検証

MLモデルの信頼性を高めるために、K分割交差検証と呼ばれる手法があります。 性質上、K分割交差検証手法は前の手法と同じですが、通常は5〜10回程度、数回繰り返されます。 次の図はその概念を表しています-

K-fold cross validation

K分割交差検証の機能

K分割交差検証の動作は、次の手順の助けを借りて理解できます-

  • ステップ1 *-配布資料データセット手法と同様に、K分割交差検証手法では、最初にデータセットをトレーニングとテストセットに分割する必要があります。 理想的には、比率は80〜20です。 トレーニングセットの80%、テストセットの20%。
  • ステップ2 *-次に、トレーニングセットを使用してモデルをトレーニングする必要があります。
  • ステップ3 *-最後に、テストセットを使用してモデルのパフォーマンスを測定します。 ホールドアウトデータセット手法とkクロス検証手法の唯一の違いは、上記のプロセスが通常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モデルがトレーニングデータから特定のパターンとノイズをある程度学習すると、トレーニングデータから新しいモデルに一般化するモデルの能力に悪影響を及ぼします。 目に見えないデータ。 ここで、ノイズはデータセット内の無関係な情報またはランダム性です。

以下は、モデルがオーバーフィットであるかどうかの天気を検出できる2つの方法です-

  • オーバーフィットモデルは、トレーニングに使用したのと同じサンプルで良好に機能しますが、新しいサンプルでは非常に良く機能しません。 トレーニングとは異なるサンプル。
  • テストセットのメトリックが同じメトリックよりも低い場合、モデルは検証中にオーバーフィットします。トレーニングセットで使用します。

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

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

モデルが不足しているかどうかを検出する方法の1つは、トレーニングセットとテストセットのメトリックを確認することです。 テストセットのメトリックがトレーニングセットのメトリックよりも高い場合、モデルは不十分になります。