October 18, 2021

Dự đoán cân nặng em bé khi sinh ra với BigQuery ML

BigQuery ML – một sản phẩm của Google được triển khai trên nền tảng Google Cloud Platform cho phép người dùng tạo và thực hiện các mô hình machine learning trong BigQuery bằng các truy vấn Standard SQL. BigQuery ML đơn giản hoá vấn đề machine learning bằng cách cho phép người dùng xây dựng các mô hình bằng các công cụ và kỹ năng SQL hiện có. BigQuery ML tăng tốc độ phát triển bằng cách loại bỏ nhu cầu di chuyển dữ liệu.

Trong bài viết này, mình sẽ tạo mô hình dự đoán cân nặng khi sinh của em bé dựa trên giới tính, thời gian mang thai và chủng tộc của người mẹ.

Nguồn dữ liệu mình sử dụng tập dữ liệu public của google trên GCP được thu thập ở Mỹ trong khoảng thời gian 40 năm (1969 – 2008). (BigQuery )

Mục tiêu

  • BigQuery ML để tạo mô hình hồi quy tuyến tính nhị phân bằng cách sử dụng câu lệnh CREATE MODEL.
  • Hàm ML.EVALUATE để đánh giá mô hình
  • Hàm ML. PREDICT để đưa ra dự đoán bằng mô hình

Kết quả mong muốn đạt được là thực hiện câu truy vấn bên dưới thì mình sẽ thu được kết quả như Hình 1.

#standardSQL
SELECT
is_male,gestation_weeks,mother_age,mother_race,predicted_weight_pounds
FROM
  ML.PREDICT(MODEL `bqml_tutorial.natality_model`,
    (
    SELECT
      is_male,
      gestation_weeks,
      mother_age,
      CAST(mother_race AS STRING) AS mother_race
    FROM
      `bigquery-public-data.samples.natality`
    WHERE
      state = "WY"))

Kết quả mong muốn.

Hình 1: Kết quả mong muốn đạt được.

Lấy ví dụ Row =1. Ta có em bé là bé gái, số tuần thai kỳ là 39 tuần, tuổi mẹ của em bé là 35 tuổi, mẹ của em bé là người da trắng. Thì khi sinh ra, em bé được dự đoán nặng là ~7.415058724905975 pounds.

Thực hiện

Để thực hiện mục đích như mô tả bên trên thì mình cần thực hiện qua 4 bước chính và 1 bước tuỳ chọn.

  • Bước 1: Tạo tập dữ liệu của bạn.
  • Bước 2: Huấn luyện – tạo mô hình.
  • Bước 3: Đánh giá mô hình.
  • Bước 4: Dự đoán kết quả.
  • Bước 5 (option): Xem số liệu thống kê kết quả huấn luyện.

Bước 1: Tạo tập dữ liệu của bạn

Bước đầu tiên là tạo một bộ dữ liệu BigQuery để lưu trữ mô hình.

1. Chuyển đến giao diện BigQuery UI trong GCP Console.

2. Trong bảng điều hướng, trong phần Resources, nhấp vào tên dự án của bạn.

3. Ở bên phải, trong bảng chi tiết, nhấp vào Create dataset.

Create dataset
Hình 2: Màn hình điều hướng để tạo dataset.

4. Trên trang Create dataset:

  • Dataset ID: nhập 
    bqml_tutorial.
  • Data location: Chọn United States (US). Hiện tại, các public dataset được lưu trữ ở multi-region của US. Để đơn giản, bạn nên đặt tập dữ liệu của bạn ở cùng một vị trí.
Create dataset page
Hình 3: Màn hình để tạo dataset

5. Các field còn lại để mặc định và nhấp Create dataset.

Bước 2: Huấn luyện – tạo mô hình

Tiếp theo, mình sẽ tạo một mô hình hồi quy tuyến tính bằng cách sử dụng các câu lệnh SQL trực tiếp trên BigQuery. Câu truy vấn Standard SQL sau đây được sử dụng để tạo mô hình để dự đoán cân nặng khi sinh của một đứa trẻ.

#standardSQL
CREATE MODEL `bqml_tutorial.natality_model`
OPTIONS
  (model_type='linear_reg',
    input_label_cols=['weight_pounds']) AS
SELECT
  weight_pounds,
  is_male,
  gestation_weeks,
  mother_age,
  CAST(mother_race AS string) AS mother_race
