機械学習とBIツールでデータ可視化してみた<実践編>~MotionBoard実装~

データ活用ことはじめ

「BIツールから機械学習を実行し、可視化する」
――社内に眠っているデータを活用し、過去の分析だけにとどまらず、未来を予測する。そんなケースが増えてきました。

機械学習では、裏で膨大な計算をさせるためにチューニングに奮闘したり、デー タベースから機械学習用基盤にデータを送る仕組みを構築したり… メインの機械学習をさせるまでには様々な作業が発生します。
そんな作業を一気に解決してくれるのが「Oracle Autonomous Data Warehouse」 です!

そこで本ブログでは連載形式で、データベースにOracle Cloud の「Autonomous Data Warehouse(以下、ADWと表記)」、BIツールに”ADW対応”、かつ、”豊富な表現力でデータドリブンを可能とする”「MotionBoard」(MB)を使用した、機械学習を検証していきます。

今回は<実践編>~OracleMachineLearning実装~で作成したADW の機械学習をMotionBoard で動かしていきます。

1.検証環境

ADW

Oracle Cloud Free Tierでクラウドアカウントを作成し、ADW を構築

Motion Board

オンプレミス環境 (Windows) に MotionBoard 6.1 をインストール

2.予測テーマ

Kaggle入門として有名な「タイタニック号の生存予測」
https://www.kaggle.com/c/titanic

簡単に分析テーマのおさらい

チケットクラスや性別、年齢などの情報から生存フラグ「Survived」の値を分類の機械学習を使って予測します。
下記、train.csvのデータでモデルを構築し、test.csv(Survivedのカラムが無いデータ)に適用し、予測結果をKaggleに投稿、正解率を確認します。

(以下、画面内の文字が小さく読みにくい場合は、お手数ですがブラウザの拡大率をあげてご覧ください。)

・train.csvの中身
adwmb04_01.JPG

・test.csvの中身
adwmb04_02.JPG

Passengerid 変数定義キー
Survived サバイバル0 =いいえ、1 =はい
Pclass チケットクラス1 = 1st、2 = 2nd、3 = 3rd
Name 名前
Sex 性別
Age 年齢年齢
SibSp タイタニック号に乗っている兄弟/配偶者の数
Parch タイタニック号に乗っている親/子供
Ticket チケット番号
Fare 運賃乗客運賃
Cabin キャビン番号
Embarked 乗船ポートC =シェルブール、Q =クイーンズタウン、S =サウサンプトン

3.手順

<実践編>~OracleMachineLardning実装~でご紹介した通り、今回実装の機械学習の流れは以下のとおりです。

  • モデル作成に使用する説明変数のカラム指定と欠損値補完用にVIEWを作成
  • プロシージャ(CREATE_MODEL)でモデルを作成
  • SELECT句にPREDICTION関数でモデルを指定
    (またはモデル作成時にできあがったテーブルをSELECT)

MotionBoard では ADW に対してプロシージャも SELECT文も実行することができますので、「モデルの作成」も「モデルを使った予測の表示」もできることになります。

プロシージャの設定は下記の手順で行います。

右上の「管理」から、「システム設定」>「接続/認証」>「外部接続」
adwmb04_03.JPG

左側の外部接続から ADW と接続設定をしたものを選び、「プロシージャコール」タブに遷移(接続設定方法は<構築編>参照)
adwmb04_04.JPG

サンプルとして一つ記載いたします。

-- 設定名:"DBMS_DATA_MINING"."SYS"."DROP_MODEL"(モデル削除)	
	
BEGIN 	
    DBMS_DATA_MINING.DROP_MODEL('${MODEL_NAME}');	
END;	

ここでOracle上の実行と違うのが、MotionBoard内の変数「${システム変数名}」をスクリプトに埋め込んでいるところです。

次にモデルを実行する SELECT文を「カスタムビュー」タブで設定していきます。

adwmb04_05.JPG

サンプルとして一つ記載します。
こちらにも今回、モデル名として MotionBoard のシステム変数を埋め込んでいます。

