5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

今度は Oracle Machine Learning AutoML UIで機械学習してタイタニック号の生存者を予測

Last updated at Posted at 2021-05-10

本投稿の背景

Oracle Autonomous Data Warehouseに AutoMLの機能が追加されました。
  https://www.oracle.com/jp/corporate/pressrelease/jp20210318.html

機能を簡単に言うと、
「Oracle Autonomous Databaseに無償で機械学習機能が組み込まれ、Oracle Autonomous Databaseにあるテーブルデータを使用して機械学習ができ、機械学習で作成したモデルをRest APIで公開できます。また、機械学習はローコードで実施できます。」 

ちょうど、前記事で Oracle Cloud Infrastructure Data Science を使用して、
機械学習で予測結果を評価しており、
「Oracle Machine Learning AutoML UI」と「Oracle Cloud Infrastructure Data Science」で
予測結果の比較をするのも面白いなと思い記事にしました。

■機械学習をするお題
 Kaggleのタイタニック生存者予測を提出して正解率を確認します。
 ※タイタニック生存者予測にの説明は、こちら を参照ください

記事では、以下2つについて記載しております
1.[前回の記事]の 「Oracle Cloud Infrastructure Data Science」 で予測した結果と
「Oracle Machine Learning AutoML UI」で予測した結果を比較

2.Oracle Machine Learning AutoML UIでモデルをデプロイしてREST API使用することができますので、APIをコールして予測結果を受け取ります

※手順は詳細に記載しており、やってみようと思う方のお役に立てたら幸いです。

実施手順

以下の手順で進めます。
1.Always free(無料)のOracle Autonomous Data Warehouse を作成
2.Oracle Machine Learningユーザの作成
3.csvデータをDBに登録
4.Oracle Machine Learning AutoML UIでモデル作成とデプロイ
5.Kaggleに提出する生存者データを予測
6.KaggleにOracle Machine Learning AutoML UIで予測した結果を提出
7.Rest APIをコールして予測結果を受け取る

※設定手順などの詳細は、折りたたんでいるので、確認は ▶ をクリックください

1.Always free(無料)のOracle Autonomous Data Warehouse を作成

今回はAlways free(無料) で Oracle Autonomous Data Warehouse を作成します。
 https://docs.oracle.com/ja-jp/iaas/Content/Database/Concepts/adbfreeoverview.htm

1-1.コンパートメントの作成

