Tìm hiểu package PyCaret trong python

- Phạm Duy Tùng

Giới thiệu

PyCaret là thư viện open-source machinelearning trong python, Thư viện tích hợp sẵn các mô hình cần thiết, giúp chúng ta train mô hình một lần trên nhiều thuật toán máy học khác nhau. Thư viện có hỗ trợ train trên GPU. Phiên bản hiện tại lúc mình viết bài viết này là 2.3.3. Các bạn có thể tham khảo thông tin thêm của thư viện ở link github https://github.com/pycaret/pycaret

Các chức năng trong pycaret

Để cài đặt pycaret, các bạn sử dụng lệnh sau


pip install pycaret

pip install pycaret[full]

Bản full có cài thêm nhiều gói thư viện khác, các bạn có thể tham khảo các gói thư viện được cài thêm ở bản full qua link https://github.com/pycaret/pycaret/blob/master/requirements-optional.txt

Mình quan sát sơ qua thì bàn full có cài thêm mấy cái thư viện kết nối aws và gcs khá dư thừa, mình không xài tới, với ổ cứng máy mình cũng có hạn. Nên mình chỉ cài bản cơ bản và các thư viện cần thiết như scikit-optimize, tune-sklearn, xgboost …

Vòng đời khi xây dựng chương trình máy học

Machine Learning Life Cycle — Image by Author (Read from left-to-right)

  • Business Problem : Như những ứng dụng khác, một ứng dụng máy học cũng được bắt đầu bằng một vấn đề thực tế trong cuộc sống, trong công việc. Phụ thuộc vào sự phức tạp của vấn đề, và các chi phí liên quan về mặt kinh doanh, chúng ta sẽ phân tích các yếu tố liên quan để xem xét có cần thiết phải phát triển chương trình sử dụng máy học hoặc tìm một giải pháp thay thế tốt hơn theo toàn bộ tiêu chí (thuyết vị lợi).

  • Data Sourcing & ETL : Sau khi hiểu bài toán, chúng ta sẽ thu thập các dữ liệu cần thiết.

  • Exploratory Data Analysis (EDA) : Dữ liệu ở trên là dữ liệu thô, chưa qua xử lý, nên có thể sẽ bị thu thập không đủ, thu thập thiếu. Chúng ta cần phải nắm rõ dữ liệu, phân tích sự cân bằng/ độ lệch của dữ liệu, xử lý nhiễu, xem phân bố của dữ liệu, xem độ tương quan giữa các đặc trưng, …

  • Data Preparation : Sau khi phân tích, xào nấu dữ liệu đẹp đẽ, trơn tru, chúng ta sẽ bắt đầu chuẩn bị dữ liệu cho mô hình train, ví dụ chia dữ liệu thành tập train,test,validation, one-hot encoding, feature engineering, feature selection …

  • Model Training & Selection : Đây là phần nhàm chán nhất, thử nghiệm dữ liệu với các mô hình và tham số khác nhau, lựa chọn mô hình có kết quả tốt nhất trên tập validation. chờ mô hình train xong

  • Deployment & Monitoring : Sau khi có được mô hình tốt nhất, chúng ta sẽ deploy ứng dụng, và theo dõi, tương tự như những ứng dụng khác thôi.

Trong việc phát triển phần mềm, có một khái niệm đang nổi gần đây (lúc mình đang viết bài viết này) là devops. Giúp cho một số công việc nhàm chám được thực hiện một cách tự động. Trong máy học, chúng ta sẽ có khái niệm MLOps.

MLOps là gì

Định nghĩa theo wikipedia:


MLOps or ML Ops is a set of practices that aims to deploy and maintain machine learning models in production reliably and efficiently

MLOps - wikipedia

Một bức hình bằng vạn câu chữ, xem bức hình trên, các bạn chắc về cơ bản cũng hiểu công việc của MLOps là gì rồi hen.

À, đọc đến đây, các bạn có lẽ sẽ thắc mắc là sao đang giới thiệu Pycaret, mà sao lại lang mang qua MLOps làm gì? Thì mình cũng trả lời luôn là Pycaret là một trong những package giúp chúng ta MLOps ==> bớt nhàm chán khi phát triển ứng dụng machine learning rồi đó.

Ví dụ sử dụng Pycaret

Mình sẽ trình bày phần này đúng theo machine learning life cycle, để đảm bảo việc giả lập sát với thực tế.

Business Problem

Bài toán Sarah Gets a Diamond, link chi tiết của bài toán ở https://hbsp.harvard.edu/product/UV0869-PDF-ENG. Bài toán này giúp người học khoá đó hiểu được sự khác nhau của linear-model, log-liner model, log-log mode. Nếu các bạn có nhu cầu tìm hiểu các model trên, có thể đăng ký khoá học trên hen. Ở đây, mình chỉ lấy mô tả chi tiết và data của khoá học.

