Funkcje kodowania, takie jak miesiąc i godzina, jako kategoryczne lub numeryczne?

23

Czy lepiej jest kodować funkcje takie jak miesiąc i godzina jako czynnik lub wartość liczbowa w modelu uczenia maszynowego?

Z jednej strony uważam, że kodowanie numeryczne może być rozsądne, ponieważ czas jest procesem postępowym (po piątym miesiącu następuje szósty miesiąc), ale z drugiej strony uważam, że kodowanie kategoryczne może być bardziej rozsądne z uwagi na cykliczność lat i dni (po 12 miesiącu następuje pierwszy).

Czy istnieje ogólne rozwiązanie lub konwencja?

juliański
źródło
Napotkałem ten sam problem podczas definiowania zmiennej godziny dnia (od 1 do 24) w modelu RF. Jeśli przekonwertuję zmienną na kategoryczną, funkcja VarImp pokazuje wartość ważności dla każdej godziny i wygląda na bardzo niezorganizowaną. Zastanawiam się tylko, czy konieczna jest konwersja zmiennej liczbowej typu „godzina dnia” na kategoryczną?
Mahmudur Rahman

Odpowiedzi:

19

Czy rozważałeś dodanie transformacji (sinus, cosinus) zmiennej pory dnia? Zapewni to, że na przykład 0 i 23 godziny są blisko siebie, umożliwiając w ten sposób cykliczny charakter zmiennej.

( Więcej informacji )

Pablo O
źródło
mam z tym problem, ponieważ jeśli to zrobię: sin (pi * X / 24) gdzie X w [0, 23] mamy taką samą ocenę dla 6 rano i 18:00 jak sin (pi * 6/24) == sin (pi * 18/24). ale są to zupełnie inne godziny
Eran Moshe
Można wykonać cykl w następujący sposób: sin (pi * X / 12). Dzięki Eran:]
Eran Moshe
@EranMoshe fyi w poście z powyższego linku zamiast tego używają współczynnika 2 * pi, więc byłby to grzech (2 * pi * X / 12) - podają uzasadnienie tego w komentarzach
tsando
I jego (2 * pi X / 24), który jest (pi X / 12):] Jak widzisz, zmagałem się z dokładnie tym samym problemem, autor blog.davidkaleko.com/feature-engineering-cyclical-features.html walczył z. A w komentarzach widać, że „Mariel G” poprawia go dokładnie tak, jak sobie uświadomiłem: pi * X / 12 będzie krążył przez całą godzinę. Dowiedziałem się również, że musisz wziąć to za cos i grzech, aby zdefiniować prawdziwy okres 24 godzin! (potrzebujesz prawdziwego koła, a nie tylko funkcji okresowej)
Eran Moshe
@EranMoshe ah tak, jeśli chcesz robić ponad godziny, możesz to zmniejszyć do piX / 12, ale jeśli chcesz robić miesiące, to byłoby 2piX / 12, czyli pi / 6. Ogólnie rzecz biorąc, byłoby to 2piX / okres
tsando
9

Odpowiedź zależy od rodzaju relacji, które chcesz reprezentować między funkcją czasu a zmienną docelową.

Jeśli kodujesz czas jako wartość liczbową, wówczas nakładasz pewne ograniczenia na model. W przypadku modelu regresji liniowej wpływ czasu jest teraz monotoniczny, albo cel wzrośnie lub zmniejszy się z czasem. W przypadku drzew decyzyjnych wartości czasu blisko siebie zostaną zgrupowane.

Czas kodowania jako kategoryczny daje modelowi większą elastyczność, ale w niektórych przypadkach model może nie mieć wystarczającej ilości danych, aby dobrze się uczyć. Jedną z technik, która może być przydatna, jest grupowanie wartości czasu w pewną liczbę zestawów i użycie zestawu jako atrybutu kategorycznego.

Niektóre przykładowe grupy:

  • Na miesiąc pogrupuj w kwartały lub pory roku, w zależności od przypadku użycia. Np .: styczeń-marzec, kwiecień-czerwiec itp.
  • W przypadku godziny pogrupuj w przedziały czasu: rano, wieczorem itp.
  • Na dzień tygodnia grupuj w dzień powszedni, weekend.

Każde z powyższych można również zastosować bezpośrednio jako atrybut kategoryczny, biorąc pod uwagę wystarczającą ilość danych. Co więcej, grupy można również odkryć poprzez analizę danych, aby uzupełnić podejście oparte na wiedzy w dziedzinie.

raghu
źródło
4

Polecam korzystanie z funkcji numerycznych. Korzystanie z funkcji kategorialnych zasadniczo oznacza, że ​​nie uznajesz odległości między dwiema kategoriami za istotne (np. Kategoria 1 jest tak bliska kategorii 2, jak kategorii 3). Z pewnością nie dzieje się tak przez kilka godzin lub miesięcy.

Jednak podnoszona przez ciebie kwestia polega na tym, że chcesz reprezentować godziny i miesiące w sposób, w którym 12 jest tak bliskie 11, jak to jest 1. Aby to osiągnąć, zalecam postępować zgodnie z sugestiami i używać funkcja sinus / cosinus przed użyciem godzin / miesięcy jako funkcji numerycznych.

Tanguy Coatalem
źródło
3

To zależy od używanego algorytmu.

Jeśli używasz algorytmów opartych na drzewach, takich jak losowy las, po prostu przekaż to pytanie. Kodowanie kategoryczne nie jest konieczne w przypadku algorytmów opartych na drzewach.

W przypadku innych algorytmów, takich jak sieć neuronowa, sugeruję wypróbowanie obu metod (ciągłej i kategorycznej). Efekt różni się w zależności od sytuacji.

Lodowate
źródło
To zależy od implementacji opartej na drzewie. Powszechnie używane pakiety, takie jak scikit-learn i xgboost, nie rozpoznają zmiennych kategorialnych. Oczekuje się, że będziesz je kodować na gorąco.
Ricardo Cruz
Z tego postu: towardsdatascience.com/… nie powinieneś używać jednego „gorącego” do czegokolwiek opartego na drzewach decyzyjnych, a właściwie tego właśnie dowiaduję się na własnej skórze .
ashley
1

Ponieważ wszystkie dane, które posiadasz, są dobrze zdefiniowane, sugeruję kodowanie kategoryczne, które jest również łatwiejsze do zastosowania.

simonepi
źródło
1

Przeformułować odpowiedź udzieloną przez @raghu . Jedną z głównych różnic między kategorycznymi i liczbowymi cechami jest to, czy wielkość liczb jest porównywalna, tj. Czy 2019 jest większy niż 2018, czy też grudzień (12) większy niż marzec (3)? Nie całkiem. Chociaż w tych liczbach występuje sekwencja, ich wielkość nie jest porównywalna. Dlatego przekształcenie w wartość kategoryczną może mieć większy sens.

CathyQian
źródło