如果我有嘈杂的数据,(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)
然后我们使用以下简单的神经网络来尝试找出 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')
显然,y_true
与 y_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')
当然,在现实生活中不可能得到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))
考虑到 r2 分数,它很低因为您正在学习嘈杂的数据。 NN 适合 x=y**2
而不是 x=y**2+noise
。特别是 adam
是为嘈杂数据设计的。这就是 r2 这么低的原因,但这并不意味着你的模型是错误的。 r2 分数越来越接近,而模型完美地拟合了数据,这导致了过度拟合。为避免这种情况:检查训练集和测试集之间的指标是否相似。
最后,您不能使用 r2
作为模型性能的指标。请改用交叉验证。
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/