python - 数据嘈杂时如何有效衡量神经网络的性能

标签 python machine-learning neural-network keras

如果我有嘈杂的数据,(y_true,y_pred) 上的 r2 分数 无法有效衡量我的神经网络的性能。

假设我们有一个非常嘈杂的y=x^2 关系

import numpy as np
X = np.linspace(0,50,5000)
Y = X**2 +np.random.normal(loc=0,scale=1000, size=(5000))
plt.plot(X,Y)

enter image description here

然后我们使用以下简单的神经网络来尝试找出 x 和 y 的关系。

from keras.layers import Dense, Input
from keras.models import Model
from keras.optimizers import Adam
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import r2_score
from sklearn.model_selection import train_test_split

X_train, X_test, Y_train, Y_test = train_test_split(X,Y,test_size=0.2,random_state=101)

X_train = X_train.reshape(-1,1)
X_test = X_test.reshape(-1,1)
Y_train = Y_train.reshape(-1,1)
Y_test = Y_test.reshape(-1,1)

x_scaler = MinMaxScaler()
y_scaler = MinMaxScaler()

x_scaler.fit(X_train)
y_scaler.fit(Y_train)

X_train_norm = x_scaler.transform(X_train)
X_test_norm = x_scaler.transform(X_test)

Y_train_norm = y_scaler.transform(Y_train)
Y_test_norm = y_scaler.transform(Y_test)

input_layer = Input(shape=(1,))
dense1 = Dense(20,activation='relu')(input_layer)
dense2 = Dense(10,activation='relu')(dense1)
output_layer = Dense(1)(dense2)
model = Model(input_layer,output_layer)

model.compile(optimizer='adam',loss='mean_absolute_error')

history = model.fit(X_train_norm,Y_train_norm, validation_data=(X_test_norm,Y_test_norm),epochs=50,batch_size=10)

结果

plt.scatter(Y_test,Y_pred)
plt.title('Practical Y_true vs Y_pred')
plt.xlabel('Practical Y_true')
plt.ylabel('Y_pred')

enter image description here

显然,y_truey_pred 图看起来不太好。而 r2 分数仅为 r2 score = 0.306。然而,我们在现实生活中观察到的y_true是嘈杂的y

尽管看似性能不佳,但如果我们考虑,我们的神经网络能够很好地找到 y=x^2 关系,并且 r2 score = 0.997以下代码。

plt.scatter(X_test**2,Y_pred)
plt.title('Ground Y_true vs Y_pred')
plt.xlabel('Ground Y_true')
plt.ylabel('Y_pred')

enter image description here

当然,在现实生活中不可能得到ground y_true value,我们只能观察到嘈杂的practical y_true。但我的观点是:

Did we miss out a lot of good models due to noisy y_true from noisy data, and due to the fact that we are unable to measure our model performance correctly?

最佳答案

首先不要忘记在预测后考虑 y_scaler.inverse_transform
如果你不应用它,你将比较网络的输出,它是“缩放”的,而真实的输入不是。
这是您使用的内容:

Y_pred=model.predict(X_test_norm)
plt.scatter(X_test,y_scaler.inverse_transform(Y_pred))

y_true,y_pred with inverse_transform

考虑到 r2 分数,它很低因为您正在学习嘈杂的数据。 NN 适合 x=y**2 而不是 x=y**2+noise。特别是 adam 是为嘈杂数据设计的。这就是 r2 这么低的原因,但这并不意味着你的模型是错误的。 r2 分数越来越接近,而模型完美地拟合了数据,这导致了过度拟合。为避免这种情况:检查训练集和测试集之间的指标是否相似。

最后,您不能使用 r2 作为模型性能的指标。请改用交叉验证。

fitting

ps:你应该考虑 mean_squared_error 而不是 mean_absolute_error

from keras.layers import Dense, Input
from keras.models import Model
from keras.optimizers import Adam

from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import r2_score
from sklearn.model_selection import train_test_split

import numpy as np
import matplotlib.pyplot as plt


X = np.linspace(0,50,5000)
Y = X**2 +np.random.normal(loc=0,scale=1000, size=(5000))

X_train, X_test, Y_train, Y_test = train_test_split(X,Y,test_size=0.2,random_state=101)

X_train = X_train.reshape(-1,1)
X_test = X_test.reshape(-1,1)
Y_train = Y_train.reshape(-1,1)
Y_test = Y_test.reshape(-1,1)

x_scaler = MinMaxScaler()
y_scaler = MinMaxScaler()

X_train_norm = x_scaler.fit_transform(X_train)
Y_train_norm = y_scaler.fit_transform(Y_train)

X_test_norm = x_scaler.transform(X_test)
Y_test_norm = y_scaler.transform(Y_test)

input_layer = Input(shape=(1,))
dense1 = Dense(20,activation='relu')(input_layer)
dense2 = Dense(10,activation='relu')(dense1)
output_layer = Dense(1)(dense2)
model = Model(input_layer,output_layer)

model.compile(optimizer='adam',loss='mean_squared_error')

history = model.fit(X_train_norm,Y_train_norm, validation_data=(X_test_norm,Y_test_norm),epochs=5,batch_size=32)


Y_pred=model.predict(X_test_norm)
plt.scatter(X,Y)
plt.scatter(X_test,y_scaler.inverse_transform(Y_pred))
#plt.scatter(Y_test,y_scaler.inverse_transform(Y_pred))
plt.show()

关于python - 数据嘈杂时如何有效衡量神经网络的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51401416/

相关文章:

Python 正则表达式 : tokenizing English contractions

c++ - SWIG, boost 共享指针和继承

tensorflow - sklearn.preprocessing 中的 LabelEncoder 是否有类似的方法?

python - 值错误: X has 231 features per sample; expecting 1228

python - pandas 根据上一列获取计数

python - Python 中哪些函数释放了 GIL?

docker - TensorFlow 2 Mask-RCNN?

python - 简单的递归神经网络输入形状

tensorflow - 如何在 tensorflow 中制作棋盘矩阵?

neural-network - 如何将数据输入到 Keras 中?如果我有超过 2 列,具体来说 x_train 和 y_train 是什么?