panderaを用いたpd.DataFrameのvalidation

kenya-sk
Oct 31, 2021
Photo by https://github.com/pandera-dev/pandera

今回はpandasのDataFrameをValidationすることができるライブラリの一つであるpanderaの基本的な使い方についてまとめたいと思います。

背景

EDAやモデリングを行なっている時には、データの理解を深める目的もあり、型や分布などを目視で確認していました。しかし、機械学習モデルを本番環境で動かしていく時には、バッチ処理・ストリーム処理によらず大量の新規データが順次得られ、これらのデータを目視で確認していくことは非現実的となります。一方でデータの理解を深める過程で、どのようなデータが得られているべきかということをルールベースで落とし込めるようになってきていることが多いと思います。そこで、このルールをassert文のようにpandasのDataFrameに適用する方法を探していた際にpanderaというライブラリを見つけました。機械学習モデルを例に考えると、モデルに入力する前のデータセットをpandasのDataFrame形式で持っておくことでデータセットのValidationを機械的に行うことができます。そうすることで、もし運用上問題が発生した際に、データセット側とモデル側の問題の切り分けを行う一つの指針になるかと思います。

私自身、panderaを業務などで実利用はしたことはありませんが、今後機会があれば感想をまとめていければと思っています。

環境構築

panderaはpipまたはcondaを用いてインストールすることができます。追加機能をインストールすることもできますので、詳しくはドキュメントを参照してください。

今回の記事では、Python=3.8.5、pandera=0.7.2のバージョンを利用しています。

データセット

panderaの動作確認として、カリフォルニアの住宅価格に関するデータセットを利用します。このデータセットはscikit-learnのsklean.datasets.fetch_california_housing()メソッドを用いて読み込むことも可能です。今回はデータセットをpandasのDataFrameとして扱いたいので、引数as_frame=Trueと設定します。

図1. California Housing Dataset内に含まれるデータの例

DataFrameのスキーマチェック

① データの型をチェック

まずはDataFrameの各カラムに含まれるデータの型が想定通りになっているかを確認してみます。今回のデータセットでは全てのカラムがfloat型で定義されています。型のValidationを行うSchemaは以下のように記述できます。コード内の検証(i)の場合では、Validationが成功しデータセットが返されます。一方でデータの型を意図的に変更した(ii)の場合では、図2のようなエラーが発生します。エラーの内容からも変更したカラムの型が想定されたものでないことが確認できます。

図2. 検証(ii)で発生するエラーメッセージ

② データの値をチェック

次にデータの値が適切であるかを確認します。例えば、HouseAgeというカラムは築年数を表すため0以上の値となることが想定されます。値の範囲はドメイン知識として持っている方に確認することでValidationのルールとして落とし込めることが多いです。そのため仕様書を確認する際に記載がなければ想定される値のパターンについて、担当者に確認しておくと検証作業が捗ると思います。では、HouseAgeカラムが正の値であることを確認してみます。値のValidationはpandera.Chackを使うことで基本的な場合については対応できます。より複雑な条件を扱う場合はlambda式を用いて自前のルールを追加することもできます。

(i)の結果を確認するとHouseAgeカラムの値が想定通り全て0以上であったことがわかります。次に意図的にマイナスの値に変換することで、Validationが失敗するかを確認します。(ii)の結果では図3のようなエラーが発生し、合わせてValidationが失敗したケースについて出力されます。最後に(iii)ではpa.Check.ge(0.0)を自前のルールとして作成しています。もし、用意されているルールで対応できない場合は、lambda式を検討してみてください。

図3. 検証(ii)で発生するエラーメッセージ

最後に①と②で定義したSchemaを一つのSchemaにまとめます。加えて、よく利用するパラメータも設定しています。coerce=Trueに設定すると各Validationが行われる前に型のチェックが優先して行われます。nullable=Trueはnullを許容するかを定義しています。デモ用にMaxPeopleというカラムのValidationを追加しています。このカラムはパラメータでrequired=Falseに設定されているため、必須カラムではありません。そのため、データセットにカラムがなくてもValidationが成功します。

まとめ

本記事では、DataFrameのValidationを行うpanderaの基本的な使い方を確認しました。panderaを使うことでデータに関するValidation項目を簡単に定義でき、実運用においてもDataFrameのテストを効率化できそうだと感じました。今回は数値型のみを扱いましたが、値が文字列の場合などにSchemaをうまく設計することができるかについても確認していきたいと思います。

--

--