데이터베이스/SQL

[Bigquery] Bigquery SQL로 ML 모델링 A to Z

sseozytank 2023. 8. 23.

Bigquery로 간단한 ML 모델링이 되는지 처음 알았다. 쿼리를 통해 모델링, 평가, 적용까지 모두 가능한 작업인데 

Docs에 나온대로 샘플로 진행을 해보고, 회사 데이터를 가지고 가입 후 3일간 유저 행동을 보고 이 유저가 이후 이탈할 유저인지 아닌지 예측하는 Random Forest 이진 분류 모델까지 만들어보았다. 만들면서 느꼈던 점은, 

  

[장점] 

- python에 비해 훨씬 간단하다. 

- SQL 기반이라 프로그래밍 언어를 모르는 사람도 쉽게 접근 가능 

- 데이터를 이동할 필요가 없다. 

- Bigquery기 때문에 아무래도 확장성이 유연하고, 대용량 데이터에서 효율적이다. 

(Python으로도 할 수는 있겠지만, 매일 들어오는 데이터에 대해 예약된 쿼리로 ML을 돌려 Precdiction 테이블 인서트하여 저장하는 점이 특히 간편하고 좋았음)  

 

[단점] 

- EDA를 통해 변수를 선정하고, 이상치를 제거하는 등 전처리 과정이 친절하지 않다.  (Python에 익숙해서 그럴 수도 있음) 

- 알고리즘이 제한적   

- 1000개의 데이터를 가지고 학습을 했는데, 7GB 가 소모되었다. (내가 잘못한 부분이 있을 수 있다.) 

 

그럼 Docs에 나온대로 펭귄 데이터를 활용하여 펭귄의 몸무게를 예측해보자! 

 

 

1. 데이터 세트 생성 

1. https://console.cloud.google.com/bigquery 빅쿼리 접속 

2. 탐색기 창에서 Create Dataset 클릭 (데이터 세트 만들기) 

3. 데이터 세트 만들기 (아래와 똑같이 셋팅해주면 된다!) 

 

 

2. 펭귄 데이터 불러오기 및 모델 생성

* 빅쿼리 지원 Model Type

https://cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-create

  • species — 펭귄의 종(문자열)
  • island — 펭귄이 사는 섬(문자열)
  • culmen_length_mm — 컬멘 길이(밀리미터)(FLOAT64).
  • culmen_depth_mm — 컬멘 깊이(밀리미터)(FLOAT64)
  • flipper_length_mm — 지느러미의 길이(밀리미터)(FLOAT64)
  • sex — 펭귄의 성별(문자열)
  • bodty_mass_g — 펭귄의 몸무게(FLOAT64)

펭귄 데이터는 위와 같이 구성되어 있으며, 해당 변수들을 사용해서 linear_Regression 모델로 body_mass_g를 예측 하여 predicted_body_mass_g 컬럼으로 예측값 출력할 것이다. 

CREATE OR REPLACE MODEL `bqml_tutorial.penguins_model` --생성할 모델명 (각자 지정해주기) 
OPTIONS
  (model_type='linear_reg',  --선형 회귀 생성 (생성할 모델 타입) 
  input_label_cols=['body_mass_g']) AS --입력 라벨 열
SELECT
  *
FROM
  `bigquery-public-data.ml_datasets.penguins`
WHERE
  body_mass_g IS NOT NULL

* 이 떄, 이상치가 존재하면 모델 생성이 되지 않으니 IS NOT NULL 이나 ,IF NULL 등의 처리로 NULL값을 반드시 제거해준 후 모델링을 들어가야한다. 

 

3. 모델 평가 

위 과정으로 모델 생성이 끝났다! 진짜 엄청 간단. 이제 완성된 모델을 평가해야하는데 ML.EVALUATE란 함수를 사용하면 쿼리 결과로 정확도를 출력해준다. 펭귄 몸무게 예측은 회귀이기 때문에 MSE / MSE / MSLE / MAE / R2-Scroe 등이 출력된다. 

#standardSQL
SELECT
  *
FROM
  ML.EVALUATE(MODEL `bqml_tutorial.penguins_model`,
    (
    SELECT
      *
    FROM
      `bigquery-public-data.ml_datasets.penguins`
    WHERE
      body_mass_g IS NOT NULL))

