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