【问题标题】:Calculating mean square error return y_true and y_pred have different number of output (1!=10)计算均方误差返回 y_true 和 y_pred 有不同数量的输出 (1!=10)
【发布时间】:2020-07-14 05:18:21
【问题描述】:

我对深度学习真的很陌生。我想做一个任务:根据测试数据评估模型并计算预测混凝土强度和实际混凝土强度之间的均方误差。您可以使用 Scikit-learn 中的 mean_squared_error 函数。

这是我的代码:

import pandas as pd
from tensorflow.python.keras import Sequential
from tensorflow.python.keras.layers import Dense
from sklearn.model_selection import train_test_split

concrete_data = pd.read_csv('https://cocl.us/concrete_data')

n_cols = concrete_data.shape[1]
model = Sequential()
model.add(Dense(units=10, activation='relu', input_shape=(n_cols-1,)))

model.compile(loss='mean_squared_error',
          optimizer='adam')


y = concrete_data.Cement
x = concrete_data.drop('Cement', axis=1)
xTrain, xTest, yTrain, yTest = train_test_split(x, y, test_size = 0.3)

model.fit(xTrain, yTrain, epochs=50)

现在为了评估均方误差,我写了这个:

from sklearn.metrics import mean_squared_error
predicted_y = model.predict(xTest)
mean_squared_error(yTest, predicted_y)

我得到了这个错误:

y_true and y_pred have different number of output (1!=10)

我的 predict_y 形状是:(309, 10)

我用谷歌搜索了它,我真的找不到解决这个问题的答案。我不知道我的代码有什么问题。

【问题讨论】:

  • 你用的是什么型号的?
  • 还有你通过predicted_y.shape 得到什么
  • @yatu 谢谢你的回复。我的模型是连续的,predicted_y 形状是 (309, 10)
  • 是多标签问题吗?为什么你有 10 列
  • @yatu 不,不是。我用我写的完整代码编辑了我的问题。但也许我犯了一些错误。嗯,这是我在 ML 中的第一个任务,所以我不确定我是否做对了

标签: python machine-learning scikit-learn mse


【解决方案1】:

实际上,您要检查的是mean_squared_errory_testpredicted_y

您必须检查您的模型在x_test 上的预测,即预测:

predicted_y = model.predict(x_test)

那么就可以计算误差了:

mean_squared_error(y_test, predicted_y)

【讨论】:

  • 是的,我之前尝试过,但它返回此错误:y_true 和 y_pred 的输出数量不同 (1!=10)
【解决方案2】:

您的 y_test 数据形状为 (N, 1),但由于您在输出层放置了 10 个神经元,因此您的模型会做出 10 种不同的预测,这就是错误。

您需要将输出层中的神经元数量更改为 1,或者添加一个只有 1 个神经元的新输出层。

下面的代码可能适合你。

import pandas as pd
from tensorflow.python.keras import Sequential
from tensorflow.python.keras.layers import Dense
from sklearn.model_selection import train_test_split

concrete_data = pd.read_csv('https://cocl.us/concrete_data')

n_cols = concrete_data.shape[1]
model = Sequential()
model.add(Dense(units=10, activation='relu', input_shape=(n_cols-1,)))           
model.add(Dense(units=1))
model.compile(loss='mean_squared_error',
          optimizer='adam')


y = concrete_data.Cement
x = concrete_data.drop('Cement', axis=1)
xTrain, xTest, yTrain, yTest = train_test_split(x, y, test_size = 0.3)

model.fit(xTrain, yTrain, epochs=50)

【讨论】:

    【解决方案3】:
    y_pred = model.predict(x_test).sum(axis=1)
    

    试试这个,它对我有用

    【讨论】:

    • OP 需要均方误差。不是预测的总和
    猜你喜欢
    • 2020-01-04
    • 2021-12-19
    • 2018-06-30
    • 2017-06-20
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    相关资源
    最近更新 更多