無料で始めるAutoML超入門 ~有馬記念で1位を予測する~(後編)

#概要
この記事では Oracle Cloud の Always Free Cloud Services によって利用可能な Autonomoud Database を利用して、AutoML UI を活用して有馬記念の着順を機械学習で予測する手順をチュートリアル形式でご紹介します。
ボリュームが多いので、前半と後半に記事を分けており、本記事は後半となります。

前半は以下のリンクからアクセスできます。
[無料で始めるAutoML超入門 ~有馬記念で1位を予測する~(前編)](https://qiita.com/rkondo/items/317d141fda6f5ecf5bf4)

#全体の流れ
以下の流れとなります。

1. 学習データの取得と整形
2. テストデータの作成
3. Oracle Cloud の無料トライアル申し込み ～ 仮想ネットワーク(VCN)の作成
4. Autonomous Databaseの構築(Always Free)
5. 機械学習用のユーザー作成と権限の付与
6. 学習データのロード
7. AutoML UIによるモデル作成
8. 着順の予測
9. 着順スコアの予測
10. 実際の結果

本記事（後半の記事）では 7~10 を記載します。

# AutoML UIによるモデル作成

先ほどはOMLユーザーでロードした状態であるため、そこからの続きとして記載します。
左上のハンバーガーメニューから Oracle Machine Learning をクリックします。
![2024-02-25_16h10_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/72e6b7d1-729c-c58f-933e-389a69a81b21.png)

ログイン画面に移りますので、先ほどのOMLユーザーでログインします。
![2024-02-25_16h11_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/6454f682-eeaf-9a55-9911-aa6c12e8cb4c.png)

クイック・アクションのリンクの中から AutoML を選択します。
![2024-02-25_16h13_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/146c3043-0d44-5508-74c9-5b6f81544eb8.png)

AutoML実験という画面が開きますので、作成ボタンを押してモデルを作ります。
![2024-02-25_16h14_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/6cfe4c0f-7578-78a9-4e73-4194c13857c0.png)

名前欄にはモデルを識別するための任意の名前を入力します。
ここでは有馬記念の確定着順を予測するモデルとわかるため、「有馬記念_確定着順予測1」としています。
モデル名が入力できたら、データ・ソースの右側の虫眼鏡をクリックします
![2024-02-25_16h16_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/e135017f-5a94-c713-863e-cc95473cd09b.png)

学習する元となるテーブルの選択画面が出ます。
race.csvのデータはRACE表に格納されているため、OMLユーザのRACEを選択します。
![2024-02-25_16h17_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/5e38559d-f13e-1a61-ef06-ddb8cf2595a9.png)

続いて予測する列を指定します。
予測ターゲットの選択の部分をクリックします。
![2024-02-25_16h19_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/1e4866b7-27f3-8c6f-9875-86f744ae09b5.png)

今回は確定着順データを予測するモデルを作りたいので、確定着順を選びます
![2024-02-25_16h20_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/cd3b7acf-d19c-5c8c-8a8d-035250d0fdbd.png)

続いて予測タイプを選びます。
今回予測するのは着順となりますので、分類するようなものではありません。
回帰分析で求めるものになるため、ここでは回帰を選択します。
ケースIDはここでは何も選択しないで次に進みます。
![2024-02-25_16h22_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/53c3c516-d7ef-5d56-720b-f186195e48b2.png)

続いて、追加設定を開きます。
ここではいろいろな数字が入っていますが、基本的にはデフォルトで問題ありません。
モデル・メトリックの欄では評価のためのアルゴリズムを選びますので、ここではR2を選択しました。
![2024-02-25_16h23_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/e3656759-d9fa-245a-4ae4-c6297078546b.png)

さらに下にはアルゴリズムを選択する欄があります。
デフォルトではすべての欄にチェックが入っていると思います。
これは、今回予測分析するうえで実行時間を短くするという言うことであればチェックを外すのが良いですが、よくわからないということであれば全部チェックを付けた状態にするのが良いと思います。
![2024-02-25_16h26_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/fce41b2b-0e9d-aba0-cb0d-1ee04e364c65.png)

さらに下にスクロールすると、特徴というところにrace.csvの列が記載されていることがわかります。
この中で、race.csvには含まれているけどtest.csvに含まれていない列が存在する場合、チェックを外します。
今回は「確定着順」と「着順スコア」を予想してみる予定であるため、確定着順を予測する際は着順スコアの情報は分析対象外とする必要があります。
そのため、ここでは着順スコアのチェックを外しています。
![2024-02-25_16h33_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/c7c86e19-3089-0173-3b5e-209c9bce6c42.png)

ここまで入力が完了したら、右上の開始ボタンを押して「より速い結果」と「より良い精度」のどちらかを選択します。
![2024-02-25_19h12_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/379a01f5-7b0e-bc36-9942-39ab53007554.png)

選択するとモデルの作成が動作していきます。
![2024-02-25_16h36_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/393d88ec-9c95-9040-99dd-d2c02cf293fc.png)

より速い速度を選択したところ、3分でモデルが作成できました。
![2024-02-25_16h40_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/486510de-0bb0-674d-c0ea-82530beccd3b.png)

リーダー・ボードを見てみましょう。
ここにR2で評価した結果が、評価の高い順に並びます。
この例ではニューラル・ネットワークの精度が一番よかったようです。
![2024-02-25_16h43_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/fe7a1506-ceee-5fc5-847a-7e5c0aed2f71.png)

では、ニューラル・ネットワークではどの列に着目して着順を予測しているのかを確認しましょう。
モデル名のリンクをクリックします。
![2024-02-25_16h43_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/366b37a2-f2bb-b189-448d-71b824c7d13f.png)

すると、モデルの詳細が開きます。
![2024-02-25_16h44_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/52ad08fc-ef99-5061-1e38-8404817512b1.png)

ここでは、AVE_3Fの情報と、PCIの情報の影響が大きいということが確認できます。
どちらも実は走ってみないとわからない情報ではありますが、今回はこれらのデータがわかっている想定で予測モデルを作っています。

こんかいはニューラル・ネットワークの精度が高かったということなので、ニューラル・ネットワークのモデルを利用しようと思います。
「ノートブックの作成」ボタンを押すことによって、モデルを利用するためのpythonのノートブックを作成してくれるので、今回はこの機能を使おうと思います。
![2024-02-25_16h49_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/a07fc3cf-fba0-fbb4-357d-6b9129651887.png)

クリックすると作成するノートブックの名前を聞かれるので適当に記載してOKを押します。
![2024-02-25_16h51_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/c2a29399-0e01-39fd-14bb-23c4136800f2.png)

そうすると、画面の下にノートブックが作成された旨のメッセージと「Open Notebook」のボタンが表示されます。
このボタンを押すことで、ノートブックを開くことができます。
![2024-02-25_16h51_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/383be334-c675-ef6e-75d5-0369c196e0ee.png)

では、実際にこのモデルを利用して確定着順を予測してみましょう。

# 着順の予測

先ほどの「Open Notebook」のリンク、もしくは左上のハンバーガーメニューを押し、「Notebooks EA」をクリックすることで、先ほど作成してNotebookを開くことができます。
![2024-02-25_16h51_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/3e0964af-2e70-5b9b-964c-6a7a35903553.png)

既にPythonのコードが埋め込まれていることがわかると思います。
必要な事項は既にコードが入っているので、実行ボタンを押します
![2024-02-25_16h56_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/f81d2770-f631-c6f3-b51d-3dfa19e24cde.png)

実行しても良いですか？といったメッセージが出るので、
![2024-02-25_16h56_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/a4d25dbe-cbab-1a2f-9c59-60099276f826.png)


実行しても良いか聞いてきますので、確認を押します。
![2021-11-30_19h20_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/95ae27e6-d831-99b2-d5e9-0e6c15763123.png)

さらに「ユーザーの処理が必要」というメッセージが出現しますので、ここは「実行を許可」を押します。これによってPythonのコードが実行され、先ほどAutoMLで作成したモデルがメモリに展開されます。おそらく1分もかからずに処理が実行されると思います。
![2024-02-25_16h57_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/dd229fec-c85a-6b1d-54a1-0fb54edde5d0.png)

モデルに展開された後の流れとしては、TESTテーブルの内容も同様にメモリに展開し、その後でモデルに適用する形となります。
TESTテーブルの内容をメモリに展開するコードを1から書くのは面倒なので、Notebookの上の方にあるRACEテーブルを展開したときの記載を参考にしようと思います。
「Get proxy object for selected data」と書かれた部分のコードをコピーしておきます。
![2024-02-25_17h03_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/5868bd15-fd12-7a56-5461-a79bc1abbad7.png)

Notebookの一番下までスクロールして、その下にさらにコードを追加したいと思います。
一番下にカーソルを合わせると記号がいくつか出現しますので、＋の記号をクリックします。
![2024-02-25_17h03_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/5af77ef1-e101-44fc-9b77-9a7819a93c0a.png)

そうすると、入力できる欄が追加されます。
![2024-02-25_17h05_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/2cedca95-0e26-4403-3212-8a6071037217.png)

ここに、先ほどコピーした内容を張り付け、以下の4つの修正を行います。
* columns の中から予測する列の情報として「, '"確定着順"'」の情報を消す
* columns の中に馬名の情報が入っていない場合は、「'"馬名"' , 」を追加する
* tables = のところのテーブル名をTEST（大文字）に変える
* query = のところの table よりも右の文字を全部消す

画像としては以下になります。
こちらが入力出来たら、セルの右側にある三角形の実行ボタンを押します。
![2024-02-25_17h19_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/48a86f1f-4319-ed9e-e441-eb75e5be34b1.png)

コードとしては以下を記載しました。
```
%python

import oml

columns = '"馬名"' , '"メス"' , '"センバ"' , '"AVE_3F"' , '"前レーススコア"' , '"先行"' , '"栗毛"' , '"馬番"' , '"距離"' , '"発走時刻"' , '"単勝オッズ"' , '"追込"' , '"PCI"' , '"逃げ"' , '"馬体重"' , '"前々レース着順"' , '"C3前レース着順"' , '"斤量"' , '"差し"' , '"人気"' , '"後方"' , '"コーナー回数"' , '"オス"' , '"前々レーススコア"' , '"出生後日数"' , '"前レース着順"' , '"レース番号"' , '"マクリ"' , '"場所"' , '"中団"' , '"不"' , '"C3前レーススコア"' 
schema='"OML"'
table='"TEST"'

column = ','.join(columns)
query = 'SELECT ' + column + ' FROM ' + schema + '.' + table 

build_data = oml.sync(query=query)
z.show(build_data)
```

TESTテーブルのデータが表示されたらコードが正しく実行され、TESTテーブルが読み込まれた結果となります。
![2024-02-25_17h23_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/9dd12234-b2b3-2931-4495-5911ecf8f4d2.png)

では続いてモデルをTESTテーブルに適用していきます。
カーソルを下に合わせ、＋ボタンを押します。
![2024-02-25_17h23_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/957555b9-bde0-01f4-e7de-031b8391d092.png)

新しい入力欄を出現させます。
![2024-02-25_17h25_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/45fabfd4-4380-17cc-3022-5e9d069e0fb5.png)

この新しい欄にモデルを適用して予想結果を出力させていきますが、モデルの情報が格納された変数名は、採用するアルゴリズムによって異なります。そのため、自動的に生成されたPythonのコードを確認しなければわかりません。
まずは少し上の方に記載されている「Build MODEL_NAME_TITLE model」のところから、変数名を確認します。
この例では nn_mod という変数に情報が入っているようです。
![2024-02-25_17h28_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/304e0595-0dc9-7fdd-08a9-c9dd695a3916.png)

では、TESTテーブルをnn_modに適用して確定着順の予測結果を取得するために、先ほど追加した空欄にコードを書いていきます。
先ほどTESTテーブルをbuild_dataという関数に入れているため、それをモデルに適用します。
その結果を「予想着順」という列として用意し、モデルを適用する際に利用したテーブルに対して列をそのまま追加し、そのテーブルを「確定着順予測テーブル」というテーブルにして保存したのが以下のコードです。
![2024-02-25_17h35_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/465bdf75-3049-83f4-60ae-4c6fb171d64d.png)

コードは以下です。
```
%python

oml_prediction = nn_mod.predict(build_data)
prediction = build_data.pull()
prediction['予想着順'] = oml_prediction['PREDICTION'].pull()
oml.create(prediction, table='確定着順予測テーブル', oranumber=False)
z.show(prediction)
```

これにより、「確定着順予測テーブル」に予測着順データが格納されました。
では、早速このデータを確認していきます。
このNotebookではSQLも実行できるため、その機能を使って結果を参照します。

まずはカーソルを下にもっていき、＋ボタンを押して
![2024-02-25_17h36_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/994b3527-fd39-1984-a557-0079d7c4f195.png)

以下のコードを入力して実行します。
![2024-02-25_17h38_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/ea6aa972-3ffb-eba0-d865-89c326d2cf88.png)

コードは以下です。
```
%sql

select "馬名","予想着順" from "確定着順予測テーブル" order by "予想着順";
```

%sql から始まることにご注意ください。

実行した結果は以下です。
![2024-02-25_17h48_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/8ba2a024-87b2-91c7-59d2-5ec1b15a0775.png)

着順は値が小さければ小さいほど良い評価値なので、エフフォーリアが一番着順として数字が小さい＝1着になる可能性が高いということがわかりました。

着順予想としては以上ですが、1着5点、2着3点、3着1点とした着順スコアの場合はどうなるのかも確認してみます。


# 着順スコアの予測
確定着順の予測を行いましたが、さすがにコースレコードの情報などから順位を予測するのは難しいと感じたため、着順のスコアを予測し、一番スコアの高い馬＝1位を取る可能性が高いと考え、再分析を行いました。

AutoMLで先ほどと同様のデータを選びつつ、予測欄に「着順スコア」を選択します。
![2024-02-25_17h51_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/7b36c41a-0c33-4554-1dd3-fde09f56b3fa.png)

モデル・メトリックには先ほどの確定着順を予測したときと同じ評価軸を選択しています。
![2024-02-25_17h51_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/39d640a6-fe1f-d7f3-b7ee-5b144fa27806.png)

また、着順スコアを予想するうえで、確定着順の情報もTEST.csvには含まれていないため、チェックを外しておきます。
![2024-02-25_17h52_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/e4ec3adb-5da3-4434-37dc-727364f6f4ad.png)
これをしておかないと、おそらく確定着順を採用した予想モデルができてしまうので注意が必要です。

この準備ができたら、画面の上までスクロールして開始ボタンを押します。
ここでは「より速い結果」を選択しました。
![2024-02-25_17h52_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/e19d4373-4583-be1b-865b-bbaf5af03c36.png)

結果としては先ほど同様に3分で完了しました。
また、先ほどと同じくニューラル・ネットワークのアルゴリズムが一番精度が高い様子が確認されます。
![2024-02-25_17h56_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/71545b99-c7fa-bd42-230d-87fa14944eda.png)

ニューラル・ネットワークのモデルの詳細を確認してみます。
確定着順とは違い、今度は脚質の情報が多く影響しているようです。
（この例では、脚質の値ごとに列を追加し、該当する場合は1、該当しないなら0という列を追加しています）
![2024-02-25_17h57_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/23d68c20-0a2c-78a7-14d5-2f8fe9950ca8.png)

ニューラル・ネットワークのモデルが一番精度として良いので、これでノートブックの作成を行います。
![2024-02-25_17h58_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/01c58e12-234e-5bcb-abc1-aeeecb91fea0.png)
![2024-02-25_17h58_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/1e2fa606-176d-ac80-dfe3-77042171bdc7.png)

ノートブックが完成したら、ノートブックを開きます。
![2024-02-25_17h58_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/de067a03-a17a-a0ae-9a48-10bfcda074a3.png)

ノートブックの一番上の△を実行してノートブックを実行します。
画像はボタンをクリックした後の状態です。△が□になります。
![2024-12-24_11h22_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/20505ba7-a810-4c07-d56e-9000ec8202a5.png)


最後まで実行できたら、一番下までスクロールして欄を追加します。
そこに、今度は当日のレースとして走る馬の情報が格納されたテーブルを呼び出します。
ここで、少しPythonのコードを記載します。
![2024-02-25_18h02_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/5387405b-583f-5054-d07b-4fa6e510fcb0.png)

画像のコードとは違いますが、以下のコードを入力します。
今回はOMLユーザーのTESTというテーブルに、当日走る馬などの情報が格納されている想定です。
必要に応じてユーザー名とテーブル名は修正をしてください。
※ 大文字である必要がありますので注意してください。
```
%python

import oml

schema='"OML"'
table='"TEST"'

column = ','.join(columns)
query = 'SELECT * FROM ' + schema + '.' + table 

build_data = oml.sync(query=query)
z.show(build_data)
```

エラー無く実行出来たら、今度はモデルを適用していきます。
今回は着順スコアを予測するモデルであるため、予測着順スコア列を追加し、結果を着順スコア予測テーブルとして生成します。
![2024-02-25_18h05_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/9cd6c530-0b4d-bbe2-024b-9a48d161a05c.png)

コードは以下です。
追加する列名を変更したい場合や、出力したいテーブル名を変えたい場合は自由に変更してください。
```
%python

oml_prediction = nn_mod.predict(build_data)
prediction = build_data.pull()
prediction['予想着順スコア'] = oml_prediction['PREDICTION'].pull()
oml.create(prediction, table='着順スコア予測テーブル', oranumber=False)
z.show(prediction)
```

着順スコア予測テーブルに予測結果が格納されたため、その情報をselect文で確認します。
![2024-02-25_18h09_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/8b77405d-5c7b-48c1-8173-659135a10c1b.png)


コードは以下です。
```
%sql

select "馬名","予想着順スコア" from "着順スコア予測テーブル" order by "予想着順スコア" desc;
```

実行した結果は以下になりました。
![2024-02-25_18h50_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109354/f466f016-e1df-e4b4-5f0c-56bd61db6cf5.png)

今回予想したのは着順スコアであり、スコアが高ければ高いほど予想順位が低いというものであるため、最もスコアの高い馬が1着になる可能性が高いということになります。

結果、予測スコアが最も高いのはこちらもエフフォーリアとなりました。
どちらにおいてもエフフォーリアが1着に来るという予測になっています。


# 実際の結果
実際のレースでは以下の順位でした

1位 エフフォーリア
2位 ディープボンド
3位 クロノジェネシス

ディープボンドの予測が出来ませんでしたが、1位の予測は的中することができました。
複勝であればかなりな確率で勝率を上げられるかもしれません。