레이블이 데이터 분석인 게시물을 표시합니다. 모든 게시물 표시
레이블이 데이터 분석인 게시물을 표시합니다. 모든 게시물 표시

2016년 3월 28일 월요일

k-means 알고리즘

- 개요

k-means 알고리즘은 데이터를 군집하는 간단하고 자주 사용되는 기법이다. k-means를 사용하면 데이터를 지정한 k개의 군집으로 나눌 수 있다.

이러한 k-means 알고리즘은 복잡한 통계 없이 간단한 원리를 사용하며, 휴리스틱 과정을 사용하여 효율적으로 데이터를 유용한 군집으로 나눌 수 있다.

- k-means 알고리즘

간단히 작동 순서를 살펴보면, 최초에는 무작위로 k개의 중심 데이터를 선정하고, 해당 데이터로부터 각 데이터의 거리(유클리디언, 맨하탄 등)을 계산한다. 그 거리의 평균이 작은 곳으로 중심점을 변경하고 다시 거리를 계산하는 것을 반복하여 최적의 군집을 찾을 수 있다.

정리하자면,

입력값
  1. k: 클러스터 수
  2. D: n 개의 데이터 오브젝트를 포함하는 집합
출력값: k 개의 클러스터
알고리즘
  1. 데이터 오브젝트 집합 D에서 k 개의 데이터 오브젝트를 임의로 추출하고, 이 데이터 오브젝트들을 각 클러스터의 중심 (centroid) 으로 설정한다. (초기값 설정)
  2. 집합 D의 각 데이터 오브젝트들에 대해 k 개의 클러스터 중심 오브젝트와의 거리를 각각 구하고, 각 데이터 오브젝트가 어느 중심점 (centroid) 와 가장 유사도가 높은지 알아낸다. 그리고 그렇게 찾아낸 중심점으로 각 데이터 오브젝트들을 할당한다.
  3. 클러스터의 중심점을 다시 계산한다. 즉, 2에서 재할당된 클러스터들을 기준으로 중심점을 다시 계산한다.
  4. 각 데이터 오브젝트의 소속 클러스터가 바뀌지 않을 때 까지 23 과정을 반복한다.


k-means 알고리즘 결과 예시

k-means 알고리즘에서 중요한 점은 k의 설정이다. k가 매우 큰 값으로 설정하면 군집의 동실성이 향상되는 동시에 데이터에 대한 과적합화가 될 위험이 있다.
k를 선택하는 방법은 데이터의 수의 n/2 제곱근으로 설정하는 경험 법칙, 엘보우 기법 등이 있으나, 무엇보다 도메인 지식을 쌓아서 k를 선택하는 것이 중요하다고 생각한다.
k의 선택에 관련된 내용은 추후에 다루도록 할 것이다.

- k-means 알고리즘의 평가

k-means 알고리즘을 사용하고 클러스터링이 얼마나 잘 되었는가를 측정하는 방법으로는 크게 내부평가와 외부평가를 이용할 수 있다.
내부 평가
내부 평가 (internal evaluation) 은 데이터 집합을 클러스터링한 결과 그 자체를 놓고 평가하는 방식이다. 이러한 방식에서는 클러스터 내 높은 유사도 (high intra-cluster similarity) 를 가지고, 클러스터 간 낮은 유사도 (low inter-cluster similarity) 를 가진 결과물에 높은 점수를 준다. 이와 같은 평가 방법은 오로지 데이터를 클러스터링한 결과물만을 보고 판단하기 때문에, 평가 점수가 높다고 해서 실제 참값 (ground truth) 에 가깝다는 것을 반드시 보장하지는 않는다는 단점이 있다.
유사도를 계산하는 방법으로는 Daives-Bouldin index, Dunn index, 실루엣 기법 등이 있다.

외부 평가
외부 평가 방식 (external evaluation)에서 클러스터링의 결과물은 클러스터링에 사용되지 않은 데이터로 평가된다. 다시 말해, 클러스터링의 결과물을 전문가들이 미리 정해높은 모범답안 혹은 외부 벤치마크 평가 기준 등을 이용해서 클러스터링 알고리즘의 정확도를 평가하는 것이다. 이러한 평가 방식은 클러스터링 결과가 미리 정해진 결과물과 얼마나 비슷한지를 측정한다.
외부 평가 방법으로는 Rand measure, F-measure, Jaccard index 등의 기법이 있다.


- k-means 알고리즘 활용분야

k-평균 알고리즘은 시장 분할, 컴퓨터 비전, 지질통계학, 천문학 및 농업 등 광범위한 분야에 적용될 수 있다. 이 기법은 주로 어떤 알고리즘을 수행하기 전 데이터를 전처리 (pre-processing) 하는 용도로 많이 쓰인다. 구체적으로, 이미지 분할, 벡터 양자화, 클러스터 분석 등에 활용될 수 있다.

