2016-03-06 13 views
11

Opracowuję narzędzie, które automatycznie przetwarza dane w formacie pandas.DataFrame. Podczas tego wstępnego etapu przetwarzania chcę inaczej traktować dane ciągłe i kategoryczne. W szczególności chcę móc zastosować np. Dane OneHotEncoder do danych kategorycznych.Co to jest dobry heurystyczny do wykrycia, czy kolumna w pandas.DataFrame jest kategoryczny?

Teraz załóżmy, że dostarczyliśmy pandas.DataFrame i nie mamy żadnych innych informacji o danych w DataFrame. Jaka jest dobra heurystyka do określenia, czy kolumna w pandas.DataFrame ma charakter kategoryczny?

Moje pierwsze myśli są:

1) Jeżeli istnieją ciągi w kolumnie (np typ danych kolumny jest object), następnie kolumna zawiera bardzo prawdopodobne dane kategoryczne

2) Jeżeli jakiś procent wartości w kolumnie są unikalne (np.> = 20%), a następnie kolumna bardzo prawdopodobnie zawiera ciągłe dane.

Znalazłem 1), aby działało poprawnie, ale 2) nie wyszło bardzo dobrze. Potrzebuję lepszej heurystyki. Jak rozwiązać ten problem?

Edytuj: Ktoś poprosił mnie o wyjaśnienie, dlaczego 2) nie działa dobrze. Było kilka przypadków testów, w których wciąż mieliśmy wartości ciągłe w kolumnie, ale w kolumnie nie było wielu unikatowych wartości. Heurystyka w 2) oczywiście nie powiodła się w tym przypadku. Były również problemy, w których mieliśmy kategoryczną kolumnę, która miała wiele, wiele unikalnych wartości, np. Nazwiska pasażerów w zestawie danych Titanica. Ten sam problem z błędami klasyfikacji kolumn.

+0

Uważam, że to pytanie jest prawie całkowicie nieokreślone. Jaki jest rozkład wszystkich zbiorów danych na świecie? Twoja reguła 1 niestety nie działa w przypadku usługi pocztowej lub książki telefonicznej. –

+3

Spróbuj [prawo Benforda] (https://en.wikipedia.org/wiki/Benford%27s_law), aby odróżnić dane liczbowe od kategorycznego. –

+0

@ Barmaley.exe Czy możesz rozwinąć ten pomysł, proszę? –

Odpowiedz

1

IMO przeciwna strategia, identyfikacja kategorii jest lepsza, ponieważ zależy od tego, o czym są dane. Technicznie adresowane dane mogą być uważane za nieuporządkowane dane kategoryczne, ale zazwyczaj nie używałbym ich w ten sposób.

Dla danych z ankiety należałoby szukać skal Likerta, np. 5-8 wartości, ciągi (które prawdopodobnie będą prawdopodobnie wymagały ustalonych (i przetłumaczonych) poziomów w celu wyszukania "dobrych", "złych", "zgodnych .", "bardzo. *", ...) lub wartości int w zakresie 0-8 + NA.

Kraje i takie rzeczy, może również być rozpoznawalne ...

grupach wiekowych ("-..") może również pracować.

8

Oto kilka podejść:

  1. Znajdź stosunek liczby unikalnych wartości do łącznej liczby unikalnych wartości.Coś jak na poniższym

    likely_cat = {} 
    for var in df.columns: 
        likely_cat[var] = 1.*df[var].nunique()/df[var].count() < 0.05 #or some other threshold 
    
  2. Sprawdź, czy top n unikalne wartości stanowią ponad pewnego odsetka wszystkich wartości

    top_n = 10 
    likely_cat = {} 
    for var in df.columns: 
        likely_cat[var] = 1.*df[var].value_counts(normalize=True).head(top_n) > 0.8 #or some other threshold 
    

Podejścia 1) na ogół sprawdziło się lepiej niż podejście 2). Ale podejście 2) jest lepsze, jeśli istnieje "rozkład o długim rozkładzie", w którym niewielka liczba zmiennych jakościowych ma wysoką częstotliwość, podczas gdy duża liczba zmiennych jakościowych ma niską częstotliwość.

