我正在尝试建立一个模型来预测房价。
我有一些功能 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 的平方根那么简单,但也没有那么复杂;基本上你要做的是:

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

  • 为了获得您的模型的性能指标,该指标在您的问题的业务环境中是有意义的(例如此处的美元)。
    让我们看一个关于玩具数据的快速示例,省略模型本身(这在这里无关紧要,实际上可以是任何回归模型 - 不仅仅是 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])
    

    关于machine-learning - 如何在 Keras Regressor 中解释 MSE,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48973140/

    10-12 16:51