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
> 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
'MOOC > Practical Machine Learning (r programing)' 카테고리의 다른 글
Week 02: Predicting with Regression (0) | 2015.11.16 |
---|---|
Week 02: Covariate creation, Pre-processing with principal components analysis (0) | 2015.11.15 |
Week 02: Training options, Plotting predictions (0) | 2015.11.13 |
Week 02: Caret Package, dataSlicing (1) | 2015.11.13 |
Week 01: Receiver Operating Characteristic, Cross validation (0) | 2015.11.09 |