Кодування "гаряче проти фіктивного" в Scikit-learn


50

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

Я чую, що за допомогою гарячого кодування перехоплення може призвести до проблеми колінеарності, завдяки чому модель не звучить. Хтось називає це " фіктивним ловушком змінної ".

Мої запитання:

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

  2. Оскільки одне гаряче кодування генерує більше змінних, чи має воно більше ступеня свободи, ніж фіктивне кодування?

Відповіді:


35

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

Для нерегульованої лінійної моделі з однокольоровим кодуванням, так, вам потрібно встановити перехоплення на помилкове або інакше мати ідеальну колінеарність. 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 змінні видаляються в макетному кодуванні. Чи все-таки ступінь свободи однакова?
Munichong

@ChongWang Я змінив відповідь на ваш коментар у свою відповідь.
Метью Друрі

Вибачте, я трохи загубився тут. Скажімо, у мене є 3 категоричні змінні, кожна з яких має 4 рівні. У фіксованому кодуванні 3 * 4-3 = 9 змінних будуються з одним перехопленням. В одному гарячому кодуванні 3 * 4 = 12 змінних будуються без перехоплення. Я прав? Отже, тут коефіцієнт кодування фіктивного кодування 9-1, а коефіцієнт однокоординатного кодування - 12. Чи правильно я?
Munichong

@ChongWang Знову відредаговано.
Меттью Друрі

@MatthewDrury У мене така ж проблема з linear_model в sklearn. Після кодування фіктивного дерева Рішення та KNN працює нормально, але лінійна регресія падає в особливості. З вашої відповіді я розумію, що я повинен видалити "рівень із другої змінної", але я не знаю, що це практично означає? Наприклад, у мене є 3 числові функції та 3 категорії (виробник, модель та тип палива). Модель, природно, залежить від виробника, оскільки один виробник може мати n моделей. Тож як діяти в такому загальному сценарії, якщо я хочу використовувати лінійну регресію?
Харві
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.