📜  CNTK-回归模型

📅  最后修改于: 2020-12-10 05:08:23             🧑  作者: Mango


在这里,我们将研究有关衡量回归模型性能的信息。

验证回归模型的基础

我们知道,回归模型与分类模型不同,从某种意义上说,个人样本没有对与错的二进制度量。在回归模型中,我们要测量预测值与实际值的接近程度。预测值越接近预期输出,模型的性能越好。

在这里,我们将使用不同的错误率函数来衡量用于回归的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个神经元的密集层。然后,我们向顺序层集添加一个额外的密集层(将作为输出层),并给出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

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