2016-10-17 5 views
0

Я хочу подать трубопровод с числовыми & категориальными переменными, как показано нижеКатегориальных переменные в трубопроводе

import numpy as np 
import pandas as pd 
from sklearn import linear_model, pipeline, preprocessing 
from sklearn.feature_extraction import DictVectorizer 

df = pd.DataFrame({'a':range(12), 'b':[1,2,3,1,2,3,1,2,3,3,1,2], 'c':['a', 'b', 'c']*4, 'd': ['m', 'f']*6}) 
y = df['a'] 
X = df[['b', 'c', 'd']] 

создать индексы для числового

numeric = ['b'] 
numeric_indices = np.array([(column in numeric) for column in X.columns], dtype = bool) 

& для категориальных переменных

categorical = ['c', 'd'] 
categorical_indices = np.array([(column in categorical) for column in X.columns], dtype = bool) 

Затем я создаю конвейер

regressor = linear_model.SGDRegressor() 
encoder = DictVectorizer(sparse = False) 

estimator = pipeline.Pipeline(steps = [  
    ('feature_processing', pipeline.FeatureUnion(transformer_list = [   

      #numeric 
      ('numeric_variables_processing', pipeline.Pipeline(steps = [ 
       ('selecting', preprocessing.FunctionTransformer(lambda data: data[:, numeric_indices])), 
       ('scaling', preprocessing.StandardScaler(with_mean = 0.))    
         ])), 

      #categorical 
      ('categorical_variables_processing', pipeline.Pipeline(steps = [ 
       ('selecting', preprocessing.FunctionTransformer(lambda data: data[:, categorical_indices])), 
       ('DictVectorizer', encoder)   
         ])), 
     ])), 
    ('model_fitting', regressor) 
    ] 
) 

и я получаю

estimator.fit(X, y) 
ValueError: could not convert string to float: 'f' 

Я знаю, что я должен применить encoder.fit() в трубопроводе, но не понимаю, как применять его Или мы ненавидим использовать предварительной обработки .OneHotEncoder(), но снова нам нужно преобразовать строку в float

Как его улучшить?

ответ

0

я вижу именно таким образом

import numpy as np 
import pandas as pd 
from sklearn import linear_model, metrics, pipeline, preprocessing 
df = pd.DataFrame({'a':range(12), 'b':[1,2,3,1,2,3,1,2,3,3,1,2], 'c':['a', 'b', 'c']*4, 'd': ['m', 'f']*6}) 
y = df.a 
num = df[['b']] 
cat = df[['c', 'd']] 
from sklearn.feature_extraction import DictVectorizer 
enc = DictVectorizer(sparse = False) 
enc_data = enc.fit_transform(cat .T.to_dict().values()) 
crat = pd.DataFrame(enc_data, columns=enc.get_feature_names()) 
X = pd.concat([crat, num], axis=1) 
cat_columns = ['c=a', 'c=b', 'c=c', 'd=f', 'd=m'] 
cat_indices = np.array([(column in cat_columns) for column in X.columns], dtype = bool) 
numeric_col = ['b'] 
num_indices = np.array([(column in numeric_col) for column in X.columns], dtype = bool) 
reg = linear_model.SGDRegressor() 
estimator = pipeline.Pipeline(steps = [  
    ('feature_processing', pipeline.FeatureUnion(transformer_list = [   
      ('categorical', preprocessing.FunctionTransformer(lambda data: data[:, cat_indices])), 

      #numeric 
      ('numeric', pipeline.Pipeline(steps = [ 
       ('select', preprocessing.FunctionTransformer(lambda data: data[:, num_indices])), 
       ('scale', preprocessing.StandardScaler())    
         ])) 
     ])), 
    ('model', reg) 
    ] 
) 
estimator.fit(X, y) 
Смежные вопросы