BigQuery ML Beta 사용기


  • 최근 발표되고 이슈가 되었던 Google Cloud BigQuery ML Beta를 사용하며 남긴 글입니다. Beta라서 많이 바뀔 것 같지만 그래도 남겨봅니다!
  • 공식 문서를 보고 작성했습니다

BigQuery ML


  • BigQuery ML에 대해 설명할 필요 없이 위 Gif를 참고하면 될 것 같습니다
  • 이 서비스가 충격적이고 Hot한 이유는 쿼리문으로 쉽게 모델을 만들 수 있는 점과 AutoML을 보여주기 때문이라 생각합니다
  • BigQuery의 standard SQL 쿼리로 머신러닝 모델을 생성하고 실행할 수 있습니다
    • 예측 Table을 만든 후, REST API처럼 사용할 수 있습니다

제공하는 모델

  • 현재(18.8월) 베타 기준으로 2가지 모델이 제공됩니다
  • 다음 달에 classification, recommendation 등이 지원될 예정이라 합니다
  • Linear regression
    • numerical value를 예측할 때 사용
  • Binary Logistic regression
    • 이메일 스팸 필터처럼 2개의 클래스를 분류할 때 사용

사용할 수 있는 곳

  • BigQuery web UI
  • bq command-line tool
  • BigQuery REST API
  • Jupyter Notebook 같은 외부 툴

BigQuery ML의 장점

  • Python이나 Java를 몰라도 SQL문으로 Machine Learning 모델을 생성할 수 있음. 즉 쉽게 모델을 만들 수 있습니다
  • 데이터웨어 하우스(BigQuery)에서 데이터를 Export하지 않고 모델링이 진행되기 때문에 속도가 빠릅니다
  • 학습 파라미터, Feature, Weight 등의 정보도 제공합니다

가격 정책

  • BigQuery의 가격 정책을 그대로 따릅니다
    • 데이터 저장비용
    • 쿼리 비용(쿼리할 때 탐색하는 데이터양에 비례해 비용이 부과)
  • 허나 아직 베타라서 이런 듯! 추후 가격 정책이 생길 것 같습니다

Getting Started with BigQuery ML


  • Data Analyst와 Data Scientist를 위한 글로 나뉘어져 있는데, 전자는 BigQuery Console에서 진행하고 후자는 Datalab에서 진행합니다(데이터셋은 동일)
  • 저는 BigQuery Console에서 Data Scientist에 나와있는 내용을 진행했습니다
    • Google Analytics 샘플 데이터를 사용해 website 방문자가 결제를 할지 예측하는 모델을 만듭니다

Method 정리

  • 모델 생성할 때 : CREATE MODEL
  • Evalute할 때 : ML.EVALUATE
  • Predcit할 때 : ML.PREDICT

1. Dataset 생성

  • BigQuery Console에서 리소스 - 프로젝트 아이디 클릭해주세요
  • 데이터세트 만들기 클릭! : id는 bqml_tutorial

2. 분류 모델 생성하기

  • 우리가 다룰 데이터는 다음과 같습니다
  • label은 0, 1로 transcation이 있으면 1 없으면 0
  • os, mobile 유무, 국가, pageviews가 feature

  • 모델 생성은 아래와 같은 쿼리로 수행합니다
CREATE OR REPLACE MODEL `bqml_tutorial.sample_model`
OPTIONS(model_type='logistic_reg') AS
SELECT
  IF(totals.transactions IS NULL, 0, 1) AS label,
  IFNULL(device.operatingSystem, "") AS os,
  device.isMobile AS is_mobile,
  IFNULL(geoNetwork.country, "") AS country,
  IFNULL(totals.pageviews, 0) AS pageviews
FROM
  `bigquery-public-data.google_analytics_sample.ga_sessions_*`
WHERE
  _TABLE_SUFFIX BETWEEN '20160801' AND '20170630'
  • label이란 컬럼이 꼭 필요합니다(label2라고 하면 에러 뿜음)
  • 20160801부터 20170630까지 약 11개월치 데이터를 학습했는데 약 8분 소요
  • Test로 20170601부터 20170630까지 1개월 데이터를 학습했는데 99초 소요 (UI가 다른 이유는 이 테스트는 과거 BigQuery Console에서 진행했기 때문입니다! 과거 UI에서도 정상 작동함)