1

Istnieje wiele miejsc, w których można "wykraść" definicje formatów, które można rzutować jako "liczbę". ##, # e- # będzie jednym z takich formatów, tylko po to, aby je zilustrować. Może uda Ci się znaleźć bibliotekę, aby to zrobić. Najpierw staram się rzucić wszystko na cyfry, a to, co zostało, no cóż, nie pozostało nic innego, jak zachować kategorię.

+0

Podoba mi się ten pomysł. Czy ktoś wie o takiej bibliotece? –

+0

Jeśli podoba ci się ten pomysł, rozważ dodanie odpowiedzi, aby była bardziej widoczna dla innych i mogłaby zasugerować bibliotekę. – Diego

1

Wydaje mi się, że prawdziwe pytanie brzmi: czy od czasu do czasu chcesz zawracać sobie głowę użytkownikiem, czy po cichu nie.

Jeśli nie przeszkadza ci w tym użytkownik, być może uda Ci się wykryć niejednoznaczność i popełnić błąd.

Jeśli nie masz nic przeciwko awarii w milczeniu, to twoje heurystyki są w porządku. Nie sądzę, że znajdziesz coś, co jest znacznie lepsze. Sądzę, że mógłbyś zrobić z tego problem naukowy, jeśli naprawdę chcesz. Pobierz kilka zestawów danych, załóżmy, że są zbiorowo reprezentatywne dla wszystkich zestawów danych na świecie i trenuj w oparciu o funkcje w każdym zbiorze danych/kolumnie, aby przewidzieć kategoryczne lub ciągłe.

Ale oczywiście w końcu nic nie może być idealne. Na przykład. czy kolumna [1, 8, 22, 8, 9, 8] odnosi się do godzin dnia czy do ras psów?

1

Myślałem o podobnym problemie i tym bardziej, że go uważam, wydaje się, że to samo w sobie jest problemem klasyfikacji, który może skorzystać na szkoleniu modelu.

założę jeśli badane kilka zestawów danych i ekstrakcji tych funkcji dla każdej kolumny/pandas.Series:

  • % pływaków: Procent wartości, które są pływak
  • % int: Procent wartości, które są liczbami
  • % łańcuch: procent wartości, które są łańcuchy
  • % unikalny łańcuch: liczba unikalnych ciąg wartości/całkowita liczba
  • % unikalne całkowite: całkowita liczba unikalnych Wartości/całkowita liczba
  • średnią wartość liczbową (wartości non numeryczne uważane 0 do tego)
  • std odchylenie od wartości liczbowych

i przeszkoleni modelu, to może uzyskać całkiem dobry wnioskowanie typów kolumn, gdzie możliwe wartości wyjściowe to: kategoryczne, porządkowe, ilościowe.

Nota boczna: jeśli chodzi o serię z ograniczoną liczbą wartości liczbowych, wydaje się, że interesującym problemem byłoby określenie kategoryczne vs porządkowe; nie boli myśl, że zmienna jest porządkowa, jeśli okaże się, że jest ilościowa, prawda? Etapy przetwarzania wstępnego zakodowałyby liczbowo wartości liczbowe bez żadnego gorącego kodowania.

Powiązany problem, który jest interesujący: biorąc pod uwagę grupę kolumn, czy można stwierdzić, czy są one już zafałszowane? Np. W konkursie kaggle przewidywania typu osłona lasu, automatycznie wiedziałbyś, że typ gleby jest jedną kategoryczną zmienną.

+0

> Powiązany problem, który jest interesujący: biorąc pod uwagę grupę kolumn, czy można stwierdzić, czy są one już zafałszowane? || Wymagałoby to kolumnowych metadanych. Zobacz https://github.com/pandas-dev/pandas/issues/3402 –