Bối cảnh của bài toán diễn ra như sau. Grey muốn mua một chiếc nhẫn để cầu hôn Sarah. Sau một hồi tham khảo mấy thằng bạn từ thời nối khố, Grey quyết định sẽ mua nhẫn kim cương. Grey tiến hành đi thu thập thông tin của 6000 chiếc nhẫn kim cương khác nhau về giá, màu sắc, hình dạng …

May mắn thay Grey có share dữ liệu này cho Pycaret, và chúng ta có thể sử dụng dữ liệu trên bằng cách load từ dataset của Pycaret


# load the dataset from pycaret
from pycaret.datasets import get_data
data = get_data('diamond')

Và top 5 dữ liệu mẫu mà Grey thu thập là:


Carat Weight    Cut Color   Clarity Polish  Symmetry    Report  Price
0   1.10    Ideal   H   SI1 VG  EX  GIA 5169
1   0.83    Ideal   H   VS1 ID  ID  AGSL    3470
2   0.85    Ideal   H   SI1 EX  EX  GIA 3183
3   0.91    Ideal   E   SI1 VG  VG  GIA 4370
4   0.83    Ideal   G   SI1 EX  EX  GIA 3171

Exploratory Data Analysis

Bước này sẽ phụ thuộc vào kinh nghiệm của người làm data. Kinh nghiệm của mình thì đầu tiên sẽ phân tích phân bố dữ liệu và phân tích mối tương quan giữa các biến liên tục trước đã, sau đó sẽ phân tích các yếu tố chuyên sâu hơn dựa vào cảm quan nhận được từ hai cái trên.

Quan sát dữ liệu, chúng ta thấy rằng chỉ có hai thuộc tính Carat Weight và Price thuộc nhóm numerical variable, các thuộc tính còn lại thuộc nhóm categorical variable, nên mình không cần tính độ tương quan làm gì hết.

Mình có học từ link ở tài liệu tham khảo phía dưới, thư viện plotly.express, mình tham khảo thử thì thấy hàm vẽ scatter của thư viện có nhiều thuộc tính khá hay. Ví dụ mình thử phân tích kích thước viên đá kim cương với giá của chiếc nhẫn, chia theo màu sắc thì như thế nào

fig = px.scatter(data,x='Carat Weight', y='Price', animation_group='Color',
                 facet_col = 'Color', opacity = 0.25, template = 'plotly_dark', trendline='ols',
             color="Color",   trendline_color_override = 'red', title = 'SARAH GETS A DIAMOND - A CASE STUDY')
fig.show()

Diamon Dataset - Phân tích kích thước đá kim cương và giá cả trên thuộc tính màu sắc

Nhìn hình trên, mình thấy rằng cùng 1 kích thước, màu H và màu I có giá xêm xêm nhau, màu E và F cũng tương tự, màu D có mức giá cao nhất. với kích thước 2.74, giá của chiếc nhẫn kim cương màu D cao hơn gấp đôi so với giá của nhẫn kim cương có màu H hoặc màu I

Các bạn có thể thay thuộc tính facet_col = ‘Color’ của hàm scatter bằng các tên cột như Cut hoặc Clarity hoặc Symmetry, sẽ có vài thứ hay ho có thể rút ra đó.

Sau khi phân tích dữ liệu, có cái nhìn sơ lược về các thuộc tính cũng như mối tương quang giữa chúng, chúng ta thường sẽ thường thực hiện các phép biến đổi để chuẩn hoá dữ liệu. Các phép biến đổi thường được xài là:

  • Chuẩn hoá dữ liệu: Scale dữ liệu về cùng một đoạn, ví dụ [-1,1] hoặc [0-1], 2 phương pháp phổ biến hay được sử dụng:

    • Min-Max
    • Z score
  • Xử lý dữ liệu lệch: Các cột thuộc tính numberric sẽ được chuẩn hoá về phân phối chuẩn.

  • Tổng hợp dữ liệu: Sử dụng các thuộc tính có sẵn, kết hợp lại để tạo nên các thuộc tính mới.

Trước hết, chúng ta sẽ xem histogram của biến Price

Diamon Dataset - Histogram

Ta thấy rằng, phân phối có ít quan sát hơn ở phía bên phải => mô hình bị lệch phải (right-skewed hoặc skewed right, positively skewed distribution). Với dữ liệu bị bịnh này thì chúng ta sẽ dùng thuốc chữa là căn bậc hai, căn bậc ba hoặc là log.

Mình sẽ xài thuốc log. Sử dụng hàm log trong thư viện numpy


import numpy as np
# create a copy of data
data_copy = data.copy()
# create a new feature Log_Price
data_copy['Log_Price'] = np.log(data['Price'])
# plot histogram
fig = px.histogram(data_copy, x=["Log_Price"], title = 'Histgram of Log Price', template = 'plotly_dark')
fig.show()



Diamon Dataset - Histogram

Dữ liệu được đưa về dạng giống giống cái chuông úp, hình dạng của phân phối chuẩn.

