Jak mogę dokonać klasyfikacji za pomocą danych kategorycznych, które nie zostały naprawione?

10

Mam problem z klasyfikacją zarówno danych kategorycznych, jak i liczbowych. Problem, z którym się zmagam, polega na tym, że moje dane kategoryczne nie są naprawione, co oznacza, że ​​nowy kandydat, którego etykietę chcę przewidzieć, może mieć nową kategorię, która nie była wcześniej obserwowana.

Na przykład, jeśli moje dane kategoryczne sexbyłyby female, jedynymi możliwymi etykietami byłyby malei otherbez względu na wszystko. Jednak moja zmienna kategorialna jest citytaka, że ​​może się zdarzyć, że osoba, którą próbuję przewidzieć, ma nowe miasto, którego mój klasyfikator nigdy nie widział.

Zastanawiam się, czy istnieje sposób na dokonanie klasyfikacji na tych warunkach, czy też powinienem ponownie przeprowadzić szkolenie, biorąc pod uwagę te nowe dane kategoryczne.

Marisa
źródło
1
czy możesz przekonwertować cityna liczbę opartą na jakiejś funkcji? W city' = f(latitude, longitude)ten sposób możesz stworzyć nową wartość dla dowolnego miasta
Mohammad Athar
@MohammadAthar tutaj dał idealne rozwiązanie, mam nadzieję, że OP to zobaczy!
Francesco Pegoraro

Odpowiedzi:

11

To bardzo dobre pytanie; w rzeczywistości ten problem istnieje już od jakiegoś czasu i nie znalazłem jeszcze idealnego rozwiązania. Jeszcze bardziej niż chętnie podzielę się moim doświadczeniem:

  • Unikaj kodowania „ na gorąco” tak często, jak to możliwe (w przeciwieństwie do tego, co sugerowano powyżej). Powodem jest to, że to nie zadziała. Model z funkcjami szybkiego kodowania działa tylko wtedy, gdy wszystkie dane podpoziomy istniały w danych szkoleniowych. Model nie będzie w stanie wykonać przewidywania, chyba że w jakiś sposób zostanie ręcznie poprawiony. Jeśli przeprowadzisz wyszukiwanie, zauważysz, że wiele osób napotkało ten problem podczas dzielenia danych na pociąg / test i napotkało problem niektórych podpoziomów określonej funkcji, które nie były obecne w podziale szkolenia, a następnie nie udało się przewidzieć na teście. Mówiąc na marginesie, jeśli masz bardzo wysokie cechy kardynalne (być może twoje miasto z, powiedzmy 200 nazwami miast), niepotrzebnie zwiększy to wymiar twoich danych! Jeśli z jakichś powodów może być konieczne jedno-kodowanie, pamiętaj o nich.
  • Użyj innych metod kodowania . Być może spróbuj dowiedzieć się więcej o innych metodach, które są odporne na ten problem, przynajmniej na razie jak na przykład kodowanie na podstawie celu, mieszanie (zobacz niektóre odnośniki poniżej). Jeśli korzystasz z Pythona, dostępna jest fajna oferta pakietowa . Możesz być zaskoczony, widząc, że inne proste metody często działają dobrze.

  • Przeszkol swój model . Teoretycznie podczas uczenia się twój zestaw / pociąg powinien mieć ten sam rozkład (przeważnie jest to uważane za rozkład docelowy, ale może być prawdziwe również w przypadku zmiennych). Teraz, gdy pojawiają się nowe elementy, zmieniła się Twoja testowa (niewidzialna) dystrybucja danych. Następnie najlepiej ponownie wyszkolić model, aby uwzględnić nowe miasta.

  • Umieść nowo dodane podkategorie (i najrzadziej) w innych . Podczas gdy wcześniejsza teza jest prawdziwa teoretycznie, jest bardzo prawdopodobne, że rozkład testów (tej konkretnej kategorii) nie zmieni się tak drastycznie w większości przypadków, np. Bardzo niewiele pozycji znajdzie się na szczycie kategorii w zestawie treningowym. Być może, jak w twoim przypadku, możesz mieć 100 miast w mieście, a z czasem pojawi się tylko kilka nowych. Rozważałbym przyjrzenie się kwantylowi X tej konkretnej kategorii i umieszczenie najmniejszych w podkategorii Inne . Zakładając, że nowo dodany punkt danych jest tylko niewielki, bardzo przejdzie do InnychGrupa. Z pewnością stracisz poziom szczegółowości, robiąc to, ale po raz kolejny chodzi o to, że nie tylko twój model uczy się danych szkoleniowych, ale co najważniejsze, aby móc bardzo dobrze uogólniać na niewidzialnych danych i jeśli te nowe dodane kategorie są bardzo punktami danych, grupowanie ich całkowicie w grupie Innych nie zaszkodzi.

  • Inne najnowsze jeszcze nie dojrzałe rozwiązania, takie jak Cat2Vec (wypożyczony z Word2Vec z NLP) lub kodowanie podobieństwa . Są to najnowsze, sprawdź artykuł dla pierwszego i jego github oraz przykład (oparty na Word2Vec) w Kaggle, a ten artykuł dla drugiego i jego implementacji . Ideą tego pierwszego jest konwersja kategorii na wektory. O ile muszę powiedzieć, to naprawdę ma sens praca, ale nie mam doświadczenia w korzystaniu z niej. Ten ostatni, tzw. Dirty_cat , wygląda dość obiecująco i jest łatwy w użyciu. To, czy dobrze jest mieć niewidoczną kategorię główną w danych testowych, nie jest dla mnie jasne!

