Проблема регрессии, где прогнозируемое значение должно быть целым числом - PullRequest
0 голосов
/ 22 апреля 2020

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

def my_custom_loss_fn(y_actual, y_predicted):
   y_predicted_rounded = K.round(y_predicted)
   custom_loss_value = K.sqrt(tf.keras.losses.mean_squared_error(y_actual, y_predicted_rounded))
   return custom_loss_value

, который выдает ошибку: нет градиентов для любой переменной: ... Эта проблема, вероятно, из-за отсутствия градиентов для функции K.round.

Мой вопрос таков: есть ли какой-нибудь другой элегантный способ или даже другая структура (например, xgboost et c), где я мог бы изменить потерянную функцию так, чтобы потеря возводилась в квадрат root означала ошибку y_actual и y_predicted, что было округлено.

1 Ответ

0 голосов
/ 22 апреля 2020

Альтернативой вашей проблеме может быть создание всей вашей проблемы как классификационной.

То есть вы преобразуете свой набор данных из регрессионного в классификационный. Более формальным принципом использования является группирование. Таким образом, если значение падает между 15,0 и 30,0, тогда вы назначаете категорию X каждому из точек данных, которые принадлежат этому интервалу.

Прогнозируемое положительное целое число будет, конечно, category_id.

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

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

...