2017-08-22 5 views
2

Voici ce que je suis d'un tutorielPandas pour Python: Exception: Les données doivent être 1 dimensions

# Data Preprocessing 

# Importing the libraries 
import numpy as np 
import matplotlib.pyplot as plt 
import pandas as pd 

# Importing the dataset 
dataset = pd.read_csv('Data.csv') 
X = dataset.iloc[:, :-1].values 
y = dataset.iloc[:, 3].values 

# Taking care of missing data 
from sklearn.preprocessing import Imputer 
imputer = Imputer(missing_values = 'NaN', strategy = 'mean', axis = 0) 
imputer = imputer.fit(X[:, 1:3]) 
X[:, 1:3] = imputer.transform(X[:, 1:3]) 

# Encoding categorical data 
# Encoding the Independent Variable 
from sklearn.preprocessing import LabelEncoder, OneHotEncoder 
labelencoder_X = LabelEncoder() 
X[:, 0] = labelencoder_X.fit_transform(X[:, 0]) 
onehotencoder = OneHotEncoder(categorical_features = [0]) 
X = onehotencoder.fit_transform(X).toarray() 
# Encoding the Dependent Variable 
labelencoder_y = LabelEncoder() 
y = labelencoder_y.fit_transform(y) 

Ceci est la matrice X avec des variables muettes encodées

1.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 4.400000000000000000e+01 7.200000000000000000e+04 
0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+00 2.700000000000000000e+01 4.800000000000000000e+04 
0.000000000000000000e+00 1.000000000000000000e+00 0.000000000000000000e+00 3.000000000000000000e+01 5.400000000000000000e+04 
0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+00 3.800000000000000000e+01 6.100000000000000000e+04 
0.000000000000000000e+00 1.000000000000000000e+00 0.000000000000000000e+00 4.000000000000000000e+01 6.377777777777778101e+04 
1.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.500000000000000000e+01 5.800000000000000000e+04 
0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+00 3.877777777777777857e+01 5.200000000000000000e+04 
1.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 4.800000000000000000e+01 7.900000000000000000e+04 
0.000000000000000000e+00 1.000000000000000000e+00 0.000000000000000000e+00 5.000000000000000000e+01 8.300000000000000000e+04 
1.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.700000000000000000e+01 6.700000000000000000e+04 

Le problème est il ne sont pas des étiquettes de colonne. J'ai essayé

something = pd.get_dummies(X) 

Mais je reçois l'exception suivante

Exception: Data must be 1-dimensional 

Répondre

3

La plupart des méthodes sklearn ne se soucient pas de noms de colonnes, car ils sont principalement préoccupés par les mathématiques derrière les algorithmes ML qu'ils mettent en œuvre. Vous pouvez ajouter des noms de colonne sur la sortie OneHotEncoder après fit_transform(), si vous pouvez déterminer l'encodage de l'étiquette à l'avance.

D'abord, saisir les noms de colonnes de vos prédicteurs de la dataset d'origine, à l'exception de la première (que nous réservons pour LabelEncoder):

X_cols = dataset.columns[1:-1] 
X_cols 
# Index(['Age', 'Salary'], dtype='object') 

maintenant obtenir l'ordre des étiquettes codées. Dans ce cas particulier, il semble que LabelEncoder() organise son mappage entier par ordre alphabétique:

labels = labelencoder_X.fit(X[:, 0]).classes_ 
labels 
# ['France' 'Germany' 'Spain'] 

combinons ces noms de colonnes, puis les ajouter à X lorsque vous convertissez à DataFrame:

# X gets re-used, so make sure to define encoded_cols after this line 
X[:, 0] = labelencoder_X.fit_transform(X[:, 0]) 
encoded_cols = np.append(labels, X_cols) 
# ... 
X = onehotencoder.fit_transform(X).toarray() 
encoded_df = pd.DataFrame(X, columns=encoded_cols) 

encoded_df 
    France Germany Spain  Age  Salary 
0  1.0  0.0 0.0 44.000000 72000.000000 
1  0.0  0.0 1.0 27.000000 48000.000000 
2  0.0  1.0 0.0 30.000000 54000.000000 
3  0.0  0.0 1.0 38.000000 61000.000000 
4  0.0  1.0 0.0 40.000000 63777.777778 
5  1.0  0.0 0.0 35.000000 58000.000000 
6  0.0  0.0 1.0 38.777778 52000.000000 
7  1.0  0.0 0.0 48.000000 79000.000000 
8  0.0  1.0 0.0 50.000000 83000.000000 
9  1.0  0.0 0.0 37.000000 67000.000000 

NB: Par exemple des données que j'utilise this dataset, qui semble très similaire ou identique à celle utilisée par OP. Notez comment la sortie est identique à la matrice X de l'OP.