Data pre-processing

Nguyễn Ngọc Bình
22 Apr 2019

Giới thiệu

  • Data pre-processing là kỹ thuật thêm, bớt, chuyển dạng dữ liệu với tập training data.

    • Đây là kỹ thuật cơ bản nhưng có ảnh hưởng lớn đến mô hình.
    • Trong phần này, tôi sẽ giới thiệu cách tiếp cận unsupervised data processing, tức là không sử dụng outcome variable trong các kỹ thuật data pre-processing.
    • Và sử dụng package recipes được viết bởi Max Kuhn

Các kỹ thuật

  • Centering and Scaling
  • Chuyển đổi dữ liệu nhằm giảm bớt bất đối xứng (skewness)
  • Chuyển đổi dữ liệu nhằm giải quyết outliers
  • Xử lý giá trị Missing
  • Thực hành

Centering and Scaling

  • 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

Transformations to Resolve Skewness

  • Skewness định nghĩa đơn giản là các điểm dữ liệu bị lệch về 1 phía so với vị trí trung tâm

Transformations to Resolve Skewness

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

Transformations to Resolve Skewness

  • 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.

  • Package MASS có hàm boxcox tính được \( \lambda \) nhưng không chuyển đổi dữ liệu. Package caret có hàm BoxCoxTrans có thể chuyển đổi dữ liệu luôn. Để thống nhất với hệ sinh thái tidyverse ta dùng hàm step_BoxCox()

Transformations to Resolve Outliers

  • 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%

Transformations to Resolve Outliers

  • Cách 2 yêu cầu phải chuyển dạng dữ liệu: spatial sign (Serneels et al. 2006). Phương pháp này dựa trên đường tròn đơn vị (bán kính bắng 1). Bằng cách chiếu từng điểm của dữ liệu lên quả cầu đa chiều (multidimensional sphere), phương pháp này làm cho từng điểm dữ liệu có cùng khoảng cách với trung tâm dữ liệu (tham khảo thêm)

Dealing with Missing Values

Để 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

Dealing with Missing Values

  • Missing do chia cho mẫu = 0: như vậy có 2 trường hợp: tử số là số dương, hoặc tử số là số âm sẽ cho ra 2 kết quả vô cùng lớn hoặc vô cùng nhỏ

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

Computing

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

Computing

  • Chia dữ liệu thành tập train và tập test
set.seed(1611)
train_test_split <- initial_split(raw_data, strata = "creditability")

credit_train <- training(train_test_split)
credit_test <- testing(train_test_split)

Computing

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 

Computing

  • Cho giá trị của biến age.in.years thành NA, sau đó impute
credit_train$age.in.years[1]
[1] 67
credit_train$age.in.years[1] <- NA
  • Tạo object recipe, mục đích để tách biến phụ thuộc khỏi các bước preprocessing (vì các bước preprocessing này là unsuppervised)
rec_obj <- recipe(creditability ~., data = credit_train)

Computing

  • Tạo object preprocessing để lưu lại các bước preprocessing
prep_obj <- rec_obj %>% 
  # Chuyển từ character -> factor
  step_string2factor(all_nominal()) %>% 
  # Xử lý missing
  step_medianimpute(all_numeric()) %>% 
  prep() 

Computing

  • Xem các biến predictors được áp dụng cách processing nào
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]

Computing

  • Áp dụng các cách tính toán vào tập train và tập test
# Á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)

Computing

  • So sánh dữ liệu ban đầu với dữ liệu sau khi preprocessing

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 ...

Computing

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

Thanks