Mam problem z zastosowaniem drzewa decyzyjnego / losowego lasu. Próbuję dopasować problem, który zawiera zarówno liczby, jak i ciągi znaków (takie jak nazwa kraju). Teraz biblioteka scikit-learn przyjmuje tylko liczby jako parametry, ale chcę wstrzyknąć ciągi, a także niosą one znaczną ilość wiedzy.
Jak poradzić sobie z takim scenariuszem?
Mogę przekonwertować ciąg na liczby za pomocą jakiegoś mechanizmu, takiego jak haszowanie w Pythonie. Chciałbym jednak poznać najlepsze praktyki dotyczące obsługi łańcuchów w problemach drzewa decyzyjnego.
machine-learning
python
scikit-learn
random-forest
decision-trees
użytkownik3001408
źródło
źródło
Odpowiedzi:
W większości uznanych systemów uczenia maszynowego zmienne jakościowe są obsługiwane naturalnie. Na przykład w R użyłbyś czynników, w WEKA użyłbyś zmiennych nominalnych. Nie jest tak w przypadku scikit-learn. Drzewa decyzyjne zaimplementowane w scikit-learn używają tylko cech numerycznych i te cechy są zawsze interpretowane jako ciągłe zmienne numeryczne .
Dlatego też należy unikać zastępowania ciągów kodem skrótu, ponieważ uważane za ciągłą funkcję numeryczną, każde kodowanie, którego użyjesz, spowoduje powstanie kolejności, która po prostu nie istnieje w twoich danych.
Jednym z przykładów jest kodowanie [„czerwony”, „zielony”, „niebieski”] za pomocą [1,2,3], powodowałoby dziwne rzeczy, takie jak „czerwony” jest niższy niż „niebieski”, a jeśli przeciętny „czerwony” i „niebieski” dostaniesz „zielony”. Kolejny bardziej subtelny przykład może się zdarzyć, gdy kodujesz [„niski”, „średni”, „wysoki”] za pomocą [1,2,3]. W tym drugim przypadku może się zdarzyć, że ma uporządkowanie, które ma sens, jednak mogą wystąpić pewne subtelne niespójności, gdy „średni” nie znajduje się w środku „niskiego” i „wysokiego”.
Wreszcie, odpowiedź na twoje pytanie polega na zakodowaniu funkcji kategorialnej na wiele funkcji binarnych . Na przykład możesz zakodować [„czerwony”, „zielony”, „niebieski”] za pomocą 3 kolumn, po jednej dla każdej kategorii, mających 1, gdy kategoria się zgadza, a 0 w przeciwnym razie. Nazywa się to kodowaniem „na gorąco”, kodowaniem binarnym, kodowaniem „k” lub czymkolwiek. Tutaj możesz sprawdzić dokumentację dotyczącą kodowania funkcji kategorycznych i wyodrębniania funkcji - mieszania i dyktowania . Oczywiście kodowanie „na gorąco” zwiększy twoje wymagania dotyczące miejsca, a czasem także obniży wydajność.
źródło
Musisz zakodować swoje ciągi jako funkcje numeryczne, których może używać sci-kit dla algorytmów ML. Ta funkcja jest obsługiwana w module przetwarzania wstępnego (np. Patrz sklearn.preprocessing.LabelEncoder na przykład).
źródło
Zwykle powinieneś zakodować zmienne jakościowe w trybie „na gorąco” dla modeli scikit-learn, w tym losowego lasu. Losowy las często będzie działał poprawnie bez kodowania na gorąco, ale zwykle działa lepiej, jeśli wykonasz kodowanie na gorąco. Jednorazowe kodowanie i zmienne „obojętne” oznaczają w tym kontekście to samo. Scikit-learn ma sklearn.preprocessing.OneHotEncoder, a Pandas ma pandas.get_dummies, aby to osiągnąć.
Istnieją jednak alternatywy. Artykuł „Beyond One-Hot” w KDnuggets doskonale wyjaśnia, dlaczego trzeba kodować zmienne kategorialne i alternatywy dla kodowania one-hot.
Istnieją alternatywne implementacje losowego lasu, które nie wymagają jednorazowego kodowania, takie jak R lub H2O. Wdrożenie w języku R jest drogie obliczeniowo i nie będzie działać, jeśli twoje funkcje mają wiele kategorii . H2O będzie działać z dużą liczbą kategorii. Continuum udostępniło H2O w Anaconda Python.
Istnieje ciągły wysiłek, aby scikit-learn bezpośrednio obsługiwać kategorycznych możliwości .
W tym artykule wyjaśniono algorytm zastosowany w H2O. Odwołuje się do akademickiego artykułu A Streaming Parallel Decision Tree Algorytm i dłuższej wersji tego samego artykułu.
źródło
Aktualizacja 2018!
Możesz utworzyć przestrzeń osadzania (gęsty wektor) dla swoich zmiennych kategorialnych. Wielu z was zna word2vec i fastext, które osadzają słowa w znaczącej, gęstej przestrzeni wektorowej. Ten sam pomysł tutaj - twoje zmienne kategorialne zostaną zmapowane na wektor o pewnym znaczeniu.
Z artykułu Guo / Berkhahn :
Autorzy stwierdzili, że reprezentacja zmiennych kategorialnych w ten sposób poprawiła efektywność wszystkich testowanych algorytmów uczenia maszynowego, w tym losowego lasu.
Najlepszym przykładem może być zastosowanie techniki Pinteresta do grupowania powiązanych Pinów:
Ludzie w fastai wdrożyli kategoryczne osadzanie i stworzyli bardzo fajny post na blogu z towarzyszącym notatnikiem demo .
Dodatkowe informacje i objaśnienia
Sieć neuronowa służy do tworzenia osadzeń, tj. Przypisuje wektor do każdej wartości jakościowej. Po uzyskaniu wektorów można ich używać w dowolnym modelu, który akceptuje wartości liczbowe. Każdy element wektora staje się zmienną wejściową. Na przykład, jeśli użyjesz wektorów 3-D, aby osadzić kategoryczną listę kolorów, możesz otrzymać coś takiego: czerwony = (0, 1,5, -2,3), niebieski = (1, 1, 0) itd. Użyłbyś trzech zmienne wejściowe w losowym lesie odpowiadające trzem składnikom. W przypadku rzeczy czerwonych c1 = 0, c2 = 1,5, a c3 = -2,3. Dla rzeczy niebieskich c1 = 1, c2 = 1, a c3 = 0.
W rzeczywistości nie musisz używać sieci neuronowej do tworzenia osadzeń (chociaż nie polecam unikania tej techniki). Jeśli to możliwe, możesz tworzyć własne osadzenia ręcznie lub w inny sposób. Kilka przykładów:
źródło
(0, 1.5, -2.3)
, niebieski =(1, 1, 0)
itd. W losowym lesie użyłbyś trzech zmiennych wejściowych odpowiadających trzem składnikom. W przypadku rzeczy czerwonych c1 = 0, c2 = 1,5, a c3 = -2,3. W przypadku rzeczy niebieskich c1 = 1, c2 = 1, a c3 = 0.W takich scenariuszach można używać zmiennych zastępczych. Za pomocą panda
panda.get_dummies
możesz tworzyć zmienne obojętne dla ciągów, które chcesz umieścić w drzewie decyzyjnym lub w losowym lesie.Przykład:
źródło
Zmień je na liczby, na przykład dla każdego unikalnego kraju, przypisując unikalny numer (np. 1,2,3 i ...)
również nie trzeba używać One-hot kodowania (zmienne aka manekin) podczas pracy z lasu losowego, ponieważ drzewa nie działają podobnie jak inne algorytmu (takich jak liniowy / regresji logistycznej) i nie działają przez odległe (oni pracować nad znalezieniem dobrego podziału dla swoich funkcji), więc NIE POTRZEBUJESZ kodowania One-Hot
źródło