- k-means 알고리즘 코드

#iris 데이타 이용
data(iris)

#종 정보를 제외하고, 꽃잎과 꽃받침의 길이와 두께 정보만을 이용하여 군집화를
#수행해 보도록 한다. scale() 함수를 이용하여 변수의 값을 표준화하였다.
iris.data <- scale(iris[-5])

kmeans.ch5 <- function(x, k, maxiter=100, nstart=1, epsilon=0.001)
{
# 데이터를 매트릭스 형태로 변환
x <- as.matrix(x)
centers <- k
xrows <- nrow(x)
xcols <- ncol(x)

# 데이터(point들) 중에서 k개의 임의의 데이터(point) 선택
ids = sample(1:xrows, k)
centroids = x[ids, ]

# 클러스터 초기 매트릭스 공간 설정
initial.cluster=matrix(0, 1, xrows)

# iteration 초기 설정
iter=0

## for 혹은 while 필요
# maxiter가 될 때까지 while문 반복
while(iter < maxiter)
{

# k개의 임의의 데이터(point)와의 유클리디언 거리 계산
dists <- apply(x, 1, function(point)
                  sapply(1:nrow(centroids), function(dim)
                                 dist(rbind(point, centroids[dim,]))
                        )
               )
cDists <- t(dists)

# Centers와 가까운 거리들을 계산하여 클러스터 할당
# 결과: 군집 번호, 1~k
cluster.dist = sapply(1:xrows, function(x) which.min(cDists[x,]))

# for every cluster, calculate its new centroid
newCentroids = t(sapply(1:centers, function(c) colMeans(x[which(cluster.dist == c), ])))

## check if change in centroids is significant
delta = sum((newCentroids - centroids) ^ 2)

# 종료조건..
# 1. iteration
# 2. delta
iter=iter+1

if (delta > epsilon) {
    ## use new centroids for next iteration
    centroids = newCentroids
    } else {
    break
    }
}

cluster.size <- c(table(cluster.dist)[1:centers])

# 출력 함수 설정
# 1. cluster size
# 2. cluster means
# 3. cluster vector

structure(list("Cluster size"=cluster.size , "Cluster means"=newCentroids, 
               "Cluster vector"=cluster.dist, "Iteration"=iter))

}


kmeans.result <- kmeans.ch5(iris.data, 3)
plot(iris[-5], pch = kmeans.result$'Cluster vector', col = kmeans.result$'Cluster vector')



위 결과는 생성함수(kmeans.ch5(iris.data, 3)). 아래 결과는 R 내장함수(kmeans(iris.data, 3))
Plot 비교


두 Plot이 거의 흡사함을 보아 잘 코딩되었음을 확인할 수 있었다.
이로써 기본적인 k-means의 설계를 익히고, 응용할 수 있는 능력 습득!

출처:
1. github
2. R을 활용한 기계학습
3. http://blog.daum.net/sys4ppl/7

2016년 1월 15일 금요일

kNN(k Nearest Neighbors) 알고리즘 소개 및 R 구현

이번 주는 분류에 대한 최근접 알고리즘 접근법인 kNN 알고리즘을 간략하게 공부했다.

kNN알고리즘은 범주를 알지 못하는 데이터가 있을 때, 근접한 k개의 데이터를 이용해 범주를 지정해주는 역할이다.



쓰임새는,
이미지나 비디오에서 얼굴과 글자를 인식하는 컴퓨터 비전 애플리케이션
개인별 추천 영화 예측
특정 단백질과 질병을 추출하는 데 사용하는 유전자 데이터의 패턴 식별

등 다양하다.

이러한 kNN알고리즘의 장단점은 아래와 같다.

장점
단점
- 단순하며 효율적
- 데이터 분산에 대한 추정을 만들 필요가 없음
- 빠른 훈련 단계
- 모델을 생성하지 않음
- 느린 분류 단계
- 많은 메모리가 필요
- 명목형 속성과 결측 데이터는 추가적인 처리 필요

- 거리계산
kNN알고리즘은 최근점 이웃의 거리를 계산하는 다양한 방법이 있다. 대표적으로 유클리디언 거리를 사용한다.



- k의 선택
또한 몇 개의 근접이웃 k를 결정하는 문제도 중요하다. 보통 k의 선택은 학습해야 할 개념의 난이도와 훈련 데이터의 개수에 달려있으며, 일반적으로 훈련 데이터의 개수에 제곱근으로 설정한다. 또한, 훈련 데이터의 개수에 제곱근으로 설정하기도 한다.

만약 k를 너무 크게 설정하면 주변에 있는 데이터와 근접성이 떨어지게 되어 클러스터링이 잘 되지 않고, 너무 작게하면 노이지 데이터나 이상치와 이웃이 될 가능성이 있으므로 이러한 문제들을 피할 수 있도록 적절한 k의 선택이 필요하다.


