Microsoft Cognitive Toolkit 简明教程

CNTK - Regression Model

在此处,我们将学习关于衡量回归模型的性能。

Basics of validating a regression model

众所周知,回归模型不同于分类模型,因为对于个体样本,没有正确或错误的二进制度量。在回归模型中,我们希望衡量预测值与实际值之间的接近程度。预测值与预期输出越接近,模型的性能就越好。

在此处,我们将使用不同的误差率函数来衡量用于回归的神经网络的性能。

Calculating error margin

如前所述,在验证回归模型时,我们无法确定预测是正确还是错误。我们希望预测尽可能接近实际值。但是,在此处可以接受较小的误差范围。

计算误差范围的公式如下 −

error margin

在此,

Predicted value = 由帽指示的 y

Real value = 由 y 预测

首先,我们需要计算预测值与实际值之间的距离。然后,为了获得总体误差率,我们需要对这些平方距离求和并计算平均值。这被称为 mean squared 误差函数。

但是,如果我们想要表示误差范围的性能数据,我们需要一个表示绝对误差的公式。 mean absolute 误差函数的公式如下 −

mean absolute

以上公式获取预测值与实际值之间的绝对距离。

Using CNTK to measure regression performance

在此处,我们将了解如何与 CNTK 结合使用我们在讨论中提到的不同指标。我们将使用回归模型,根据以下步骤预测汽车每加仑英里的行程。

Implementation steps−

Step 1 − 首先,我们需要从 cntk 包导入所需组件,如下所示 −

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

Step 2 − 接下来,我们需要使用 default_options 函数定义一个默认激活函数。然后,创建一个新的顺序层集并提供两个各具有 64 个神经元的稠密层。然后,我们将一个额外的稠密层(将充当输出层)添加到顺序层集并提供 1 个没有激活的神经元,如下所示 −

with default_options(activation=relu):
model = Sequential([Dense(64),Dense(64),Dense(1,activation=None)])

Step 3 − 创建网络后,我们需要创建一个输入特征。我们需要确保该特征与我们即将用于训练的特征具有相同的形状。

features = input_variable(X.shape[1])

Step 4 − 现在,我们需要创建一个大小为 1 的另一个 input_variable 。它将用于存储神经网络的预期值。

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

现在,我们需要训练模型,为此,我们将拆分数据集并使用以下实现步骤执行预处理 −

Step 5 − 首先,从 sklearn.preprocessing 导入 StandardScaler 以获取 -1 到 +1 之间的值。这将有助于防止神经网络中梯度爆炸问题。

from sklearn.preprocessing import StandardScalar

Step 6 − 接下来,从 sklearn.model_selection 中导入 train_test_split,如下所示 −

from sklearn.model_selection import train_test_split

Step 7 − 使用 drop*method. At last split the dataset into a training and validation set using the *train_test_split 函数按照如下方法在数据集中删除 mpg 列 −

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)

Step 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

现在,我们来看一下如何使用训练的模型。对于我们的模型,我们将 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)

Complete implementation example

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)

Output

-------------------------------------------------------------------
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
[………]

为了验证我们的回归模型,我们需要确保模型处理新数据的效果与处理训练数据一样好。为此,我们需要使用测试数据在 lossmetric 组合上调用 test 方法,如下所示 −

loss.test([X_test, y_test])

Output−

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