私はsklearnのパイプラインにかなり慣れておらず、この問題に直面しています。テキストと数値が混在するデータセットがあります。つまり、特定の列にはテキストのみがあり、残りの列には整数(または浮動小数点数)があります。
たとえば、テキスト機能でLabelEncoder()
を呼び出し、数値列でMinMaxScaler()
を呼び出すことができるパイプラインを構築できるかどうか疑問に思いました。私がWebで見た例は、ほとんどの場合、選択した列ではなく、データセット全体でLabelEncoder()
を使用することを示しています。これは可能ですか?もしそうなら、どんなポインタでも大歓迎です。
私が通常行う方法は、FeatureUnion
を使用し、FunctionTransformer
を使用して関連する列を引き出すことです。
重要な注意事項:
モデルをpickle化する場合、FunctionTransformerでdef
またはlambda
を使用できないため、関数をpartial
で定義する必要があります。
FunctionTransformer
をvalidate=False
で初期化する必要があります
このようなもの:
from sklearn.pipeline import make_union, make_pipeline
from sklearn.preprocessing import FunctionTransformer
def get_text_cols(df):
return df[['name', 'fruit']]
def get_num_cols(df):
return df[['height','age']]
vec = make_union(*[
make_pipeline(FunctionTransformer(get_text_cols, validate=False), LabelEncoder()))),
make_pipeline(FunctionTransformer(get_num_cols, validate=False), MinMaxScaler())))
])
V0.20以降、これを実現するために ColumnTransformer
を使用できます。