u++の備忘録

Pandasのパイプラインを作る「pdpipe」を使ってみた

Pandasのパイプラインを作る「pdpipe」というライブラリを知ったので、少し触ってみました。本記事では、簡単な使い方および良かった点・悪かった点をまとめます。

使い方

KaggleのTitanicデータセットで検証しました。一連の処理はNotebookを公開しています。

import pandas as pd


train = pd.read_csv('../input/titanic/train.csv')
test = pd.read_csv('../input/titanic/test.csv')

www.kaggle.com

インストール

公式ドキュメントに記載の通り、pipでインストール可能です。

pdpipe.github.io

pip install pdpipe

パイプラインの構築

パイプラインの記述する方法は、いくつか存在します。ここではリストで列挙する方法を採用しましたが、例えば+演算子で羅列することも可能です。

pdpipe.github.io

import pdpipe as pdp


CATEGORICAL_COL = ['Sex', 'SibSp', 'Embarked']
DROP_COL = ['PassengerId', 'Name', 'Ticket', 'Parch', 'Cabin']

pipeline = pdp.PdPipeline([
    pdp.Encode(CATEGORICAL_COL),
    pdp.ColDrop(DROP_COL)
])

今回は簡単な処理として、カテゴリ変数 CATEGORICAL_COL のラベルエンコーディングと、一部のカラム DROP_COL の削除を実行します。

前処理

「悪かった点」で後述しますが、ラベルエンコーディングの対象となるカラムに欠損値が含まれる場合に、次のエラーが発生します。

TypeError: Encoders require their input to be uniformly strings or numbers. Got ['float', 'str']

この問題に対処すべく、事前にカテゴリ変数の欠損値処理が必要です。「パイプラインで事前に定義しよう・・・」と考えたのですが、現状は欠損値を埋める処理が用意されておらず、独自に対応する必要がありました。

github.com

for c in CATEGORICAL_COL:
    train[c].fillna('<missing>', inplace=True)
    test[c].fillna('<missing>', inplace=True)

パイプラインの実行

構築したパイプラインは、sklearnの要領でtrain, testに適用できます。

train = pipeline.fit_transform(train, verbose=True)
test = pipeline.transform(test)
- Encode Sex, SibSp, Embarked..
100%|██████████| 3/3 [00:00<00:00, 132.06it/s]
- Drop columns PassengerId, Name, Ticket, Parch, Cabin..

before

f:id:upura:20200728042242p:plain

after

f:id:upura:20200728042248p:plain

良かった点

事前にパイプラインを定義することで、処理の見通しは非常に良くなると感じました。trainとtestに同一のパイプラインを適用する形式のため、処理の整合性が取れる利点もあると思います。

悪かった点

まずはカテゴリ変数に欠損値が含まれる場合のラベルエンコーディングでエラーが発生する点および、その回避に別の処理が必要な点が挙げられます。せめてパイプライン内に欠損値処理を盛り込めればなと感じました。issueコメントを見るに、contributionのチャンスかもしれません。

同じくカテゴリ変数のラベルエンコーディングの処理で、testで新たに出現する値に対してエラーが発生するのも辛いところでした。パイプライン内で sklearn.preprocessing.LabelEncoder() をラッピングしている都合上、このエラーを回避する処理を外部から付け加えるのは難しいです。許される場合は、次のようにtrainとtestを結合してから処理するのが現実的な解決策かもしれません。

data = pd.concat([train, test], sort=False)

おわりに

本記事では、Pandasのパイプラインを作るライブラリ「pdpipe」の簡単な使い方および良かった点・悪かった点をまとめました。手軽に利用でき、パイプラインを構築する上での利点は感じられた一方で、現時点の機能では若干の使いづらさを感じたというのが率直な印象です。余裕があれば、PRを出してみようかなと思いました。