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