2014-04-24 20 views
5

Moje dane składają się z kombinacji cech ciągłych i kategorycznych. Poniżej znajduje się niewielki fragment jak moje dane wygląda w formacie csv (traktować je jako dane zebrane przez super sieci sklepów, która funkcjonuje do sklepów w różnych miastach)Jak dokonać dyskretyzacji atrybutów ciągłych w sklearn?

city,avg_income_in_city,population,square_feet_of_store_area, store_type ,avg_revenue 
NY ,54504   , 3506908 ,3006      ,INDOOR , 8000091 
CH ,44504   , 2505901 ,4098      ,INDOOR , 4000091 
HS ,50134   , 3206911 ,1800      ,KIOSK  , 7004567 
NY ,54504   , 3506908 ,1000      ,KIOSK  , 2000091 

Ją widać, że avg_income_in_city, square_feet_of_store_area i avg_revenue są wartościami ciągłymi, gdy jako miasto, typ sklepu itp. są klasy kategoryczne (i kilka innych, których tu nie pokazałem, aby zachować zwięzłość danych).

Chcę modelować dane w celu przewidywania przychodów. Pytanie brzmi: jak "dyskretyzować" wartości ciągłe za pomocą sklearna? Czy sklearn zapewnia jakąkolwiek "gotową" klasę/metodę dyskretyzacji wartości ciągłych? (Tak jak mamy w Orange (np Orange.Preprocessor_discretize danych, metody = orange.EntropyDiscretization())

Dzięki!

+1

nie widzę dlaczego należy bin/dyskretyzacji zmiennych ciągłych. To wyrzuca informacje. –

+0

Sądzę, że zależy to od rodzaju danych, z którymi pracujesz i od tego, w jaki sposób dobre późniejsze mechanizmy są w trakcie wykorzystywania tych informacji. Czasami kwantyzacja wektorowa lub ogólnie tworzenie klastrów jako preprocessing może uczynić reprezentacje o wiele bardziej stabilnymi. – eickenberg

Odpowiedz

4

Można również rozważyć renderowania zmienne kategoryczne liczbowy, np poprzez zmienne wskaźnikowe, procedura znana także jak jeden gorący kodowania

Spróbuj

from sklearn.preprocessing import OneHotEncoder 

i dopasować go do swoich danych kategorycznych, a następnie za pomocą numerycznej metody szacowania takich jak regresji liniowej . Dopóki nie ma zbyt wielu kategorii (miasto może być trochę za dużo), to może działać dobrze.

Jeśli chodzi o dyskretyzację zmiennych ciągłych, można rozważyć binowanie przy użyciu dostosowanego rozmiaru bin, lub równoważnie, jednolite binning po normalizacji histogramu. numpy.histogram może być pomocne tutaj. Ponadto, jeśli klastrowanie Fayyad-Irani nie jest zaimplementowane w sklearn, możesz sprawdzić, czy dane są adaptacyjne (nawet jeśli jest to tylko 1D). przez KMeans.

+0

Szukałem gotowej klasy w sklearn, ale wygląda na to, że nie ma gotowego. Zrobię kilka _ ciągłych wartości (z niektórymi grupowymi algo) i dopasuję dane, ale znowu to trochę pracy! –

+1

Możesz spróbować ['numpy.histogram'] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.html). Nie jestem pewien, czy istnieją inteligentne/skuteczne sposoby obliczania histogramów, które sprawdzają się w wyszukiwaniu informacji. – eickenberg

7

Odpowiedź brzmi: nie. Nie ma binningu w nauce scikita. Jak powiedział eickenberg, możesz użyć np.histogramu. Funkcje uczenia się przez scikit są uważane za ciągłe, a nie dyskretne. Głównym powodem, dla którego nie ma binningu, jest prawdopodobnie to, że większość sklearn została opracowana na podstawie tekstu, obrazów lub zbioru danych ze społeczności naukowej. W tych ustawieniach kojarzenie jest rzadko pomocne. Czy znasz wolny zestaw danych, w którym binning jest naprawdę korzystny?

+0

To brzmi jak prawdziwa odpowiedź na pytanie, tj. "Nie". – eickenberg

+0

Cześć Andreas, nie próbowałem binning na dowolnie swobodnie dostępnych zestawach danych, ale można sprawdzić "Zestaw danych Titanic" gdzie Sex, Class itp są kategoryczne cechy i Wiek jest liczbą rzeczywistą.Zestaw danych kategoryzuje klasę przeżyty = tak/nie, co ponownie jest kategoryczne. W takim przypadku, jeśli musisz uruchomić algorytm klasyfikacji (takie drzewo decyzyjne), będzie to miało znaczenie dla _bin_ funkcji "Wiek" Czy to pomaga? –

+2

Nie sądzę, że binning ma sens w przypadku drzew, ale może pomóc w przypadku liniowych klasyfikatorów w tym zestawie danych. –

0

można za pomocą pandas.cut metody tak:

bins = [0, 4, 10, 30, 45, 99999] 
labels = ['Very_Low_Fare', 'Low_Fare', 'Med_Fare', 'High_Fare','Very_High_Fare'] 
train_orig.Fare[:10] 
Out[0]: 
0  7.2500 
1 71.2833 
2  7.9250 
3 53.1000 
4  8.0500 
5  8.4583 
6 51.8625 
7 21.0750 
8 11.1333 
9 30.0708 
Name: Fare, dtype: float64 

pd.cut(train_orig.Fare, bins=bins, labels=labels)[:10] 
Out[50]: 
0   Low_Fare 
1 Very_High_Fare 
2   Low_Fare 
3 Very_High_Fare 
4   Low_Fare 
5   Low_Fare 
6 Very_High_Fare 
7   Med_Fare 
8   Med_Fare 
9   High_Fare 
Name: Fare, dtype: category 
Categories (5, object): [High_Fare < Low_Fare < Med_Fare < Very_High_Fare < Very_Low_Fare]