iT邦幫忙

2022 iThome 鐵人賽

DAY 25
1
AI & Data

[GCP BigQuery] - 探索資料倉儲,開啟你的數位轉型之旅系列 第 25

Day 25: [機器學習實作一] 在 BigQuery 中建立心臟病發作預測模型

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20221009/201525293RsIQ4lqID.png

前言:

今天要在 BigQuery 這個資料倉儲的環境中,建置機器學習,並且最後存放到 Vertex AI model registry,方便我們日後做模型的管理。

情境:

想像你是醫院心臟科的資料分析師,目前內部的資料倉儲是使用 BigQuery,你希望能夠使用心臟病發作的歷史資料,建立初步的機器學習模型,並且找到和心臟病發作有高度相關的因子。

解法:

BigQuery 中提供 BigQuery ML 功能,讓使用者能夠快速時現機器學習想法,另一方面,為了日後方便管理多個模型,後續可以使用 Vertex AI model registry。

準備材料:

Data

資料介紹:

今天使用到的資料是 Kaggle 上的 Heart Attack Analysis & Prediction Dataset,共有 303筆資料15 個欄位(我自己有新增patient_id,方便日後做 train, validation和 test的切割)。

資料長相如下:

https://ithelp.ithome.com.tw/upload/images/20221009/20152529KUpf5HlXtA.png

觀察一下資料,我們要預測的是output 這一欄: 是否心臟病發作,是一個分類問題,因此對照我們能夠使用的模型有這些:

https://ithelp.ithome.com.tw/upload/images/20221009/20152529T3lkk57vbI.png

接下來會示範 logistic regressionXGBoost 兩種模型。

打開 BigQuery 頁面

建立資料集:

https://ithelp.ithome.com.tw/upload/images/20221009/20152529Lb1g34z7FA.png

https://ithelp.ithome.com.tw/upload/images/20221009/201525295IEZeurjmO.png

建立資料表:

https://ithelp.ithome.com.tw/upload/images/20221009/20152529mAUIp0qVlK.png

https://ithelp.ithome.com.tw/upload/images/20221009/201525290e0LSkmite.png

https://ithelp.ithome.com.tw/upload/images/20221009/20152529KlnIbWo4Dv.png

查看數據:

SELECT
   *
FROM
   `ithome-bq-test.Heart_attack_analysis.heart`
LIMIT
  100;

https://ithelp.ithome.com.tw/upload/images/20221009/20152529JVUJNrh37j.png

建立 view 表:

CREATE OR REPLACE VIEW
  `Heart_attack_analysis.heart_view` AS
SELECT
   *,
  CASE
    WHEN ABS(MOD(patient_id, 10)) < 8 THEN 'train'
    WHEN ABS(MOD(patient_id, 10)) = 8 THEN 'validation'
    WHEN ABS(MOD(patient_id, 10)) = 9 THEN 'test'
  END AS dataframe
FROM
  `ithome-bq-test.Heart_attack_analysis.heart`

執行完成後,可看到 heart_view:

https://ithelp.ithome.com.tw/upload/images/20221009/20152529el3cAO90o0.png

因為之後要導出模型,我們先啟用 Vertex AI API:

https://ithelp.ithome.com.tw/upload/images/20221009/20152529PxTUFBnub9.png

創建模型 (CREATE MODEL): (logistic regression model)

CREATE OR REPLACE MODEL
  `Heart_attack_analysis.heart_model`
OPTIONS
  ( model_type='LOGISTIC_REG',
    auto_class_weights=TRUE,
    enable_global_explain=TRUE,
    data_split_method='NO_SPLIT',
    input_label_cols=['output'],
    max_iterations=15) AS
SELECT
  * EXCEPT(dataframe)
FROM
  `Heart_attack_analysis.heart_view`
WHERE
  dataframe = 'train'

https://ithelp.ithome.com.tw/upload/images/20221009/20152529v2zkudZKX8.png

模型跑完後,點選專案,可看到產生的模型:

https://ithelp.ithome.com.tw/upload/images/20221009/20152529Quzo4fDAMH.png

詳細資料記錄了訓練過程用了哪些超參數、訓練日期。

https://ithelp.ithome.com.tw/upload/images/20221009/20152529o4L1rjfhUD.png

也記錄了訓練過程的學習率(learning rate):

https://ithelp.ithome.com.tw/upload/images/20221009/201525299WzbEbZbDx.png

模型的Precision-recall curve、ROC curve:

https://ithelp.ithome.com.tw/upload/images/20221009/20152529ynDxTsdil0.png

給出了模型中變數的重要性:

