【问题标题】:Not able to get correct results even though mean absolute error is low即使平均绝对误差很低,也无法获得正确的结果
【发布时间】:2021-07-17 17:03:06
【问题描述】:
import pandas as pd
df=pd.read_csv('final sheet for project.csv')
features=['moisture','volatile matter','fixed carbon','calorific value','carbon %','oxygen%']
train_data=df[features]
target_data=df.pop('Activation energy')
X_train, X_test, y_train, y_test = train_test_split(train_data,target_data,  test_size=0.09375, random_state=1)

standard_X_train=pd.DataFrame(StandardScaler().fit_transform(X_train))
standard_X_test=pd.DataFrame(StandardScaler().fit_transform(X_test))

y_train=y_train.values
y_train = y_train.reshape((-1, 1))

scaler = MinMaxScaler(feature_range=(0, 1))
scaler = scaler.fit(y_train)

normalized_y_train = scaler.transform(y_train)

y_test=y_test.values
y_test = y_test.reshape((-1, 1))

scaler = MinMaxScaler(feature_range=(0, 1))
scaler = scaler.fit(y_test)

normalized_y_test = scaler.transform(y_test)

model=keras.Sequential([layers.Dense(units=20,input_shape=[6,]),layers.Dense(units=1,activation='tanh')])

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


history = model.fit(standard_X_train,normalized_y_train, validation_data=(standard_X_test,normalized_y_test),epochs=200)

我希望创建一个模型来使用一些特征来预测激活能量。我得到训练损失:0.0629 和 val_loss:0.4213。 但是当我试图预测一些其他看不见的数据的激活能量时,我得到了奇怪的结果。我是 ML 的初学者。

有人可以帮忙在代码中进行哪些更改。 (我想制作一个具有 20 个单元的隐藏层的模型,它具有激活函数 tanh。)

【问题讨论】:

  • 您还应该比较原始和预测的 RMSE 值

标签: python pandas tensorflow


【解决方案1】:

您不应将fit_transform 用于测试数据。您应该将fit_transform 用于训练数据并仅将transform 应用于测试数据,以便在测试数据上对训练数据使用相同的参数。

所以,你的代码的转换部分应该像这样改变:

scaler_x = StandardScaler()
standard_X_train = pd.DataFrame(scaler_x.fit_transform(X_train))
standard_X_test  = pd.DataFrame(scaler_x.transform(X_test))

y_train=y_train.values
y_train = y_train.reshape((-1, 1))
y_test=y_test.values
y_test = y_test.reshape((-1, 1))

scaler_y = MinMaxScaler(feature_range=(0, 1))
normalized_y_train = scaler_y.fit_transform(y_train)
normalized_y_test  = scaler_y.transform(y_test)

此外,由于您正在扩展数据,因此您应该对任何预测执行相同的操作。所以,你的预测线应该是这样的:

preds = scaler_y.inverse_transform(
     model.predict(scaler_x.transform(pred_input)) #if it is standard_X_test you don't need to transform again, since you already did it. 
     )

此外,由于您在 0 和 1 范围内转换标签,您可能需要将最后一层激活函数更改为 sigmoid 而不是 tanh,或者甚至可能更好地使用像 relu 这样的激活函数如果在上述修改后仍然得到较差的结果,请在第一层中。

model=keras.Sequential([
                        layers.Dense(units=20,input_shape=[6,],activation='relu'),
                        layers.Dense(units=1,activation='sigmoid')
                       ])

【讨论】:

  • 我刚刚尝试了您建议的这些修改,但我仍然得到不正确的输出。有没有其他可以尝试的修改?喜欢而不是使用 MinMaxScaler 缩放 target_y ,还有什么?
  • 在不了解您的数据的情况下,几乎不可能说规模或任何其他参数调整对您是否有帮助。此外,您应该指定不正确的输出是什么意思。总有一个指标可以衡量期望输出与模型输出(如损失)相差多少,您应该使用它而不是告诉错误的结果。
  • 另外,当我在第一层使用 relu 并在第二层使用 sigmoid 时,我的训练 loss=0.0445 和 test loss=0.1103
  • 看来,您的指标有所改善。但是,您对预测结果不满意。现在,您应该尝试更改参数,例如将损失从mae 更改为mse。或向您的网络添加更多层等等。
  • 我对新数据的预测的损失是 145.3105
猜你喜欢
  • 1970-01-01
  • 2019-07-10
  • 2019-05-24
  • 2021-11-13
  • 2016-11-13
  • 2019-01-02
  • 2021-04-19
  • 2014-03-11
  • 1970-01-01
相关资源
最近更新 更多