本投稿の背景
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.コンパートメントの作成
コンパートメント作成の詳細はこちら
1-2.Oracle Autonomous Data Warehouseの作成
Oracle Autonomous Data Warehouse作成の詳細はこちら
2.Oracle Machine Learningユーザの作成
AutoMLやモデルのデプロイをを実行するOracle Machine Learningユーザを作成します。
今後はこの作成したユーザを使用します。
Oracle Machine Learningユーザ作成の詳細はこちら
[ユーザ名]、[電子メール・アドレス]、[チェック]を外し、[パスワード]を入力して、[作成]をクリック
作成したOracle Machine Learningユーザがcsvファイルを取り込めるようにする設定をします
Oracle Machine Learningユーザが「データベースアクション」できるように設定
sqlで設定
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に登録の詳細はこちら
4.Oracle Machine Learning AutoML UIでモデル作成とデプロイ
ロードしたデータを使用して機械学習を行います
Oracle Machine Learning AutoML UIでモデル作成とデプロイする手順詳細はこちら
[Oracle Machine Learningノートブック]をクリック
「2.Oracle Machine Learningユーザの作成」で作成したユーザ、パスワードを入力して「サインイン」をクリック
「名前」、「コメント(任意)」を入力して、「データ・ソース」の[虫眼鏡アイコン]をクリック
「スキーマ」を作成したユーザ(この記事だとAUTOMLユーザ)を選択、「表」とトレーニングデータの
[TRAIN]を選択して、[OK]ボタンをクリック
「予測」は 機械学習で予測する列を選択します。※生存フラグ列の[SURVIVED]列を選択。
「予測タイプ」は、「予測」で列を選択した際に自動で[分類]or[回帰]を選択してくれます。
「ケースID」は、今回は一意な列[PASSENGERID]を選択
実行中を表示される。進捗状況は[・・・]をクリック
学習が終わると[完了]と表示される
アルゴリズム毎の精度がでる。(今回はランダム・フォレストが精度が高かった)
詳細はモデル名をクリック
予測するにあたり影響が大きい列が表示される。「混同行列」をクリックすることで混同行列を確認できる
デプロイするモデルを選択(今回はランダム・フォレスト:rf_6ce964502f)を選択して、[デプロイ]をクリック
「名前(任意)」、「URI(任意)」、「バージョン(任意)」、「ネームスペース(任意)」、「共有」にチェックを入れ、[OK]をクリック
モデルのデプロイ結果が表示される
作成したモデルは、予想する際に必要な情報は、「AGE」、「FARE」、「PCLASS」、「SEX」、「SIBSP」で
結果は、"0"、"1" でかえるようになっている
5.Kaggleに提出する生存者データを予測
notebookを作成すると、
「4.Oracle Machine Learning AutoML UIでモデル作成とデプロイ」で作成したモデルを
Pythonのコードにして自動生成されます。
notebook上でpythonを実行し、モデルを使用できる状態にして、
Kaggleに提出する生存者データの予測をします。
Kaggleのtestデータを予測する手順詳細はこちら
画面左上の[AutoML]をクリックします
作成したAutoMLをクリック
先ほどデプロイした精度の1番高いアルゴリズムを選択して、[ノートブックの作成]をクリック
作成されたノートブックが表示される。ノートブック名をクリック
ノートブックが開くと、AutoMLで選択したアルゴリズムからpythonコードに変換されている
このpython コードを上から順番に実施していき、モデルが使用できる状態にして、
「Kaggleに提出する test データ」を予想させます
▶ をクリックして、pythonを上から順番に実行します。(編集なしで実行のみでOK)
「Show Accuracy」の後に以下のコードを入力します。
内容は、「TEST」テーブルのデータを読み込み、モデルに予測させる内容となります
%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順の予測結果になっている
6.KaggleにOracle Machine Learning AutoML UIで予測した結果を提出
Oracle Machine Learning AutoML UIで予測した結果を提出
結果は、77.9%
※2021年5月に予想した結果になります(日々、製品は進化するのでいつ時点の結果かを追記)
「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」、「データベース名」)
[サービス・コンソール]をクリック
「OMLサーバURL」、「データベース名」を確認
■確認手順(「テナンシのOCID」)
画面右上の人アイコンをクリックして、テナンシーをクリック
OCIDの[コピー]をクリック
サンプル
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":" ~ " までがトークン (白の部分)
※取得したトークンの有効時間は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 と結果がかえります。
Oracle Machine Learning AutoML UIで機械学習を行い、APIを公開して
API をコールすることが確認できました。
応用編:作成した予測モデルをアプリケーションから呼び出す
今回公開したAPIと前回作成したAPIをコールして、予測結果を取得するアプリを作ってみました。(PythonでCGIを用いたWebアプリケーション)
※curl から Python の変換はこのサイトで変換したものを参考にしました
各APIから予測結果が「0」、「1」と取得できるので、結果によりメッセージを変えています。
0:「生還できない」かもしれない
1:「無事に帰れる」かもしれない
※Oracle Machine Learning AutoML UIの場合、probability(確率) も取得できるので表示しています
![]() |
---|
Web画面のHTMLとPythonで処理するコード。
※最低限動くコードとなっています(エラー処理などはありません)
Web画面の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のコードはこちら
# !/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))
参考