web-dev-qa-db-ja.com

sklearnパイプライン-さまざまな列にさまざまな変換を適用する方法

私はsklearnのパイプラインにかなり慣れておらず、この問題に直面しています。テキストと数値が混在するデータセットがあります。つまり、特定の列にはテキストのみがあり、残りの列には整数(または浮動小数点数)があります。

たとえば、テキスト機能でLabelEncoder()を呼び出し、数値列でMinMaxScaler()を呼び出すことができるパイプラインを構築できるかどうか疑問に思いました。私がWebで見た例は、ほとんどの場合、選択した列ではなく、データセット全体でLabelEncoder()を使用することを示しています。これは可能ですか?もしそうなら、どんなポインタでも大歓迎です。

14
Javiar Sandra

私が通常行う方法は、FeatureUnionを使用し、FunctionTransformerを使用して関連する列を引き出すことです。

重要な注意事項:

  • モデルをpickle化する場合、FunctionTransformerでdefまたはlambdaを使用できないため、関数をpartialで定義する必要があります。

  • FunctionTransformervalidate=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())))
])
28
maxymoo

V0.20以降、これを実現するために ColumnTransformer を使用できます。

11
syg