#python #machine-learning #scikit-learn #loss-function
#python #машинное обучение #scikit-учиться #функция потерь #scikit-learn
Вопрос:
Код для функции потерь в scikit-learn logestic regression является:
# Logistic loss is the negative of the log of the logistic function.
out = -np.sum(sample_weight * log_logistic(yz)) .5 * alpha * np.dot(w, w)
Однако, по-видимому, она отличается от обычной формы логарифмической функции потерь, которая гласит:
-y(log(p) (1-y)log(1-p))
(пожалуйста, смотрите http://wiki.fast.ai/index.php/Log_Loss)
Кто-нибудь может сказать мне, как понять код для функции потерь в scikit-learn logestic regression и какова связь между ней и общей формой логарифмической функции потерь?
Заранее благодарю вас.
Ответ №1:
Сначала вы должны отметить, что 0.5 * alpha * np.dot(w, w)
это просто нормализация. Итак, логистическая регрессия sklearn сводится к следующему
-np.sum(sample_weight * log_logistic(yz))
Кроме того, np.sum
это связано с тем, что он рассматривает несколько выборок, поэтому он снова сводится к
sample_weight * log_logistic(yz)
Наконец, если вы читаете ЗДЕСЬ, вы заметите, что sample_weight — это необязательный массив весов, которые присваиваются отдельным выборкам. Если не указано, то каждому образцу присваивается единичный вес. Итак, она должна быть равна единице (поскольку в исходном определении потери перекрестной энтропии мы не рассматриваем неравный вес для разных выборок), следовательно, потери сводятся к:
- log_logistic(yz)
что эквивалентно
- log_logistic(y * np.dot(X, w))
.
Теперь, почему это выглядит иначе (по сути, это то же самое), чем функция потери перекрестной энтропии, т. Е.:
- [y log(p) (1-y) log(1-p))]
.
Причина в том, что мы можем использовать любое из двух различных соглашений о маркировке для двоичной классификации, либо используя {0, 1}
или {-1, 1}
, что приводит к двум разным представлениям. Но они одни и те же!
Более подробную информацию (о том, почему они одинаковы) можно найти ЗДЕСЬ. Обратите внимание, что вам следует прочитать ответ Мануэля Моралеса.
Комментарии:
1. Здравствуйте, Мейсам Садеги, ваш ответ очень полезен. Большое спасибо. И у меня есть еще один вопрос: какова взаимосвязь между «sample_weight» и «class_weight» в scikit-learn logestic regression? Наилучшие пожелания!
2. Я стараюсь изо всех сил кратко объяснить: class_weights можно использовать для обработки случаев, когда у вас неодинаковый объем данных в разных классах. Предположим, что 1000 пациентов, которых вы тестируете на редкий рак, 990 здоровы, а у 10 рак. Тогда, если ваша модель всегда говорит вам, что все здоровы, ее точность составляет 0,99%. Но если (например) вы взвешиваете классы обратно пропорционально количеству образцов (1000/10 = 100 для случаев рака и 1000/990 = 1,01), вы можете справиться с этим.
3. … Продолжить … sample_weights используются для придания важности образцам, которые вас больше интересуют / беспокоят. Предположим, у вас есть 100 выборок, но 10 из них (класс, к которому они принадлежат, не важен, но сами выборки важны, поэтому давайте предположим, что 5 положительных и 5 отрицательных выборок в задаче двоичной классификации) получены от конкурса, в котором вы собираетесь участвовать, а остальные (остальные 90) — это просто некоторые данные, которые вы нашли из Интернета и не так важны.
4. ….Продолжить… Затем вы можете установить более высокий sample_weight для этих 10 выборок и убедиться, что они должным образом подчеркнуты при обучении модели.