サンプルをグループごとにトレーニングデータとテストデータに分割する機能をDCEKitに搭載しました!

回帰モデルやクラス分類モデルの予測性能を評価するとき、トレーニングデータとテストデータにサンプルを分割して、トレーニングデータでモデルを構築し、テストデータで構築されたモデルを評価します。一般的には、scikit-learn の train_test_split を用いて、トレーニングデータとテストデータに分けると思います。ただ、基本的にランダムにサンプルを分割しますが、サンプルごとにグループがあるときに対応できませんでした。DCEKit に新たに追加された train_test_split_group を用いれば、グループごとにまとめてトレーニングデータとテストデータに分けることができます。

DCEKit (Data Chemical Engineering toolKit) を PyPI にリリース!
これまで化学データ・化学工学データのデータ解析に役立つツールや金子研で開発された手法に関する Python コードを Github にて公開してきました。このたびは、これらのツール・手法 (の一部) に加えて、新たな機能を追加して、DCEK...

 

これにより、例えば、

  • 高分子設計において新たなモノマーを含む材料の予測
  • 合金材料設計において新たな金属種を含む材料の予測
  • 複数の評価方法があるときの材料予測
  • バッチプロセスにおける新たなバッチの予測

 

これら↑に対応可能なモデルの予測精度を評価できるようになりました。

この考え方については、こちら↓も合わせてお読みください。

単体・化合物と実験条件・製造条件の両方が変わるデータセットの解析の仕方
データセットを用いて説明変数 X と目的変数 Y との間でモデル Y = f(X) を構築するときの話です。材料のデータセットを扱うときは、X が化合物の化学構造や結晶構造や金属の特徴量だったり、単体や化合物の組成比だったり、その他の実験条...

 

例えば高分子設計において、モノマーや添加剤を変化させて材料を合成して、その物性を評価することを考えます。メインのモノマーは同じにして、添加剤や他の重合条件を変えたようなサンプルが存在することになります。このようなデータセットを用いて、新たな種類のモノマーを用いたときの材料の物性を予測したいとき、新たな種類のモノマーをモデルに入力するとどの程度の精度で予測できるかを、事前に評価しなければいけません。ただ、例えば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 グループになります。サンプル数ではございませんのでご注意ください。

また、トレーニングデータとテストデータに分けるだけでなく、グループごとにまとめたダブルクロスバリデーション

ダブルクロスバリデーション(モデルクロスバリデーション)でテストデータいらず~サンプルが少ないときのモデル検証~
回帰モデルやクラス分類モデルを検証するときの話です。 モデルの検証 一般的には、データセットが与えられたとき、サンプルをモデル構築用サンプル (トレーニングデータ, training dataset) とモデル検証用サンプル (テストデ...

 

も可能な関数 double_cross_validation_group もあります。こちらはダブルクロスバリデーションにおける外側のクロスバリデーションにおいて、トレーニングデータとテストデータに同じグループ ID のサンプルが含まれないように分割されます。具体的な使用方法についてはデモンストレーションのサンプルプログラムである

 

demo_double_cross_validation_group_for_pls.py

 

を実行し、ご覧いただければと思います。

 

以上です。

質問やコメントなどありましたら、twitter, facebook, メールなどでご連絡いただけるとうれしいです。

タイトルとURLをコピーしました