2016-09-23 4 views
2

あらかじめPythonとSklearnで謝っています。私は2つの変圧器を持っており、結果を「FeatureUnion」(最終的なモデリング・ステップの最後)に集めたいと考えています。これは非常に簡単ですが、FeatureUnionはnx2配列またはDataFrameを提供するのではなく、出力を積み重ねています。以下の例では、10行×2列のデータを生成します。これにより、10行1列の2つの機能が生成されます。私は最終的なフィーチャユニオンに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] 

回のトランスを使用してパイプライン(私の実際のケースで私は2つの異なるトランスを持っていますが、これは問題を再現)

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

今私はパイプラインを使用しますが、それは二倍の長さ

pipe.fit_transform(df).shape 

(20,) 
の配列を返します。

しかし、寸法(10,2)の配列が必要です。

クイックフィックス?

答えて

2

FeatureUnionの変圧器は2次元の行列を返す必要がありますが、コードでは列を選択すると1次元のベクトルが返されます。これを修正するには、X[[self.col_name]]という列を選択します。

関連する問題