2016-10-25 2 views
1

je tente de construire un pipeline avec des variablesLes variables dans la canalisation: incompatibilité de dimension

import numpy as np 
import pandas as pd 
import sklearn 
from sklearn.base import BaseEstimator, TransformerMixin 
from sklearn import linear_model 
from sklearn.pipeline import Pipeline 
df = pd.DataFrame({'a':range(6), 'c':['a', 'b', 'c']*2, 'd': ['m', 'f']*3  }) 
X = df[['c', 'd']] 
y = df['a'] 

regressor = linear_model.SGDRegressor() 

Transformer les variables qualitatives

class Cat(TransformerMixin): 

    def transform(self, X, **transform_params): 
     enc = DictVectorizer(sparse = False) 
     enc_data = enc.fit_transform(X.T.to_dict().values()) 
     return enc_data 

    def fit(self, X, y=None, **fit_params): 
     return self 

Pipeline

pipeline = Pipeline([ 

       ('categorical', Cat()), 
    ('model_fitting', regressor), 
]) 
pipeline.fit(X, y) 

C'est exact. Mais je reçois une erreur lorsque j'essaie d'adapter un nouveau jeu de données. Par exemple

contr = pd.DataFrame({'c':['a'], 'd': ['m']}) 
pred = pipeline.predict(contr) 
pred 
and 

ValueError: shapes (1,2) and (5,) not aligned: 2 (dim 1) != 5 (dim 0) 

Voir que le problème dans la classe Cat (TransformerMixin). Comment l'améliorer?

Répondre

0

J'ai fait comme ci-dessous. Il fonctionne

J'ai modifié la fonction

class Cat(TransformerMixin): 

def transform(self, X, y=None, **fit_params): 
    enc = DictVectorizer(sparse = False) 
    encc = enc.fit(df[['c', 'd']].T.to_dict().values()) 
    enc_data = encc.transform(X.T.to_dict().values()) 
    return enc_data 

def fit_transform(self, X, y=None, **fit_params): 
    self.fit(X, y, **fit_params) 
    return self.transform(X) 

def fit(self, X, y=None, **fit_params): 
    return self 

Et un nouveau jeu de données

control = pd.DataFrame({'c':['b'], 'd': ['f']}) 
pred = pipeline.predict(control) 
pred