【问题标题】:Denormalization of output from neural network神经网络输出的非规范化
【发布时间】:2020-05-01 10:30:24
【问题描述】:

早上好,我使用了 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)

【问题讨论】:

  • 标准化标签很奇怪(除非这些是连续的目标)。这样做有什么特别的原因吗?

标签: python machine-learning neural-network anaconda spyder


【解决方案1】:

你应该去规范化,这样你就可以获得对你的神经网络的真实世界预测,而不是 0-1 之间的数字

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

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

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

x = z(max - min) + 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 以获得相应的值。

You can use this link here to better visualize this.

【讨论】:

  • 我明白你的意思,但是我的输出(y_predict)的最大值和最小值不等于标签的最大值和最小值。因此,在我看来,我不能使用您的代码行,因为您评估的最大值和最小值是指标签,而不是来自神经网络的“非规范化”预测值。你怎么看?
  • 当您将 min max 应用于您的标签时,您将根据您的标签值而不是您的特征值来应用。因此,您的标签值与您的特征值无关,您可以使用原始标签的最小最大值(在您的代码标签 = dataset.iloc[:,-1] 中)来确定要使用的最小值和最大值。这就是 MinMaxScaler() 首先对其进行规范化的方式,所以我不明白为什么您不能再次使用它。
  • 在 label 函数中执行 MinMaxScaler() 之前,您需要获取最小最大值。然后将 y_test/y_pred 中的输出视为上述函数中的 z 值。我们没有使用 y_predict 的最小最大值,而是标签的最小值最大值,即原始自变量。 y_pred 中的值是您的 z 值
猜你喜欢
  • 2017-02-24
  • 2019-08-19
  • 2013-03-02
  • 2015-12-29
  • 2012-02-21
  • 2017-12-31
  • 2015-11-26
  • 1970-01-01
  • 2015-02-23
相关资源
最近更新 更多