web-dev-qa-db-ja.com

SklearnパイプラインでOnehotencodingを行う方法

Pandasデータフレームのカテゴリ変数をoneHotEncodeしようとしています。これには、カテゴリ変数と継続変数の両方が含まれます。これは、pandasで簡単に実行できることがわかります。 get_dummies()関数ですが、後でPMMLファイルを生成できるようにパイプラインを使用する必要があります。

これはマッパーを作成するためのコードです。エンコードしたいカテゴリ変数は、「ダミー」というリストに格納されています。

from sklearn_pandas import DataFrameMapper
from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import LabelEncoder

mapper = DataFrameMapper(
    [(d, LabelEncoder()) for d in dummies] +
    [(d, OneHotEncoder()) for d in dummies]
)

そしてこれは、マッパーと線形回帰を含むパイプラインを作成するためのコードです。

from sklearn2pmml import PMMLPipeline
from sklearn.linear_model import LinearRegression

lm = PMMLPipeline([("mapper", mapper),
                   ("regressor", LinearRegression())])

ここでフィットしようとすると(「features」がデータフレームで、「targets」が一連の場合)、「文字列をfloatに変換できませんでした」というエラーが表示されます。

lm.fit(features, targets)

私を助けることができる人はいますか?データの前処理を含むパイプラインの作業に必死です...よろしくお願いします!

10

OneHotEncoderは文字列機能をサポートしていません。また、[(d, OneHotEncoder()) for d in dummies]を使用すると、すべてのダミー列に適用されます。代わりにLabelBinarizerを使用してください。

mapper = DataFrameMapper(
    [(d, LabelBinarizer()) for d in dummies]
)

別の方法は、2番目のLabelEncoderステップでOneHotEncoderを使用することです。

mapper = DataFrameMapper(
    [(d, LabelEncoder()) for d in dummies]
)

lm = PMMLPipeline([("mapper", mapper),
                   ("onehot", OneHotEncoder()),
                   ("regressor", LinearRegression())])
8
dukebody