Table of Contents
R (프로그레밍 언어)/기계학습 #
개념 #
R은 대중적인 Open source 프로그램으로써 다양한 통계, 그래픽 등의 함수를 제공한다. R은 데이터 사이언스의 첨단에 있는 기계학습(Machine Learning) 알고리즘을 다양한 패키지 형태로 제공한다. 기계학습은 크게 감독(Supervised)과 비감독(Unsupervised)법으로 나눌 수 있다. 이번 순서에서는 R을 이용한 감독법 기계학습 예제를 소개하는 것이다.
caret package #
caret 패키지는 2017년 10월 기준 238의 알고리즘을 제공한다. 뿐만아니라 예측모델 수립을 위한 다양한 함수 역시 포함하고 있다. 이는 현재 R에서 제공하는 기계학습 페키지 중 가장 큰 규모이다. 메뉴얼 역시 잘 갖추어져 있기 때문에 예제를 통해 다양한 실습과 응용이 가능하다. caret 페키지는 아래와 같은 대항목으로 분류된다. 약 40여 종의 함수들과 상호작용을 통해 응용이 가능하다.
- data splitting (기본적으로 training set과 test set 분리)
- pre-processing (수치형 자료의 scaling, normalization 등)
- model tuning(resampling) (bootstrap, k-fold cross validation 등)
- feature selection (feature dependency 등의 계산 등)
- variance importance estimation (각 feature의 중요도 계산 등)
caret package를 이용한 기계학습 예제 #
R에서 디폴트로 제공하는 'iris' 데이터를 이용해 간단한 기계학습 예제를 소개하도록하겠다. 해당 예제는 http://topepo.github.io/caret/에서 더욱 자세한 내용을 확인할 수 있다.
1) 데이터의 특성 파악 분석의 가장 기본은 주어진 데이터의 특성을 파악하는 것이다. 데이터 형태는 문자열(character), 숫자(numeric, int), 인자(factor), 데이터프레임(data.frame), 매트릭스(matrix) 등으로 표현된다. 예제로 쓰일 iris는 데이터프레임 구조이다. 'str' 함수를 이용해 각 iris 데이터를 구성하는 특성(feature)들의 형태를 확인해보자.
str(iris)
2) 특성(Feature)과 class의 구분 특성은 데이터의 분류(classification)의 근거가 되는 데이터이다. iris 데이터의 경우 종(species)가 class가 되며 나머지 꽃받침(Sepal)과 꽃잎(Petal)의 길이(length)와 폭(width), 이 네 가지 특성을 이용해 종을 예측하는 모델을 만들 것이다. featurePlot 이라는 함수를 이용해 이용해 데이터를 살펴보자.
library(caret)
featurePlot(x = iris[, 1:4],
y = iris$Species,
plot = "pairs",
## Add a key at the top
auto.key = list(columns = 3))
3) 기계학습을 위한 특성의 분류
(1) Near-zero variance feature
데이터의 특성은 두 가지로 분류할 수 있다. 예측모델 구축에 사용할 것과 사용하지 않을 것이다. 전자의 경우 충분한 분산 값을 가지며 개체 별 변이가 큰 특성이다. 후자의 경우 분산이 0 혹은 0에 가까운 특성이다. 즉, 해당특성의 경우 대부분의 개체에서 같은 값을 갖기 때문에 class 를 분류하는데 기여가 적음을 의미한다. 이를 구분하기 위해 nearZeroVar 함수를 사용할 수 있다.
nearZeroVar(iris[, 1:4], saveMetrics= TRUE)
아래의 커맨드를 이용하면 zero 및 near-zero인 특성을 제거할 수 있다.
nzv = nearZeroVar(iris[,1:4])
iris[,1:4][, -nzv]
(nzv가 하나 이상의 값을 가질 때 실행하도록하자!!)
(2) feature-feature correlation
특성의 수가 많아질 수록 학습과정에서 많은 시간이 소요된다. 또 상관관계가 높은 특성은 정확도에 영향을 주지 않는다. 이러한 점에서 특성 간 상관관계를 고려해 높다고 판단되는 경우 하나의 특성만 남기는 과정을 소개한다.
descrCor <- cor(iris[,1:4])
highCorr <- sum(abs(descrCor[upper.tri(descrCor)]) > .999)
or
highlyCorDescr <- findCorrelation(descrCor, cutoff = .75)
filteredDescr <- iris[,-highlyCorDescr]
4) 데이터 분리 학습을 위한 전체 데이터로 부터 학습시킬 데이터(training data)와 시험 데이터(test data)로 나눠야 한다. 이는 학습으로 만들어진 모델의 정확도 측정을 위해 필요하다.
전체 데이터로 부터 학습 데이터와 시험 데이터를 나누는 방법은 다음과 같다.
trainIndex <- createDataPartition(iris$Species, p = .8,
list = FALSE,
times = 1)
train_data = iris[trainIndex, ]
test_data = iris[-trainIndex, ]
전체 데이터 중 추출할 데이터의 비율을 값 p에 적어주면 된다.
5) 학습모델 생성 기계학습의 중 실제로 모델을 만드는 과정이다. 앞서 전처리된 데이터 중 학습 데이터로 분류된 데이터를 이용하게된다. 여기서는 학습모델의 생성과 그 성능 검증을 위한 방법으로써 K-fold cross validation 방식으로 학습모델 생성과 검증을 반복한다.
K-fold cross validation(k=4)
학습모델 생성에 앞서 우선 모델의 parameter를 설정해줘야 한다. 기계학습을 위한 알고리즘에 따라 차이가 있으니 실행 전 아래 링크의 내용을 숙지하길 바란다.
https://topepo.github.io/caret/train-models-by-tag.html
이번 예제에서는 K-fold cross validation 방법을 사용하도록 하겠다. k의 값은 'number'로 지정해주면 된다.
fitControl <- trainControl(method = "repeatedcv",
number = 4,
classProbs = T)
예제의 학습알고리즘으로는 support vector machine을 사용하도록 하겠다. 앞서 parameter 설정 값은 'trControl'에 지정해주면 된다. 알아둘 점은 결과의 재현성(reproducibility)을 위해 seed 값을 지정해줘야한다.
set.seed(132245)
SVM_model = train(Species ~.,
data = train_data,
method = 'svmRadial',
trControl = fitControl,
metric = 'ROC')
SVM
6) 학습모델의 테스트 앞서 모델링 작업을 통하여 예측모델을 만들었다. 이제 시험 데이터를 이용해 실제 예측을 진행해보자.
predict(SVM_model, newdata = test_data)
마지막으로 테스트결과를 리포팅하는 방법이다.
Predict_result = predict(SVM_model,
newdata = test_data)
confusionMatrix(data = Predict_result,
test_data$Species)
마치며 #
이번 예제를 통해 'iris'의 표현형 데이터를 이용해 종(species)을 예측하는 모델을 만들어 보았다. 기계학습에서 가장 중요하고 할 수 있는 부분은 역시 학습을 위한 데이터의 전처리 과정이라할 수 있다. 학습에 앞서 반드시 각 각의 특성의 데이터 유형을 파악하도록하자. 그 다음으로 중요한 것이 학습 데이터의 특성에 맞는 학습 알고리즘을 선정하는 것이다. 이번 예제는 R을 이용한 기계학습의 기초에 대해 다루었다. 실제 데이터를 분석하기 앞서서는 자세한 개념과 이론 부분을 숙지하도록 하자.
참고 #
1 caret package 메뉴얼: <https://cran.r-project.org/web/packages/caret/vignettes/caret.pdf>
2 위키피디아: <https://ko.wikipedia.org/wiki/%EA%B8%B0%EA%B3%84_%ED%95%99%EC%8A%B5>