FROM
  `bigquery-public-data.samples.natality`
WHERE
  weight_pounds IS NOT NULL
  AND RAND() < 0.001

Trong đó:

  • Câu lệnh CREATE MODEL được sử dụng để tạo và huấn luyện mô hình có tên bqml_tutorial.natality_model.
  • Câu lệnh OPTIONS (model_type = ‘linear_reg’, input_label_cols = [‘weight_pound’]) chỉ ra rằng bạn đang tạo mô hình hồi quy tuyến tính. Hồi quy tuyến tính là một loại mô hình hồi quy tạo ra giá trị liên tục từ sự kết hợp tuyến tính của các tính năng đầu vào. Cột weight_pound là nhãn đầu vào. Đối với mô hình hồi quy tuyến tính, nhãn phải có giá trị thực (giá trị cột phải là số thực).
    • weight_pound – Cân nặng của trẻ, tính bằng pound (FLOAT64).
    • is_maleTRUE nếu đứa trẻ là nam, FALSE nếu là nữ (BOOL).
    • gestation_weeks – Số tuần của thai kỳ (INT64).
    • mother_age – Tuổi của người mẹ khi sinh con (INT64).
    • mother_race – Một giá trị nguyên tương ứng với chủng tộc của người mẹ (INT64 – giống như child_race trong lược đồ bảng). Để buộc BigQuery ML xem mother_race là một tính năng không phải là số, với mỗi giá trị riêng biệt đại diện cho một danh mục khác nhau, truy vấn sẽ ép kiểu (cast) mother_race thành STRING. Điều này rất quan trọng vì chủng tộc có nhiều ý nghĩa hơn là một danh mục hơn là một số nguyên (có thứ tự và tỷ lệ). Tập dữ liệu quy ước chủng tộc như sau:
      1 – White
      2 – Black
      3 – American Indian
      4 – Chinese
      5 – Japanese
      6 – Hawaiian
      7 – Filipino
      9 – Unknown/Other
      18 – Asian Indian
      28 – Korean
      39 – Samoan
      48 – Vietnamese
  • Mệnh đề FROM
bigquery-public-data.samples.natality - chỉ ra rằng bạn đang truy vấn bảng natality trong tập dữ liệu samples. Bộ dữ liệu này nằm trong project bigquery-public-data.
  • Mệnh đề WHERE weight_pound IS NULL AND RAND () <0,001 – loại trừ các hàng có weight_poundNULL và sử dụng hàm RAND để chọn một mẫu dữ liệu ngẫu nhiên.

2.1 Chạy truy vấn CREATE MODEL

Để chạy truy vấn CREATE MODEL để tạo và huấn luyện mô hình của bạn:

1. Trong giao diện web BigQuery UI, bấm vào nút Compose new query.

2. Nhập truy vấn Standard SQL vào vùng Query editor.

#standardSQL
CREATE MODEL `bqml_tutorial.natality_model`
OPTIONS
  (model_type='linear_reg',
    input_label_cols=['weight_pounds']) AS
SELECT
  weight_pounds,
  is_male,
  gestation_weeks,
  mother_age,
  CAST(mother_race AS string) AS mother_race
FROM
  `bigquery-public-data.samples.natality`
WHERE
  weight_pounds IS NOT NULL
  AND RAND() < 0.001

3. Bấm Run. Truy vấn mất khoảng 30 giây để hoàn thành, sau đó mô hình (natality_model) xuất hiện trong bảng điều hướng của giao diện BigQuery UI. Vì truy vấn sử dụng câu lệnh CREATE MODEL để tạo bảng, nên bạn sẽ không thấy kết quả thực hiện truy vấn.

Bước 3: Đánh giá mô hình

Sau khi tạo mô hình của bạn, mình đánh giá hiệu suất của quá trình dự đoán bằng hàm ML.EVALUATE. Hàm ML.EVALUATE đánh giá các giá trị dự đoán dựa trên dữ liệu thực tế. Trình phân loại là một trong những tập hợp các giá trị đích được liệt kê cho nhãn.

Truy vấn sau được sử dụng để đánh giá mô hình:

#standardSQL
SELECT
*
FROM
  ML.EVALUATE(MODEL `bqml_tutorial.natality_model`,
    (
    SELECT
      weight_pounds,
      is_male,
      gestation_weeks,
      mother_age,
      CAST(mother_race AS STRING) AS mother_race
    FROM
      `bigquery-public-data.samples.natality`
    WHERE
      weight_pounds IS NOT NULL))

