2016-09-23 2 views
2

Новое в python и sklearn, так что извиняйтесь заранее. У меня два трансформатора, и я хотел бы собрать результаты в «FeatureUnion» (для окончательного этапа моделирования в конце). Это должно быть довольно просто, но FeatureUnion укладывает выходные данные, а не предоставляет массив nx2 или DataFrame. В приведенном ниже примере я буду генерировать некоторые данные, которые состоят из 10 строк по 2 столбца. Затем будут созданы две функции, состоящие из 10 строк по 1 столбцу. Я хотел бы, чтобы окончательный союз функций имел 10 строк и 1 столбец, но я получаю 20 строк по 1 столбцу.Связывание выходов трансформаторов в FeatureUnion

Я попытаюсь показать с моим примером ниже:

частью импорта

import numpy as np 
import pandas as pd 
from sklearn import pipeline 
from sklearn.base import TransformerMixin 

некоторых случайных данные

df = pd.DataFrame(np.random.rand(10, 2), columns=['a', 'b']) 

обычаем трансформатор, который выбирает столбец

class Trans(TransformerMixin): 
    def __init__(self, col_name): 
     self.col_name = col_name 
    def fit(self, X): 
     return self                  
    def transform(self, X):               
     return X[self.col_name] 

трубопровод, который использует трансформатор дважды (в моем действительном случае у меня есть два различных трансформаторов, но это воспроизводящий проблему)

pipe = pipeline.FeatureUnion([ 
    ('select_a', Trans('a')), 
    ('select_b', Trans('b')) 
    ]) 

теперь я использовать трубопровод, но он возвращает массив удвоенной длины

pipe.fit_transform(df).shape 

(20,) 

однако мне нужен массив с размерами (10, 2).

Быстрое исправление?

ответ

2

Трансформаторы в FeatureUnion должны возвращать 2-мерные матрицы, однако в вашем коде, выбирая столбцы, вы возвращаете одномерный вектор. Вы можете исправить это, выбрав столбец с X[[self.col_name]].

Смежные вопросы