Денормализация выхода из нейронной сети - PullRequest
3 голосов
/ 14 января 2020

Доброе утро, я использовал нормализацию MinMax для нормализации своего набора данных, как функций, так и метки. У меня вопрос, правильно ли нормализовать и этикетку? Если да, как я могу денормализовать выходные данные нейронной сети (ту, которую я прогнозирую с помощью нормализованного набора тестов)?

К сожалению, я не могу загрузить набор данных, но он состоит из 18 функций и 1 ярлык. Это регрессионная задача, элементы и метка являются физическими величинами.

Итак, проблема в том, что y_train_pred e y_test_pred находятся в диапазоне от 0 до 1. Как я могу предопределить «реальное значение»? Если вы нашли другую ошибку, пожалуйста, сообщите мне.

Спасибо.

Код, который я использую, напишите ниже

    dataset = pd.read_csv('DataSet.csv', decimal=',', delimiter = ";")

label = dataset.iloc[:,-1]
features = dataset.drop(columns = ['Label'])

features = features[best_features]

X_train1, X_test1, y_train1, y_test1 = train_test_split(features, label, test_size = 0.25, random_state = 1, shuffle = True)

y_test2 = y_test1.to_frame()
y_train2 = y_train1.to_frame()

scaler1 = preprocessing.MinMaxScaler()
scaler2 = preprocessing.MinMaxScaler()
X_train = scaler1.fit_transform(X_train1)
X_test = scaler2.fit_transform(X_test1)

scaler3 = preprocessing.MinMaxScaler()
scaler4 = preprocessing.MinMaxScaler()
y_train = scaler3.fit_transform(y_train2)
y_test = scaler4.fit_transform(y_test2)

optimizer = tf.keras.optimizers.Adamax(lr=0.001)
model = Sequential()

model.add(Dense(80, input_shape = (X_train.shape[1],), activation = 'relu',kernel_initializer='random_normal'))
model.add(Dropout(0.15))
model.add(Dense(120, activation = 'relu',kernel_initializer='random_normal'))
model.add(Dropout(0.15))
model.add(Dense(80, activation = 'relu',kernel_initializer='random_normal'))

model.add(Dense(1,activation = 'linear'))
model.compile(loss = 'mse', optimizer = optimizer, metrics = ['mse'])

history = model.fit(X_train, y_train, epochs = 300,
                    validation_split = 0.1, shuffle=False,   batch_size=120
                    )
history_dict = history.history

loss_values = history_dict['loss']
val_loss_values = history_dict['val_loss']

y_train_pred = model.predict(X_train)
y_test_pred = model.predict(X_test)

1 Ответ

0 голосов
/ 14 января 2020

Вы должны денормализовать, чтобы вы могли получать прогнозы реального мира для своей нейронной сети, а не число в диапазоне 0-1

Минор - максимальная нормализация определяется как:

z = (x - min)/(max - min)

Если z - нормализованное значение, x - значение метки, max - значение max x, а min - значение min x. Поэтому, если у нас есть z, min и max, мы можем определить для x следующее:

x = z(max - min) + min

Таким образом, перед тем, как нормализовать ваши данные, определите переменные для значения max и min для метки, если она непрерывна. Затем, после получения значений pred, вы можете использовать следующую функцию:

y_max_pre_normalize = max(label)
y_min_pre_normalize = min(label) 

def denormalize(y):
    final_value = y(y_max_pre_normalize - y_min_pre_normalize) + y_min_pre_normalize 
    return final_value

и применить эту функцию к вашему y_test / y_pred, чтобы получить соответствующее значение.

Вы можете использовать эту ссылку здесь, чтобы лучше визуализировать это.

...