2017-10-10 1 views
3

Dire que j'ai les données suivantesComment faire le codage d'un chaud dans plusieurs colonnes d'une trame de données Pandas pour une utilisation ultérieure avec scikit-learn

import pandas as pd 
data = { 
    'Reference': [1, 2, 3, 4, 5], 
    'Brand': ['Volkswagen', 'Volvo', 'Volvo', 'Audi', 'Volkswagen'], 
    'Town': ['Berlin', 'Berlin', 'Stockholm', 'Munich', 'Berlin'], 
    'Mileage': [35000, 45000, 121000, 35000, 181000], 
    'Year': [2015, 2014, 2012, 2016, 2013] 
} 
df = pd.DataFrame(data) 

sur lequel je voudrais faire l'encodage d'un chaud sur la deux colonnes "Marque" et "Ville" afin de former un classificateur (disons avec Scikit-Learn) et de prédire l'année. Une fois que le classificateur est formé, je veux prédire l'année sur les nouvelles données entrantes (ne pas utiliser dans la formation), où je devrai réappliquer le même codage à chaud. Par exemple:

new_data = { 
    'Reference': [6, 7], 
    'Brand': ['Volvo', 'Audi'], 
    'Town': ['Stockholm', 'Munich'] 
} 

Dans ce contexte, quelle est la meilleure façon de le faire sur les Pandas dataframe codant pour un chaud des 2 colonnes sachant qu'il est nécessaire de coder plusieurs colonnes, et qu'il est nécessaire être capable d'appliquer le même encodage sur de nouvelles données plus tard.

C'est une question de suivi de How to re-use LabelBinarizer for input prediction in SkLearn

Répondre

3

Tenez compte the following approach.

Démo:

from sklearn.preprocessing import LabelBinarizer 
from collections import defaultdict 

d = defaultdict(LabelBinarizer) 

In [7]: cols2bnrz = ['Brand','Town'] 

In [8]: df[cols2bnrz].apply(lambda x: d[x.name].fit(x)) 
Out[8]: 
Brand LabelBinarizer(neg_label=0, pos_label=1, spars... 
Town  LabelBinarizer(neg_label=0, pos_label=1, spars... 
dtype: object 

In [10]: new = pd.DataFrame({ 
    ...:  'Reference': [6, 7], 
    ...:  'Brand': ['Volvo', 'Audi'], 
    ...:  'Town': ['Stockholm', 'Munich'] 
    ...: }) 

In [11]: new 
Out[11]: 
    Brand Reference  Town 
0 Volvo   6 Stockholm 
1 Audi   7  Munich 

In [12]: pd.DataFrame(d['Brand'].transform(new['Brand']), columns=d['Brand'].classes_) 
Out[12]: 
    Audi Volkswagen Volvo 
0  0   0  1 
1  1   0  0 

In [13]: pd.DataFrame(d['Town'].transform(new['Town']), columns=d['Town'].classes_) 
Out[13]: 
    Berlin Munich Stockholm 
0  0  0   1 
1  0  1   0 
1

Vous pouvez utiliser la fonction get_dummies pandas géants fournit et convertir les valeurs catégoriques.

Quelque chose comme ça ..

import pandas as pd 
data = { 
    'Reference': [1, 2, 3, 4, 5], 
    'Brand': ['Volkswagen', 'Volvo', 'Volvo', 'Audi', 'Volkswagen'], 
    'Town': ['Berlin', 'Berlin', 'Stockholm', 'Munich', 'Berlin'], 
    'Mileage': [35000, 45000, 121000, 35000, 181000], 
    'Year': [2015, 2014, 2012, 2016, 2013] 
} 
df = pd.DataFrame(data) 

train = pd.concat([df.get(['Mileage','Reference','Year']), 
          pd.get_dummies(df['Brand'], prefix='Brand'), 
          pd.get_dummies(df['Town'], prefix='Town')],axis=1) 

Pour les données de test, vous pouvez:

new_data = { 
    'Reference': [6, 7], 
    'Brand': ['Volvo', 'Audi'], 
    'Town': ['Stockholm', 'Munich'] 
} 
test = pd.DataFrame(new_data) 

test = pd.concat([test.get(['Reference']), 
          pd.get_dummies(test['Brand'], prefix='Brand'), 
          pd.get_dummies(test['Town'], prefix='Town')],axis=1) 

# Get missing columns in the training test 
missing_cols = set(train.columns) - set(test.columns) 
# Add a missing column in test set with default value equal to 0 
for c in missing_cols: 
    test[c] = 0 
# Ensure the order of column in the test set is in the same order than in train set 
test = test[train.columns] 
+1

si le jeu de test a une nouvelle valeur invisible pour les colonnes codées un chaud? Cela sera-t-il conservé ou supprimé dans cette approche? Excusez-moi, mais je demande parce que je ne pouvais pas comprendre la dernière ligne. –