Data Preparation

Xài thư viện PyCaret khá sướng, chúng ta chỉ cần gọi hàm setup của thư viện là đủ


# initialize setup
from pycaret.regression import *
s = setup(data, target = 'Price', transform_target = True,transform_target_method="yeo-johnson", log_experiment = True, experiment_name = 'diamond')

Bài toán thuộc dạng hồi quy, nên mình sẽ load toàn bộ các hàm thuộc regression vào.

Mọi việc còn lại, từ việc tính log của cột Price, đến việc tiền xử lý dữ liệu , … đã được PyCaret lo hết. Chúng ta chỉ cần chịu khó đọc doc của thư viện để hiểu các tham số và ứng dụng nó vào là ổn.

Một lưu ý là hàm transform mặc định xài box-cox, và pycaret ở thời điểm hiện tại chỉ hỗ trợ “box-cox” hoặc “yeo-johnson”. Nếu các bạn muốn xài log cho cột Price, thì phải thêm cột mới. Mình sẽ xài yeo-johnson thay cho mặc định box-cox.

Model Training & Selection

Tiếp đến việc train model và lựa chọn model cũng hết sức đơn giản, chúng ta chỉ cần gọi 1 dòng lệnh duy nhất


# compare all models
best = compare_models()

Xong. Thư viện tự động điều chỉnh tham số, lựa chọn tham số tốt nhất và mô hình tốt nhất cho chúng ta. Chúng ta chỉ cần ngồi, đợi máy chạy, xem kết quả.

Diamon Dataset - Histogram

Một lưu ý là các bạn nếu không cài bản full thì nên xem file log để xem có báo lỗi thiếu thư viện hay không hen.

Sau khi có được thuật toán với mô hình tốt nhất , và các trọng số tốt nhất, chúng ta sẽ lưu mô hình lại vào file để sau này sử dụng.


# finalize the model
final_best = finalize_model(best)
# save model to disk
save_model(final_best, 'diamond-pipeline')

Deployment & Monitoring

Đến phần này thì đơn giản rồi, các bạn có thể viết webapi như flask hoặc fastapi để sử dụng.

Pycaret có hỗ trợ mlflow, dùng để xem đường dẫn các model đã được huấn luyện, cũng như chi tiết các thông tin tham số, độ lỗi. Các bạn hãy gõ lệnh

!mlflow ui

Nếu bạn chạy bằng terminal , thì chỉ cần gõ mlflow ui thôi, không cần dấu ! đâu, do mình chạy trên jupiter notebook nên phải thêm dấu ! câu lệnh mới hoạt động.

Sau khi chạy lện trên, bạn hãy mở trình duyệt web lên và nhập và địa chỉ http://localhost:5000, cái này cũng không có gì nhiều để đề cập, nên mình không show chi tiết ở đây, các bạn cứ vào đó vọc vạch, quậy phá hen.

Các bạn có thể testing best model bằng câu lệnh sau


# create a copy of data and drop Price
data1 = data.copy()
# data1.drop('Price', axis=1, inplace=True)
# generate predictions
from pycaret.regression import predict_model
predictions = predict_model(final_best, data=data1)
predictions.head()

Cột Label chính là cột giá của mô hình. Mình giữ lại cột giá để tiện so sánh.


    Carat Weight    Cut Color   Clarity Polish  Symmetry    Report  Price   Label
0   1.10    Ideal   H   SI1 VG  EX  GIA 5169    5365.265635
1   0.83    Ideal   H   VS1 ID  ID  AGSL    3470    3525.863059
2   0.85    Ideal   H   SI1 EX  EX  GIA 3183    3352.882096
3   0.91    Ideal   E   SI1 VG  VG  GIA 4370    4485.753572
4   0.83    Ideal   G   SI1 EX  EX  GIA 3171    3327.363225

Top 5 phần tử đầu tiên hiện ra cho mình thấy rằng, có vẻ mô hình dự đoán giá cao hơn một chút so với giá gốc.

Cảm ơn các bạn nhiều. Hẹn gặp lại trong các bài viết tiếp theo

Tham khảo

https://github.com/pycaret/pycaret

https://towardsdatascience.com/build-with-pycaret-deploy-with-fastapi-333c710dc786

https://towardsdatascience.com/easy-mlops-with-pycaret-mlflow-7fbcbf1e38c6

Nếu bạn thấy nội dung của bài viết thật sự hữu ích và bạn muốn đóng góp cho blog để có thêm nhiều bài viết chất lượng hơn nữa, các bạn có thể ủng hộ blog bằng một cốc trà hoặc một cốc cà phê nhỏ qua https://nhantien.momo.vn/7abl2tSivGa hoặc paypal.me/tungduypham. Sự ủng hộ của các bạn là nguồn động viên quý giá để chúng tôi có thêm động lực và chia sẻ nhiều điều mà chúng tôi tìm hiểu được đến với cộng đồng. Trân trọng cảm ơn.