CNTK - Модель регрессии
Здесь мы изучим измерение производительности в отношении регрессионной модели.
Основы проверки регрессионной модели
Как мы знаем, регрессионные модели отличаются от классификационных моделей в том смысле, что не существует двоичной меры правильного или неправильного для отдельных выборок. В регрессионных моделях мы хотим измерить, насколько близок прогноз к фактическому значению. Чем ближе значение прогноза к ожидаемому результату, тем лучше работает модель.
Здесь мы собираемся измерить производительность NN, используемой для регрессии, с использованием различных функций частоты ошибок.
Расчет погрешности
Как обсуждалось ранее, при проверке регрессионной модели мы не можем сказать, верен ли прогноз или нет. Мы хотим, чтобы наш прогноз был как можно ближе к реальному значению. Но здесь допустима небольшая погрешность.
Формула для расчета погрешности выглядит следующим образом:
Вот,
Predicted value = указано y шляпой
Real value = предсказано y
Во-первых, нам нужно рассчитать расстояние между прогнозируемым и реальным значением. Затем, чтобы получить общий коэффициент ошибок, нам нужно просуммировать эти квадраты расстояний и вычислить среднее значение. Это называетсяmean squared функция ошибки.
Но если нам нужны показатели производительности, которые выражают предел погрешности, нам нужна формула, выражающая абсолютную погрешность. Формула дляmean absolute функция ошибок выглядит следующим образом -
Приведенная выше формула берет абсолютное расстояние между прогнозируемым и реальным значением.
Использование CNTK для измерения производительности регрессии
Здесь мы рассмотрим, как использовать различные метрики, которые мы обсуждали в сочетании с CNTK. Мы будем использовать регрессионную модель, которая прогнозирует количество миль на галлон для автомобилей, используя шаги, указанные ниже.
Этапы реализации -
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 - Теперь нам нужно создать еще один input_variable с размером 1. Он будет использоваться для хранения ожидаемого значения для NN.
target = input_variable(1)
z = model(features)
Теперь нам нужно обучить модель, и для этого мы собираемся разделить набор данных и выполнить предварительную обработку, используя следующие шаги реализации:
Step 5-Сначала импортируйте StandardScaler из sklearn.preprocessing, чтобы получить значения от -1 до +1. Это поможет нам против растущих проблем градиента в NN.
from sklearn.preprocessing import StandardScalar
Step 6 - Затем импортируйте train_test_split из sklearn.model_selection следующим образом:
from sklearn.model_selection import train_test_split
Step 7 - Отбрось mpg столбец из набора данных с помощью dropметод. Наконец, разделите набор данных на набор для обучения и проверки, используя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)
Step 8 - Теперь нам нужно создать еще одну переменную input_variable с размером 1. Она будет использоваться для хранения ожидаемого значения для 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)
Полный пример реализации
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 и metric комбинация с данными испытаний следующим образом -
loss.test([X_test, y_test])
Выход
{'metric': 1.89679785619, 'samples': 79}