2014-04-24 2 views
5

Mes données se composent d'un mélange de fonctionnalités continues et catégorielles. Voici un petit extrait de ce que donne mes données comme dans le format csv (Considérez que les données recueillies par une chaîne super magasin qui exploite des magasins dans différentes villes)Comment discrétiser des attributs continus dans 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 

Elle vous pouvez voir que avg_income_in_city, square_feet_of_store_area et avg_revenue sont des valeurs continues où city, store_type etc sont des classes catégoriques (et quelques autres que je n'ai pas montrées ici pour maintenir la brièveté des données). Je souhaite modéliser les données afin de prédire le chiffre d'affaires. La question est comment «Discrétiser» les valeurs continues en utilisant sklearn? Est-ce que sklearn fournit une classe/méthode "readymade" pour la discrétisation des valeurs continues? (Comme nous l'avons à Orange par exemple Orange.Preprocessor_discretize (données, méthode = orange.EntropyDiscretization())

Merci!

+1

Je ne vois pas pourquoi vous devriez bin/discrétiser les variables continues. C'est jeter l'information. –

+0

Je suppose que cela dépend du type de données que vous utilisez et de la manière dont les mécanismes subséquents dans votre pipeline exploitent ces informations. Parfois, la quantification vectorielle ou généralement le regroupement en tant que pré-traitement peut rendre les représentations beaucoup plus stables. – eickenberg

Répondre

4

Vous pouvez également envisager de rendre les variables qualitatives numériques, par exemple via des variables d'indicateur, une procédure également connue comme un codage à chaud

Essayez

from sklearn.preprocessing import OneHotEncoder 

et l'adapter aux données catégoriques, suivie d'une méthode d'estimation numérique comme la régression linéaire . Tant qu'il n'y a pas trop de catégories (la ville peut être un peu trop), cela peut bien fonctionner. En ce qui concerne la discrétisation des variables continues, vous pouvez envisager un regroupement en utilisant une taille de bac adaptée, ou, de manière équivalente, un regroupement uniforme après la normalisation de l'histogramme. numpy.histogram peut être utile ici. En outre, alors que le clustering Fayyad-Irani n'est pas implémenté dans sklearn, n'hésitez pas à consulter sklearn.cluster pour les discrétisations adaptatives de vos données (même si ce n'est que 1D), par ex. via les KMeans.

+0

Je cherchais un cours prêt à l'emploi dans sklearn mais j'ai l'impression qu'il n'y en a pas un déjà fait. Je vais faire quelques _binning_ de valeurs continues (avec un peu d'algo en cluster) et ajuster les données, mais encore une fois c'est du travail! –

+1

Vous pouvez essayer ['numpy.histogram'] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.html). Je ne suis pas sûr s'il existe des moyens intelligents/efficaces pour calculer les histogrammes qui fonctionnent bien pour la recherche d'information. – eickenberg

7

La réponse est non. Il n'y a pas de binning dans scikit-learn. Comme l'a dit eickenberg, vous pouvez utiliser np.histogram. Les fonctionnalités de scikit-learn sont supposées continues, non discrètes. La principale raison pour laquelle il n'y a pas de binning est probablement que la plupart des sklearn sont développés sur du texte, des objets d'image ou des jeux de données de la communauté scientifique. Dans ces paramètres, le binning est rarement utile. Connaissez-vous un ensemble de données librement disponible où binning est vraiment bénéfique?

+0

Cela ressemble à la réponse réelle à la question, c'est-à-dire "Non". – eickenberg

+0

Salut Andreas, je n'ai pas essayé moi-même de catégoriser des ensembles de données librement disponibles, cependant vous pouvez vérifier 'Titanic Data Set' où Sex, Class etc sont des caractéristiques catégoriques et Age est un nombre réel.L'ensemble de données classe la classe survived = yes/no, ce qui est encore une fois catégorique. Dans ce cas, si vous devez exécuter un algorithme de classification (un tel arbre de décision), cela aura du sens pour _bin_ la fonction 'Age' Cela aide-t-il? –

+2

En fait, je ne pense pas que le binning ait un sens avec les arbres, mais cela pourrait aider avec les classificateurs linéaires sur cet ensemble de données. –

0

vous pourriez en utilisant pandas.cut méthode, comme ceci:

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] 
Questions connexes