Trong đó:

  • Câu lệnh SELECT * lấy tất cả cột từ mô hình .
  • Mệnh đề FROM – sử dụng hàm ML.EVALUATE đối với mô hình: bqml_tutorial.natality_model.
  • Câu lệnh SELECT lồng nhau và mệnh đề FROM của truy vấn này giống như câu lệnh trong truy vấn khi tạo mô hình (CREATE MODEL).
  • Mệnh đề WHEREWHERE weight_pound IS NOT NULL – lấy những dòng có weight_pound không có giá trị NULL.

3.1 Chạy truy vấn ML.EVALUATE
Để chạy truy vấn ML.EVALUATE đánh giá mô hình:

1. Trong giao diện BigQuery UI, bấm vào nút Compose new query..

2. Nhập truy vấn Standard SQL sau vào vùng Query editor.

#standardSQL
SELECT
  *
FROM
  ML.EVALUATE(MODEL `bqml_tutorial.natality_model`,
    (
    SELECT
      weight_pounds,
      is_male,
      gestation_weeks,
      mother_age,
      CAST(mother_race AS STRING) AS mother_race
    FROM
      `bigquery-public-data.samples.natality`
    WHERE
      weight_pounds IS NOT NULL)
)

3. Bấm Run.

4. Khi truy vấn hoàn tất, nhấp vào tab Results bên dưới vùng Query editor. Các kết quả sẽ như sau:

ML.EVALUATE output
Hình : Kết quả đánh giá mô hình.

Vì mình thực hiện hồi quy tuyến tính, kết quả bao gồm các cột sau:

  • mean_absolute_error
  • mean_squared_error
  • mean_squared_log_error
  • median_absolute_error
  • r2_score
  • explained_variance

Một tiêu chí quan trọng trong kết quả đánh giá là r2_score – thước đo trong thống kê xác định xem dự đoán hồi quy tuyến tính có xấp xỉ dữ liệu thực tế hay không?. 0 chỉ ra rằng mô hình giải thích không có sự thay đổi của dữ liệu đáp ứng xung quanh giá trị trung bình. 1 chỉ ra rằng mô hình giải thích tất cả sự thay đổi của dữ liệu đáp ứng xung quanh giá trị trung bình.

Bước 4: Dự đoán kết quả

Sau bước đánh giá mô hình, bước tiếp theo là sử dụng nó để dự đoán kết quả. Ở đây, sử dụng mô hình của mình huấn luyện được để dự đoán cân nặng khi sinh của tất cả các em bé được sinh ra ở Wyoming.

Truy vấn được sử dụng để dự đoán kết quả như sau:

#standardSQL
SELECT
is_male,gestation_weeks,mother_age,mother_race,predicted_weight_pounds
FROM
  ML.PREDICT(MODEL `bqml_tutorial.natality_model`,
    (
    SELECT
      is_male,
      gestation_weeks,
      mother_age,
      CAST(mother_race AS STRING) AS mother_race
    FROM
      `bigquery-public-data.samples.natality`
    WHERE
      state = "WY")
)
  • Câu lệnh SELECT – Chỉ lấy cột đầu vào (is_male, gestation_weeks, mother_age, mother_race) và kết quả dự đoán (predict_weight_pound). Cột này được tạo bởi hàm ML.PREDICT. Khi bạn sử dụng hàm ML.PREDICT, tên cột đầu ra cho mô hình được dự đoán . Đối với các mô hình hồi quy tuyến tính, dự đoán_label là giá trị ước tính của nhãn. Đối với các mô hình logistic regestionn, dự đoán_label là một trong hai nhãn đầu vào tùy thuộc vào nhãn nào có xác suất dự đoán cao hơn.
  • Hàm ML.PREDICT được sử dụng để dự đoán kết quả bằng mô hình: bqml_tutorial.natality_model.
  • Câu lệnh SELECT lồng nhau và mệnh đề FROM của truy vấn này giống như câu lệnh trong truy vấn CREATE MODEL.
  • Mệnh đề WHERE – WHERE state = “WY” – Chỉ dự đoán đối với tiểu bang Wyoming.

4.1 Chạy truy vấn ML.PREDICT
Để chạy truy vấn sử dụng mô hình để dự đoán kết quả:

1. Trong giao diện BigQuery UI, bấm vào nút Compose new query.

