【问题标题】:How to predict two numerical columns using keras?如何使用 keras 预测两个数值列?
【发布时间】:2019-11-21 07:24:59
【问题描述】:

我是机器学习的新手。我正在尝试从数据集中预测两个数字列。我必须预测的列是 Amount 和 number of days 。 金额、天数是特征,所有其他列都是标签。

ID  Category    Company Amount  No_of_days
x1  c1             A    338.07   5
x2  c2             B    46.21    35
x4  c1             C    1480     35
x1  c3             C    2018     48
x2  others         A    4344    -10

我尝试用 keras 的神经网络拟合数据集 我所做的预处理步骤是一种热编码和最小最大标量。

我尝试添加更多层、更多神经元、改变 epoch 数和激活层到 sigmoid 和leaky relu。

代码:


model = Sequential()

# The Input Layer :
model.add(Dense(64, kernel_initializer='normal',input_dim = X_train.shape[1], activation='relu'))

# The Hidden Layers :
model.add(Dense(256, kernel_initializer='normal',activation='relu'))
model.add(Dense(256, kernel_initializer='normal',activation='relu'))
model.add(Dense(256, kernel_initializer='normal',activation='relu'))
model.add(Dense(64, kernel_initializer='normal',activation='relu'))

# The Output Layer :
model.add(Dense(2, kernel_initializer='normal',activation='linear'))

# Compile the network :
model.compile(loss='mean_absolute_error', optimizer='adam', metrics=['mean_absolute_error'])

checkpoint_name = 'Weights-{epoch:03d}--{val_loss:.5f}.hdf5' 
checkpoint = ModelCheckpoint(checkpoint_name, monitor='val_loss', verbose = 1, save_best_only = True, mode ='auto')
callbacks_list = [checkpoint]

model.fit(X_train, y_train, epochs=50, batch_size=32,validation_split = 0.2, callbacks=callbacks_list)

Keras 函数式 API 代码

from keras.models import Model
from keras.layers import Input

X_train, y_train = np.array(X_train), np.array(y_train)
visible = Input(shape=(X_train.shape[1],))
X = Dense(256, kernel_initializer='normal',activation='relu')(visible)
X = Dense(256, kernel_initializer='normal',activation='relu')(X)
X = Dense(256, kernel_initializer='normal',activation='relu')(X)
out1 = Dense(1, kernel_initializer='normal',activation='linear')(X)
out2 = Dense(1, kernel_initializer='normal',activation='linear')(X)
model = Model(inputs=visible, outputs=[out1, out2])
model.compile(loss='mean_absolute_error', optimizer='adam', metrics=['mean_absolute_error'])
model.fit(X_train,[y_train[:,0], y_train[:,1]] ,epochs=50, batch_size=32)

预测的两列与实际测试列不匹配,得到的 RMSE 分数是 40860。所以我不知道如何继续进行以获得更准确的预测。请帮助我哪里出错了?我必须在哪里进行更改以预测多列?

【问题讨论】:

  • 您能否提供更多详细信息,您获得的训练准确度和验证准确度是多少?
  • 损失:0.0078 - mean_absolute_error:0.0078 - val_loss:0.0094 - val_mean_absolute_error:0.0094 @RAMSHANKERG

标签: python machine-learning keras regression prediction


【解决方案1】:

不要尝试从一层输出这种变化的值。相反,为每个层制作一个层,并为每个层附加一个损失函数。看看这个页面: https://keras.io/getting-started/functional-api-guide/#multi-input-and-multi-output-models 您将需要功能 API。

编辑:我会尝试使用损失权重。你的模型很困惑,因为 损失值差别很大。每个输出都在不同的 完全缩放。

虽然这个答案使用了不同的损失函数,但想法是一样的:

Keras loss weights

model.compile(
    optimizer='adam',
    loss={
        'out1': 'mean_absolute_error', 
        'out2': 'mean_absolute_error'
    },
    loss_weights={'out1': 1., 'out2': 0.2}
)

【讨论】:

  • 我关注了您的链接,并尝试使用 keras 功能 api 对两层进行预测,但我可以看到 RMSE 分数有所提高,但准确性仍然很差。我已经更新了问题中的功能 api 代码@DasHund
  • 更新了我的回复。
  • 感谢@DasHund 的更新,但是当我尝试使用您的更新编译时,我收到此错误。 ValueError:损失字典中的未知条目:“out1”。只需要以下键:['dense_9', 'dense_10']
  • 将 name='out1' 和 name='out2' 添加到各自的构造函数中:out1 = Dense(1, kernel_initializer='normal',activation='linear', name='out1')( X) out2 = Dense(1, kernel_initializer='normal',activation='linear', name='out2')(X) 此外,根据该消息,如果您在笔记本中,您可能需要重置运行时。
  • 感谢@DasHund 它的工作,但我仍然没有得到准确性。我分别测量了两列的 RMSE 分数,第一列(no_of_days)得到 14,第二列数量得到 62455。从第二列与货币有关我在预处理或其他地方遗漏了什么吗?两个特征列都有负值,负值会有问题吗?
猜你喜欢
  • 2020-01-22
  • 1970-01-01
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
相关资源
最近更新 更多