該当レコードは学習には用いない調整済み残差でPRESSを求める(SPSS Modeler データ加工逆引き8-15)

# 該当レコードは学習には用いない調整済み残差でPRESS(予測残差平方和)を求める

![スクリーンショット 2023-06-14 15.20.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a2bdc08b-a904-7969-1dbc-948e7ba839f2.png)

＊予測残差平方和はSPSS Statistics 29.0.1で以下の通り、標準搭載されましたがSPSS Modelerではノードを繋いで求める必要があります。

![スクリーンショット 2023-06-14 17.38.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/97dcd960-a477-77b0-0104-53de545efc37.png)


## 1.想定される利用目的

・回帰モデルを複数作成した際の評価に利用

## 2.サンプルストリームのダウンロード

①一般的なスコアリングを用いる場合

https://github.com/yoichiro0903n/blue/raw/main/PRESS.str

②該当レコードは学習には用いない調整済み残差で求める場合（Modelerスクリプトを利用）

https://github.com/yoichiro0903n/blue/raw/main/PRESS_Loop.str

## 3.サンプルストリームの説明

#### ①一般的なスコアリングを用いる場合

![スクリーンショット 2023-06-14 16.01.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5ed0c85d-23da-d0bd-b211-56ce665b1d45.png)

a.入力するデータは以下の通りです。
![スクリーンショット 2023-06-14 16.05.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/2b4d0c13-5052-5b9b-e719-721aeeb63b10.png)

b.[データ型]ノードを以下のように設定します。馬力を予測するモデルを作成します。
![スクリーンショット 2023-06-14 16.05.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e0e498b0-bda3-7272-5f6e-5b8cd7485f7b.png)

c.[線型回帰]ノードを配置して実行します。

d.モデルナゲットを右クリックして[プレビュー]を選択します。予測フィールドが追加されました。
![スクリーンショット 2023-06-14 16.06.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/04f72ad5-2b37-91b7-bb0e-72ba71ff055b.png)

e.[フィールド作成]ノードを編集します。残差と予測の差を2乗します。
![スクリーンショット 2023-06-14 16.06.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/6a86c804-7756-7f00-e2b7-30c6797cd703.png)

[プレビュー]を実行します。
![スクリーンショット 2023-06-14 16.07.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ef7c555a-2a95-1a4b-d8c2-97d0a2f45a6e.png)

f.[レコード集計]ノードを編集します。残差平方和を求めます。
![スクリーンショット 2023-06-14 16.07.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/0c20fb74-c09e-12ea-6155-32a8832f4d72.png)

[テーブル]を実行します。
![スクリーンショット 2023-06-14 16.07.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/c4974e32-4bad-5091-6bf6-9d8f5269660a.png)

#### ②該当レコードは学習には用いない調整済み残差で求める場合

300回ループさせて、全レコード（行）に対して該当レコードを含まない学習データで作成した予測値と残差を利用します。SPSS StatisticsのPRESSと同じ演算方法です。

![スクリーンショット 2023-06-14 16.03.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/09e3ac09-9b0e-aba7-fde3-54e3367ea38f.png)

g.[条件抽出]ノードを配置します。条件はブランクのまま　[モード]を[破棄]にします。
![スクリーンショット 2023-06-14 17.55.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/24c81d9f-bd2a-a171-9453-c21f99a1d893.png)

h.[条件抽出]ノードを配置します。条件はブランクのまま　[モード]を[含める]にします。
![スクリーンショット 2023-06-14 17.55.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e051f8b9-d9f9-b943-dac5-17f1243d0b33.png)

i.[フラットファイル]ノードを編集します。ファイル名とパスを指定して[データのインポートノードを生成]にチェックをして実行します。
![スクリーンショット 2023-06-14 17.57.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/4847fb0c-a52f-b465-8c82-d8453efddbee.png)

j.インポートノードが自動生成されました。先のiで指定した[データのインポートノードを生成]のチェックを外してから
後続としてeとfを複製して接続します。

### Modelerスクリプトでループを設定する

![スクリーンショット 2023-06-14 18.15.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/662b71db-e766-bc27-ecb7-e009c6e04993.png)


Pythonモードで以下のようにスクリプトを記述します。[このスクリプトを実行]を選択します。

![スクリーンショット 2023-06-14 18.10.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/4f620cb9-ec87-2f2f-c5d4-fb0e01d21b76.png)

```python:pythonスクリプト
stream = modeler.script.stream()
dis= stream.findByType("select","out")
inc= stream.findByType("select","one")
output = stream.findByType("outputfile",None)

num = 1
while num <= 300 :
    dis.setPropertyValue("condition",u"ID = "+ str(num) )
    inc.setPropertyValue("condition",u"ID = "+ str(num) )
    stream.findByType("regression",None).run(None)	

    if num == 1:
     output.setPropertyValue("write_mode", "Overwrite")
    else:
     output.setPropertyValue("write_mode", "Append")
    stream.findByType("outputfile",None).run(None)	
    num = num + 1

stream.findByType("table",None).run(None)	

```

### ループ処理を実行する

画面の▶︎ボタンを押すと３００回モデルをループしながら作成します。


![スクリーンショット 2023-06-14 18.17.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/b66f729a-800e-041e-2cb9-29266c60e245.png)

処理が終了するとPERSSが表示されます。
![スクリーンショット 2023-06-14 18.51.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1974f036-440e-c515-7b3b-dfc4b6be4ee4.png)


#### 注意事項

以下StatisiticsのPRESS（表示が誤訳になっています）との比較です。Statisticsの予測の少数桁数がModelerと異なった影響でわずかに差が生じました。

![スクリーンショット 2023-06-14 18.56.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/105301cb-7b70-9704-4e82-1032ed32536e.png)



## 4.参考情報

#### PRESSを扱った記事

https://qiita.com/416nishimaki/items/f51e8281cf68772dc0a2

#### Modelerスクリプトを扱った記事

https://qiita.com/416nishimaki/items/8e406c4787c4670a023e

https://qiita.com/416nishimaki/items/319d92838c0efef8be68

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008