Как добавить целевой преобразователь sklearn (для выходной переменной) в конвейер нейронной сети keras? - PullRequest
1 голос
/ 28 апреля 2020

Я хочу построить нейронную сеть, используя Keras на преобразованиях моих входных переменных И моих выходных переменных, используя конвейер sklearn (чтобы я мог выполнять CV). Я пытаюсь использовать TransformedTargetRegressor, но мои среднеквадратические ошибки не имеют для меня смысла.

Это мой код, который адаптирован из примера Склеарна для TransformedTargetRegressor с использованием набора данных Boston Housing и добавления простой нейронной сети, которая масштабируется входные переменные (X).

Настройка (этот раздел подходит):

import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasRegressor
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import MinMaxScaler
from sklearn.datasets import load_boston
from sklearn.compose import TransformedTargetRegressor
from sklearn.model_selection import train_test_split

#load data
X, y = load_boston(return_X_y=True)

#define simple neural network
def simple_nn():
    model = Sequential()
    model.add(Dense(13, input_dim=13, activation='relu'))
    model.add(Dense(1))
    model.compile(loss='mean_squared_error', optimizer = 'adam')
    return model

#create pipeline for input variables (X) preprocessing
estimators = []
estimators.append(('standardize', StandardScaler()))
estimators.append(('mlp', KerasRegressor(build_fn=simple_nn, epochs=100, batch_size=5, verbose=True)))
pipeline = Pipeline(estimators)

Я пытаюсь сделать следующее (раздел в вопрос):

#Section in question
transformer = MinMaxScaler()
model = TransformedTargetRegressor(regressor=pipeline,
                                   transformer=transformer)
results = cross_val_score(model, X, y, cv=KFold(n_splits=5))

Полученные результаты перекрестной проверки: array([ 0.61321517, 0.35811762, -2.67674546, -0.30623006, -0.38187424])

Среднее число представляет особый интерес для меня, поскольку предполагается, что цель y масштабирована от 0 до 1, поэтому среднеквадратическая ошибка -2,67 кажется неправильной. Что я здесь не так делаю?

1 Ответ

1 голос
/ 29 апреля 2020

Среднеквадратичная ошибка возводится в квадрат, поэтому не может быть отрицательной. Это означает, что ваша оценка не является среднеквадратичной ошибкой.

Документация cross_val_score говорит нам, что, если она не определена, по умолчанию оценщик использует оценщик оценки:

"Если нет, используется оценщик по умолчанию оценщика (если имеется).

В вашем случае используется регрессор TransformedTargetRegressor. И документация TransformedTargetRegressor сообщает нам что его оценка по умолчанию:

Возвращает коэффициент определения R ^ 2 прогноза.

Таким образом, отображаемые вами значения являются баллами R2. Это может быть отрицательно, если Ваша модель работает плохо. См., например, этот вопрос.

В качестве хорошей практики всегда следует определять счетчик, который вы хотите использовать, чтобы не полагаться на неправильный.

...