3
votes

ColumnTransformer: données 1D transmises à un transformateur qui attend des données 2D

C'est la première fois que j'utilise ColumnTransformer et je rencontre un problème avec la dimension du tableau.

Voici mon dataframe appelé 'concat_data':

StandardScaler().fit(concat_data[['Observation']])

J'essaie d'appliquer un scaler standard uniquement sur la colonne Observation avec le code suivant:

preprocessor = ColumnTransformer(
        transformers=[
            ('num', StandardScaler(), ['Observation'])],
        remainder="passthrough")

preprocessor.fit(concat_data, concat_data['Observation'])

Je reçois ce message d'erreur:

ValueError: données 1D transmises à un transformateur qui attend des données 2D. Essayer pour spécifier la sélection de colonne sous la forme d'une liste d'un élément au lieu d'un scalaire.

Je pourrais le faire sans ColumnTransformer mais mon objectif est de comprendre comment fonctionne ColumnTransformer. Par exemple, ce code fonctionne:

          Date  Hour  Observation
0  01/09/2015      0           10
1  01/09/2015      1            9
2  01/09/2015      2            8
3  01/09/2015      3           10
4  01/09/2015      4           12

Merci à tous!


1 commentaires

Je ne suis pas en mesure de reproduire cela. Sur mon système, le code que vous avez publié fonctionne bien pour ColumnTransformer . L'erreur suggère d'utiliser une liste d'éléments uniques. Mais dans votre code, vous le faites déjà dans ['Observation'] . Alors, êtes-vous sûr d'utiliser le même code? Essayez de mettre à jour la version de scikit-learn vers la dernière.


3 Réponses :


-1
votes

preprocessor.fit (concat_data, concat_data)

preprocessor.fit (concat_data, concat_data [['Observation']])

Peut également être utile: exemple d'utilisation du ColumnTransformer

À propos de l'utilisation de df ['A'] et df [['A']]

Dans un cas, vous avez toujours un pd.DataFrame - en utilisant df [['A']] , dans l'autre cas, il est pressé sur pd.Series - df ['A'] . p>

pd.Series est considéré comme un objet 1D, car il est autorisé à avoir une colonne; pd.DataFrame est un objet 2D, autorisé à avoir plusieurs colonnes et traité en conséquence.

type(df['A'])

Sortie [27]: pandas.core.frame.DataFrame

df = pd.DataFrame(data=[[1,2,3,4,5],[5,4,3,2,1]],index=[0,1],columns=['A','B','C','D','E'])

type(df[['A']])

Sortie [28]: pandas.core .series.Series

La sortie pour les deux cas est également légèrement différente.


3 commentaires

Bien que votre explication sur la forme DataFrame soit correcte, mais dans votre réponse, vous modifiez le deuxième paramètre, c'est-à-dire y en 2D contre 1-d. y est un paramètre facultatif, qui n'est pas requis par StandardScaler, donc également non utilisé par ColumnTransformer même si vous y envoyez 2-d ou 1-d. Il ne sera pas utilisé et le problème n'est pas lié à cela.


Pourriez-vous s'il vous plaît étendre ce que vous voulez dire exactement? La question ne concerne pas le StandardScaler, mais plutôt le ColumnTransformer.


Oui. Mais lorsque vous dites essayer ceci ou cela , vous modifiez le deuxième paramètre d'entrée qui dans ColumnTransformer est y et optionnel. Donc, à moins que l'objet interne, (le StandardScaler ) l'utilise, il ne sera pas utilisé. Le problème OP ayant est pour la première entrée, à savoir X . Donc vos suggestions ne sont pas pertinentes à cela



-3
votes

Artur Sokolovsky, j'ai aussi essayé l'exemple de scikit-learn et cela n'a pas fonctionné non plus

Comme Vivek Kumar l'a suggéré, le problème était dû à une ancienne version de scikit-learn. La mise à jour vers la version 0.20.02 a résolu le problème.


0 commentaires

-1
votes

Vous devez utiliser preprocessor.fit (concat_data) directement et cela fonctionnera, le ColumnTransformer n'attend qu'un seul DataFrame et non deux. Et il recherchera automatiquement la colonne Observation


0 commentaires