如何在Keras Regressor中解释MSE

Iva*_*van 2 regression machine-learning normalization scikit-learn keras

我是Keras / TF /深度学习的新手,我正在尝试建立模型来预测房价。

我有一些功能X(浴室数量等)和目标Y(大约$ 300,000至$ 800,000)

在将其拟合到模型之前,我曾使用sklearn的Standard Scaler来标准化Y。

这是我的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
Run Code Online (Sandbox Code Playgroud)

我在尝试解释结果时遇到了麻烦-0.617454319755的MSE是什么意思?

我是否必须对这个数字进行逆变换,然后对结果求平方,得到741.55美元的错误率?

math.sqrt(sc.inverse_transform([mse]))
Run Code Online (Sandbox Code Playgroud)

我为刚开始听起来很傻而道歉!

des*_*aut 6

我为刚开始听起来很傻而道歉!

不要; 这是一个非常重要的细微问题,在教程和介绍性介绍中通常(并且很遗憾)被忽略。

不幸的是,它不像取逆变换的MSE的平方根那么简单,但是也没有那么复杂。本质上,您要做的是:

  1. 将您的预测转换回原始数据的初始规模
  2. 在这些逆变换的预测与原始数据之间获取MSE
  3. 取结果的平方根

为了获得模型的性能指标,该指标在问题的业务环境中将是有意义的(例如此处的美元)。

让我们看一个带有玩具数据的简单示例,省略模型本身(这里无关紧要,实际上可以是任何模型-不仅是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 dcaling
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]])
Run Code Online (Sandbox Code Playgroud)

现在,假设我们使用缩放集X_train和拟合了Keras模型(此处未显示)Y_train,并获得了训练集的预测:

prediction = model.predict(X_train) # scaled inputs here
print(prediction)
# [-1.4687586  -0.6596055   0.14954728  0.95870024  1.001172  ]
Run Code Online (Sandbox Code Playgroud)

Keras报告的MSE实际上是按比例缩放的MSE,即:

MSE_scaled = mean_squared_error(Y_train, prediction)
MSE_scaled
# 0.052299712818541934
Run Code Online (Sandbox Code Playgroud)

而我上面描述的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
Run Code Online (Sandbox Code Playgroud)

因此,在我们的案例中,如果我们的初始Y为美元,则相同单位(美元)的实际误差为0.32(美元)。

请注意,对缩放后的MSE进行逆变换的天真的方法将如何产生非常不同(且不正确)的结果:

np.sqrt(sc_Y.inverse_transform([MSE_scaled]))
# array([2.25254588])
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢您的详细解释! (2认同)