神经网络输出的非规范化

Gab*_*lvo 5 python machine-learning normalization neural-network

我使用了 MinMax 标准化来标准化我的数据集,包括特征和标签。我的问题是,标准化标签是否正确?如果是,如何对神经网络的输出进行反规范化(我用规范化的测试集预测的输出)?

我无法上传数据集,但它由 18 个特征和 1 个标签组成。这是一个回归任务,特征和标签都是物理量。

所以问题是y_train_predy_test_pred0 和 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)
Run Code Online (Sandbox Code Playgroud)

Ede*_*koh 4

您应该进行非规范化,以便您的神经网络可以获得真实世界的预测,而不是 0-1 之间的数字

最小-最大归一化定义为:

z = (x - min)/(max - min)
Run Code Online (Sandbox Code Playgroud)

z 是标准化值,x 是标签值,max 是最大 x 值,min 是最小 x 值。因此,如果我们有 z、min 和 max,我们可以按如下方式解析 x:

x = z(max - min) + min
Run Code Online (Sandbox Code Playgroud)

因此,在标准化数据之前,如果标签是连续的,请定义标签的最大值和最小值的变量。然后,在获得预测值后,您可以使用以下函数:

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
Run Code Online (Sandbox Code Playgroud)

并将此函数应用于您的 y_test/y_pred 以获得相应的值。

您可以在此处使用此链接来更好地形象化这一点。