- kNN R function.
R에서는 다양한 kNN패키지가 있으며 가장 기본적인 패키지는 class 패키지로 이용할 수 있다. 하지만 직접 구현해보며 알고리즘을 익히는 것이 목표이기에 직접 코딩을 하고자 한다.


- kNN in R programming.


normalize <- function(x) {
num <- x - min(x)
denom <- max(x) - min(x)
return (num/denom)
}

## 해당 방식으로 normalize 사용 가능
iris_norm <- as.data.frame(lapply(iris[1:4], normalize))

## set.seed는 난수를 재현 가능하도록, 난수 패턴을 저장해놓는 것
set.seed(1234)

## traning data와 test data를 0.67, 0.33의 확률로 나누기 위한 샘플 생성
ind <- sample(2, nrow(iris), replace=TRUE, prob=c(0.67, 0.33))

## 수치 데이터와 수치 데이터의 Label 을 따로 정의
iris.training <- iris[ind==1, 1:4]
iris.test <- iris[ind==2, 1:4]

iris.trainLabels <- iris[ind==1, 5]
iris.testLabels <- iris[ind==2, 5]

## knn 함수 생성
knn.t <- function(train, test, cl, k)
{
test.result <- numeric(length(test))

## 유클리디언 거리 함수
euclidean.distance <- function(x1, x2) sqrt(sum((x1-x2)^2))

## 전체 데이터에 유클리디언 거리를 계산
for(i in 1:nrow(test)){
train$dist=sapply(1:nrow(train), function(ntrain){
      euclidean.distance(train[ntrain,1:4], test[i,1:4])
      })

## 가장 가까운 k개의 데이터 위치를 저장
nearest.k=order(train$dist)[1:k]
## train data에서 해당 하는 위치의 라벨을 저장
nearest.k.categories=cl[nearest.k]
## k개 중 가장 많이 나온 라벨을 저장
common.category=names(sort(table(nearest.k.categories),decreasing=TRUE)[1])
## 결과값(라벨들)을 저장
test.result[i]=common.category
}
train$dist=NULL
test.result
}

## 실험
result <- knn.t(train=iris.training, test=iris.test, cl=iris.trainLabels, k=3)
result

## gmodels 패키지를 통해 예측률 확인
library(gmodels)
CrossTable(x=iris.testLabels, y=result, prop.chisq=FALSE)



## class패키지의 knn 함수를 통해 결과 비교
library(class)

iris_pred <- knn(train=iris.training, test=iris.test, cl=iris.trainLabels, k=3)
iris_pred

CrossTable(x=iris.testLabels, y=iris_pred, prop.chisq=FALSE)


패키지의 결과와 생성 함수의 결과가 같읕 것으로 보아 성공적으로 코딩하였다.


2016년 1월 6일 수요일

지도학습(Supervised Learning)과 비지도학습(Unsupervised Learning)



데이타마이닝을 할 때에 지도학습(Supervised Learning)과 비지도학습(Unsupervised Learning)이 자주 거론된다.

지도학습(Supervised Learning)은 말 그대로 학습을 지도한다는 뜻으로,
훈련용 데이터(training data)에 알고리즘을 적용하여 함수를 추론하고, 이제 그 추론된 함수를 통해 컴퓨터가 알아서 답을 찾도록 만드는 것이다. 따라서 지도학습은 명확한 input과 output이 존재한다. 이러한 지도학습에는 분류(Classification)과 예측(Regression)이 있다.

먼저 예측(Regression)은 데이터를 대표하는 선형모델 등을 만들고 그 모델을 통해 미래의 사건을 예측하는 것이다.

분류(Classification)는 이전까지 학습된 데이터를 근거로, 새로운 데이터가 기존에 학습된 데이터에 분류가 되냐 안되냐를 판단할 수 있다.


비지도학습(Unsupervised Learning)에서도 역시 분류를 하지만, 컴퓨터에게 답을 알려줄 수 없다. 즉, 훈련용 데이터를 통해 함수를 추론할 수 없다. 컴퓨터가 알아서 분류를 하고, 의미있는 값을 보여준다. 따라서 예측 등이 아닌, 데이터가 어떻게 구성되어 있는지 밝히는데 주로 사용하고, 일종의 그룹핑 알고리즘으로 볼 수 있다.

이러한 지도학습, 비지도학습의 대표적인 알고리즘을 표로 정리해보았다.

지도학습
Classification
kNN
Naïve Bayes
Support Vector machine
Decision Tree
Regression
Linear regression
Locally weighted linear regression
Ridge
Lasso
비지도학습

Clustering
K means
Density estimation
Expectation maximization
Pazen window
DBSCAN