https://ithelp.ithome.com.tw/upload/images/20221009/20152529FNQQS6m0wJ.png

另一方面,我們可以去 Vertex AI查看 模型是否有導出:

https://ithelp.ithome.com.tw/upload/images/20221009/20152529hj2PX23laN.png

https://ithelp.ithome.com.tw/upload/images/20221009/20152529A6jmDfB164.png

評估模型:

SELECT
  *
FROM
  ML.EVALUATE (MODEL `Heart_attack_analysis.heart_model`,
    (
    SELECT
      *
    FROM
      `Heart_attack_analysis.heart_view`
    WHERE
      dataframe = 'validation'
    )
  )

https://ithelp.ithome.com.tw/upload/images/20221009/20152529DN4XsnFXjI.png

模型推論:

SELECT
  *
FROM
  ML.PREDICT (MODEL `Heart_attack_analysis.heart_model`,
    (
    SELECT
      *
    FROM
      `Heart_attack_analysis.heart_view`
    WHERE
      dataframe = 'test'
     )
  )

https://ithelp.ithome.com.tw/upload/images/20221009/20152529ixW0H9Yifa.png

模型解釋:

SELECT
  *
FROM
  ML.EXPLAIN_PREDICT (MODEL `Heart_attack_analysis.heart_model`,
    (
    SELECT
      *
    FROM
      `Heart_attack_analysis.heart_view`
    WHERE
      dataframe = 'test'
    )
  )

給出了預測是否會心臟病發作,並且還給出判斷的原因!

https://ithelp.ithome.com.tw/upload/images/20221009/20152529QpNNdPjeXW.png

對模型進行全局說明:

SELECT
  *
FROM
  ML.GLOBAL_EXPLAIN(MODEL `Heart_attack_analysis.heart_model`)

查看模型權重:

SELECT
  *
FROM
  ML.WEIGHTS(MODEL `Heart_attack_analysis.heart_model`)

https://ithelp.ithome.com.tw/upload/images/20221009/20152529AbVCxGwrLl.png

查看confusion matrix:

SELECT
  *
FROM
  ML.CONFUSION_MATRIX(MODEL `Heart_attack_analysis.heart_model`,
  (
    SELECT
      *
    FROM
      `Heart_attack_analysis.heart_view`
    where 
       dataframe = 'test'))

https://ithelp.ithome.com.tw/upload/images/20221009/20152529vchf86r9fR.png

創建模型 (CREATE MODEL): (xgboost model):

CREATE OR REPLACE MODEL
 `Heart_attack_analysis.heart_model_xgb`
OPTIONS(MODEL_TYPE='BOOSTED_TREE_CLASSIFIER',
        BOOSTER_TYPE = 'GBTREE',
        NUM_PARALLEL_TREE = 1,
        MAX_ITERATIONS = 50,
        TREE_METHOD = 'HIST',
        EARLY_STOP = FALSE,
        SUBSAMPLE = 0.85,
        INPUT_LABEL_COLS = ['output']) AS 
SELECT
  * EXCEPT(patient_id, dataframe)
FROM
  `Heart_attack_analysis.heart_view`
WHERE
  dataframe = 'train'

接下來的步驟就和前面創建 logistic regression 一樣了,就不再重複描述。

身為一個醫院心臟科的資料分析師,到這裡,你就完成了初步的機器學習模型建置囉!

Summary:

  1. 今天我們學會了在 BigQuery 中創建 logistic regression modelXGBoost model,各位也可以換成分類問題的其他模型看看 (Random forest, AutoML, DNN…etc)。

  2. 我們曾提過 BigQuery 有四種連接方式,今天使用的是第一種連接方法console 的方式操作,其實也可以用第四種連接方法---python client library 去操作。 之所以會使用 console 方式操作是因為 BigQuery ML 設計就是要讓不熟 python的人,用 SQL的方式實現機器學習。

  3. 個人覺得 BigQuery ML 的功能滿適合做初步的機器學習探索,只是因為很多細節 BigQuery 都幫我們自動處理了,建議要閱讀文件,才不會不知道自己的機器學習做了什麼處理。 (比如資料不平衡、資料如何分割、如何避免overfitting...等)

Reference:

Building and using a classification model on census data

How to Split and Sample a Dataset in BigQuery Using SQL


上一篇
Day 24: BigQuery ML: 圖解三種寫法 + 常用指令介紹
下一篇
Day 26: [數據分析實作二] 將串流資料(streaming data) 寫入 BigQuery 並建立 Real time Dashboard (上)
系列文
[GCP BigQuery] - 探索資料倉儲,開啟你的數位轉型之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言