Горячее против фиктивного кодирования в Scikit-Learn


50

Существует два разных способа кодирования категориальных переменных. Скажем, одна категориальная переменная имеет n значений. Горячее кодирование преобразует его в n переменных, а фиктивное кодирование преобразует его в n-1 переменные. Если у нас есть k категориальных переменных, каждая из которых имеет n значений. Одно горячее кодирование заканчивается переменными kn , а фиктивное кодирование заканчивается переменными kn-k .

Я слышал, что для одноразового кодирования перехват может привести к проблеме коллинеарности, из-за которой модель не работает. Кто-то называет это « фиктивной переменной-ловушкой ».

Мои вопросы:

  1. Модель линейной регрессии Scikit-learn позволяет пользователям отключать перехват. Так что для горячего кодирования, я должен всегда устанавливать fit_intercept = False? Для фиктивного кодирования fit_intercept всегда должен быть установлен в True? Я не вижу никаких «предупреждений» на сайте.

  2. Поскольку одноразовое кодирование генерирует больше переменных, имеет ли оно большую степень свободы, чем фиктивное кодирование?

Ответы:


35

Модель линейной регрессии Scikit-learn позволяет пользователям отключать перехват. Так что для горячего кодирования, я должен всегда устанавливать fit_intercept = False? Для фиктивного кодирования fit_intercept всегда должен быть установлен в True? Я не вижу никаких «предупреждений» на сайте.

Для нерегулярной линейной модели с однократным кодированием, да, вам нужно установить значение перехвата равным false, иначе произойдет идеальная коллинеарность. sklearnтакже учитывает штраф за усадку горного хребта, и в этом случае он не является необходимым, и на самом деле вы должны включать как перехват, так и все уровни. Для фиктивного кодирования вы должны включить перехват, если только вы не стандартизировали все свои переменные, в этом случае перехват равен нулю.

Поскольку одноразовое кодирование генерирует больше переменных, имеет ли оно большую степень свободы, чем фиктивное кодирование?

Перехват - это дополнительная степень свободы, поэтому в хорошо определенной модели все равно.

Для второго, что, если есть k категориальных переменных? k переменных удаляются в фиктивной кодировке. Степень свободы все та же?

x1,x2,,xn

x1+x2++xn=1

x

x1+x2++xk=1

и поэтому вы создали линейную зависимость

x1+x2+xnx1x2xk=0

Таким образом, вы должны пропустить уровень во второй переменной, и все выстраивается правильно.

Скажем, у меня есть 3 категориальные переменные, каждая из которых имеет 4 уровня. В фиктивном кодировании 3 * 4-3 = 9 переменных строятся с одним перехватом. В одноразовом кодировании 3 * 4 = 12 переменных создаются без перехвата. Я прав?

3×4=12


Благодарю. Для второго, что, если есть k категориальных переменных? k переменных удаляются в фиктивной кодировке. Степень свободы все та же?
Мюнхен

@ChongWang Я отредактировал ответ на ваш комментарий в свой ответ.
Мэтью Друри

Извините, я немного заблудился здесь. Скажем, у меня есть 3 категориальные переменные, каждая из которых имеет 4 уровня. В фиктивном кодировании 3 * 4-3 = 9 переменных строятся с одним перехватом. В одноразовом кодировании 3 * 4 = 12 переменных создаются без перехвата. Я прав? Таким образом, здесь DF для фиктивного кодирования составляет 9-1, а DF для горячего кодирования - 12. Я прав?
Мюнхен

@ChongWang Отредактировано снова.
Мэтью Друри

@ MatthewDrury У меня такая же проблема с linear_model в sklearn. После фиктивного кодирования Decision Tree и KNN работают нормально, но линейная регрессия падает в сингулярности. Я понимаю из вашего ответа, что я должен удалить "уровень из второй переменной", но я не знаю, что это означает на практике? Например, у меня есть 3 числовых и 3 категориальных (производитель, модель и fuel_type). Модель, естественно, зависит от производителя, поскольку один производитель может иметь n моделей. Итак, как действовать в этом типичном сценарии, если я хочу использовать линейную регрессию?
Харви
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.