回帰モデルやクラス分類モデルの予測性能を評価するとき、トレーニングデータとテストデータにサンプルを分割して、トレーニングデータでモデルを構築し、テストデータで構築されたモデルを評価します。一般的には、scikit-learn の train_test_split を用いて、トレーニングデータとテストデータに分けると思います。ただ、基本的にランダムにサンプルを分割しますが、サンプルごとにグループがあるときに対応できませんでした。DCEKit に新たに追加された train_test_split_group を用いれば、グループごとにまとめてトレーニングデータとテストデータに分けることができます。
これにより、例えば、
- 高分子設計において新たなモノマーを含む材料の予測
- 合金材料設計において新たな金属種を含む材料の予測
- 複数の評価方法があるときの材料予測
- バッチプロセスにおける新たなバッチの予測
これら↑に対応可能なモデルの予測精度を評価できるようになりました。
この考え方については、こちら↓も合わせてお読みください。
例えば高分子設計において、モノマーや添加剤を変化させて材料を合成して、その物性を評価することを考えます。メインのモノマーは同じにして、添加剤や他の重合条件を変えたようなサンプルが存在することになります。このようなデータセットを用いて、新たな種類のモノマーを用いたときの材料の物性を予測したいとき、新たな種類のモノマーをモデルに入力するとどの程度の精度で予測できるかを、事前に評価しなければいけません。ただ、例えばscikit-learn の train_test_split を用いてランダムにトレーニングデータとテストデータに分割すると、同じモノマー種がトレーニングデータにもテストデータにも含まれる状況が起きてしまい、新たなモノマー種に対する予測精度を評価できません。
合金材料設計においても、メインの金属を変えながら材料設計をしている場合に、新たな金属種を予測したいときには、新たな金属種をモデルに入力したときにどの程度の精度で予測できるか知りたいです。ただscikit-learn の train_test_split を用いてランダムにトレーニングデータとテストデータに分割すると、同じ金属種がトレーニングデータにもテストデータにも含まれてしまい、新たな金属種に対する予測精度を評価できません。
ある材料の物性や活性の評価を、評価条件を変えて複数分析したデータがあることを考えます。このデータセットのサンプルを、(例えば scikit-learn の train_test_split を用いて) ランダムにトレーニングデータとテストデータに分けてしまうと、材料が同じで評価方法だけ異なるサンプルが、トレーニングデータにもテストデータにも含まれてしまい、新たな材料に対する予測精度を評価できません。
バッチプロセスにおいて、バッチごとにいくつかサンプリングして得られる物性や活性の測定値を、バッチの時系列データから予測することを考えます。新たなバッチにおける物性値や活性値を予測するモデルを検討するとき、データセットのサンプルを (例えば scikit-learn の train_test_split を用いて) ランダムに分けてしまうと、同じバッチのサンプルがトレーニングデータにもテストデータにも含まれてしまい、新しいバッチにおける予測精度を検証できません。
以上のような場合に対応可能な関数 train_test_split_group を DCEKit で作成しました。サンプルごとにグループ ID を設定でき、グループ ID が同じサンプルはまとめてトレーニングデータもしくはテストデータに含まれるようにします。基本的に、グループ ID の指定以外は train_test_split と同じように使用できます。具体的な使用方法についてはデモンストレーションのサンプルプログラムである
demo_train_test_split_with_group_id.py
を実行し、ご覧いただければと思います。
一つ注意点です。scikit-learn の train_test_split と同様にして、train_test_split_group でもテストデータ (トレーニングデータ) の割合もしくはテストデータ (トレーニングデータ) の数を指定できますが、それぞれグループに基づく割合とグループ数になっています。例えば、300 サンプルあり 100 グループあるとき、test_size = 25 とすると、テストデータが 25 グループ、トレーニングデータが 75 グループになります。サンプル数ではございませんのでご注意ください。
また、トレーニングデータとテストデータに分けるだけでなく、グループごとにまとめたダブルクロスバリデーション
も可能な関数 double_cross_validation_group もあります。こちらはダブルクロスバリデーションにおける外側のクロスバリデーションにおいて、トレーニングデータとテストデータに同じグループ ID のサンプルが含まれないように分割されます。具体的な使用方法についてはデモンストレーションのサンプルプログラムである
demo_double_cross_validation_group_for_pls.py
を実行し、ご覧いただければと思います。
以上です。
質問やコメントなどありましたら、twitter, facebook, メールなどでご連絡いただけるとうれしいです。