An end-to-end Machine Learning project

Photo by Jess Bailey on Unsplash

An end-to-end Machine Learning project

Có thể build ML prediction model chưa phải là mục tiêu cuối, nó chỉ là công cụ hỗ trợ cho business nào đó tốt hơn

·

3 min read

Look at the Big Picture

Frame the problem

Mục tiêu của dự án là gì?

Có thể build ML prediction model chưa phải là mục tiêu cuối, nó chỉ là công cụ hỗ trợ cho business nào đó tốt hơn. Biết được điều đó ta mới có thể xác định được:

  • sử dụng algorithm nào phù hợp CNN, LSTM,..

  • performance measure thế nào, cái nào phù hợp để đánh giá (ví dụ với nhiều outlier thì không nên dùng MSE)

  • how much effort you will spend tweaking it.

What the current solution looks like?

Biết được điều này giúp ta biết được performance hiện tại thế nào và có thể cải thiện được không, dùng cách nào để tối ưu và tăng chất lượng nhất

Từ kết quả và giải thích có thể hiểu được vấn đề nằm ở đâu

  • thời gian thực hiện quá lâu và phức tạp

  • performance chưa tốt vì các rule đã có chưa đạt được độ chính xác cao

Solution cho vấn đề

  • sử dụng dạng ML, DL hay Reinforcement learning?

  • classification hay regression?

  • batch learning hay online learning techniques

  • nhiều câu hỏi nữa khi đi sâu vào vấn đề

Để đưa ra được sự lựa chọn đúng, cần có sự hiểu biết sâu rộng về các algorithm, ưu và nhược điểm với từng bài toán

Discover and Visualize the data để tìm kiếm insights

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
housing = pd.read_csv('datasets/housing.csv')
train_set, test_set = train_test_split(housing, test_size=0.2, random_state=42)

Phương pháp chia data này chỉ phù hợp khi ta có data đủ lớn. Nếu số lượng data nhỏ, ta có thể bị significant sampling bias. Chúng ta muốn khi chia, training set có khả năng represent đầy đủ các đặc tính của cả tập data hay population.

Để thực hiện điều đó, ta có thể dùng phương pháp chia stratified sampling. Có thể hiểu là, cả data hay population được chia thành các homogeneous subgroup (strata), ví dụ như subgroup là nam và nữ. Sau đó sẽ lấy data ở mỗi group sao có tỉ lệ cân bằng

Nếu chỉ random lấy data, ta rất dễ bị skewed data vì phân bố không đều giữa các đặc tính, từ đó làm model bị bias về một tập data nào đó

Ví dụ trong tập housing.csv, attribute median_income rất quan trọng, cần thiết tập traintest phải có đủ thông tin (khoảng). Thử subgroup nó xem sao

housing['income_cat'] = pd.cut(housing['median_income'], bins=[0, 1.5, 3, 4.5, 6, np.inf], labels=[1, 2, 3, 4, 5])
housing['income_cat'].hist(bins=5, figsize=(12, 3))
plt.show()

from sklearn.model_selection import StratifiedShuffleSplit

# no need to fold split, so n_splits=1
split = StratifiedShuffleSplit(n_splits=1, test_size=0.2, random_state=42)
for train_idx, test_idx in split.split(housing, housing['income_cat']):
    strat_train_set = housing.loc[train_idx]
    strat_test_set = housing.loc[test_idx]

# drop income_cat column for get back orginal data
for set_ in (strat_train_set, strat_test_set):
    set_.drop('income_cat', axis=1, inplace=True)

Từ trong sách, có thể thấy tỉ lệ thực tế cần phải lấy giữa các subgroup sau khi đếm số lượng, StratifiedShuffleSplit cho ra kết quả gần với tỉ lệ đúng hơn là phương pháp random