我是机器学习的新手。我正在尝试从数据集中预测两个数值列。我必须预测的列是数量和天数。 数量,天数是要素,所有其他列都是标签。
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的神经网络拟合数据集 我已经完成的预处理步骤是一种热编码和最小最大标量。
我曾尝试为乙状结肠和漏水的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 Functional 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)
Predicted两列与实际测试列完全不匹配,RMSE得分为40860。所以我不知道如何继续进行更准确的预测。请帮助我哪里出了问题?我必须在哪里进行更改才能预测多列?
答案 0 :(得分:0)
请勿尝试从一层输出此类变化的值。取而代之的是为每个图层创建一个图层,并为每个图层附加损失函数。查看此页面: https://keras.io/getting-started/functional-api-guide/#multi-input-and-multi-output-models 您将需要功能性API。
编辑:我会尝试使用失重。您的模型很困惑,因为 损失值差别很大。每个输出在不同的位置 完全扩展。
虽然此答案使用了不同的损失函数,但想法是相同的:
model.compile(
optimizer='adam',
loss={
'out1': 'mean_absolute_error',
'out2': 'mean_absolute_error'
},
loss_weights={'out1': 1., 'out2': 0.2}
)