SELECT SETTING_NAME, SETTING_VALUE FROM USER_MINING_MODEL_SETTINGS
WHERE MODEL_NAME = '${MODEL_NAME}'

それでは早速、上記で設定したプロシージャコールとカスタムビューを使用して、チャートや明細を作成していきます!

今回作成した画面は下記の4種類です。

【タブ1】訓練データ

まず、モデルを作成するための訓練データを分析するための画面です。
説明変数になり得そうな軸を左上のコンボボックスから選択し、目的変数「SURVIVED」の1と0を積み上げ棒グラフで表示しています。

adwmb04_06.JPG

コンボボックスでは「PCLASS」「SEX」「AGE」「SIBSP」「PARCH」「FARE」「EMBARKED」「NAME」を選択できるようにしています。

adwmb04_07.JPG

MotionBoard のチャート機能で100%積み上げにも簡単に変更可能です。

adwmb04_08.JPG

なお、今回のチャートでは「NAME」はすべて、 “Miss” や “Mr” を切り取って取り扱っています。

adwmb04_09.JPG

画面の裏で実行されている SQL は下記です。

SELECT ${CHART_ROW} AS SELECTION, SURVIVED FROM TITANIC_TRAIN

【タブ2】モデルの設定

次に、モデルを作成する画面です。

adwmb04_10.JPG

①欠損値の処理と説明変数の選択

モデル作成時に参照させるVIEWの定義を作り変える操作が可能です。

adwmb04_11.JPG

発行SQLはプロシージャコールで設定の下記です。

-- 設定名:VIEWの再作成

DECLARE
    VSQL VARCHAR2(1000);
BEGIN
    VSQL:='CREATE OR REPLACE VIEW V_TITANIC_TRAIN AS SELECT PASSENGERID ,SURVIVED ${SELECT_PCLASS} ${SELECT_NAME} ${SELECT_SEX} ${SELECT_AGE} ${SELECT_SIBSP} ${SELECT_PARCH} ${SELECT_FARE} ${SELECT_EMBARKED} FROM TITANIC_TRAIN';
    EXECUTE IMMEDIATE VSQL;
    
    VSQL:='CREATE OR REPLACE VIEW V_TITANIC_TEST AS SELECT PASSENGERID ${SELECT_PCLASS} ${SELECT_NAME} ${SELECT_SEX} ${SELECT_AGE} ${SELECT_SIBSP} ${SELECT_PARCH} ${SELECT_FARE} ${SELECT_EMBARKED} FROM TITANIC_TEST';
    EXECUTE IMMEDIATE VSQL;
END;

②モデルの設定、③モデルの設定情報

モデル名の指定、モデルに使用するアルゴリズム情報を含む SETTINGS_TABLE を画面から編集しながらモデルを作成することが可能です。

adwmb04_12.JPG

SETTINGS_TABLE の SETTING_NAME の一覧は「③モデルの設定情報」で確認ができます。

adwmb04_13.JPG

発行 SQL は下記です。

・「モデルの作成」から呼び出されるプロシージャコール

-- 設定名:"DBMS_DATA_MINING"."SYS"."DROP_MODEL"(モデルの削除)

CALL DBMS_DATA_MINING.DROP_MODEL('${MODEL_NAME}')
-- 設定名:"DBMS_DATA_MINING"."SYS"."CREATE_MODEL"(モデルの作成)

{CALL DBMS_DATA_MINING.CREATE_MODEL(
   MODEL_NAME          => '${MODEL_NAME}',
   MINING_FUNCTION     => DBMS_DATA_MINING.CLASSIFICATION,
   DATA_TABLE_NAME     => 'V_TITANIC_TRAIN',
   TARGET_COLUMN_NAME  => 'SURVIVED',
   CASE_ID_COLUMN_NAME => 'PASSENGERID',
   SETTINGS_TABLE_NAME => '${SETTINGS_TABLE_NAME}')
  }

・SETTINGS_TABLE