2. Nhập truy vấn Standard SQL vào vùng văn bản Query editor.

#standardSQL
SELECT
is_male,gestation_weeks,mother_age,mother_race,predicted_weight_pounds
FROM
  ML.PREDICT(MODEL `bqml_tutorial.natality_model`,
    (
    SELECT
      is_male,
      gestation_weeks,
      mother_age,
      CAST(mother_race AS STRING) AS mother_race
    FROM
      `bigquery-public-data.samples.natality`
    WHERE
      state = "WY")
   )

3. Bấm Run.

4. Khi truy vấn hoàn tất, nhấp vào tab Results bên dưới vùng Query editor. Các kết quả sẽ như sau:

Hình : Kết quả đạt được

Bước 5 : Xem số liệu thống kê kết quả huấn luyện

Để xem kết quả huấn luyện mô hình, bạn có thể sử dụng hàm ML.TRAINING_INFO hoặc bạn có thể xem số liệu thống kê trong giao diện BigQuery UI. Trong hướng dẫn này, mình sử dụng giao diện BigQuery UI.

Một thuật toán học máy xây dựng một mô hình bằng cách kiểm tra nhiều ví dụ và cố gắng tìm một mô hình có độ lỗi là nhỏ nhất.

Để xem số liệu thống kê đào tạo mô hình đã được tạo khi bạn chạy truy vấn CREATE MODEL:

Trong giao diện BigQuery UI, trong Resources, mở rộng [PROJECT_ID]> bqml_tutorial và sau đó nhấp vào natality_model.

Nhấp vào tab Model stats. Các kết quả sẽ như sau:

ML.TRAINING_INFO output
Hình : Kết quả thông kê sau khi huấn luyện mô hình

Cột Training Data Loss biểu thị số liệu mất mát được tính sau khi mô hình được đào tạo trên tập dữ liệu huấn luyện. Trong bài viết này đã thực hiện hồi quy tuyến tính, cột này là mean squared error.

Cột Evaluation Data Loss là cùng một số liệu mất mát được tính toán trên tập dữ liệu đánh giá (evaluation data). Chiến lược tối ưu hóa “normal_equation” được tự động sử dụng trong quá trình huấn luyện, do đó chỉ cần một lần lặp là đã hội tụ cho được mô hình cuối cùng. Để biết thêm chi tiết về tùy chọn chiến lược tối ưu hóa, các bạn có thể xem thêm ở đây.

Quay lại ví dụ, để tránh phát sinh chi phí cho tài khoản Google Cloud Platform của mình khi thực hiện ví dụ này. Thì sao khi thực hiện xong, ngắm nghía nó một chút, mình nên xoá dataset và lưu lại câu truy vấn mà mình dùng để sử dụng cho những project khác:

  1. Mở giao diện BigQuery UI.
  2. Trong phần điều hướng, nhấp vào tập dữ liệu bqml_tutorial bạn đã tạo.
  3. Nhấp vào Delete dataset ở bên phải của cửa sổ. Hành động này sẽ xoá tất cả dữ liệu trong dataset.
  4. Trong hộp thoại  Delete dataset  tập dữ liệu, xác nhận lệnh xóa bằng cách nhập tên của tập dữ liệu của bạn (bqml_tutorial) và sau đó nhấp vào Delete.

Lời kết

Vậy chúng ta đã hoàn thành việc huấn luyện mô hình dự đoán cân nặng của em bé khi sinh và sử dụng mô hình học được để dự đoán theo các tham số đầu vào – giới tính, số tuần thai kỳ, số tuổi của người mẹ ,… mà không cần biết quá nhiều về machine learning. Từ ví dụ này, các bạn có thể áp dụng để dự đoán mức độ chi trả của khách hàng khi khách hàng ghé thăm shop của bạn, hoặc bất cứ cái gì mà bạn có thể nghĩ ra, …

Khi có chỗ nào chưa rõ, cần support, các bạn hãy liên hệ với các chuyên gia – Cloud Ace Việt Nam – để được hỗ trợ tốt hơn.

Source: https://cloud.google.com/bigquery-ml/docs/bigqueryml-natality

Bao Vuong

Vương hiện là Cloud Engineer của Cloud Ace Vietnam.+6 năm kinh nghiệm phát triển backend +2 năm kinh nghiệm Data Analytics +1 năm kinh nghiệm Machine Learning

View all posts by Bao Vuong →