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
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 train
và test
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