コンボボックス「ディシジョンツリー」「ベイズ」「ニューラルネットワーク」「ランダムフォレスト」それぞれに対応するテーブルを用意し、テーブルの情報を全行表示を行います。

ディシジョンツリー用:SELECT * FROM SETTING_DT
adwmb04_14.JPG

ベイズ用:SELECT * FROM SETTING_B
adwmb04_15.JPG

ニューラルネットワーク用:SELECT * FROM SETTING_NN
adwmb04_16.JPG

ランダムフォレスト:SELECT * FROM SETTING_RF
adwmb04_17.JPG

「モデルの設定情報」に表示させているSQL(カスタムビュー)は下記です。

SELECT SETTING_NAME,SETTING_VALUE FROM USER_MINING_MODEL_SETTINGS
WHERE MODEL_NAME = '${MODEL_NAME}'

④モデルにより作成されたビューの一覧

モデルを作成したときに Oracle が自動で作成するビューの一覧を表示します。

adwmb04_18.JPG

・「モデルにより作成されたビューの一覧」に表示させているSQL(カスタムビュー)

SELECT * FROM USER_MINING_MODEL_VIEWS WHERE MODEL_NAME = '${MODEL_NAME}'

VIEW_NAME カラムにある VIEW の中身は下記のような内容です。
ディシジョンツリーのノードの中身などが確認できます。

adwmb04_19.JPG

adwmb04_20.JPG

上記の情報を使って、ディシジョンツリーをMotionBoardで可視化することも可能です。

adwmb04_21.JPG

⑤モデルに登録された属性一覧

モデルに寄与している説明変数と目的変数の一覧を表示しています。

adwmb04_22.JPG

「EMBARKED」はモデル作成時に画面でチェックをつけましたが、ここに表示されていないので予測に使用しないと判断されたようです。
確かに④で確認した「DM$VPTITANIC_MODEL」や「DM$VITITANIC_MODEL」にも出てきていません。

・「モデルに登録された属性一覧」に表示させているSQL(カスタムビュー)

SELECT * FROM USER_MINING_MODEL_ATTRIBUTES WHERE MODEL_NAME = '${MODEL_NAME}'

⑥訓練データとの生存判定一致

訓練データと「SURVIVED」と機械学習で予測した「SURVIVED」の一致比率を表示しています。

adwmb04_23.JPG

・「訓練データとの生存判定一致」に表示させているSQL(カスタムビュー)

SELECT
    COUNT(*),
    CASE
        WHEN SURVIVED = PREDICTION THEN '一致'
        ELSE '不一致'
    END AS MATCH
FROM
    (
        SELECT
            TRAIN.*,
            PREDICTION(${MODEL_NAME} USING TRAIN.*) AS PREDICTION,
            PREDICTION_PROBABILITY(${MODEL_NAME} USING TRAIN.*) AS PREDICTION_PROBABILITY
        FROM
            V_TITANIC_TRAIN TRAIN
    ) SUB
GROUP BY
    CASE
        WHEN SURVIVED = PREDICTION THEN '一致'
        ELSE '不一致'
    END

【タブ3】訓練データとの照合

続いて、訓練データと予測した値を分析する画面です。

adwmb04_24.JPG

①訓練データとの生存判定一致率
 こちらは前画面に表示した棒グラフを円グラフにしたものです。

②PREDICTION_PROBABOLITY(予測に対する確立)
 ③の明細の予測に対する確率ごとのデータ分布を棒グラフで表したものです。

③訓練データと予測値・予測に対する確率・詳細
 訓練データに下記のカラムを追加し、表示しています。

adwmb04_25.JPG

・上記明細に表示させているSQL(カスタムビュー)

