2017-12-05 15 views
4

ScikitlearnのPolynomialFeaturesは、多項式フィーチャの生成を容易にします。scikitlearnのフィーチャのサブセットに多項式変換を適用する方法

import numpy as np 
import pandas as pd 
from sklearn.preprocessing import PolynomialFeatures 

# Example data: 
X = np.arange(6).reshape(3, 2) 


# Works fine 
poly = PolynomialFeatures(2) 
pd.DataFrame(poly.fit_transform(X)) 

    0 1 2 3 4 5 
0 1 0 1 0 0 1 
1 1 2 3 4 6 9 
2 1 4 5 16 20 25 

質問:のみの機能の特定のリストに適用される多項式変換を持っているすべての機能があります。ここ

は簡単な例ですか?

# Use previous dataframe 
X2 = X.copy() 

# Categorical feature will be handled 
# by a one hot encoder in another feature generation step 
X2['animal'] = ['dog', 'dog', 'cat'] 

# Don't try to poly transform the animal column 
poly2 = PolynomialFeatures(2, cols=[1,2]) # <-- ("cols" not an actual param) 

# desired outcome: 
pd.DataFrame(poly2.fit_transform(X)) 
    0 1 2 3 4 5 'animal' 
0 1 0 1 0 0 1 'dog' 
1 1 2 3 4 6 9 'dog' 
2 1 4 5 16 20 25 'cat' 

特徴生成し、モデルのトレーニングコードの長いシリーズを組み合わせることPipeline機能を使用するときに特に有用であろう。

1つの選択肢は、自分自身のロール(great example、Michelle Fullwood)ですが、他の誰かがこのユースケースを偶然見つけたと思いました。

答えて

5

PolynomialFeaturesは、sklearnの他の多くのトランスと同様に、適用するデータの列を指定するパラメータを持たないため、パイプラインに配置して動作させることは簡単ではありません。

さらに一般的な方法として、FeatureUnionを使用して、別のパイプラインを使用してデータフレームにある各機能のトランスフォーマを指定することができます。

簡単な例は次のようになります。

from sklearn.pipeline import FeatureUnion 
from sklearn.preprocessing import PolynomialFeatures, OneHotEncoder, LabelEncoder 
from sklearn.linear_model import LogisticRegression 
from sklearn.pipeline import Pipeline 


X = pd.DataFrame({'cat_var': ['a', 'b', 'c'], 'num_var': [1, 2, 3]}) 


class ColumnExtractor(object): 
    def __init__(self, columns=None): 
     self.columns = columns 

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

    def transform(self, X): 
     X_cols = X[self.columns] 

    return X_cols 


pipeline = Pipeline([ 
    ('features', FeatureUnion([ 
     ('num_var', Pipeline([ 
      ('extract', ColumnExtractor(columns=['num_var'])), 
      ('poly', PolynomialFeatures(degree=2)) 
     ])), 
     ('cat_var', Pipeline([ 
      ('extract', ColumnExtractor(columns=['cat_var'])), 
      ('le', LabelEncoder()), 
      ('ohe', OneHotEncoder()), 
     ])) 
    ])), 
    ('estimator', LogisticRegression()) 
]) 
+0

これは素晴らしいです。私は追加のライブラリに頼っていないので、私はこの答えを受け入れています。 – Nelson

2

はい、(そこよりエレガントな解決策になるはずですが、今それをテストすることはできません)これは動作するはずsklearn-pandas

がチェックアウトされています

from sklearn.preprocessing import PolynomialFeatures 
from sklearn_pandas import DataFrameMapper 

X2.columns = ['col0', 'col1', 'col2', 'col3', 'col4', 'col5', 'animal'] 

mapper = DataFrameMapper([ 
('col0', PolynomialFeatures(2)), 
('col1', PolynomialFeatures(2)), 
('col2', PolynomialFeatures(2)), 
('col3', PolynomialFeatures(2)), 
('col4', PolynomialFeatures(2)), 
('col5', PolynomialFeatures(2)), 
('Animal', None)]) 

X3 = mapper.fit_transform(X2) 
関連する問題