3

Les objectifs principaux sont les suivants:prétraitement d'entité de deux variables continues et (de type entier) avec scikit-learn

1) Appliquer StandardScaler à variables continues

2) Appliquer LabelEncoder et OnehotEncoder à catégorique variables

Les variables continues doivent être mises à l'échelle, mais en même temps, quelques variables catégorielles sont également de type entier. L'application de StandardScaler entraînerait des effets indésirables. D'un autre côté, le StandardScaler mettrait à l'échelle les variables catégorielles basées sur des entiers, ce qui n'est pas non plus ce que nous voulons.

Puisque les variables continues et les variables catégorielles sont mélangées dans un seul DataFrame Pandas, quel est le flux de travail recommandé pour aborder ce type de problème?

Le meilleur exemple pour illustrer mon propos est le jeu de données Kaggle Bike Sharing Demand, où season et weather sont des nombres entiers variables

+0

Comme 'StandardScalar' fonctionne par colonne, je ne pense pas qu'il fera quoi que ce soit pour les variables codées à chaud unique. Avez-vous essayé de faire ce qui précède pour cette seule Dataframe? Avez-vous trouvé le comportement avec lequel vous sembliez avoir des problèmes? –

+0

Les variables codées à chaud unique sont identiques à celles du type entier. Si vous les avez concaténés ensemble, pourquoi voudriez-vous qu'ils fassent les choses différemment? S'ils se comportent de la même manière, que pensez-vous qu'il se passerait s'il y avait une variable qui n'est pas catégorique mais numérique et qui a une valeur de 1 ou 0, puis utilise le scalaire? –

+0

J'ai essayé, apparemment, il a tout fait évoluer quelles que soient les valeurs qu'ils ont supposé. Pourriez-vous s'il vous plaît appliquer 'StandardScaler(). Fit_transform (df)' sur ce jeu de données Bike et me dire le contraire? –

Répondre

6

Vérifiez la méta-transformateur sklearn_pandas.DataFrameMapper. Utilisez-le comme la première étape de votre pipeline pour effectuer des données sage colonne opérations d'ingénierie:

mapper = DataFrameMapper(
    [(continuous_col, StandardScaler()) for continuous_col in continuous_cols] + 
    [(categorical_col, LabelBinarizer()) for categorical_col in categorical_cols] 
) 
pipeline = Pipeline(
    ("mapper", mapper) 
) 
pipeline.fit_transform(df, df["y"]) 

En outre, vous devez utiliser sklearn.preprocessing.LabelBinarizer au lieu d'une liste de [LabelEncoder(), OneHotEncoder()].

+0

'sklearn_pandas.DataFrameMapper' est génial et vaut vraiment le détour. Merci de me le faire savoir. Mais selon la documentation, 'LabelBinarizer' devrait être utilisé dans le cas où vous avez une variable cible avec plusieurs valeurs, par opposition à plusieurs variables ayant chacune un ensemble de valeurs différentes, non? Je ne sais pas si je l'obtiens ou non. –

+0

Le 'LabelBinarizer' est le bon choix pour l'encodage des colonnes de chaînes - il traduira d'abord les chaînes en entiers, puis binarise ces entiers en vecteurs binaires. Il fait tout en une fois. Pas besoin de diviser ce "workflow" entre deux étapes du transformateur (ie 'LabelEncoder' plus' OneHotEncoder'). Essayez-le avec des données réelles, et vous l'aimerez. – user1808924