Взвешенная функция потери шарнира

#python #tensorflow #machine-learning #loss-function

#python #тензорный поток #машинное обучение #функция потери

Вопрос:

Я определяю свою потерю ванильного шарнира как:

 def hinge(y_true, y_pred):    
    return tf.maximum(0., 1- y_true*y_pred)
 

Я обучаю SVM для прогнозирования события. И мои y значения — 1 это тот класс или -1 не тот класс. Мой класс несбалансирован, и у меня его гораздо -1 больше 1 .

Следовательно, я хотел бы взвесить потерю 1 как более высокий штраф. Но я не знаю, как именно я бы изменил свою потерю шарнира. Лучшее, о чем я могу думать, это,

 X = (# of non event samples) / (# of event samples)
if(y_true*y_pred > 0):
    return tf.maximum(0., 1- y_true*y_pred)*X
 

Это означает, что если у меня есть 100 не-событий и 10 событий, то X = 100/10 = 10.
Тогда потеря hingeloss*10 равна if y_true = 1 .

Это правильно или есть лучший способ сделать это?

Ответ №1:

Как насчет:

 def hinge(y_true, y_pred):    
    return tf.multiply((11/9 y_true)*9/2,tf.maximum(0., 1- y_true*y_pred))
 

Логика здесь в том, что мы хотим умножить на 10, если y_true оно равно 1, и на 1, если оно равно -1 . Вы можете проверить, что при y_true значении -1 (11/9 y_true)*9/2 значение равно 1, а при значении 1 значение равно 10. Если вам интересно узнать, как получить 11/9 в выражении, это результат решения линейного уравнения для желаемого сдвига s:

10 (s (-1)) = 1 (s 1).

Комментарии:

1. Хм, интересная мысль. Но это говорит о том, что я знаю, что хочу умножить на 10. Меня интересует, как получить 10 в первую очередь. Я получил 10, просто обратно пропорционально взвесив два класса. Но если дисбаланс классов составлял 1000 и 10, то ваше уравнение становится 100 (s (-1)) = s 1. И, таким образом, коэффициент слева — это то, что мне действительно нужно.

2. Как правильно выбрать этот коэффициент.

3. Вероятно, у вас будет компромисс между точностью и отзывом, вы можете попробовать выбрать тот, который максимизирует ваш результат в формуле-1 en.wikipedia.org/wiki/F1_score путем перекрестной проверки или выбора порогового значения точности и максимизации отзыва при условии получения по крайней мере такой точности.

4. Вы также можете просто взвесить их по обратной пропорции элементов в каждом классе, как вы предлагаете, хотя в вашем примере это было бы (100 10)/10=11. Я понятия не имею, какую точность и отзывчивость вы получите, но я предполагаю, что она будет более сбалансированной.