Как понять функцию потерь в scikit-изучите код логической регрессии?

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