【问题标题】:How to interpret MSE in Keras Regressor如何在 Keras Regressor 中解释 MSE
【发布时间】:2021-01-24 16:49:54
【问题描述】:

我正在尝试建立一个模型来预测房价。

我有一些特征 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]))

对于刚开始的时候听起来很愚蠢,我深表歉意!

【问题讨论】:

    标签: machine-learning keras scikit-learn regression normalization


    【解决方案1】:

    对于刚开始的时候听起来很愚蠢,我深表歉意!

    不要;这是一个非常重要的微妙问题,通常(很遗憾)在教程和介绍性说明中省略。

    不幸的是,它并不像取反变换的 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 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_trainY_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(美元)。

    请注意,对缩放的 MSE 进行逆变换的幼稚方法会产生非常不同(且不正确)的结果:

    np.sqrt(sc_Y.inverse_transform([MSE_scaled]))
    # array([2.25254588])
    

    【讨论】:

    • 非常感谢您的详细解释!
    • 对答案的清晰和卓越表示赞同。
    • 这个答案对于那些不知道如何将数据导入和导出模型的 ML/DL 新手来说非常有价值。太棒了!
    【解决方案2】:

    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)
    

    您可以在此处找到更多详细信息。

    https://keras.io/models/about-keras-models/

    https://keras.io/models/sequential/

    【讨论】:

    • OP 并没有要求这样做,而是要求在之前对训练结果进行缩放时对生成的 MSE 进行解释
    猜你喜欢
    • 1970-01-01
    • 2016-05-04
    • 2020-10-24
    • 1970-01-01
    • 2021-01-30
    • 2019-04-09
    相关资源
    最近更新 更多