индивидуальные потери, функция как остатков, так и истинных значений - PullRequest
0 голосов
/ 23 января 2019

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

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

  • Мы можем быть " расслабленными " в машинах прогнозирования, для которых реальный нарушенный период составляет <30 дней, поскольку машины, которые будут выходить из строя в течение> = 30 дней
  • Это НЕ ОК предсказывать машины, для которых реальный сломанный период составляет> = 30 дней, как машины, которые не будут работать в течение <30 дней </li>

Чтобы рассмотреть 2 пункта выше, я подумал, что это может быть отправной точкой для

  • За y <30 штрафовать больше, чем за оценки </li>
  • За y> = 30 штрафовать больше недооценок

Код может быть примерно таким:

def custom_differentiate_long_short_objective(preds, dtrain):
    labels = dtrain.get_label()
    # create a dataframe with predictions and labels (easier to work)
    dataframe = pandas.DataFrame({"predictions": preds, "labels": labels})

    # differenciate between machines broken for > 30 days or less
    dataframe_short = dataframe[dataframe["labels"] < 30]
    dataframe_long = dataframe[dataframe["labels"] >= 30]

    # for machines broken for >= 30 custom asymmetric MSE that gives 10 times more penalty when the true targets are more than predictions (underestimation) as compared to when true targets are less (overestimation)
    residual_long = (dataframe_long["labels"] - 
    dataframe_long["predictions"]).astype("float")


    grad_long = residual_long.copy()
    grad_long[residual_long > 0] = -2 * 10.0 * grad_long[residual_long > 0]
    grad_long[residual_long <= 0] = -2 * grad_long[residual_long <= 0]
    hess_long = residual_long.copy()
    hess_long[residual_long > 0] = 2 * 10.0
    hess_long[residual_long <= 0] = 2.0

    # machines broken for < 30 days custom asymmetric MSE that gives 10 times more penalty when the true targets are less than predictions (overestimation) as compared to when true targets are more (underestimation)
    residual_short = (dataframe_short["labels"] - dataframe_short["predictions"]).astype("float")
    grad_short = residual_short.copy()
    grad_short[residual_short < 0] = -2 * 10.0 * grad_short[residual_short < 0]
    grad_short[residual_short >= 0] = -2 * grad_short[residual_short >= 0]
    hess_short = residual_short.copy()
    hess_short[residual_short < 0] = 2 * 10.0
    hess_short[residual_short >= 0] = 2.0

    grad = pandas.concat([grad_short, grad_long]).values
    hess = pandas.concat([hess_short, hess_long]).values

return grad, hess

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

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