如何在 Keras Regressor 中解释 MSE
How to interpret MSE in Keras Regressor
我正在尝试建立一个模型来预测房价。
我有一些功能 X(浴室数量等)和目标 Y(大约 300,000 美元到 800,000 美元)
在将 Y 拟合到模型之前,我已经使用 sklearn 的 Standard Scaler 对其进行了标准化。
这是我的 Keras 模型:
def build_model():
model = Sequential()
model.add(Dense(36, input_dim=36, activation='relu'))
model.add(Dense(18, input_dim=36, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='mse', optimizer='sgd', metrics=['mae','mse'])
return model
我在尝试解释结果时遇到问题 -- 0.617454319755 的 MSE 是什么意思?
我是否必须对这个数字进行逆变换并对结果进行平方根,得到 741.55 美元的错误率?
math.sqrt(sc.inverse_transform([mse]))
对于刚开始时听起来很愚蠢,我深表歉意!
MSE是均方误差,这里是公式。
基本上它是预期输出和预测的不同平方的均值。对其求平方根不会给您误差和输出之间的差异。这对训练很有用。
目前您已经建立了一个模型。
如果你想训练模型使用这些函数。
mode.fit(x=input_x_array, y=input_y_array, batch_size=None, epochs=1, verbose=1, callbacks=None, validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, sample_weight=None, initial_epoch=0, steps_per_epoch=None, validation_steps=None)
如果你想对输出进行预测,你应该使用下面的代码。
prediction = model.predict(np.array(input_x_array))
print(prediction)
您可以在此处找到更多详细信息。
I apologise for sounding silly as I am starting out!
不要;这是一个非常重要的微妙问题,在教程和介绍性说明中通常(令人遗憾地)被忽略。
不幸的是,它不像取 inverse-transformed MSE 的平方根那么简单,但也没有那么复杂;基本上你要做的是:
- 将您的预测转换回原始数据的初始规模
- 获取这些 invert-transformed 预测与原始数据之间的均方误差
- 对结果取平方根
为了获得模型的性能指标,该指标在您问题的 业务 上下文中有意义(例如此处为美元)。
让我们看一个玩具数据的简单示例,省略模型本身(这里不相关,实际上可以是任何回归模型——不仅是 Keras 模型):
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
import numpy as np
# toy data
X = np.array([[1,2], [3,4], [5,6], [7,8], [9,10]])
Y = np.array([3, 4, 5, 6, 7])
# feature scaling
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X)
# outcome scaling:
sc_Y = StandardScaler()
Y_train = sc_Y.fit_transform(Y.reshape(-1, 1))
Y_train
# array([[-1.41421356],
# [-0.70710678],
# [ 0. ],
# [ 0.70710678],
# [ 1.41421356]])
现在,假设我们使用缩放集 X_train
和 Y_train
拟合我们的 Keras 模型(此处未显示),并获得训练集的预测:
prediction = model.predict(X_train) # scaled inputs here
print(prediction)
# [-1.4687586 -0.6596055 0.14954728 0.95870024 1.001172 ]
Keras 报告的 MSE 实际上是缩放后的 MSE,即:
MSE_scaled = mean_squared_error(Y_train, prediction)
MSE_scaled
# 0.052299712818541934
虽然我上面描述的 3 个步骤很简单:
MSE = mean_squared_error(Y, sc_Y.inverse_transform(prediction)) # first 2 steps, combined
MSE
# 0.10459946572909758
np.sqrt(MSE) # 3rd step
# 0.323418406602187
所以,在我们的例子中,如果我们最初的 Y 是美元,相同单位(美元)的实际误差将是 0.32(美元)。
请注意 inverse-transforming 缩放 MSE 的天真方法如何给出非常不同(且不正确)的结果:
np.sqrt(sc_Y.inverse_transform([MSE_scaled]))
# array([2.25254588])
我正在尝试建立一个模型来预测房价。
我有一些功能 X(浴室数量等)和目标 Y(大约 300,000 美元到 800,000 美元)
在将 Y 拟合到模型之前,我已经使用 sklearn 的 Standard Scaler 对其进行了标准化。
这是我的 Keras 模型:
def build_model():
model = Sequential()
model.add(Dense(36, input_dim=36, activation='relu'))
model.add(Dense(18, input_dim=36, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='mse', optimizer='sgd', metrics=['mae','mse'])
return model
我在尝试解释结果时遇到问题 -- 0.617454319755 的 MSE 是什么意思?
我是否必须对这个数字进行逆变换并对结果进行平方根,得到 741.55 美元的错误率?
math.sqrt(sc.inverse_transform([mse]))
对于刚开始时听起来很愚蠢,我深表歉意!
MSE是均方误差,这里是公式。
基本上它是预期输出和预测的不同平方的均值。对其求平方根不会给您误差和输出之间的差异。这对训练很有用。
目前您已经建立了一个模型。 如果你想训练模型使用这些函数。
mode.fit(x=input_x_array, y=input_y_array, batch_size=None, epochs=1, verbose=1, callbacks=None, validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, sample_weight=None, initial_epoch=0, steps_per_epoch=None, validation_steps=None)
如果你想对输出进行预测,你应该使用下面的代码。
prediction = model.predict(np.array(input_x_array))
print(prediction)
您可以在此处找到更多详细信息。
I apologise for sounding silly as I am starting out!
不要;这是一个非常重要的微妙问题,在教程和介绍性说明中通常(令人遗憾地)被忽略。
不幸的是,它不像取 inverse-transformed MSE 的平方根那么简单,但也没有那么复杂;基本上你要做的是:
- 将您的预测转换回原始数据的初始规模
- 获取这些 invert-transformed 预测与原始数据之间的均方误差
- 对结果取平方根
为了获得模型的性能指标,该指标在您问题的 业务 上下文中有意义(例如此处为美元)。
让我们看一个玩具数据的简单示例,省略模型本身(这里不相关,实际上可以是任何回归模型——不仅是 Keras 模型):
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
import numpy as np
# toy data
X = np.array([[1,2], [3,4], [5,6], [7,8], [9,10]])
Y = np.array([3, 4, 5, 6, 7])
# feature scaling
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X)
# outcome scaling:
sc_Y = StandardScaler()
Y_train = sc_Y.fit_transform(Y.reshape(-1, 1))
Y_train
# array([[-1.41421356],
# [-0.70710678],
# [ 0. ],
# [ 0.70710678],
# [ 1.41421356]])
现在,假设我们使用缩放集 X_train
和 Y_train
拟合我们的 Keras 模型(此处未显示),并获得训练集的预测:
prediction = model.predict(X_train) # scaled inputs here
print(prediction)
# [-1.4687586 -0.6596055 0.14954728 0.95870024 1.001172 ]
Keras 报告的 MSE 实际上是缩放后的 MSE,即:
MSE_scaled = mean_squared_error(Y_train, prediction)
MSE_scaled
# 0.052299712818541934
虽然我上面描述的 3 个步骤很简单:
MSE = mean_squared_error(Y, sc_Y.inverse_transform(prediction)) # first 2 steps, combined
MSE
# 0.10459946572909758
np.sqrt(MSE) # 3rd step
# 0.323418406602187
所以,在我们的例子中,如果我们最初的 Y 是美元,相同单位(美元)的实际误差将是 0.32(美元)。
请注意 inverse-transforming 缩放 MSE 的天真方法如何给出非常不同(且不正确)的结果:
np.sqrt(sc_Y.inverse_transform([MSE_scaled]))
# array([2.25254588])