Як я можу класифікувати категоричні дані, які не виправлені?


10

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

Наприклад, якщо мої категоричні дані були sexєдино можливими етикетки не було б female, maleі other, незалежно від того , що. Однак моя категорична змінна cityтака, що може статися так, що людина, яку я намагаюся передбачити, має нове місто, якого мій класифікатор ніколи не бачив.

Мені цікаво, чи є спосіб зробити класифікацію за цими термінами чи мені слід провести навчання ще раз, враховуючи ці нові категоричні дані.


1
ви можете перетворити cityна число на основі якоїсь функції? Як city' = f(latitude, longitude)таким чином, ви можете створити нове значення для будь-якого міста
Мохаммад Атар

@MohammadAthar тут дав ідеальне рішення, сподіваємось, що ОП це бачить!
Франческо Пегораро

Відповіді:


11

Це дуже гарне запитання; насправді ця проблема існує вже деякий час, і я ще не знайшов ідеального рішення. І все-таки більш ніж радий поділитися своїм досвідом:

  • Уникайте максимально можливого кодування (всупереч тому, що було запропоновано вище). Міркування полягає в тому, що це не спрацює. Модель з функцією «гарячого кодування» працює лише тоді, коли всі ці підрівні існували в даних тренувань. Модель не зможе передбачити прогноз, якщо якимось чином це не буде налаштовано вручну. Якщо ви шукаєте, ви знайдете багато людей, які зіткнулися з цим питанням під час розподілу своїх даних на поїзд / тест, і зіткнулися з тим, що деякі підрівні конкретної особливості не були присутні в навчальному розколі, а згодом не вдалося передбачити тест. Зауважте, якщо у вас є дуже високі кардинальні особливості (можливо, як у вашому місті, скажімо, 200 назв міст), це непотрібно збільшить розмірність ваших даних! Якщо з якихось причин вам може знадобитися зробити гаряче кодування, просто пам’ятайте про це.
  • Використовуйте інші методи кодування . Можливо, спробуйте дізнатися більше про інші методи, які є надійними для цього питання, принаймні на даний момент, як кодування на основі цілі, хешування (див. Деякі посилання нижче). Якщо ви з Python є хороший пакет пропонує варіанти MANT кодування. Ви можете бути здивовані, побачивши, що інші прості методи часто спрацьовують чудово.

  • Перевчіть свою модель . Теоретично, коли навчання вашого поїзда / набору повинно було мати однаковий розподіл (в основному це вважається цільовим розподілом, але це може бути правдою і для змінних). Тепер з новими предметами вступає в гру, ваш тестовий (небачений) розподіл даних змінився. Тоді найкраще ще раз перевчити модель, щоб ті нові міста були враховані.

  • Поставте нещодавно додані підкатегорії (і найменш часті) для інших . Хоча попередня точка теоретично відповідає дійсності, велика ймовірність, що розподіл тестів (цієї конкретної категорії) не зміниться, що в більшості випадків кардинально зміниться, наприклад, дуже мало предметів перевершить категорії в навчальному наборі. Можливо, як у вашому випадку, у вас може бути 100 міст у місті, і з часом з’являється дуже мало нових. Що б я вважав, - це дивитись на X-квантиль даної конкретної категорії, а найменш частий - у підкатегорію Інші . Якщо припустити, що ваш щойно доданий пункт даних є лише невеликим, він дуже сильно перейде в Іншігрупи. Ви, звичайно, втратите рівень деталізації, зробивши це, але ще раз сенс навчання полягає в тому, що не тільки ваша модель вивчає дані тренувань, але головне, щоб мати можливість дуже добре узагальнити небачені дані та якщо ці нові додані категорії є дуже точними даними, об’єднання їх у групу Інші не зашкодить.

  • Інші останні не зовсім зрілі рішення, такі як Cat2Vec (запозичені у Word2Vec від NLP) або кодування подібності . Вони дуже недавні, перевірте папір для першого та його github та приклад (на основі Word2Vec) у Kaggle, а цей документ - для останнього та його реалізацію . Ідея першого - перетворити категорії на вектори. Наскільки я маю сказати, це дійсно має сенс працювати, але я не маю досвіду його використання. Останній, так званий dirty_cat , виглядає досить перспективно і просто у використанні. Чи є надійним наявність невидимої кардинальної категорії у ваших даних тесту, мені не ясно!

PS: Я хотів би додати, що ідея міста щодо географічного розташування, наведена в першому коментарі, дуже приємна і насправді не складна, оскільки їх багато API Python, наприклад, Google або ТУТ, що дозволяє вам це зробити. Але зазначається, що це лише спосіб інженерії нових функцій і, звичайно, не замінений самою функцією міста.

Цікаві посилання для перевірки першого , другого , третього , четвертого (жодного конкретного замовлення!)

Усі вищезазначені моменти є практичними рішеннями, досить конкретно теоретично правильними, і, безумовно, підлягають подальшому обговоренню. І я більше ніж рада дізнатися більше.


1
Що щодо створення кластеризації подібних міст? Як навіть якщо у нас є нове місто, воно не відрізняється від того, що все, що ми вже маємо, ми можемо пересвідчитися з найближчим відповідним містом?
Адітя

Задоволення Адітя. Це також ще одна відмінна ідея. Я не знаю про нове "Кодування подібності", можливо, вони роблять абсолютно те саме. Перевірте їх підручник. Також бічне зауваження, що треба бути обережним, яку кластеризацію використовувати для категоричних даних, таких як k-режими, адже всі їх відстані не мають аналогічного значення, як числові значення.
TwinPenguins

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

Будь ласка. Про перепідготовку: це буквально означає починати заново, змішувати всі свої дані, переконуючись, що у вас є нові дані, і починати знову. Інший пункт, який ви згадали, що у вас немає справжньої мітки для конкретного нового пункту даних: це сама по собі історія. Що ви можете зробити для позначення цієї точки даних, це те, що більшість подібних точок даних і взяти мітку звідти, як дуже простий алгоритм KNN.
TwinPenguins

4

Найпростіша річ (яка зазвичай є хорошим місцем для початку) - це просто гаряче кодування ваших міст, де кожне місто стає єдиною особливістю і має значення або 1 (людина з цього міста), або 0 (а не з те місто). Якщо в тестовому наборі з’являється нове місто, яке відсутнє у навчальному наборі, у цієї особи просто буде 0 для всіх міст навчального набору. Це може здатися дивним, але якщо це місто не є в навчальному наборі, то не повинно бути важкої людини, яка перебуває з цього міста.

Наступним кроком буде щось, що пропонується з того, що запропонував Мохаммед Атхар, і отримати уявлення про географічну близькість до інших міст у вашому навчальному наборі. Це буде набагато складніше, тому я дозволю комусь ще прокоментувати це.


Починати з простого і рости звідти - чудова порада!
Ескахатор

0

Слід замовити Vowpal Wabbit , який дуже красиво обробляє нові функції, використовуючи хеш-трюк та адаптивну швидкість навчання.

Він не тільки не вийде з ладу, коли з’являться нові функції (у поїзді чи тестовому часі), але і почне оновлювати ваги на ньому. Крім того, його злий швидко. Однак він реалізує лише варіанти лінійної моделі, тому ви обмежені на цій стороні. Дуже потужний інструмент, про який потрібно знати

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.