2016-07-27 13 views
1

Ich konnte das Beispiel in der Github Repo replizieren reproduzieren. Als ich jedoch meine eigenen Daten ausprobierte, bekam ich den ValueError.Sklearn-Pandas DataFrameMapper: Mapper.Fit_Transform gibt ValueError: schlechte Eingabe Shape (8, 2)

Unten ist ein Dummy-Daten, die den gleichen Fehler wie meine echten Daten gibt.

import pandas as pd 
import numpy as np 
from sklearn_pandas import DataFrameMapper 
from sklearn.preprocessing import LabelEncoder, StandardScaler, MinMaxScaler 

data = pd.DataFrame({'pet':['cat', 'dog', 'dog', 'fish', 'cat', 'dog','cat','fish'], 'children': [4., 6, 3, 3, 2, 3, 5, 4], 'salary': [90, 24, 44, 27, 32, 59, 36, 27], 'feat4': ['linear', 'circle', 'linear', 'linear', 'linear', 'circle', 'circle', 'linear']}) 

mapper = DataFrameMapper([ 
    (['pet', 'feat4'], LabelEncoder()), 
    (['children', 'salary'], [StandardScaler(), 
           MinMaxScaler()]) 
]) 

np.round(mapper.fit_transform(data.copy()),2) 

Unten finden Sie die Fehler


ValueError Traceback (most recent call last) in() ----> 1 np.round(mapper.fit_transform(data.copy()),2)

C:\Users\E245713\AppData\Local\Continuum\Anaconda3\lib\site-packages\sklearn\base.py in fit_transform(self, X, y, **fit_params) 453 if y is None: 454 # fit method of arity 1 (unsupervised transformation) --> 455 return self.fit(X, **fit_params).transform(X) 456 else: 457 # fit method of arity 2 (supervised transformation)

C:\Users\E245713\AppData\Local\Continuum\Anaconda3\lib\site-packages\sklearn_pandas\dataframe_mapper.py in fit(self, X, y) 95 for columns, transformers in self.features: 96 if transformers is not None: ---> 97 transformers.fit(self._get_col_subset(X, columns)) 98 return self 99

C:\Users\E245713\AppData\Local\Continuum\Anaconda3\lib\site-packages\sklearn\preprocessing\label.py in fit(self, y) 106 self : returns an instance of self. 107 """ --> 108 y = column_or_1d(y, warn=True) 109 _check_numpy_unicode_bug(y) 110 self.classes_ = np.unique(y)

C:\Users\E245713\AppData\Local\Continuum\Anaconda3\lib\site-packages\sklearn\utils\validation.py in column_or_1d(y, warn) 549 return np.ravel(y) 550 --> 551 raise ValueError("bad input shape {0}".format(shape)) 552 553

ValueError: bad input shape (8, 2)

Kann jemand helfen?

dank

Antwort

3

Sie sollten nur mehrere Arrays zu einer Transformation einreichen, wenn es in der Tat mehrere Eingänge (z sklearn.decomposition.PCA (1) in der Dokumentation) führt. In Ihrem Fall letztlich der Fehler aus dieser Linie kommt:

(['pet', 'feat4'], LabelEncoder()), 

Auch funktioniert das nicht:

(['pet', 'feat4'], [LabelEncoder(), LabelEncoder()]), 

Sie müssen stattdessen so etwas tun:

mapper_good = DataFrameMapper([ 
(['pet'], LabelEncoder()), 
(['feat4'], LabelEncoder()), 
(['children'], StandardScaler()), 
(['salary'], MinMaxScaler()) 
]) 

np.round(mapper_good.fit_transform(data.copy()),2) 
+0

Dank @ Jeff carey ! Ich vermutete, dass mein Fehler von dieser Zeile kam, konnte aber nicht herausfinden warum. Ich wurde auf den Teil des Dokuments fixiert, der besagt, dass man mehrere Spalten mit einem Transformator machen kann. Ich schätze, das hängt vom Transformator ab ... gut zu wissen! Wie für die (['Kinder', 'Gehalt'], funktioniert [StandardScaler(), MinMaxScaler()]) tatsächlich für mehrere Spalten und mehrere Transformatoren im selben Tupel (für diese Transformatoren mindestens ...). Danke noch einmal! – wi3o

+1

Darüber hinaus bietet der Master-Zweig von Github die Möglichkeit, einen Standard-Transformer auf Spalten anzuwenden, die nicht explizit im Transformer aufgelistet sind, falls dies für Sie nützlich ist: https://github.com/paulgb/sklearn-pandas#applying-a- Standard-Transformator – dukebody

+0

@Dukebody danke! – wi3o