Machine Learning Data Preparation

DP4ML - Data Transform - Phần 7 - How to Transform the Target in Regression

DP4ML - Data Transform - Phần 7 - How to Transform the Target in Regression

Bài thứ 20 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ứ 7 về về Data Transforms. Trong bài này, chúng ta sẽ tìm hiểu cách thức để thực hiện Data Transforms đôi với target dạng numerical. Chúng ta cũng sẽ thực hành trên bộ dữ liệu thực tế.

1. Hai cách thực hiện Data Transforms cho Target Variable

Cũng giống như features, target cũng cần phải được áp dụng các kỹ thuật Data Transforms trước khi đưa cho mô hình để học. Có 2 cách thực hiện Data Transforms cho target là: Manual và Automative

1.1 Manual Transform of the Target Variable

Các bước thực hiện như sau:

  • Tạo transform object. VD: MinMaxScaler.
  • Fit transform object vào tập train.
  • Áp dụng transform object vào 2 tập train/test.
  • Chuyển đổi ngược kết quả dự đoán về dạng ban đầu (khi chưa transform).

VD:

...
# create target scaler object
target_scaler = MinMaxScaler()
target_scaler.fit(train_y)
# transform target variables
train_y = target_scaler.transform(train_y)
test_y = target_scaler.transform(test_y)
...
# invert transform on predictions
yhat = model.predict(test_X)
yhat = target_scaler.inverse_transform(yhat)

Cách làm này khá bất tiện vì không sử dụng được một số hàm của scikit-learn, ví dụ như cross_val_score() để nhanh chóng đánh giá model.

1.2 Automatic Transform of the Target Variable

Scikit-learn cung cấp cho chúng ta một cách thực hiện khác dễ dàng hơn, tự dộng hóa hơn bằng cách sử dụng class TransformedTargetRegressor(). TransformedTargetRegressor làm việc theo cách đóng gói model và Tranform Object vào làm một. Transform Object của target sử dung cùng Training Data để fit model. Khi có dữ liệu mới đến để dự đoán, nó sẽ áp dụng Inverse Transform để trả về kết quả đúng như khi chưa thực hiện Data Transforms.

Để sử dụng TransformedTargetRegressor, cần cung cấp 2 tham số là model và Transform Object.

...
# define the target transform wrapper
wrapped_model = TransformedTargetRegressor(regressor=model, transformer=MinMaxScaler())
...
# use the target transform wrapper
wrapped_model.fit(train_X, train_y)
yhat = wrapped_model.predict(test_X)

2. Thực hành TransformedTargetRegressor

2.1 Boston Housing Dataset

Chúng ta sẽ sử dụng bộ dữ liệu Boston Housing để thực hành việc sử dụng TransformedTargetRegressor. Bộ dữ liệu này đã được sử dụng trong bài số 3 để minh họa cách xử lý Outlier. Nó bao gồm 506 mẫu, mỗi mẫu có 13 features và một target. Base model đạt được kết quả MAE = 6.659.

2.2 Sử dụng TransformedTargetRegressor

  • Khai báo pipeline thực hiện Data Transforms cho target và model huấn luyện:
...
# prepare the model with input scaling
pipeline = Pipeline(steps=[('normalize', MinMaxScaler()), ('model', HuberRegressor())])

Các features sẽ được scale sử dụng MinMaxScaler, còn model sử dụng là HuberRegressor.

  • Định nghĩa TransformedTargetRegressor
...
# prepare the model with target scaling
model = TransformedTargetRegressor(regressor=pipeline, transformer=MinMaxScaler())
  • Đánh giá model sử dụng 10-fold Cross-Validation
...
# evaluate model
cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)
scores = cross_val_score(model, X, y, scoring='neg_mean_absolute_error', cv=cv, n_jobs=-1)

Code đầy đủ như sau:

# example of normalizing input and output variables for regression.
from numpy import mean
from numpy import absolute
from numpy import loadtxt
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedKFold
from sklearn.pipeline import Pipeline
from sklearn.linear_model import HuberRegressor
from sklearn.preprocessing import MinMaxScaler
from sklearn.compose import TransformedTargetRegressor
# load data
dataset = loadtxt('housing.csv', delimiter=",")
# split into inputs and outputs
X, y = dataset[:, :-1], dataset[:, -1]
# prepare the model with input scaling
pipeline = Pipeline(steps=[('normalize', MinMaxScaler()), ('model', HuberRegressor())])
# prepare the model with target scaling
model = TransformedTargetRegressor(regressor=pipeline, transformer=MinMaxScaler())
# evaluate model
cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)
scores = cross_val_score(model, X, y, scoring='neg_mean_absolute_error', cv=cv, n_jobs=-1)
# convert scores to positive
scores = absolute(scores)
# summarize the result
s_mean = mean(scores)
print('Mean MAE: %.3f' % (s_mean))

Kết quả thực hiện:

Mean MAE: 3.203

Kết quả này tốt hơn Base model rất nhiều rồi.

Thử thêm một phép transform nữa vào features và target xem sao:

# example of power transform input and output variables for regression.
from numpy import mean
from numpy import absolute
from numpy import loadtxt
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedKFold
from sklearn.pipeline import Pipeline
from sklearn.linear_model import HuberRegressor
from sklearn.preprocessing import PowerTransformer
from sklearn.preprocessing import MinMaxScaler
from sklearn.compose import TransformedTargetRegressor
# load data
dataset = loadtxt('housing.csv', delimiter=",")
# split into inputs and outputs
X, y = dataset[:, :-1], dataset[:, -1]
# prepare the model with input scaling and power transform
steps = list()
steps.append(('scale', MinMaxScaler()))
steps.append(('power', PowerTransformer()))
steps.append(('model', HuberRegressor()))
pipeline = Pipeline(steps=steps)
# prepare the model with target scaling
model = TransformedTargetRegressor(regressor=pipeline, transformer=PowerTransformer())
# evaluate model
cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)
scores = cross_val_score(model, X, y, scoring='neg_mean_absolute_error', cv=cv, n_jobs=-1)
# convert scores to positive
scores = absolute(scores)
# summarize the result
s_mean = mean(scores)
print('Mean MAE: %.3f' % (s_mean))

Kết quả thực hiện:

Mean MAE: 2.972

Ta thấy MAE có sự cải thiện thêm được 1 chút, giảm từ 3.203 xuống còn 2.972. Bạn có thể thử thêm các phép biến đổi khác xem kết quả có được cải thiện hơn ko?

3. Kết luận

Bài thứ 7 về chủ đề Data Transforms, mình đã giới thiệu về kỹ thuật class TransformedTargetRegressor() của thư viện scikit-learn giúp chúng ta thực hiện được việc Data Transforms cho target. 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ẽ tìm hiểu cách thức save và load Data Transforms. Mời các bạn đón đọc.

4. Tham khảo

[1] Jason Brownlee, “Data Preparation for Machine Learning”, Book: https://machinelearningmastery.com/data-preparation-for-machine-learning/.