Week 02: Basic preprocessing


  • Caret package
  • Data slicing
  • Training options
  • Plotting predictions
  • Basic preprocessing
  • Covariate creation
  • Preprocessing with principal components analysis
  • Predicting with Regression
  • Predicting with Regression Multiple Covariates



Basic pre-processing 


어떤 머신러닝 알고리즘을 적용하던지간에 anomaly value를 제거하는 것은 중요하다.

그래프를 그리던지해서 noise 제거하는것은 정확히 해당 데이터로 부터 right signal을 추출해서 모델을 생성하도록 돕기

때문에 정확도 항샹에 큰 영향을 미치게 된다.


아래와 같은 spam 데이터 예제에대해서 일부만 빈도가 높을 수도 있다. 이러면 문제가 발생한다.

library(caret); library(kernlab); data(spam)

inTrain <- createDataPartition(y=spam$type,

                               p=0.75, list=FALSE)

training <- spam[inTrain,]

testing <- spam[-inTrain,]

hist(training$capitalAve,main="",xlab="ave. capital run length")


평균과 표준편차를 계산해 보면 아래와 같다.

> mean(training$capitalAve)

[1] 4.844242

> sd(training$capitalAve)

[1] 27.37255



1.1 standardizing - manual


$$E(X)=m,\quad \sigma (X)=\sigma,\quad Z=\frac { X-m }{ \sigma  }$$라두면, 평균과 표준편차의 성질을 이용하여 아래와 같이 전개 된다.

$$E(Z)=E\left( \frac { X-m }{ \sigma  }  \right) =E=\left( \frac { 1 }{ \sigma  } X-\frac { m }{ \sigma  }  \right) =\frac { 1 }{ \sigma  } E(X)-\frac { m }{ \sigma  } =0$$ 

$$\sigma(Z)=\sigma\left( \frac { X-m }{ \sigma  }  \right) =\sigma=\left( \frac { 1 }{ \sigma  } X-\frac { m }{ \sigma  }  \right) =\frac { 1 }{ \sigma  } \sigma(X)=1$$


이것을 training set에 대해서 표준화(standardizing)을 수행하면 아래와 같은 결과를 얻을 수 있다.

> #Standardizing
> trainCapAve <- training$capitalAve
> trainCapAveS <- (trainCapAve  - mean(trainCapAve))/sd(trainCapAve) 
> mean(trainCapAveS)
[1] -5.008709e-18
> sd(trainCapAveS)
[1] 1


test set에 standardizing을 적용할 때에 test set에 대한 mean과 sd를 적용하는 것이 아닌,

training set에서의 mean과 sd 값을 적용 해야 한다. 

> #standardizing - test set
> testCapAve <- testing$capitalAve
> testCapAveS <- (testCapAve  - mean(trainCapAve))/sd(trainCapAve) 
> mean(testCapAveS)
[1] 0.04085023
> sd(testCapAveS)
[1] 1.131577

당연히 mean과 sd는 0과 1이 아니다. 하지만 그것에 근접한 값이 나오기를 바랄 뿐이다.


1.2 standardizing - using preProcess in caret package


Pre-processing transformation (centering, scaling etc.) can be estimated from the training data and applied to any data set with the same variables.

preObj <- preProcess(training[,-58],method=c("center","scale"))
trainCapAveS <- predict(preObj,training[,-58])$capitalAve
mean(trainCapAveS)
[1] -5.008709e-18
> sd(trainCapAveS)
[1] 1

여기서 58번째 컬럼을 제거하는 이유는 해당 컬럼만 numeric이 아닌 factor type 이기 때문이다.

method=c("center","scale")의 의미는 아래와 같다.

method = "center" subtracts the mean of the predictor's data (again from the data in x) from the predictor values while method = "scale" divides by the standard deviation.


이전과 같이 거의 zero에 가까운 mean과 1의 sd를 얻을 수 있다.


test set의 경우 당연히 training set의 preObj을 사용해서 처리 해야한다.