[ 출력 결과 ] 

* 간단하게 알아보는 회귀 모델 성능 평가 지표 개념 

https://sseozytank.tistory.com/25 

 

[머신러닝]회귀 모델 성능 평가 지표 개념과 파이썬 코드 (MAE,MSE,RMSE,R2,MAPE,MPE)

회귀모델을 만들면 이에 대한 평가가 필요한데, 관련 방법으론는 MAE , MSE, RMSE,RMSE, R2, MAPE 등이 있다. MAE (Mean Absolute Error) 평균 절대 오차 ✔️ MAE : 모든 절대 오차의 평균 ✔️ 언제? : 약간의 이

sseozytank.tistory.com

 

4. 완성된 모델을 사용하여 결과 예측 

모델의 평과는 주관적인 기준도 다르고, 데이터 , 상황에 따라 다르기 때문에 개인적으로 판단하고 넘어가면 된다! 

결과가 맘에 들지 않는다면 데이터 EDA를 해보고, 하이퍼파라미터를 조절해보며 다시 모델링을 반복하면 된다. 

 

그렇다면 제일 중요한! 우리가 만든 모델을 새로운 데이터에 적용하는 방법이다. 

ML.PREDICT란 함수를 쓰면 되고 , 서브쿼리 절에 예측할 데이터셋을 담아주면 된다. 이 과정에서도 NULL값 제거는 필수적임 (NULL이 있으면 실행이 안되는 것으로 알고 있다.) 

#standardSQL
SELECT
  *
FROM
  ML.PREDICT(MODEL `bqml_tutorial.penguins_model`,
    (
    SELECT
      *
    FROM
      `bigquery-public-data.ml_datasets.penguins`
    WHERE
      body_mass_g IS NOT NULL
      AND island = "Biscoe"))

쿼리 실행시 맨 첫행에 Predicter_body_mass_g가 추가된 것을 확인할 수 있다! 

모델을 생성하고 평가하고, 적용하는 부분은 여기까지이지만, 이 외에 모델에 대해 알아볼 수 있는 두가지가 더 있다. 

 

5. Explainable AI 메서드로 예측 결과 설명 

모델에서 이러한 예측 결과를 생성하는 이유를 알아볼 때 사용하는 ML.EXPLAIN_PREDICT 함수이다. 

이 함수를 사용하면 결과를 설명하는 추가 열이 있는 예측 결과를 반환한다. 

#standardSQL
SELECT
  *
FROM
  ML.EXPLAIN_PREDICT(MODEL `bqml_tutorial.penguins_model`,
    (
    SELECT
      *
    FROM
      `bigquery-public-data.ml_datasets.penguins`
    WHERE
      body_mass_g IS NOT NULL
      AND island = "Biscoe"),
    STRUCT(3 as top_k_features))

* 출력 결과 열에 대한 설명 

https://cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-explain-predict#mlexplain_predict_output

 

6. 모델을 전역적으로 설명 

마지막으로 펭귄 가중치를 결정하는 데 가장 중요한 특성이 무엇인지 알아보고 싶을 때는, ML.GLOBAL_EXPLAIN을 사용하면 된다. 이 모델을 사용하기 위해서는, ENABLE_GLOBAL_EXPLAIN=TRUE 옵션을 사용해서 모델을 다시 학습해 주어야한다. 

 

#standardSQL
CREATE OR REPLACE MODEL `bqml_tutorial.penguins_model`
OPTIONS
  (model_type='linear_reg',
  input_label_cols=['body_mass_g'],
  enable_global_explain=TRUE) AS
SELECT
  *
FROM
  `bigquery-public-data.ml_datasets.penguins`
WHERE
  body_mass_g IS NOT NULL
 
 
 
 
#standardSQL
SELECT
  *
FROM
  ML.GLOBAL_EXPLAIN(MODEL `bqml_tutorial.penguins_model`)

입력 시, feature 별 기여도가 출력됨을 확인할 수 있다 ! 

 

 


SQL만 알아도 모델링을 할 수 있다는 것 자체가 되게 매력적이었던 것 같은 Bigquery ML에 대해 다뤄봤다. 

조금 더 사용해보고 확장해볼만 하면 , 실제 현업 사례를 통해 다시 작성해봐야겠다. 

댓글