3. 학습 모델 정보 보기

  • 생성된 Table에서 정보 확인
  • 모델 유형, loss 유형, 학습 옵션도 보임!!! Early Stopping이 적용된 듯
  • 위 방법 이외에도 모델의 정보를 보고 싶은 경우엔 ML.TRAINING_INFO 를 사용하면 됩니다

    SELECT
    *
    FROM
    ML.TRAINING_INFO(MODEL `bqml_tutorial.sample_model`)
    
  • training_run은 새로 생성된 모델은 값이 0이고 warm_start 옵션을 사옹할 경우, 다시 학습시 값이 증가합니다

  • Feature의 정보를 보고싶을 경우

    SELECT
    *
    FROM
    ML.FEATURE_INFO(MODEL `bqml_tutorial.sample_model`)
    
  • Weights의 정보를 보고싶을 경우

    SELECT
     *
    FROM
     ML.WEIGHTS(MODEL `bqml_tutorial.sample_model`)
    
  • 이런 식으로 weight도 나옵니다! 충격적…

4. 모델 평가하기

  • ML.EVALUATE를 사용해 모델 평가합니다
  • 학습할 때 사용하지 않은 20170701 ~ 20170801 데이터로 평가했습니다
SELECT
  *
FROM ML.EVALUATE(MODEL `bqml_tutorial.sample_model`, (
  SELECT
    IF(totals.transactions IS NULL, 0, 1) AS label,
    IFNULL(device.operatingSystem, "") AS os,
    device.isMobile AS is_mobile,
    IFNULL(geoNetwork.country, "") AS country,
    IFNULL(totals.pageviews, 0) AS pageviews
  FROM
    `bigquery-public-data.google_analytics_sample.ga_sessions_*`
  WHERE
    _TABLE_SUFFIX BETWEEN '20170701' AND '20170801'))
  • 1초가 지난 후 아래와 같은 결과가 나왔습니다

5. 모델로 예측하기

  • ML.PREDICT을 사용해 예측한 후, 국가별 총 예측 구입량을 계산했습니다
SELECT
  country,
  SUM(predicted_label) as total_predicted_purchases
FROM ML.PREDICT(MODEL `bqml_tutorial.sample_model`, (
  SELECT
    IFNULL(device.operatingSystem, "") AS os,
    device.isMobile AS is_mobile,
    IFNULL(totals.pageviews, 0) AS pageviews,
    IFNULL(geoNetwork.country, "") AS country
  FROM
    `bigquery-public-data.google_analytics_sample.ga_sessions_*`
  WHERE
    _TABLE_SUFFIX BETWEEN '20170701' AND '20170801'))
  GROUP BY country
  ORDER BY total_predicted_purchases DESC
  LIMIT 10
  • 역시 1초 뒤 아래와 같은 결과가 나왔습니다

BigQuery ML 문법


  • CREATE MODEL : 링크
    • l1_reg, l2_reg, max_iterations, learn_rate_strategy, learn_rate, early_stop, min_rel_progress, data_split_method, warm_start 등을 설정할 수 있음
  • ML.EVALUATE : 링크
    • logistic regression은 precision, recall, accuracy, f1_score, log_loss, roc_auc로 결과가 나옴
    • linear regression은 mae, mse, msle, mae, r2_score, explained_variance로 결과가 나옴
  • ML.PREDICT : 링크
  • ML.TRAINING_INFO : 링크
  • ML.FEATURE_INFO : 링크
  • ML.WEIGHTS : 링크

Tutorial


사용 후기


  • 원래 BigQuery에 대한 만족이 높았는데, 이번 BigQuery ML로 더욱 만족도가 높아졌습니다
  • Structured된 데이터라면 더 쉽게 모델을 만들 수 있을 것 같습니다
  • 단, BigQuery 특성상 딥러닝 모델까지 나올진 의문이 듭니다
    • BigQuery는 쿼리할 때 탐색하는 데이터의 양에 따라 비용이 부과되는데 비정형 데이터는 데이터가 크기 때문에 비용도 들고.. 비효율성이 나타날 것 같음
    • BigQuery에 데이터를 적재하기도 어려운 상황
  • 아마 구조화된 데이터는 BigQuery ML로 비정형 데이터는 AutoML로 커버하지 않을까 생각됩니다
  • 그래도 갓구글님들이 이런 제품을 내놓아서 리스펙.. 자꾸 내놓으면 저같은 데이터쟁이는 어떻게 되나요(..)

Reference


이 글이 도움이 되셨다면 공감 및 광고 클릭을 부탁드립니다 :)




© 2017. by Seongyun Byeon

Powered by zzsza