Microsoft-cognitive-toolkit-regression-model

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

CNTK-回帰モデル

ここでは、回帰モデルに関するパフォーマンスの測定について検討します。

回帰モデルの検証の基本

回帰モデルは分類モデルとは異なることがわかっているため、個人のサンプルの正誤の2進測定はありません。 回帰モデルでは、予測が実際の値にどれだけ近いかを測定します。 予測値が期待される出力に近いほど、モデルのパフォーマンスが向上します。

ここでは、さまざまな誤り率関数を使用して、回帰に使用されるNNのパフォーマンスを測定します。

エラーマージンの計算

前に説明したように、回帰モデルを検証している間、予測が正しいか間違っているかはわかりません。 私たちは予測をできるだけ実際の値に近づけたいと思っています。 ただし、ここでは小さなエラーマージンが許容されます。

エラーマージンを計算するための式は次のとおりです-

エラーマージン

ここに、

予測値 =帽子でyを示した

  • 実際の値 *= yで予測

まず、予測値と実際の値の間の距離を計算する必要があります。 次に、全体的なエラー率を取得するには、これらの平方距離を合計して平均を計算する必要があります。 これは「平均二乗」誤差関数と呼ばれます。

ただし、エラーマージンを表すパフォーマンス値が必要な場合は、絶対エラーを表す式が必要です。* 平均絶対*誤差関数の式は次のとおりです-

平均絶対値

上記の式は、予測値と実際の値の間の絶対距離をとります。

CNTKを使用した回帰パフォーマンスの測定

ここでは、CNTKと組み合わせて説明した、さまざまなメトリックの使用方法について説明します。 以下の手順を使用して、自動車のガロンあたりのマイル数を予測する回帰モデルを使用します。

実装手順-

ステップ1 *-最初に、次のように *cntk パッケージから必要なコンポーネントをインポートする必要があります-

from cntk import default_option, input_variable
from cntk.layers import Dense, Sequential
from cntk.ops import relu

ステップ2 *-次に、 *default_options 関数を使用してデフォルトのアクティベーション関数を定義する必要があります。 次に、新しいシーケンシャルレイヤーセットを作成し、それぞれ64個のニューロンを持つ2つの高密度レイヤーを提供します。 次に、追加の高密度レイヤー(出力レイヤーとして機能します)をシーケンシャルレイヤーセットに追加し、次のようにアクティベーションなしで1つのニューロンを与えます-

with default_options(activation=relu):
model = Sequential([Dense(64),Dense(64),Dense(1,activation=None)])
  • ステップ3 *-ネットワークが作成されたら、入力フィーチャを作成する必要があります。 これは、トレーニングに使用する機能と同じ形状であることを確認する必要があります。
features = input_variable(X.shape[1])

ステップ4 *-次に、サイズ1の別の *input_variable を作成する必要があります。 NNの期待値を格納するために使用されます。

target = input_variable(1)
z = model(features)

ここで、モデルをトレーニングする必要があります。そのために、データセットを分割し、次の実装手順を使用して前処理を実行します-

  • ステップ5 *-最初に、sklearn.preprocessingからStandardScalerをインポートして、-1から+1までの値を取得します。 これは、NNで急増する勾配の問題を防ぐのに役立ちます。
from sklearn.preprocessing import StandardScalar
  • 手順6 *-次に、次のようにsklearn.model_selectionからtrain_test_splitをインポートします-
from sklearn.model_selection import train_test_split

ステップ7 *- drop メソッドを使用して、データセットから *mpg 列を削除します。 最後に、次のように train_test_split 関数を使用して、データセットをトレーニングおよび検証セットに分割します-

x = df_cars.drop(columns=[‘mpg’]).values.astype(np.float32)
y=df_cars.iloc[: , 0].values.reshape(-1, 1).astype(np.float32)
scaler = StandardScaler()
X = scaler.fit_transform(x)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
  • ステップ8 *-次に、サイズ1の別のinput_variableを作成する必要があります。 NNの期待値を格納するために使用されます。
target = input_variable(1)
z = model(features)

データを分割および前処理したので、NNをトレーニングする必要があります。 前のセクションで行った回帰モデルの作成と同様に、モデルをトレーニングするには、損失と metric 関数の組み合わせを定義する必要があります。

import cntk
def absolute_error(output, target):
   return cntk.ops.reduce_mean(cntk.ops.abs(output – target))
@ cntk.Function
def criterion_factory(output, target):
   loss = squared_error(output, target)
   metric = absolute_error(output, target)
   return loss, metric

それでは、トレーニング済みモデルの使用方法を見てみましょう。 このモデルでは、損失とメトリックの組み合わせとして、criteria_factoryを使用します。

from cntk.losses import squared_error
from cntk.learners import sgd
from cntk.logging import ProgressPrinter
progress_printer = ProgressPrinter(0)
loss = criterion_factory (z, target)
learner = sgd(z.parameters, 0.001)
training_summary=loss.train((x_train,y_train),parameter_learners=[learner],callbacks=[progress_printer],minibatch_size=16,max_epochs=10)

完全な実装例

from cntk import default_option, input_variable
from cntk.layers import Dense, Sequential
from cntk.ops import relu
with default_options(activation=relu):
model = Sequential([Dense(64),Dense(64),Dense(1,activation=None)])
features = input_variable(X.shape[1])
target = input_variable(1)
z = model(features)
from sklearn.preprocessing import StandardScalar
from sklearn.model_selection import train_test_split
x = df_cars.drop(columns=[‘mpg’]).values.astype(np.float32)
y=df_cars.iloc[: , 0].values.reshape(-1, 1).astype(np.float32)
scaler = StandardScaler()
X = scaler.fit_transform(x)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
target = input_variable(1)
z = model(features)
import cntk
def absolute_error(output, target):
   return cntk.ops.reduce_mean(cntk.ops.abs(output – target))
@ cntk.Function
def criterion_factory(output, target):
loss = squared_error(output, target)
metric = absolute_error(output, target)
return loss, metric
from cntk.losses import squared_error
from cntk.learners import sgd
from cntk.logging import ProgressPrinter
progress_printer = ProgressPrinter(0)
loss = criterion_factory (z, target)
learner = sgd(z.parameters, 0.001)
training_summary=loss.train((x_train,y_train),parameter_learners=[learner],callbacks=[progress_printer],minibatch_size=16,max_epochs=10)

出力

-------------------------------------------------------------------
average  since   average   since  examples
loss     last    metric    last
------------------------------------------------------
Learning rate per minibatch: 0.001
690       690     24.9     24.9       16
654       636     24.1     23.7       48
[………]

回帰モデルを検証するには、モデルがトレーニングデータと同様に新しいデータを処理することを確認する必要があります。 このため、次のように、*損失*と*メトリック*の組み合わせで*テスト*メソッドをテストデータと呼び出す必要があります-

loss.test([X_test, y_test])

出力−

{'metric': 1.89679785619, 'samples': 79}