Bài thứ 21 trong chuỗi các bài viết về chủ đề Data Preparation cho các mô hình ML và là bài thứ 8 về về Data Transforms. Trong bài này, chúng ta sẽ tìm hiểu cách thức save và load Data Transforms. Chúng ta cũng sẽ thực hành trên bộ dữ liệu giả ngẫu nhiên được sinh ra.
Một điều rất quan trọng khi giải quyết bài toán ML là các kỹ thuật DP4ML nào áp dụng cho Training Data thì cũng phải được áp dụng cho New Data trong tương lai. Nếu mỗi lần cần dự đoán, lại phải thực hiện lại việc fitting các kỹ thuật DP4ML trên tập train thì sẽ rất mất thời gian. Một cách giải quyết hiệu quả là lưu lại các kỹ thuật DP4ML đó thành 1 file, khi nào cần thì chỉ việc load lên và sử dụng.
Chúng ta sẽ sử dụng hàm make_blobs() để tạo ra tập dữ liệu gồm 1000 mẫu, mỗi mẫu có 10 features, và thuộc một trong 2 lớp.
# example of creating a test dataset and splitting it into train and test sets
from sklearn.datasets import make_blobs
from sklearn.model_selection import train_test_split
# prepare dataset
X, y = make_blobs(n_samples=100, centers=2, n_features=2, random_state=1)
# split data into train and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=1)
# summarize the scale of each input variable
for i in range(X_test.shape[1]):
print('>%d, train: min=%.3f, max=%.3f, test: min=%.3f, max=%.3f' %
(i, X_train[:, i].min(), X_train[:, i].max(),
X_test[:, i].min(), X_test[:, i].max()))
Kết quả thực hiện:
>0, train: min=-4.532, max=1.496, test: min=-4.208, max=1.502
>1, train: min=1.161, max=8.365, test: min=0.514, max=6.835
>2, train: min=-12.799, max=-2.350, test: min=-13.251, max=-2.298
>3, train: min=-6.736, max=10.176, test: min=-6.540, max=10.960
>4, train: min=-12.151, max=-3.827, test: min=-12.747, max=-4.879
>5, train: min=-10.774, max=5.887, test: min=-11.169, max=6.068
>6, train: min=-8.694, max=1.201, test: min=-8.426, max=1.204
>7, train: min=-5.880, max=3.847, test: min=-5.524, max=3.553
>8, train: min=-10.177, max=0.464, test: min=-10.118, max=1.256
>9, train: min=-8.925, max=4.209, test: min=-8.630, max=3.078
Ta thấy rằng các features có khoảng giá trị khác nhau, ngụ ý rằng chúng ta phải thực hiện một số kỹ thuật DP4ML đối với nó.
Ta sẽ sử dụng MinMaxScaler để scale các features:
# example of scaling the dataset
from sklearn.datasets import make_blobs
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
# prepare dataset
X, y = make_blobs(n_samples=1000, centers=2, n_features=10, random_state=1)
# split data into train and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=1)
# define scaler
scaler = MinMaxScaler()
# fit scaler on the training dataset
scaler.fit(X_train)
# transform both datasets
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)
# summarize the scale of each input variable
for i in range(X_test.shape[1]):
print('>%d, train: min=%.3f, max=%.3f, test: min=%.3f, max=%.3f' %
(i, X_train_scaled[:, i].min(), X_train_scaled[:, i].max(),
X_test_scaled[:, i].min(), X_test_scaled[:, i].max()))
Kết quả thực hiện:
>0, train: min=0.000, max=1.000, test: min=0.054, max=1.001
>1, train: min=0.000, max=1.000, test: min=-0.090, max=0.788
>2, train: min=0.000, max=1.000, test: min=-0.043, max=1.005
>3, train: min=0.000, max=1.000, test: min=0.012, max=1.046
>4, train: min=0.000, max=1.000, test: min=-0.072, max=0.874
>5, train: min=0.000, max=1.000, test: min=-0.024, max=1.011
>6, train: min=0.000, max=1.000, test: min=0.027, max=1.000
>7, train: min=0.000, max=1.000, test: min=0.037, max=0.970
>8, train: min=0.000, max=1.000, test: min=0.006, max=1.075
>9, train: min=0.000, max=1.000, test: min=0.022, max=0.914
Tất cả các features bây giờ đều đã nằm trong khoảng [0,1].
Sử dụng LogisticRegression, ta sẽ mô hình hóa tập dữ liệu này. Sau đó, cả model và MaxMinScaler sẽ được lưu lại thành file, sử dụng pickle framework.
# example of fitting a model on the scaled dataset
from sklearn.datasets import make_blobs
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn.linear_model import LogisticRegression
from pickle import dump
# prepare dataset
X, y = make_blobs(n_samples=100, centers=2, n_features=2, random_state=1)
# split data into train and test sets
X_train, _, y_train, _ = train_test_split(X, y, test_size=0.33, random_state=1)
# define scaler
scaler = MinMaxScaler()
# fit scaler on the training dataset
scaler.fit(X_train)
# transform the training dataset
X_train_scaled = scaler.transform(X_train)
# define model
model = LogisticRegression(solver='lbfgs')
model.fit(X_train_scaled, y_train)
# save the model
dump(model, open('model.pkl', 'wb'))
# save the scaler
dump(scaler, open('scaler.pkl', 'wb'))
Sau khi chạy đoạn chương trình trên, 2 files model.pkl và scaler.pkl được sinh ra.
Phần này, ta sẽ tiến hành load model và scaler object để thực hiện dự đoán trên một dữ liệu mới.
# load model and scaler and make predictions on new data
from sklearn.datasets import make_blobs
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from pickle import load
# prepare dataset
X, y = make_blobs(n_samples=1000, centers=2, n_features=10, random_state=1)
# split data into train and test sets
_, X_test, _, y_test = train_test_split(X, y, test_size=0.33, random_state=1)
# load the model
model = load(open('model.pkl', 'rb'))
# load the scaler
scaler = load(open('scaler.pkl', 'rb'))
# check scale of the test set before scaling
print('Raw test set range')
for i in range(X_test.shape[1]):
print('>%d, min=%.3f, max=%.3f' % (i, X_test[:, i].min(), X_test[:, i].max()))
# transform the test dataset
X_test_scaled = scaler.transform(X_test)
print('Scaled test set range')
for i in range(X_test_scaled.shape[1]):
print('>%d, min=%.3f, max=%.3f' % (i, X_test_scaled[:, i].min(), X_test_scaled[:, i].max()))
# make predictions on the test set
yhat = model.predict(X_test_scaled)
# evaluate accuracy
acc = accuracy_score(y_test, yhat)
print('Test Accuracy:', acc)
Kết quả thực hiện:
Raw test set range
>0, min=-4.208, max=1.502
>1, min=0.514, max=6.835
>2, min=-13.251, max=-2.298
>3, min=-6.540, max=10.960
>4, min=-12.747, max=-4.879
>5, min=-11.169, max=6.068
>6, min=-8.426, max=1.204
>7, min=-5.524, max=3.553
>8, min=-10.118, max=1.256
>9, min=-8.630, max=3.078
Scaled test set range
>0, min=-0.025, max=1.024
>1, min=-0.245, max=0.996
>2, min=-0.147, max=1.306
>3, min=0.012, max=1.106
>4, min=-0.082, max=1.000
>5, min=-0.060, max=1.078
>6, min=-0.054, max=1.154
>7, min=0.000, max=1.168
>8, min=0.013, max=1.140
>9, min=-0.106, max=1.011
Test Accuracy: 1.0
Đoạn chương trình này có thể coi như template cho các bài toán tương tự.
Bài thứ 8 cũng là bài cuối cùng về chủ đề Data Transforms. Trong bài này mình đã giới thiệu cách thức save và load model cũng như Transform Object để thuận tiện trong việc sử dụng. Toàn bộ code của bài này, các bạn có thể tham khảo tại đây.
Bài tiếp theo chúng ta sẽ chuyển sang tìm hiểu về nhiệm vụ Dimensionality Reduction. Mời các bạn đón đọc.
[1] Jason Brownlee, “Data Preparation for Machine Learning”, Book: https://machinelearningmastery.com/data-preparation-for-machine-learning/.