予測モデルを使ったシミュレーションと最適解探索

DataRobotの山本です。

今回はDataRobotを使った入力データの最適化についてご紹介したいと思います。

例えば、製造業におけるR&Dでは、「この配合比の場合の性能を予測したい」というよりも、「最も性能を高くするためには、どのような配合比にすれば良いのか知りたい」というケースが多いかと思います。このような問題は入力データの最適化、あるいは逆問題と呼ばれており、その他にも、「最もマーケティング効果を高めるための施策」など、分野を問わず、多くのお客様から頂く要望の一つとなっています。

もちろん特徴量の数が2つか3つ程度であれば、モデルX-RAYの部分依存などを参考に人間が考えて最適な入力データを求めることもできます。しかし、特徴量が大量にあると考慮すべき相関関係の数が膨大になってしまい、人間には最適値を求めるのが難しくなってきます。しかしそのような場合でも、コンピュータを用いることで簡単に最適な入力データを推定することができます。

それでは、さっそく以下のコンクリートの配合条件と圧縮強度のデータを題材に実際にDataRobotを用いた入力データの最適化をやってみたいと思います。ここでは圧縮強度を最大化したいとします。 

Picture1

 

まずはいつもどおり、配合条件から圧縮強度を予測するモデルをDataRobotで構築します。生成したモデルの中から最適化に使用するものを選び、モデルをAPIとして専用予測サーバーにデプロイしておきます。

これからこの予測モデルを使って繰り返し「実験」を行いながら最適な配合条件を求めていきます。この「実験」のやり方には色々なやり方がありますが、よく知られている手法にはグリッドサーチ、ランダムサーチ、SMBOなどがあります。ここではランダムサーチとSMBOの一種であるhyperoptを使いたいと思います。hyperoptはKaggleなどのコンペで主にハイパーパラメーターの調整目的で人気のあるpythonのライブラリですが、幅広い用途に使用することができて大変便利です。その他には、SMBOとしてはGaussian Processを用いたベイジアンオプティマイゼーションベイジアンオプティマイゼーションなどが知られています。

Table about optimization methods

 

ランダムサーチによる最適解の探索

まずはランダムサーチによる探索を行ってみます。ランダムサーチは指定した探索空間からランダムにサンプリングを繰り返し行うことで予測値が最大になる入力データの組み合わせを探索してくれます。ここでは探索空間を元データの平均値と標準偏差を用いた正規分布から外挿しつつサンプリングすることとしました。

Screen Shot 0030-04-13 at 18.47.37

これらのランダム生成した入力データに対してDataRobotによるコンクリート圧縮強度の予測値を取得します。得られた結果から、入力データに対するコンクリート圧縮強度の依存性を可視化したり、最適な配合の候補を見出すことができます。例えば、以下の図は単位水量と材齢に対するコンクリート圧縮強度予測値の関係を可視化したものですが、コンクリートが経時と共に硬化していくことや、単位水量に適切な範囲があることが見て取れるかと思います。

result_randomsearch2

 

SMBOを使った最適解の探索

次にhyperoptを使う場合でも同様に、探索範囲を辞書型として定義します。scikit-learnのGridSearchCVやRandomizedSearchCVとよく似た書き方ですので、これらを使ったことがある方でしたら馴染みがあるのではないかと思います。ここでもランダムサーチの場合と同様に定義しました。 

normal_dist 

次に、最適化したい対象を目的関数として定義します。ここではDataRobotの専用予測サーバーから戻ってくるコンクリート圧縮強度の予測値を最大化します。DataRobotは予測APIのデプロイについても1クリックで簡単に行うことができるため、このように外部ツールとの連携も簡単に行うことができます。なお、hyperoptは最小化しか行なってくれないためにここでは戻り値の符号を逆転させています。 

Screen Shot 0030-04-13 at 18.56.16 

fminを実行すると、最適化が始まります。hyperoptは探索空間から入力データをサンプリングしてはDataRobotによる予測を行い、どこからサンプリングすると良い予測結果が得られそうかを賢く学習しながら探索を進めてくれます。

Screen Shot 0030-04-13 at 19.00.48 

今回の場合は150回の探索を行い、予想圧縮強度が約100 MPaとなる入力データを見つけることができました。また、探索過程を特徴量インパクトの高い特徴量2つについて可視化したました。ここから、ランダムサーチの場合と同様に材齢が高いと強度が上がる傾向や、単位水分量は低いと強度が上がるものの、低すぎても良くなさそうだなどの傾向を見て取ることができます。

hyperopt_animation_en

ただし、この結果の妥当性についてはそもそも物理的に可能なのか、コスト的にあり得るのか、法令や基準に合致しているかなどをドメイン知識に照らして注意深く確認する必要があります。というのも、最適化によって得られるのは予測モデルにおける局所最適解でしかなく、ビジネスあるいはR&Dの課題そのものの解を与えてくれるわけではないからです。その点ではモデルX-RAYと同様にあくまでインサイト機能の一つと言えるのではないかと思います。

ここではさらに、元データを事前情報としてhyperoptに与えることで探索をより早く収束させることができないか試してみました。hyperoptはtrialsオブジェクトに探索結果を保存しており、これを活用することでウォームスタートやレジュームも可能になります。

hyperopt_animation_prior_en

結果を確認すると、事前情報を使わない場合と比較して少ない探索回数で良い候補を見つけられていることがわかります。また、材齢における無理な外挿を行わないようになっており、元データの分布を反映してより現実的な探索を行っているようにも見えます。

以上のように、DataRobotGUIだけでなくAPIによる操作も簡単に行うことができ、例えば材料の配合比やマーケティング施策などの最適化に応用することも可能です。また、今回ご紹介した最適化の事例については、2月のマンスリーワークショップでもご紹介しており、使用したデータセットやjupyter notebookは以下からダウンロードすることができます。

https://datarobot.connpass.com/event/77850/

DataRobotをより深くご活用頂き、お客様のビジネスに幅広くお役立て頂ければと思います。