SELECT
    SUB.PASSENGERID,
    SUB.SURVIVED,
    SUB.PCLASS,
    SUB.NAME,
    SUB.SEX,
    SUB.AGE,
    SUB.SIBSP,
    SUB.PARCH,
    SUB.TICKET,
    SUB.FARE,
    SUB.CABIN,
    SUB.EMBARKED,
    SUB.PREDICTION,
    SUB.PREDICTION_PROBABILITY,
    CASE
        WHEN SURVIVED = PREDICTION THEN '一致'
        ELSE '不一致'
    END AS MATCH,
    RTRIM(TRIM(SUBSTR(OUTPRED."Attribute1",17,100)),'rank="1"/>') FIRST_ATTRIBUTE,
    RTRIM(TRIM(SUBSTR(OUTPRED."Attribute2",17,100)),'rank="2"/>') SECOND_ATTRIBUTE,
    RTRIM(TRIM(SUBSTR(OUTPRED."Attribute3",17,100)),'rank="3"/>') THIRD_ATTRIBUTE,
    RTRIM(TRIM(SUBSTR(OUTPRED."Attribute4",17,100)),'rank="4"/>') FOURTH_ATTRIBUTE
FROM
    (
        SELECT
            ORG.*,
            PREDICTION(${MODEL_NAME} USING TRAIN.*) AS PREDICTION,
            ROUND(TO_NUMBER(PREDICTION_PROBABILITY(${MODEL_NAME} USING TRAIN.*)),3) AS PREDICTION_PROBABILITY,
            PREDICTION_DETAILS(${MODEL_NAME} USING TRAIN.*) AS PREDICTION_DETAILS
        FROM
            V_TITANIC_TRAIN TRAIN
        JOIN
            TITANIC_TRAIN ORG
        ON
            TRAIN.PASSENGERID = ORG.PASSENGERID
    ) SUB
  ,
    XMLTABLE('/Details'
        PASSING SUB.PREDICTION_DETAILS
            COLUMNS 
                "Attribute1" XMLType PATH 'Attribute[1]',
                "Attribute2" XMLType PATH 'Attribute[2]',
                "Attribute3" XMLType PATH 'Attribute[3]',
                "Attribute4" XMLType PATH 'Attribute[4]') OUTPRED
    

【タブ4】テストデータからの予測

最後に、Kaggle へ投稿する用に、テストデータを予測した結果を CSV ダウンロードする画面です。

adwmb04_26.JPG

・上記明細に表示させているSQL(カスタムビュー)

SELECT 
    PASSENGERID,
    PREDICTION(${MODEL_NAME} USING *) AS SURVIVED 
FROM V_TITANIC_TEST TEST

4.作ったボードの操作(モデルの作成と検証)

試しに何個か画面からモデルを作ってみたいと思います!

モデルパターン1:ディシジョンツリーで説明変数をすべて選択

adwmb04_27.JPG

adwmb04_28.JPG

スコアは「0.77272」

訓練データとの一致率は82%だったので少し訓練データへの適合に寄ったモデルになっています。
そこで次に、決定木の深さの階層を浅くしてモデルを簡易化してみます。

モデルパターン2:ディシジョンツリーで階層を浅くする

adwmb04_29.JPG

SETTINGS_TABLEの中身を上記のように変更します。
ADWのテーブルの「行の挿入」「データの更新」「行の削除」がMotionBoardの画面からできてしまうので設定変更がとっても簡単です!

adwmb04_30.JPG

スコアは「0.78468」

少しあがりました。続いて、違うアルゴリズムでモデルを作ってみます。

モデルパターン3:ランダムフォレストのアルゴリズムを使う

adwmb04_31.JPG

adwmb04_32.JPG

スコアは「0.78229」でした。

デフォルト設定のディシジョンツリーより若干良いくらいですね。

さいごに

今回は、MotionBoardから機械学習のモデルの構築や設定変更ができる画面を実装してみました。
もちろん、大量データでモデルを作る場合には時間がかかりますので、あらかじめ ADW 側でモデルを作成しておいて、MotionBoard からはモデルの参照だけにするなど色々な使い方ができます。

ADWとMotionBoardの機械学習チュートリアルのような内容でしたので、設定用テーブルなど明細アイテムをたくさん配置したチャートになってしまいましたが、次回はもう少しビジネスに近いデータを使用して、「チャートによる可視化」にフォーカスしたレポートを披露できればと思います!

BI_banner01.png