SPSS Modelerでクロスバリデーションをする

SPSS Modelerでクロスバリデーション（交差検証）を行ってみます。

■テスト環境
Modeler 18.2.2
Windows 10

サンプルストリーム

https://github.com/hkwd/spsssample/raw/master/20210416%E3%82%AF%E3%83%AD%E3%82%B9%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3/210416%E3%82%AF%E3%83%AD%E3%82%B9%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3.str

#1. ホールド・アウト法
クロスバリデーションを説明する前にホールド・アウト法を確認しておきます。通常SPSS Modelerではホールド・アウト法でモデルの頑健性を確認することが多いと思います。
データを学習データとテストデータに分けて、テストデータでの精度やAUCを比較し過学習をしていないか、未知のデータに対しても性能が期待できるかを確認する方法です。

例えば、学習データを70％、テストデータを30%にわけ、70%の学習データでモデルを作成して、テストデータで精度やAUCを確認します。
学習データでに精度（例では80%）とテストデータでの精度（例では76%）を比較して、下がり過ぎていないか、十分な精度かを確認して、本番適用すべきかを考えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/ace36efb-d93d-1678-7f21-d2cfeacd1360.png)

Modelerではデータ区分ノードでホールド・アウトの割合を決めて、精度分析ノードで確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/fe8a6b1b-a90e-a2ac-8e87-85910a88628b.png)


#2. クロスバリデーション
しかしながら、
* そもそも学習に使えるデータが少ない場合
* 判別したいカテゴリの割合がデータが少ない場合（めったにコンバージョンしない、故障しないなど）
テストデータを準備することが難しいことがあります。

こういう時にクロスバリデーションを使います。

クロスバリデーションではスコアリングモデル自体は全データをつかって作成します。
そして、データをK個に分割してK個パターンの検証用学習データと検証用テストデータをつくり、それぞれで検証用モデルとテストデータ精度を算出し、その平均で元々のスコアリングモデルを評価します。

以下の図で解説します。
まず、全データを学習データとしてモデルを作成しました。この学習データの精度は81%になっています。
そしてその学習データを3分割し、3パターンの検証用学習データと検証用テストデータをつくり、3つのモデルを作って、３つのテストデータ精度を算出して、その平均として、全体精度73%を計算しています。未知のデータに対しては、学習データでの精度である81%よりも、クロスバリデーション結果の精度である73%に近い性能のモデルだろうと考えることになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/b1d83888-e955-9ff5-864b-1a1f76f5613f.png)


Modeler 18.2.2の自動分類ノードのクロスバリデーションの機能を使ってこれを行ってみます。

自動分類ノードのモデルタブで交差検証にチェックをつけて、分割数を入力します。ここでは上の例に合わせて3にしています。（デフォルトは5です。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/d0c0edbf-e11a-e465-90e6-6498d53cbc89.png)

次にエキスパートタブで使いたいモデリング手法を選びます。ここではCHAIDを選びました。クロスバリデーションが目的であれば、通常は一つのモデリング手法を選び、モデルを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/d5abdfa2-2545-9e93-7cb6-04b74796dc00.png)

できたモデルをみるとクロスバリデーションで算出された精度とAUCが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/1ab82b3a-47c9-7b9b-204c-c042003c7ce1.png)

なお、このモデルの中身を見た場合はスコアリング・モデルが表示されます。ルートノードをみると全件が対象になっているのがわかります。一つ一つの検証モデルを参照することはできません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/68af2aa9-1a87-0c77-7a90-be784c8e3729.png)

また、このモデルの精度分析ノードでの結果は全データをつかって作成したスコアリングモデルの精度やAUCが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/8b3ad227-300f-1e9a-547e-5d069554d943.png)

#3. クロスバリデーション（数値予測）
数値予測についても、自動数値ノードによってクロスバリデーションが行えます。

モデルタブに交差検証のチェックがあり、分割数を指定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/7e26c268-a38a-dcad-08dc-530209a3fd74.png)

エキスパートタブで使いたいモデリング手法を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/4d0ce42b-c4b5-0a14-c3dd-4a7a3f2004b0.png)

作成されたモデルをみると検証用モデルに対する、相関（予測値と実測値）と相対誤差(1-R2乗)の平均が表示されますので、これでモデルを評価します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/5f10a8a2-9195-5a43-c41f-5fcc7bcf8761.png)

やはり、精度分析ノードで確認する指標は全データでつくったスコアリング・モデルに対する指標になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/86197389-1840-ce0d-02a5-4427be7eb53f.png)

#4. Modeler 18.2.2より前のバージョンでのクロスバリデーション
自動分類ノードと自動数値ノードで行うクロスバリデーションはModeler 18.2.2からの機能です。

しかしながら、C5.0には交差検証の機能は以前のバージョンから可能でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/9491b1d7-347f-8e38-0efb-1857f6bfb06a.png)


それ以外のモデルで交差検証を行う場合にはスクリプトで行うことができます。

https://www.ibm.com/blogs/solutions/jp-ja/spss_kwospecialmodeler07/