Mục lục
Tổng quan
Overfitting
Overfitting là hiện tượng mô hình quá khớp với dữ liệu training. Việc quá khớp chỉ với một dữ liệu dẫn đến việc dự đoán nhầm, nhiễu và mô hình không còn tốt trên các dữ liệu khác. Hình sau đây minh họa hiện tượng overfitting.
Từ hình minh họa, ta thấy rằng:
- Mô hình 1: Quá đơn giản và quá yếu.
- Mô hình 2: Cân bằng giữa độ phức tạp và khả năng dự báo của mô hình.
- Mô hình 3: Mô hình có khả năng dự báo rất mạnh nhưng độ phức tạp cao, đồng thời không tốt trên mẫu test.
Tránh overfitting
Để tránh overfittling, ta thường sử dụng quy trình như sau:
- Dữ liệu ban đầu thường được chia thành tập train và validate (out-of sampe).
- Xây dựng mô hình theo độ phức tạp tăng dần trên mẫu train, dùng mô hình này để score cho mẫu validate.
- Theo dõi performance đồng thời trên dữ liệu train và validate.
- Chọn điều kiện dừng phù hợp (early stopping): thường là khi performance của model trên dữ liệu validate bắt đầu xấu đi.
Hình sau đây minh họa phương pháp tránh overfitting:
Với hình minh họa trên, ta thấy rằng, khi độ phức tạp của mô hình tăng dần thì sai số trên dữ liệu train giảm dần. Trong khi đó sai số trên dữ liệu validate lúc đầu giảm dần nhưng sau đó lại tăng lên. Căn cứ vào đồ thị, ta thấy dừng tại bước số 9 là hợp lý.
Nếu số lượng quan sát trong dữ liệu đủ lớn, ta có thể chia dữ liệu ban đầu thành dữ liệu train (chiếm 70% quan sát) và dữ liệu validate (chiếm 30%) quan sát. Tỉ lệ này có thể là 70/30 hoặc 80/20. Khi chia dữ liệu thành hai phần cần chú ý các vấn đề như sau:
-
Sử dụng kỹ thuật Stratify sample cho biến target (good/bad) nhằm đảm bảo tỉ lệ Good/Bad của mẫu validation và train là tương tự nhau.
-
Sử dụng seed là giá trị định danh nhằm đảm bảo cách chia train/validate là tương tự nhau trong mỗi lần chia (mỗi lần chạy code).
Minh họa cho stratify sampling được minh họa như sau:
Sử dụng Macro
Syntax
Để chia dữ liệu thành tập dữ liệu train và validate theo stratify sampling, ta dùng Macro Data_Partition. Tham số của macro như sau:
%Data_Partition(ds_in, train, valid, percent, target, seed=123456);
Trong đó:
ds_in
(data[target
]): Dữ liệu ban đầu cần chia (input).train
(data): Dữ liệu train (output).valid
(data): Dữ liệu validate (output).percent
(float): (Số quan sát dữ liệutrain
)/ (Số quan sát dữ liệuvalidate
) *100.target
(variable): Thực hiện stratify sampling dựa trên biếntarget
. Biếntarget
có thể là binary hoặc interval và phải nằm trong dữ liệuds_in
. -seed
(int) giá trị để cố định sự ngẫu nhiên trong các lần chia. Sử dụng số này để đảm bảo kết của của mỗi lần chạy macro là không khác nhau.
Detail
Các bước xử lý trong macro như sau:
- Bước 1: Check số lượng \(n\) các giá trị phân biệt của biến
target
. Nếu n nhỏ hơn hoặc bảng 20 thì chuyển sang bước 2. Còn lại chuyển sang bước 3. - Bước 2: Sử dụng Proc HPSample để chia dữ liệu
ds_in
thành hai dữ liệutrain
vàvalid
theo tỉ lệpercent: (100- percent)
. - Bước 3: Chia biến
target
thành 20 nhóm theo quantile. Sử dụng biến group mới này để thực hiện stratify sampling. Sử dụng Proc HPSample để chia dữ liệuds_in
thành hai dữ liệutrain
vàvalid
theo tỉ lệpercent: (100- percent)
.
Output
Report
Với biến target
là biến nhị phân (nhận giá trị 0 hoặc 1). Kết quả nhận được như sau:
Với biến target
là biến liên tục. Kết quả nhận được như sau:
Trong đó:
- Target là các giá trị khác nhau của biến
target
. - Num Input, Num Train, Num Valid là số lượng quan sát ứng với từng giá trị khác nhau của cột target của các dữ liệu
input, train, valid
tương ứng. - Pct Train, Pct Valid là tỉ lệ phần trăm qua sát trong dữ liệu
train, valid
so với dữ liệuinput
. Các giá trị trong cột này bằng nhau thể hiện macro chạy chúng theo stratify sampling.
Dữ liệu
Kết quả đầu ra của Macro là hai dữ liệu train
và valid
với các biến và tỉ lệ target
tương tự như dữ liệu đầu vào. Tỉ lệ số lượng quan sát ở hai dữ liệu train
và valid
so với dữ liệu ds_in
là percent
/100 và 1-percent
/100.
Example
Ví dụ sau dùng để chia dữ liệu data.import thành hai dữ liệu train (data.train) và validate (data.valid) theo tỷ lệ 70% và 30% tương ứng.
%data_partition (
ds_in=data.import,
train=data.train,
valid=data.valid,
percent=70,
target=bad);