Nguyễn Ngọc Bình
22 Apr 2019
Data pre-processing là kỹ thuật thêm, bớt, chuyển dạng dữ liệu với tập training data.
Centering: làm cho biến predictor có trung bình bằng 0, bằng cách trừ tất cả các giá trị của biến predictor cho giá trị trung bình
Scaling: làm cho biến predictor có độ lệch chuẩn bằng 1, bằng cách chia tất cả các giá trị của biến predictor cho sd
Công thức tính hệ số bất đối xứng:
\[ Skew = \frac{\sum(X_i - \bar{X})^3}{(n-1) v^{3/2}} \]
Trong đó \( v = \frac{\sum(X_i - \bar{X})^2} {n-1} \)
Hệ số này càng gần 0, phân phối của dữ liệu càng đối xứng
Các hàm dùng để chuyển đổi thông thường là log, square root, or inverse.
Để lựa chọn hàm chuyển đổi phù hợp. Box and Cox (1964), \( \lambda \) = 2 sử dụng square, \( \lambda \) = 0.5 sử dụng square root, \( \lambda \) = -1 sử dụng hàm inverse, với giá trị khác sẽ dùng hàm khác.
Outliers là những điểm dữ liệu nằm quá xa vùng dữ liệu chính. Những điểm outliers có thể làm thay đổi kết quả dự báo mô hình đặc biệt là đối với những mô hình quá nhạy với outliers
Cách giải quyết đơn giản nhất đối với những trường hợp này là đưa những giá trị ngoại lai về điểm phân vị 99% và 1%
Để xử lý giá trị missing, đầu tiên phải tìm ra nguyên nhân giá trị đó missing.
Missing do lỗi nhập liệu: Xử lý bằng cách gán giá trị missing bởi các giá trị mean, median, mode, hoặc knn …
Missing do cách thiết kế dữ liệu:
Ví dụ: số ngày quá hạn của 1 hợp đồng có thể = missing nếu hợp đồng đó chưa bị quá hạn. -> Trong trường hợp này giá trị missing có thể gán = 0
Ví dụ: tính tỷ lệ khoản phải thu/ khoản phải trả của DN. Trong đó, khoản phải trả = 0 -> dữ liệu sẽ bị missing. -> Trong TH này có thể gán giá trị missing bằng 1 giá trị vô cùng lớn
Dùng dữ liệu germancredit
data("germancredit")
raw_data <- germancredit
Biến numeric
f_no_vars <- compose(length, names)
raw_data %>% select_if(is.numeric) %>% f_no_vars()
[1] 7
Biến character
raw_data %>% select_if(is.character) %>% f_no_vars()
[1] 1
Biến factor
raw_data %>% select_if(is.factor) %>% f_no_vars()
[1] 13
set.seed(1611)
train_test_split <- initial_split(raw_data, strata = "creditability")
credit_train <- training(train_test_split)
credit_test <- testing(train_test_split)
Tỷ lệ good/bad của tập train và tập test
credit_train$creditability %>% table() %>% prop.table()
.
bad good
0.3 0.7
credit_test$creditability %>% table() %>% prop.table()
.
bad good
0.3 0.7
credit_train$age.in.years[1]
[1] 67
credit_train$age.in.years[1] <- NA
rec_obj <- recipe(creditability ~., data = credit_train)
prep_obj <- rec_obj %>%
# Chuyển từ character -> factor
step_string2factor(all_nominal()) %>%
# Xử lý missing
step_medianimpute(all_numeric()) %>%
prep()
prep_obj
Data Recipe
Inputs:
role #variables
outcome 1
predictor 20
Training data contained 750 data points and 1 incomplete row.
Operations:
Factor variables from 14 items [trained]
Median Imputation for duration.in.month, ... [trained]
# Áp dụng đối với tập train
train_data <- bake(prep_obj, new_data = credit_train)
# Áp dụng đối với tập test
test_data <- bake(prep_obj, new_data = credit_test)
Biến chuyển từ dạng character sang factor
credit_train$purpose %>% str()
chr [1:750] "radio/television" "radio/television" "education" ...
train_data$purpose %>% str()
Factor w/ 10 levels "business","car (new)",..: 8 8 5 6 2 5 6 3 8 2 ...
Biến age.in.years gán giá trị NA thành median
credit_train$age.in.years[1]
[1] NA
train_data$age.in.years[1]
[1] 33