> testCapAveS <- predict(preObj,testing[,-58])$capitalAve
> mean(testCapAveS)
[1] 0.04085023
> sd(testCapAveS)
[1] 1.131577


1.3 standardizing - preProcess argument

train function에서 argument로써 수행 할 수 있다.

> set.seed(32343)
> modelFit <- train(type ~.,data=training,
+                   preProcess=c("center","scale"),method="glm")
There were 27 warnings (use warnings() to see them)
> modelFit
Generalized Linear Model 

3451 samples
  57 predictor
   2 classes: 'nonspam', 'spam' 

Pre-processing: centered (57), scaled (57) 
Resampling: Bootstrapped (25 reps) 
Summary of sample sizes: 3451, 3451, 3451, 3451, 3451, 3451, ... 
Resampling results

  Accuracy   Kappa     Accuracy SD  Kappa SD 
  0.9201069  0.832212  0.01353308   0.0260575


2. Standardizing - Box-Cox transforms

새로운 standardizing 방법이 있다.

center, scale 방법은 익스트림 값을 제거하는 스타일의 방법이다.


하지만 여기서 소개하는 box-cox 방식은 normal data 처럼 만들어주는 standardizing 방법이다.

# Standardizing box cox transforms
preObj <- preProcess(training[,-58],method=c("BoxCox"))
trainCapAveS <- predict(preObj,training[,-58])$capitalAve
par(mfrow=c(1,2)); hist(trainCapAveS); qqnorm(trainCapAveS)

오른쪽은 이전에 standardizing을 수행하지 않고 histogram을 그린것이다. 보는것과 같이 특정 구간에만 빈도가 몰린것을 알 수 있다. 하지만 box-cox를 적용한다음에는 분포가 고른것을 볼 수 있다. 



 



Q-Q plot을 통해서 해당 standardizing이 얼마만큼 normal distribution과 일치 하는지를 알 수 있다.

변위치(Quantiles) 0에 많은 데이터가 분포하므로 완벽히 45도 기울기의 일직선이 아느므로 완벽하지는 않다. 하지만 거의 유사하다. 



3. Standardizing - Imputing data


missing data를 처리하기 위한 전처리 방법이다. NA(missing data), 결측치가 있을경우 대부분의 통계 함수들이나 prediction algorithm들은 동작 자체를 하지 않는다. 따라서 반드시 처리해줘야하는 것들 중 하나이다.


이때 이러한 missing data를 impute(덮어씌우기)하는 알고리즘들을 배워보자.

k-nearest neighbor's imputation이 쉬운 방법중 하나이다.


코드는 아래와 같다.

#standardizing - imputing data
set.seed(13343)

# Make some values NA
training$capAve <- training$capitalAve
selectNA <- rbinom(dim(training)[1],size=1,prob=0.05)==1
training$capAve[selectNA] <- NA

# Impute and standardize
preObj <- preProcess(training[,-58],method="knnImpute")
capAve <- predict(preObj,training[,-58])$capAve

# Standardize true values
capAveTruth <- training$capitalAve
capAveTruth <- (capAveTruth-mean(capAveTruth))/sd(capAveTruth)

결과는 아래와 같다.

> quantile(capAve - capAveTruth)
           0%           25%           50%           75%          100% 
-3.5036289018 -0.0005761963  0.0006479362  0.0011937179  0.1832545934 
> quantile((capAve - capAveTruth)[selectNA])
           0%           25%           50%           75%          100% 
-3.5036289018 -0.0175633552  0.0009851735  0.0159918619  0.1832545934 
> quantile((capAve - capAveTruth)[!selectNA])
           0%           25%           50%           75%          100% 
-0.8523414202 -0.0004922746  0.0006475486  0.0011696849  0.0016053800 


Notes and future reading

Training and test must be processed in the same way

Test transformations will likely be imperfect

Especially if the test/training sets collected at different times

Careful when transforming factor variables!



더 읽어볼 거리

preprocessing-caret: http://topepo.github.io/caret/preprocess.html




+ Recent posts