Пользовательская функция потерь для прогнозирования выходных данных Interget? - PullRequest
0 голосов
/ 16 февраля 2020

Я сейчас работаю над набором данных, где я должен предсказать целочисленный вывод. Он начинается с 1 до N. Я построил сеть с функцией потерь mse. Но я чувствую, что функция потерь mse не может быть идеальной функцией потерь для минимизации в случае целочисленного вывода.

Я также округляю свой прогноз для получения целочисленного вывода Есть ли способ улучшить / оптимизировать модель в случае целочисленного вывода.

Может ли кто-нибудь помочь с обработкой целочисленного вывода / целей. Это функция потерь, которую я использую сейчас.

model.compile(optimizer=SGD(0.001), loss='mse')

Ответы [ 2 ]

1 голос
/ 16 февраля 2020

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

Я нашел реализацию соответствующей функции потерь на github (нет связи). Для полноты ниже я скопирую и вставлю код из этого репо:

from keras import backend as K
from keras import losses

def loss(y_true, y_pred):
    weights = K.cast(
        K.abs(K.argmax(y_true, axis=1) - K.argmax(y_pred, axis=1))/(K.int_shape(y_pred)[1] - 1),
        dtype='float32'
    )
    return (1.0 + weights) * losses.categorical_crossentropy(y_true, y_pred)
1 голос
/ 16 февраля 2020

Вы используете неправильную потерю, среднеквадратическая ошибка - это потеря для регрессии, и у вас есть проблема классификации (дискретные выходы, а не непрерывные).

Таким образом, для этой модели ваша модель должна иметь выходной слой softmax :

model.add(Dense(N, activation="softmax"))

И вы должны использовать классификационные потери:

model.compile(optimizer=SGD(0.001), loss='sparse_categorical_crossentropy')

Предполагая, что ваши метки являются целыми числами в диапазоне [0, N-1] (отключено на единицу), это должно работать. Чтобы сделать прогноз, вы должны сделать:

output = np.argmax(model.predict(some_data), axis=1) + 1

* +1, потому что целочисленные метки go от 0 до N-1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...