출처
- 머신러닝 입문#1, http://www.slideshare.net/Byungwook/1-knn
- 일반인을 위한 머신러닝, http://gorakgarak.tistory.com/437
- 기계학습의 정의 및 종류, http://eunwoopark.com/wp/2014/03/24/machine_learning/



2015년 11월 29일 일요일

데이터 분석가가 되기 위한 학습

빅데이터, 딥러닝, 머신러닝 등 데이터 과학이 한참 이슈이다.

여테 석사를 하면서 통계적 품질관리(관리도)를 전공했지만,
품질관리던지, 어느 분야던지 데이터 분석에 대한 이슈가 앞으로도 뜨거울 것 같다고 느껴진다.

사실 데이터분석에 대한 사전 지식이 없는 상황에서, 얼마전 모 회사에서 데이터분석 면접을 보았지만... 아무말도 못한 정말 챙피한 경험

그래서 늦었지만 데이터 분석을 제대로 공부하려고 결심을 해보았다. (너무 늦은 결정이 아닐까 걱정되지만... 그래도 해보고 싶다)

몇 가지 데이터분석 관련 책을 선별해보았다.

1. 앞으로 데이터 분석을 시작하려는 사람을 위한 책, 구도 타쿠야
2. R을 활용한 전산통계개론, 손건태
3. R을 활용한 기계 학습, 브레트 란츠

석사시절, 기본적인 통계(아주 기초적)와 R은 어느 정도 익숙했기에, tool은 R로 정하였다. 기회가 된다면 파이썬도 배워야지.

첫 번째 책은 데이터 분석가가 기본적으로 가져야할 마인드와 간단한 분석기법 등을 소개한다. 두 번째 책은 통계적인 알고리즘을 배우기에 무척 좋고, 세 번째 책은 머신러닝을 위한 기본적인 도서이다.

위의 도서를 훑어보고 앞으로 배워야 할 알고리즘 등을 작성해보았다.
하나씩 차근차근.




개념
분석 수법
사례
수리통계학
1변량
기술통계학
분포와 대표값
요약통계량
품질 관리
RFM 분석
롱테일 분석
도수집계
히스토그램
추론 통계학
빈도론
모수적 검정
실험 계획법
임상 시험
부작용의 특정
비모수적 검정
점 추정
구간 추정
주관론
베이지안 확률
스펨 필터링
다변량
탐색적 자료 분석, 기계학습
자율학습
(데이터를 어떤 기준에 따르지 않고 분류, 해석)
주성분 분석
가격 최적화
행렬, 정체 회피 분석
마켓 바스켓 분석
고객 세분화
추천
크로스셀/업셀분석
계통트리(생명과학)
설문 조사 분석
인자 분석
상관 분석
연관 규칙 분석
대응 분석
수량화 이론 III
다차원 척도 구성법
계층적 군집 분석
k-평균법
자기조직화 지도
지도학습
(데이터를 어떤 기준에 따라 분류하고 해석)
협업 필터링
고객 이탈 예측 모델
신용카다의 부정 이용 감지
캠페인 효과 측정
매정별 매출 총량 예측
선거 예측
세이버매트릭스
물류 최적화
소셜 미디어 분석
화상 분석(연령 추정)
화상 진단
예방 의료
유전자 발견
범죄 프로파일링
인공 신경망
의사 결정 트리 분석
k-근접 이웃법
일반 선형 모델
(정규분포를 전체로 한 선형 모델)
단회귀 분석
분산 분석
수량화 이론 I
다중 회귀 분석
정준 상관 분석
공분산 구조 분석
일반화 선형 모델
(정규 분포 이외의 분포를 다룰 수 있도록 일반 선형 모델을 확장한 모델)
로지스틱 회귀 분석
로그 선형 모델
수량화 이론 II
판별 분석
생존 분석
서포트 벡터 머신
<표 1> 주요 데이터 분석법

분석 모델
태스크
최근접 이웃
분류
나이브 베이즈
분류
결정 트리
분류
선형 회귀
수치 예측
회귀 트리
수치 예측
모델 트리
수치 예측
신경망
다중 용도
서포트 벡터 머신
다중 용도
연관 규칙
패턴 탐지
K 평균 군집화
군집화
<표 2> 알고리즘 별 태스크

위의 <표 1, 2>에 작성한 분석 기법들을 전부 R로 구현해보면서 공부 할 계획이다.
이 밖에 Genetic algorithm 등을 추가적으로 습득. 한 주에 1~2가지 알고리즘을 공부하기.


출처

  • "앞으로 데이터 분석을 시작하려는 사람을 위한 책", 구도 타쿠야, 루비페이퍼
  • "R을 활용한 전산통계개론", 손건태, 자유아카데미
  • "R을 활용한 기계 학습",  브레츠 란츠, 에이콘