CNTK - 迴歸模型



在這裡,我們將學習如何評估迴歸模型的效能。

迴歸模型驗證的基礎

眾所周知,迴歸模型與分類模型不同,因為對於單個樣本,沒有對錯的二元衡量標準。在迴歸模型中,我們希望衡量預測值與實際值的接近程度。預測值越接近預期輸出,模型的效能就越好。

在這裡,我們將使用不同的誤差率函式來衡量用於迴歸的 NN 的效能。

計算誤差範圍

如前所述,在驗證迴歸模型時,我們無法判斷預測是正確還是錯誤。我們希望我們的預測儘可能接近真實值。但是,這裡可以接受較小的誤差範圍。

計算誤差範圍的公式如下:

Error Margin

這裡,

預測值 = 用帽子表示的 y

真實值 = 用 y 表示的預測值

首先,我們需要計算預測值和真實值之間的距離。然後,為了獲得整體誤差率,我們需要將這些平方距離相加並計算平均值。這稱為均方誤差函式。

但是,如果我們想要表示誤差範圍的效能指標,我們需要一個表示絕對誤差的公式。平均絕對誤差函式的公式如下:

Mean absolute

上述公式取預測值和真實值之間的絕對距離。

使用 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函式定義一個預設啟用函式。然後,建立一個新的 Sequential 層集並提供兩個具有 64 個神經元的 Dense 層。然後,我們將一個額外的 Dense 層(充當輸出層)新增到 Sequential 層集中,並提供 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。就像在前面的部分建立迴歸模型時一樣,我們需要定義損失和指標函式的組合來訓練模型。

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

現在,讓我們看看如何使用訓練好的模型。對於我們的模型,我們將使用 criterion_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
[………]

為了驗證我們的迴歸模型,我們需要確保模型處理新資料的方式與處理訓練資料的方式一樣好。為此,我們需要在損失指標組合上呼叫test方法,並使用測試資料,如下所示:

loss.test([X_test, y_test])

輸出:

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

© . All rights reserved.