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 sex
byłyby female
, jedynymi możliwymi etykietami byłyby male
i other
bez względu na wszystko. Jednak moja zmienna kategorialna jest city
taka, ż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.
city
na liczbę opartą na jakiejś funkcji? Wcity' = f(latitude, longitude)
ten sposób możesz stworzyć nową wartość dla dowolnego miastaOdpowiedzi:
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:
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.
źródło
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ć.
źródło
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ć
źródło