Как предсказать два числовых столбца, используя керас? - PullRequest
0 голосов
/ 11 июля 2019

Я новичок в машинном обучении. Я пытаюсь предсказать два числовых столбца из набора данных. Столбцы, которые я должен предсказать, это количество и количество дней. Сумма, количество дней - это функции, а все остальные столбцы - метки.

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. Предварительные шаги обработки, которые я сделал, это одно горячее кодирование и минимальный максимальный скаляр.

Я попытался добавить больше слоев, больше нейронов, изменяющееся количество эпох и слой активации к сигмовидной и неплотной реакции.

Код:


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)

Функциональный код API Keras

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. Так что я не знаю, как двигаться дальше, чтобы получить более точный прогноз. где я должен внести изменения, чтобы предсказать несколько столбцов?

1 Ответ

0 голосов
/ 11 июля 2019

Не пытайтесь выводить такие переменные значения из одного слоя.Вместо этого создайте слой для каждого и прикрепите функцию потерь к каждому.Проверьте эту страницу: 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}
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...