如果我有嘈杂的数据,则r2 score
上的(y_true,y_pred)
无法有效地衡量我的神经网络的性能。
假设我们有一个非常吵杂的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
。但我的意思是:
由于噪声数据中的y_true噪声大,以及由于我们无法正确衡量模型性能的事实,我们错过了很多好的模型吗?
答案 0 :(得分:2)
首先,不要忘了考虑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()