コンパートメント作成の詳細はこちら
コンパートメントの作成については、[こちら](https://qiita.com/kngsym2018/items/34b512fef527db38fd40#2%E3%82%B3%E3%83%B3%E3%83%91%E3%83%BC%E3%83%88%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90)

1-2.Oracle Autonomous Data Warehouseの作成

Oracle Autonomous Data Warehouse作成の詳細はこちら

メニューの[Oracle Database]-[Autonomous Database]をクリック
image.png

1-1.で作成したコンパートメントになっている事を確認して、[Autonomous Databaseの作成]をクリック
image.png

作成したコンパートメントになっていることを確認、DBの表示名、データベース名を入力して、
[ワークロード・タイプの選択]を「データ・ウェアハウス」をクリック
image.png

[Always Free]を選択
image.png

DB管理者 ADMINのパスワードを入力
image.png

[Autonomous Databaseの作成]をクリック
image.png

[使用可能]になるのを待ちます
image.png

2.Oracle Machine Learningユーザの作成

AutoMLやモデルのデプロイをを実行するOracle Machine Learningユーザを作成します。
今後はこの作成したユーザを使用します。

Oracle Machine Learningユーザ作成の詳細はこちら

[サービス・コンソール]をクリック
image.png

[管理]をクリック
image.png

[Oracle MLユーザの管理]をクリック
image.png

[作成]をクリック
image.png

[ユーザ名]、[電子メール・アドレス]、[チェック]を外し、[パスワード]を入力して、[作成]をクリック
image.png

ユーザが作成されたことを確認
image.png

作成したOracle Machine Learningユーザがcsvファイルを取り込めるようにする設定をします

[開発]-[データベース・アクション]をクリックします
image.png

ADMIN と入力
image.png

パスワードを入力して、[サインイン]をクリック
image.png

[SQL]をクリック
image.png

Oracle Machine Learningユーザが「データベースアクション」できるように設定
sqlで設定
image.png

p_url_mapping_pattern は、ユーザ名の小文字を設定

BEGIN
   ORDS_ADMIN.ENABLE_SCHEMA(
     p_enabled => TRUE,
     p_schema => 'AUTOML',
     p_url_mapping_type => 'BASE_PATH',
     p_url_mapping_pattern => 'automl',
     p_auto_rest_auth => TRUE
   );
   COMMIT;
END;
/

3.csvデータをDBに登録

Kaggleからダウンロードした機械学習するデータ(train.csv、test.csv)をDBにロードします。

csvデータをDBに登録の詳細はこちら

[開発]-[データベース・アクション]をクリックします
image.png

さっきほど設定した、p_url_mapping_pattern で設定した、ユーザ名の小文字を入力して
パスワードを入力、そして[サインイン]をクリック
image.png

[データ・ロード]をクリック
image.png

[ローカル・ファイル]を選択して、[次]をクリックします
image.png

3-1.train.csvのロード

Kaggleからダウンロードした、train.csvをドラッグ・アンド・ドロップします
image.png

鉛筆マークをクリック
image.png

[Servived]を選択して、VARCHAR2にデータ型を変更して、[閉じる]をクリック
※後工程のnotebook作成でエラー回避する対応
image.png

▶ ボタンをクリックして、[実行]ボタンをクリックします
image.png

[ステータス]が完了されていることを確認して、[完了]ボタンをクリック
image.png

3-2.test.csvのロード

[データ・ロード]をクリック
image.png

[ローカル・ファイル]を選択して、[次]をクリックします
image.png

test.csvをドラッグ・アンド・ドロップ
image.png

▶ ボタンをクリックして、[実行]ボタンをクリックします
image.png

[ステータス]が完了されていることを確認して、[完了]ボタンをクリック
image.png

4.Oracle Machine Learning AutoML UIでモデル作成とデプロイ

ロードしたデータを使用して機械学習を行います

Oracle Machine Learning AutoML UIでモデル作成とデプロイする手順詳細はこちら

[開発]をクリック
image.png

[Oracle Machine Learningノートブック]をクリック
image.png

「2.Oracle Machine Learningユーザの作成」で作成したユーザ、パスワードを入力して「サインイン」をクリック
image.png

[AutoML]をクリック
image.png

[作成]をクリック
image.png

「名前」、「コメント(任意)」を入力して、「データ・ソース」の[虫眼鏡アイコン]をクリック
image.png

「スキーマ」を作成したユーザ(この記事だとAUTOMLユーザ)を選択、「表」とトレーニングデータの
[TRAIN]を選択して、[OK]ボタンをクリック
image.png

「予測」は 機械学習で予測する列を選択します。※生存フラグ列の[SURVIVED]列を選択。
「予測タイプ」は、「予測」で列を選択した際に自動で[分類]or[回帰]を選択してくれます。
「ケースID」は、今回は一意な列[PASSENGERID]を選択
image.png

[開始]ボタンをクリック。今回は「より早い結果」を選択
image.png

実行中を表示される。進捗状況は[・・・]をクリック
image.png
image.png
学習が終わると[完了]と表示される
image.png

アルゴリズム毎の精度がでる。(今回はランダム・フォレストが精度が高かった)
詳細はモデル名をクリック
image.png

予測するにあたり影響が大きい列が表示される。「混同行列」をクリックすることで混同行列を確認できる
image.png
image.png

デプロイするモデルを選択(今回はランダム・フォレスト:rf_6ce964502f)を選択して、[デプロイ]をクリック
image.png

「名前(任意)」、「URI(任意)」、「バージョン(任意)」、「ネームスペース(任意)」、「共有」にチェックを入れ、[OK]をクリック
image.png
モデルのデプロイ結果が表示される
image.png

画面左上の[モデル]をクリック
image.png

[デプロイメント」をクリック
image.png

作成したモデル名をクリック
image.png

作成したモデルは、予想する際に必要な情報は、「AGE」、「FARE」、「PCLASS」、「SEX」、「SIBSP」で
結果は、"0"、"1" でかえるようになっている
image.png

URIの情報を確認
image.png
URIをPATHを確認(あとで使用します) ※APIのURLになります
image.png

5.Kaggleに提出する生存者データを予測

notebookを作成すると、
「4.Oracle Machine Learning AutoML UIでモデル作成とデプロイ」で作成したモデルを
Pythonのコードにして自動生成されます。

notebook上でpythonを実行し、モデルを使用できる状態にして、
Kaggleに提出する生存者データの予測をします。

Kaggleのtestデータを予測する手順詳細はこちら

画面左上の[AutoML]をクリックします
image.png
作成したAutoMLをクリック
image.png

先ほどデプロイした精度の1番高いアルゴリズムを選択して、[ノートブックの作成]をクリック
image.png

ノードブック名を入力して、[OK]をクリック
image.png

[ノートブック]をクリック
image.png

作成されたノートブックが表示される。ノートブック名をクリック
image.png

ノートブックが開くと、AutoMLで選択したアルゴリズムからpythonコードに変換されている
このpython コードを上から順番に実施していき、モデルが使用できる状態にして、
「Kaggleに提出する test データ」を予想させます

▶ をクリックして、pythonを上から順番に実行します。(編集なしで実行のみでOK)
image.png

「Show Accuracy」の後に以下のコードを入力します。
内容は、「TEST」テーブルのデータを読み込み、モデルに予測させる内容となります
image.png

%python
import oml

columns = '"PASSENGERID"' , '"AGE"' ,  '"FARE"'   , '"PCLASS"' , '"SEX"' , '"SIBSP"' 
schema='"AUTOML"'
table='"TEST"'

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

data_test = oml.sync(query=query)
result = rf_mod.predict(data_test)['PREDICTION'].pull()
print(result)

実行すると予測結果が表示されます。結果をコピーしてKaggleに提出する形式に加工します。
※PASSENGERID順の予測結果になっている
image.png
image.png

6.KaggleにOracle Machine Learning AutoML UIで予測した結果を提出

Oracle Machine Learning AutoML UIで予測した結果を提出

image.png

結果は、77.9%
※2021年5月に予想した結果になります(日々、製品は進化するのでいつ時点の結果かを追記)
image.png

「Oracle Machine Learning AutoML UI」と「Oracle Cloud Infrastructure Data Science」の
 予測結果の比較

製品 正解率 生存者予測した月
Oracle Machine Learning AutoML UI 0.779 2021年5月
Oracle Cloud Infrastructure Data Science 0.760 2021年2月
※日々、製品は進化するので、結果は参考値という位置づけになります

7.Rest APIをコールして予測結果を受け取る

「4.Oracle Machine Learning AutoML UIでモデル作成とデプロイ」の手順で作成された
Rest API をコールして結果を受け取る方法について記載します。

Rest APIをコールして予測結果を受け取る手順詳細はこちら

7-1.トークンを取得する

APIをコールするには、トークンを取得する必要があります。

構文

curl -X POST --header 'Content-Type: application/json' \
--header 'Accept: application/json' \
-d '{"grant_type":"password", "username":"'<ユーザ>'", "password":"'<パスワード>'"}'\
 <OMLサーバURL>/omlusers/tenants/<テナンシOCID>/databases/<データベース名>/api/oauth2/v1/token

<ユーザ>:「2.Oracle Machine Learningユーザの作成」で作成したユーザ名
<パスワード>:「2.Oracle Machine Learningユーザの作成」で設定したパスワード
<OMLサーバURL>:以下手順で取得する OMLサーバURL
<テナンシーOCID>:以下手順で取得する テナンシOCID
<データベース名>:以下手順で取得する データベース名

■確認手順(「OMLサーバURL」、「データベース名」)
[サービス・コンソール]をクリック
image.png
「OMLサーバURL」、「データベース名」を確認
image.png

■確認手順(「テナンシのOCID」)
画面右上の人アイコンをクリックして、テナンシーをクリック
OCIDの[コピー]をクリック
image.png

サンプル

curl -X POST --header 'Content-Type: application/json' \
 --header 'Accept: application/json' -d '{"grant_type":"password", "username":"'AUTOML'", "password":"'DUMMY'"}' \
 https://adb.ap-tokyo-1.oraclecloud.com/omlusers/tenants/OCID1.TENANCY.OC1..略SC7M5YHQ/databases/DBAUTOML/api/oauth2/v1/token

結果がかえる
※{"accessToken":" ~ " までがトークン (白の部分)
image.png
※取得したトークンの有効時間は1時間になりますので、失効したら再取得します

7-2.APIをコールしてみる

7-1.で取得したトークンを使用して、APIをコール

トークンを環境変数に格納して、curlを実行

構文

export token=xxx<省略>xxxx==

curl -i -X POST --header "Authorization: Bearer ${token}" --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{"inputRecords": [{"AGE":20, "FARE":200, "PCLASS":1, "SEX":"female","SIBSP":3}],"topN":2,"topNdetails":0}' -k https://192.xx.xx.xx/omlmod/v1/deployment/<設定した値>

<export> :はまりポイントは、トークンの中に「!」がある場合、export する際、エラーになるので、「\」エスケープ文字を「!」の前に入れる
<-d > :モデルで使用する条件を設定
<-k >:SSLのワーニングを無視するために入れています
<APIのURL>:「4.Oracle Machine Learning AutoML UIでモデル作成とデプロイ」で確認した、「URIをPATH」になります
<topN>:予測結果をprobabilityの高い順に並べてくれます。「0」:は "0"、"1"と結果でソート。今回は「2」として結果でソートしています(結果は"0"、"1" の2種類しかない)
<toPdetails>:予測結果したどの列が影響をしたかを表示します。今回は「0」:非表示にしています

 

■Rest APIをコールして予測結果を受け取った画面キャプチャ
 予想する条件をcurlの引数に設定して実行。
 予想が「1」になる確率が0.83 、「0」になる確率が 0.16 と結果がかえります。
image.png

Oracle Machine Learning AutoML UIで機械学習を行い、APIを公開して
API をコールすることが確認できました。

応用編:作成した予測モデルをアプリケーションから呼び出す

今回公開したAPIと前回作成したAPIをコールして、予測結果を取得するアプリを作ってみました。(PythonでCGIを用いたWebアプリケーション)
※curl から Python の変換はこのサイトで変換したものを参考にしました

構成図は以下のとおり。
image.png

各APIから予測結果が「0」、「1」と取得できるので、結果によりメッセージを変えています。
 0:「生還できない」かもしれない 
 1:「無事に帰れる」かもしれない
※Oracle Machine Learning AutoML UIの場合、probability(確率) も取得できるので表示しています

Web画面のHTMLとPythonで処理するコード。
※最低限動くコードとなっています(エラー処理などはありません)

Web画面のHTMLはこちら
画面のHTML
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>タイタニック</title>
  <head>
  <body>
    <form action="/cgi-bin/cgi-app.py" method="post">

    <h2>タイタニック号に乗船する人の情報を入力</h2>
    <table border="1" style="border-collapse: collapse">
      <tr>
        <td>チケットクラス</td>
        <td>
            <select name="pclass">
            <option value="1">上層クラス(お金持ち)</option>
            <option value="2">中級クラス(一般階級)</option>
            <option value="3">下層クラス(労働階級)</option>
            </select>
        </td>
      </tr>
      <tr>
        <td>性別</td>
        <td><select name="sex">
            <option value="male">男性</option>
            <option value="female">女性</option>
            </select>
        </td>
      </tr>
      <tr>
        <td>年齢(数字)</td>
        <td><input type="text" name="age"  maxlength="3" oninput="value = value.replace(/[^0-9]+/i,'');"></td>
      </tr>
      <tr>
        <td>同乗している兄弟/配偶者の数(数字)</td>
        <td><input type="text" name="sibsp"  maxlength="3" oninput="value = value.replace(/[^0-9]+/i,'');"></td>
      </tr>
      <tr>
        <td>同乗している親/子供の数(数字)</td>
        <td><input type="text" name="parch"  maxlength="3" oninput="value = value.replace(/[^0-9]+/i,'');"></td>
      </tr>
      <tr>
        <td>料金(数字)500以下位</td>
        <td><input type="text" name="rare"  maxlength="3" oninput="value = value.replace(/[^0-9]+/i,'');"></td>
      </tr>
      <tr>
        <td>タイタニックへ乗った港</td>
        <td><select name="embarked">
            <option value="C">Cherbourg</option>
            <option value="Q">Queenstown</option>
            <option value="S">Southampton</option>
            </select>
        </td>
       </tr>
    </table>
    <BR>
    <input type="submit" name="送信">
  </form>
  </body>
</html>

Web画面の条件で 各APIをコールして結果を返す Pythonのコードはこちら
pythonのコード

# !/usr/bin/python
# -*- coding: utf-8 -*-

import cgi
import sys
import io
import requests
import urllib.request, json
import urllib3

# Web画面の条件を変数に格納
form = cgi.FieldStorage()
pclass = form.getvalue('pclass', '')
sex = form.getvalue('sex', '')
age = form.getvalue('age', '0')
parch = form.getvalue('parch', '0')
rare = form.getvalue('rare', '0')
embarked = form.getvalue('embarked', '')
sibsp = form.getvalue('sibsp', '0')

# デバッグ用
# pclass = "1"
# sex = 'male'
# age =  '80'
# parch =  '0'
# rare =  '120'
# embarked =  'E'
# sibsp = '1'

#####
# Oracle Cloud Infrastructure Data Science のAPIコール処理
#####

# Oracle Cloud Infrastructure Data Scienceに渡す headers情報
headers = {
    'Content-Type': 'application/json',
}

# Oracle Cloud Infrastructure Data Scienceに渡す条件
dataDS =  "{\"input\":[[" + pclass + ",\"" +  sex + "\"," + age + "," + parch + "," + rare + ",\"" +   embarked    +  "\"]]}"


# Oracle Cloud Infrastructure Data Science の APIをコール
returnDS = requests.get('https://xxxxx.apigateway.ap-tokyo-1.oci.customer-oci.com/titanic/app', headers=headers, data=dataDS)

returnDSdata = returnDS.json()
predictionDS = returnDSdata["prediction"]


# 結果を編集
if str(predictionDS[0]) == "1":
    textDS ="「無事に帰れる」かもしれない"
else:
    textDS ="「生還できない」かもしれない"

  
#####
# Oracle Machine Learning AutoML UI のAPIコール処理
#####

# Oracle Machine Learning AutoML UIに渡す headers情報
headersAutoML = {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
}


# Oracle Machine Learning AutoML UIに渡す条件
dataML = "{\"inputRecords\": [{\"AGE\":"  + age  + ", \"FARE\":" + rare +", \"PCLASS\":"  +  pclass + ", \"SEX\":\"" + sex + "\",\"SIBSP\":" + sibsp + "}],\"topN\":2,\"topNdetails\":0}"

# Oracle Machine Learningユーザの情報
dataAutoML = '{"grant_type":"password", "username":"AUTOML", "password":"xxxxx"}'

# トークン情報を取得
tokenAutoML=requests.post('https://adb.ap-tokyo-1.oraclecloud.com/omlusers/tenants/OCID1.xxxxx/databases/DBAUTOML/api/oauth2/v1/token', headers=headersAutoML, data=dataAutoML)
tokentext = tokenAutoML.text


# {"accessToken":" ~ " の文字位置を特定
serchtext_start="{\"accessToken\":\""
serchtext_end="\",\"expiresIn\""
position_start=tokentext.find(serchtext_start) + 16
position_end=tokentext.find(serchtext_end)

# トークン情報を取得
retoken=tokentext[position_start:position_end]

# ヘッダ情報を作成
authML= "Bearer " + retoken
headersML = {
    'Authorization': 'Bearer test',
    'Content-Type': 'application/json',
    'Accept': 'application/json'
}

headersML['Authorization']=authML


# Oracle Machine Learning AutoML UIの APIをコール
urllib3.disable_warnings()
responseML = requests.post('https://192.xxx.xxx.xxx/omlmod/v1/deployment/titanic_v1/score', headers=headersML, data=dataML, verify=False)

resML=responseML.text

# 予測結果 「0」 or 「1」 とprobability を 取得
position_label="label"
position_probability="probability"

# labelの結果を取得
sp=resML.find(position_label) + 8
retlabel=resML[sp:sp+1]

# probability の結果を取得
sp=resML.find(position_probability)+13
retprobability=resML[sp:sp+4]
retprobability="(probability:" + retprobability + ""

# 結果を編集
if str(retlabel) == "1":
    textML ="「無事に帰れる」かもしれない"
else:
    textML ="「生還できない」かもしれない"


#####
# 結果を表示する処理
#####

print('Content-type: text/html; charset=UTF-8\r\n')

html_body = """
<!DOCTYPE html>
<html>
<head>
</haed>
<link rel="stylesheet" type="text/css" href="./../oracle.css">
<h2>予測結果</h2>
<table border=1>
  <tr>
     <TH>製品</TH><TH>予測結果</TH>
  </tr>
  <tr>
     <TD valign="left"><b><font color="#C00000">Oracle Machine Learning AutoML</font></B></TD><TD>%s<BR>%s</TD>
  </tr>
  <tr>
     <TD valign="left"><b><font color="#0070C0">Oracle Cloud Infrastructure Data Science</font></B></TD><TD>%s</TD>
  </tr>
</table>
<body>
<br>
<a href= "https://xxxx.xxxxx.xxxx/" >TOPに戻る</a>
</body>
</html>
"""

print(html_body % (textML,retprobability,textDS))

参考

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?