PS: Chciałbym dodać, że pomysł miasta na lokalizację geograficzną podany w pierwszym komentarzu jest naprawdę fajny i nie jest tak naprawdę skomplikowany, ponieważ jest wiele API Pythona np. Google lub TUTAJ, które to umożliwiają. Należy jednak zauważyć, że jest to tylko sposób na zaprojektowanie nowych funkcji i na pewno nie zostanie zastąpiony przez samą funkcję miasta.

Ciekawe referencje do sprawdzenia pierwszego , drugiego , trzeciego , czwartego (bez konkretnej kolejności!)

Wszystkie wyżej wymienione punkty są praktycznymi rozwiązaniami raczej konkretnie poprawnymi teoretycznie i na pewno podlegają dalszym dyskusjom. Jestem więcej niż szczęśliwy, mogąc dowiedzieć się więcej.

TwinPenguins
źródło
1
Co z tworzeniem grup podobnych miast? Nawet jeśli mamy nowe miasto, to nie różni się od tego, co już mamy, możemy sprawdzić krzyżowo z najbliższym pasującym miastem?
Aditya
Przyjemność Aditya. To także kolejny doskonały pomysł. Nie wiem o nowym „Kodowaniu podobieństwa”, być może robią dokładnie to samo. Sprawdź ich samouczek. Na marginesie należy również zwrócić uwagę, że należy skupić się na klastrowaniu danych kategorycznych, takich jak tryby K, ponieważ ich odległości nie mają podobnego znaczenia jak wartości liczbowe.
TwinPenguins,
Dziękuję za wspaniałą odpowiedź. Jak mogę przeprowadzić przekwalifikowanie? Wyobraź sobie, że mam nowego kandydata i chcę przewidzieć, czy on / ona jest dobry czy zły, jak mogę przekwalifikować mój model, jeśli nie mam jego / jej prawdziwej etykiety wskazującej, czy jest dobry czy nie? Nie widzę sposobu, aby uwzględnić te nowe dane w celu ponownego przeszkolenia i nie będę mógł przewidzieć. Czy się mylę?
Marisa
Zapraszamy. O przekwalifikowaniu: oznacza to dosłownie zacząć od nowa, wymieszać wszystkie dane, upewniając się, że masz nowe dane i rozpocząć naukę od nowa. Drugi punkt, o którym wspomniałeś, że nie masz prawdziwej etykiety dla tego konkretnego nowego punktu danych: to zupełnie inna historia. To, co możesz zrobić, aby oznaczyć ten punkt danych, to wyszukiwanie tego najbardziej podobnego punktu danych i zabranie stąd etykiety jak bardzo prostego algorytmu KNN.
TwinPenguins,
4

Najprostszą rzeczą do zrobienia (co jest zwykle dobrym miejscem na początek) jest tylko szybkie zakodowanie swoich miast, w których każde miasto staje się pojedynczą cechą i ma wartości 1 (osoba jest z tego miasta) lub 0 (nie z to miasto). Jeśli nowe miasto pojawi się w zestawie testowym, którego nie ma w zestawie treningowym, osoba ta będzie miała po prostu zero dla wszystkich miast w zestawie treningowym. To może wydawać się dziwne, ale jeśli to miasto nie znajduje się w zestawie treningowym, to nie powinno być obciążenia dla osoby pochodzącej z tego miasta.

Następnym krokiem byłoby coś zgodnie z sugestią Mohammada Athara i poznanie geograficznej bliskości innych miast w zestawie treningowym. Będzie to o wiele bardziej skomplikowane, więc pozwolę komuś komentować.

DJBunk
źródło
Rozpoczynanie prostych i rozwijanie stamtąd jest świetną radą!
Escachator
0

Powinieneś sprawdzić Vowpal Wabbit , który obsługuje bardzo ładnie nowe funkcje za pomocą sztuczki hashującej i adaptacyjnych kursów uczenia się.

Nie tylko nie zawiesi się, gdy pojawią się nowe funkcje (w pociągu lub w czasie testu), ale także zacznie aktualizować na nim swoje wagi. Na dodatek jest to niegodziwy szybki. Jednak implementuje tylko warianty modelu liniowego, więc jesteś ograniczony po tej stronie. Bardzo potężne narzędzie, o którym warto wiedzieć

slymore
źródło