SPSS Modelerでパラメーター最適化③ーパラメーターをシミュレーションで生成

複数のパラメーターを調整して何らかの目標仕様を満たしたいということがあります。
例えば、シリコン量と鉄分の量（パラメーター）を調整して、ある強度（目標仕様）のパーツを作りたいというようなことです。

このようなパラメーター調整をSPSS Modelerを使って行う方法を、3回シリーズで解説しています。
この記事はそのシリーズの③番目です。

1. [複数のパラメーターから目標仕様を予測する](https://qiita.com/kawada2017/items/0269c3aefe2bbc3fefaf
)
1. [複数の目標仕様を予測する](https://qiita.com/kawada2017/items/d5b1331a8ea392fb160e)
1. **[パラメーターをシミュレーションで生成](https://qiita.com/kawada2017/items/b5263da5d06806e8b2ca)**



ここまではパラメーター自体は実験者が考えて作成し、予測モデルで目標仕様をみたすかどうかを確認していくということを行っていました。

ここではさらに、複数の目標仕様を満たすパラメーターをシミュレーションで自動生成して探していきます。
例えば、ある摩擦係数（目標仕様１）とある強度（目標仕様２）とあるコスト（目標仕様３）の３つの仕様を満たすパーツを作りたいときに、シリコン量（パラメーター）と鉄量（パラメーター）で取りうる値をシミュレーションで自動生成してさがしていくというようなことです。

このようなパラメーター調整をSPSS Modelerを使って行います。


## 実行動画（動画はシリーズ①②③をすべてを解説しています。③は5分くらいからです）

<iframe width="560" height="315" src="https://www.youtube.com/embed/jvRTOs4GogE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


* テスト環境
    * Modeler 18.5
    * Windows 11 64bit

* サンプルストリーム

https://github.com/hkwd/spsssample/blob/master/230519surrogatemodel/surrogateModel.str

* サンプルデータ

https://raw.githubusercontent.com/hkwd/spsssample/master/230519surrogatemodel/CAEdata.csv

https://raw.githubusercontent.com/hkwd/spsssample/master/230519surrogatemodel/CAE%E5%80%99%E8%A3%9Cdata.csv

# 1.データの読み込み

まず、「CAEdata.csv」からCAEのシミュレーターでの結果を読み込みます。
「P1」から「P27」のパラメーターでシミュレーションを行った結果として「摩擦係数」や「強度」、「コスト」などの目標仕様がどうなったかという結果が記録されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/b08635bf-ddfd-f90c-3b43-0ab5d780b3f3.png)


# 2.パラメーターセットの自動生成
ここではシミュレーターでの過去履歴から、要求仕様を満たすパラメーターのセットを探してみます。例えば「摩擦係数 <= 0.6 and 強度 >= 0.02」を満たす必要があるとします。
条件抽出ノードで絞り込んでみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/25f31c91-2f2d-7c53-dfe2-3b6df708a500.png)

結果は以下の3つのパラメータのセットであれば「摩擦係数 <= 0.6 and 強度 >= 0.02」の目標仕様を満たしていました。しかしながら、コストは最低でも2701でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/8890fc10-5f50-7779-02b7-80d397b921e1.png)

そこでこのコストをもっと抑えたいというシナリオで考えてみます。例えば「コスト<=2000」も目標仕様に加えようとすると、今までのシミュレーターでの過去履歴では見つからないことになります。

そこでシミュレーターでの過去履歴から、自動的に新しい「P1」から「P27」のパラメーターセットを生成してみます。

まず、「フィルター」ノードで「P1」から「P27」のパラメーターセットのみに絞り込みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/1ae596a2-f287-c247-e184-16972f35055e.png)

次に「シミュレーションの当てはめ」ノードを接続します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/c24f8acb-7793-2091-92f5-5ddd3c457d00.png)

「Sim Gen」のノードができます。中を見ると各フィールドの分布とパラメータが推定されています。
例えば、「P8」のパラメータを「指定」で見てみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/fdf52555-addd-476e-2376-0fe19dd59720.png)

以下のような平均と標準偏差を持つ正規分布だと推定しています。これはユーザーが変更することもできます。また最小値最大値も修正できます。例えば、必ず0以上などに指定することも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/4d46b63a-27c9-5228-a3e5-1c86293fc6d1.png)

拡張オプションの項目を見てみます。デフォルトは「ケース最大数」は100,000になっていますので、10万件のデータをシミュレーションで生成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/207c0447-fc42-07b2-a73c-cd6ce9781405.png)

「テーブル」ノードで確認してみると、以下のように10万件のデータが、元データのデータ分布に従って生成されています。10万件分の試験パターンを作成するイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/df7c4979-d569-534c-4be2-5f92a8dc3645.png)

# 3.目標仕様のスコアリング

先に作った３つのモデルをつかってスコアリングをしてみます。「Sim Gen」から３つのモデルナゲットに接続します。

10万件分の試験パターンのパラメーターでCAEのシミュレーションを行ったときに、目標指標である「摩擦係数」「強度」、「コスト」がどのくらいになるかを予測できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/9bd2bd4f-6ede-23ec-e978-523a62ea6c0e.png)


そして「条件抽出ノード」で目標仕様である
```
'$L-摩擦係数' <= 0.6 and '$L-強度' >= 0.02 and '$L-コスト' <=2000
```
を満たす試験パターンに絞り込みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/825fd907-d8b8-5da0-f00e-b9d2e1db5bd9.png)

最後に「ソート」ノードを使って、「コスト」で並べ替えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/bd2a430d-7d93-6d49-c6aa-34ca92377a7a.png)

そうすると３つの目標仕様をみたしつつ、最低コストとなる試験パターンのパラメーターが得られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/18e8abe7-cec7-629f-9441-80c8b0978f9c.png)

このパラメーターを基にCAEシミュレーションを行うことで効率的にシミュレーションを行っていくことが可能です。

# 参考
ちなみにここで「一次」のモデルを使っておりモデルを単純な式にすることができますので、本当はシミュレーションノードでパラメーター候補を生成するよりも、最適化問題として解く方がより効率的なパラメーターを得ることができます。しかしながら、もっと精度のでる、例えばランダムツリーなどを使った場合にはモデルがブラックボックス化します。単純な最適化問題としては解けなくなりますので、このシミュレーションノードを使った方法が役に立ちます。

なお、最適化ソフトウェアのCPLEXにはブラックボックスのモデルをつかった場合にも最適化する機能もあります。シミュレーションノードよりもより効率的に最適解を探せる可能性があります。

CPLEX CPのブラックボックス最適化をつかって目的変数を最適化 #CPLEX - Qiita 

https://qiita.com/kawada2017/items/d564aea1a2c771a5ef24


#### 2023春IBMソリューションタイム　SPSS Modelerでシミュレーションができるの？！―Modelerで行う最適パラメーター推定―
https://speakerdeck.com/jpspss/2023chun-ibmsoriyusiyontaimu-ri-ben-aibiemuzhu-shi-hui-she-he-tian-spss-modelerdesimiyuresiyongadekiruno-modelerdexing-uzui-shi-parametatui-ding?slide=6