반응형

안녕하세요


오늘은 R로 머신러닝하기 마지막 알고리즘, SVM에 대해 알아보겠습니다.


서포트 벡터 머신(SVM)이란,

 매우 강력하고 선형이나 비선형 분류, 회귀, 이상치 탐색에도 사용할 수 있는 다목적 머신러닝 모델입니다!



SVM 알고리즘 아이디어는 다음과 같습니다.




다차원 공간을 초평면이라고 하는 경계를 사용하여 데이터를 양쪽에 유사한 클래스 값들의 그룹으로 분할합니다.



[ 용어 설명 ]


경계에 가장 가까운 값들을 support vectors라고 합니다.


예를 들어 위의 이차원 그래프에서의 초평면은 직선(w*x - b = 0)입니다.




여기서 아래의 검정색 원과 흰색 원을 분할하는 직선은 하나이상 존재합니다.




그렇다면 알고리즘은 어떻게 선택해야 할까요?



답은 두 클래스 사이를 가장 멀리 분리하는 최대 마진 초평면(MMH, Maximum Margin Hyperplane)을 찾는 것입니다.




R로 알아보는 SVM 알고리즘

# 1. 데이터 로드

# 데이터출처: "R을 활용한 머신러닝-브레트 란츠"


letters <- read.csv("letterdata.csv")

str(letters) # 2. 훈련 데이터와 테스터 데이터 구분 letters_train <- letters[1:16000, ] letters_test <- letters[16001:20000, ] # 3. 데이터로 모델 훈련 ---- # 단순 선형 SVM을 훈련으로 시작 # install.packages("kernlab") library(kernlab) # knn와 svm과 섞임 # vanilladot letter_classifier <- ksvm(letter ~ ., data = letters_train, kernel = "vanilladot") # 4. 모델에 대한 기본 정보 확인

# C 하이퍼 파라미터를 사용하여 MMH과 support vectors의 폭을 조절할 수 있습니다. # SV type: C-svc (classification)

# parameter : cost C = 1 letter_classifier # 5..모델 성능 평가 ---- # 테스트 데이터셋에 대한 예측 letter_predictions <- predict(letter_classifier, letters_test) head(letter_predictions) table(letter_predictions, letters_test$letter) # 6. 일치/불일치 예측을 표시하는 TRUE/FALSE 벡터 생성 agreement <- letter_predictions == letters_test$letter table(agreement) prop.table(table(agreement))



오늘은 여기까지~


보다 자세한 부분은 python에서 알아보겠습니다~

반응형
반응형

안녕하세요~


너무 오랜만이네요ㅜㅜ


정보처리기사 실기시험등 다양한 이유로

이제야 돌아왔습니다!ㅋㅋ


관련 포스팅은 궤도에 오르다에서!


사설은 여기까지!




오늘은 비지도학습, 클러스터링 알고리즘 중

K-means 알고리즘에 대해 알아보도록 하겠습니다.



우선 클러스터링이란 무엇일까요?


클러스터링(군집화)이란, 

데이터를 클러스터(또는 유사한 아이템의 그룹)로 자동 분리하는 비지도학습(unsupervised) 머신러닝 방법입니다.


군집화는 예측보단 데이터 안에서 발견되는 그 그룹에 대한 패턴, 즉 통찰력을 제공합니다.


군집화의 기본 아이디어: 클러스터 안에 있는 아이템들은 서로 아주 비슷해야하지만 클러스터 밖에 있는 아이템은 아주 달라야한다.




K-means 알고리즘 이란?


가장 일반적으로 사용되는 군집화 방법으로,

특징 공간에서 주어진 데이터를 k개의 클러스터로 묶는 알고리즘입니다.




그렇다면 knn과 k-means는 어떻게 다를까요?


공통점


거리함수를 이용하여 중심에 가까운 거리에 있는 데이터를 클러스터링합니다.


차이점


knn알고리즘은 label이 있는 지도학습이지만, k-means는 앞에서 언급했듯이 비지도학습 방법입니다.




k, 클러스터의 개수 선택하는 방법


k 값을 너무 작게 설정하면 분류를 잘 하지 못하고,

k 값을 너무 크게 설정하면 그룹내의 동질성이 올라가 과적합이 일어날 수 있습니다.


1. k = sqrt(n/2) : k를 (n/2)의 제곱근과 동일하게 설정


2. elbow point: 클러스터 내의 동질성과 이질성의 변화를 측정하여 특정 포인트를 넘으면 결과가 약화되는 k를 찾는 방법




R 코드로 알고리즘 설명하기



1. k-means 알고리즘

# 1. 기본 데이터 셋을 만든다. 무조건 수치형 데이터여야한다. c <- c(3,4,1,5,7,9,5,4,6,8,4,5,9,8,7,8,6,7,2,1) row <- c("A","B","C","D","E","F","G","H","I","J") col <- c("X","Y") data <- matrix( c, nrow= 10, ncol=2, byrow=TRUE, dimnames=list(row,col)) data # 데이터 확인하기1 # 2. plot 그래프를 그린다 plot(data) # 데이터 확인하기2 # 3. stats 패키지를 설치한다. # install.packages("stats") library(stats) # 4. kmeans 함수로 데이터를 분류한다. # k개 구하는 공식: k = sqrt(n/2) k = round(sqrt(length(data)/2)) km <- kmeans(data,2) kc <- km$centers cbind(data,km$cluster) # 5. 분류한 파라미터 값을 가지고 다시한번 시각화 한다. plot(round(kc), col = kc2, pch=22, bg=kc2+1, xlim = range(0:10), ylim = range(0:10)) par(new=T) plot(data, col =km$cluster+1, xlim=range(0:10), ylim = range(0:10))


2. 시각화하기

# install.packages("factoextra") library(factoextra) fviz_cluster(km, data = data, stand = F)


[결과]





kmeans 알고리즘의 장점: 간단한 원리, 매우 유연


kmeans 알고리즘의 단점: 임의의 우연(random chance) 요소를 사용하기 때문에 최적의 클러스터 집합을 찾는 것이 보장되지 않는다.

데이터에 존재하는 자연스런 클러스터 개수에 대한 합리적인 추측이 필요하다.

반응형
반응형

안녕하세요


오늘은 연관규칙 Apriori 알고리즘에 대해 알아보도록 하겠습니다!



Q1. Apriori 알고리즘 이란?


A1. 간단한 성능 측정치를 이용해 거대한 데이터베이스에서 데이터간의 연관성을 찾는 알고리즘



Q2. 그래서 어떤 패턴을 찾는데?


A2. 연관규칙은 장바구니 분석에 가장 많이 사용됩니다. 하지만 잠재적인 패턴을 찾을 때 또한 유용합니다.



예시: "기저귀를 살 때 맥주를 함께 산다"


그림출처: 사람과 디지털연구소


연관 규칙을 통해 맥주와 기저귀라는 별 상관없어 보이는 상품의 동시 구매 패턴을 발견하였습니다.



Q3. 굳이 왜 ML(머신러닝)으로 패턴을 찾아야해?


A3. k개의 아이템으로 2개씩 아이템을 묶어 연관패턴을 찾으려면 평가해야할 2^k개의 아이템 집합을 갖습니다.

만약 아이템이 100개면 2의 100승개의 아이템 집합이 생기므로 사람이 그 많은 데이터를 직접분석하기는 어렵습니다.




연관규칙에서 사용하는 두가지 통계척도


1. 지지도: 데이터에서 발생하는 빈도

count(x)

support(x) = ----------------------

N


2. 신뢰도: 예측능력이나 정확도의 측정치

support(x,y)

confidence(x -> y) = ------------------------------

support(x)




기저귀와 맥주의 예시 코드를 생성하여 연관규칙 알고리즘에 대해 알아봅시다!


# 1. 데이터 로드 x <- data.frame( beer=c(0,1,1,1,0), bread=c(1,1,0,1,1), cola=c(0,0,1,0,1), diapers=c(0,1,1,1,1), eggs=c(0,1,0,0,0), milk=c(1,0,1,1,1) ) # x 확인하기

x # 2. arules 패키지를 설치한다. (apriori함수를 이용하기위해 설치) # install.packages("arules") library(arules) trans <- as.matrix(x,"Transaction") trans # 3. apriori 함수를 이용해서 연관관계를 분석한다. rules <- apriori(trans, parameter=list(supp=0.2, conf=0.6, target = "rules")) rules # support: 지지도, confidence:신뢰도, lift: 향상도, count inspect(sort(rules))


결과




신뢰도가 클수록 연관관계가 높다는 의미입니다.


연관규칙을 평가하는 지수는 사실 위에서 언급한 2가지말고도 많은데

그 중 꽤 많이 쓰이는 것이 상관관계를 나타내는 lift입니다.



추가 : 연관관계 시각화하기

# install.packages("sna") # install.packages("rgl") library(sna) library(rgl) #visualization b2 <- t(as.matrix(trans)) %*% as.matrix(trans) b2.w <- b2 - diag(diag(b2)) #rownames(b2.w) #colnames(b2.w) gplot(b2.w , displaylabel=T , vertex.cex=sqrt(diag(b2)) ,

vertex.col = "Pink" , edge.col="grey" , boxed.labels=F ,

arrowhead.cex = .3 , label.pos = 3 , edge.lwd = b2.w*2)


결과



마지막으로, 연관규칙 학습을 위한 에이 프라이어리 알고리즘의 장단점을 알아보겠습니다.


장점1. 대규모 거래 데이터에서 작업할 수 있다.


장점2. 이해하기 쉬운 규칙을 생성한다.


장점3. '데이터 마이닝'과 데이터 베이스에서 예상치 못한 지식을 발굴하는 데 유용하다.


---------------------------------------------------------------------------------


단점1. 작은 데이터 셋에서는 유용하지 않을 수 있다.


단점2. 랜덤 패턴에서 비논리적 결론을 도출하기 쉽다.





오늘은 여기까지!!


다음은 k-means알고리즘으로 돌아오겠습니다!!

반응형
반응형



안녕하세요


오늘은 수치분석의 꽃 회귀분석에 대해 알아보도록 하겠습니다.(개인적인 생각임ㅎ)



회귀란?


유전학자 프린시스 골턴이 유전의 법칙을 연구하다가 나온 명칭으로


아버지의 키가 크다고 할지라도 아들의 키는 아들세대의 평균으로 접근하는 경향이 있다.


즉 평균으로의 회귀를 의미합니다.


회귀분석은 하나의 종속변수가 나머지 다른 독립변수들과의 어떠한 관계를 갖는가를 분석하는 방법입니다.



(기본적으로 ML에서 분류는 카테고리를 예측하는 것, 회귀는 수치 값을 예측하는 것입니다.)




회귀분석의 종류는 아래와 같이 다양합니다.






회귀 분석의 원리


회귀분석이란 회귀선을 도출하는 과정입니다.


y = ax + b (a, b: 회귀모수)


예를들어,

위의 그래프는

평수(독립변수)가 집값(종속변수)에 영향을 주는 정도를 나타낸 그래프입니다.



위의 직선의 경우


y = w1 * X + w2


여기서 잔차의 제곱의 합이 최소가 되도록 하는 최적의 선을 구하는 방법으로 최소 자승법을 이용합니다.





코드로 회귀분석에대해 더욱 자세히 알아보겠습니다.


이것은 제가 만든 미니 프로젝트 코드입니다.


주제: 첫 주의 누적관객 수가 그 영화의 흥망을 결정한다는 말이 있습니다.


이번에 그 첫 주 누적관객수에 영향을 미치는 요인을 영화 배급사가 결정할 수 있는 수치적인 요인으로 독립변수를 선택하였습니다.


종속변수: 첫 주 누적관객수

독립변수: 첫 주 누적 상영횟수, 첫 주 누적 스크린 수, 같은 날 개봉한 영화 수


data: 영화관입장권통합전산망 오픈API

################ 첫 주의 관객 수가 흥망을 결정한다. ################## ################ 첫 주 관객 수에 영향을 미치는 요인 ################## # db(mysql)에서 data 가져오기(2013-01-01 ~ 2018-06-15) library(RMySQL)


# dget() 함수는 이미 생성한 익명함수를 r로 로드하여 사용할 수 있습니다.

# 비밀번호와 주소를 감추기 위해 사용하였습니다. mysqldbConnect <- dget("mysqldbConnect.R") conn <- mysqldbConnect(dbname = "movieanalysis") c_sql <- "SELECT COUNT(*) FROM movie where openDt != ''" count <- dbGetQuery(conn, c_sql) count        # 19316

# r로 db에 있는 데이터 로드하기 r_sql <- c("SELECT * FROM movie where openDt != ''") document_r <- dbGetQuery(conn, r_sql) head(document_r)


######## 데이터 전처리 ############## # 한글이 깨지는 것을 복구하기위해 사용하였습니다. Encoding(document_r$movieNm) <-"UTF-8" head(document_r)

# 2013-01-01 이전 데이터 생략하기 document <- document_r[document_r$openDt > as.Date('2013-01-01'),] head(document) # 같은 날 개봉한 영화 수 (직접생성): sameDate document$sameDate <- '' for (i in 1:nrow(document)){ # print(j) document[i,"sameDate"] <- sum(document$openDt[i] == document$openDt) }


# normalization 등을 위해 data 전처리 str(document) document$salesAcc <- as.numeric(document$salesAcc) document$audiAcc <- as.numeric(document$audiAcc) document$audiChange <- as.numeric(document$audiChange) document$sameDate <- as.numeric(document$sameDate) document$showCnt <- as.numeric(document$showCnt) document$showRange <- substring(strptime(as.character(document$showRange), "%Y%m%d"), 1, 10) document$showRange <- as.Date(document$showRange) nrow(document) # table 정리 ncol = which(colnames(document) == "openDt") ncol1 = which(colnames(document) == "scrnCnt") ncol2 = which(colnames(document) == "sameDate") ncol3 = which(colnames(document) == "showRange")

# 개봉한지 7일 뒤의 날짜를 추가한다.

table <- cbind.data.frame(document[,-c(ncol,ncol1,ncol2,ncol3)],

"scrnCnt" = document[,ncol1],"openDate" = document[,ncol],

"sameDate" = document[,ncol2], "showRange" = document[,ncol3],

"after_7days" = (as.Date(document$openDt)+7))

# 누적 데이터 구하기 library(data.table) table <- as.data.table(table) table <- table[,Cum.showCnt := cumsum(showCnt), by = movieCd] table <- table[,Cum.rank := cumsum(rank), by = movieCd] table$scrnCnt <- as.numeric(table$scrnCnt) table <- table[,Cum.scrnCnt := cumsum(scrnCnt), by = movieCd] head(table) # 첫 주 누적관객수 및 누적데이터만 추출하기 movieWeek <- NULL for (z in 1:nrow(table)){ if (table$after_7days[z] == table$showRange[z]){ movieWeek <- rbind(table[z,],movieWeek) } } head(movieWeek)

movieWeek$openDate <- as.Date(movieWeek$openDate) movieWeek[(movieWeek$movieNm == movieWeek$movieNm) & (movieWeek$openDate <= movieWeek$showRange),]

############## 다중 회귀 분석 ############ normalize <- function(x) { return ( (x-min(x)) / (max(x) - min(x)) ) } # 정규화: 종속변수에 대한 독립변수의 영향을 파악하기위해 # 독립변수: 그 주 개봉하는 영화수, 누적 스크린 수, 누적 상영횟수 (only 수치데이터) movie_n <- as.data.frame(lapply(movieWeek[,c("Cum.scrnCnt","sameDate","Cum.showCnt")],

normalize)) head(movie_n) head(movieWeek) movieWeek_n <- cbind(movieWeek[ , -c("sameDate","Cum.showCnt","Cum.rank","Cum.scrnCnt")],

movie_n) head(movieWeek_n) # train data set과 test data set 나누기 set.seed(18)    # 여러값 중 좋은 set.seed()값 찾기 nrow <- round(dim(movieWeek_n)[1]*0.7)


# data shuffle하기 train_indx <- sample(1:dim(movieWeek_n)[1], nrow, replace = F)

movie_train <- movieWeek_n[1:train_indx,] movie_test <- movieWeek_n[(train_indx+1): nrow(movieWeek_n),] nrow(movie_train) nrow(movie_test)

# 다중회귀모델 생성하기

set.seed(1)

# 선형 모델 함수 lm()이용 library(stats)

model <-lm(audiAcc ~ (sameDate + Cum.showCnt + Cum.scrnCnt), data= movie_train) summary(model)    # r-squared(결정계수) 값 등을 확인한다.

# Adjusted R-squared: 0.79


# test data set result result <- predict(model,movie_test[,c("sameDate", "Cum.showCnt", "Cum.scrnCnt")]) str(result) result<- as.vector(result) str(movie_test$audiAcc) str(result) # 테스트 데이터의 라벨과 예측결과와 상관관계가 어떻게 되는지 확인한다. cor(result, movie_test$audiAcc) # 0.914286 : 양의 상관관계가 매우 높다.



# 어떤 독립변수가 어떤 종속변수에 영향을 많이 미치는 가?

# 시각화. pairs.panels library(psych) pairs.panels(movieWeek_n[,c("audiAcc", "Cum.showCnt", "Cum.scrnCnt", "sameDate")],

main = "첫 주 관객 수에 영향을 미치는 요인") # audiAcc와 Cum.showCnt의 상관관계는 0.88정도이다.





 




추가) 상관관계란


상관분석은 두 변수가 서로 어떠한 관계인지 파악하는 분석으로 기울기에 따라 양의 상관관계, 음의 상관관계로 나눌 수 있습니다.


점들의 흩어진 모습을 보고 두 변수의 관계를 파악하는데 밀도의 차이에 따라서 상관계수를 나타냅니다.


상관계수는 -1에서 1사이의 값을 가지며

상관계수의 수치가 0에 가까울수록 상관관계가 약하다는 뜻이고

+1에 가까우면 양의 상관관계가, -1에 가까우면 음의 상관관계가 강하다는 것을 의미합니다.



위의 코드에서 꼭 알아야하는 것!!


1. library(stats)를 이용하였다.


2. library(stats) 중 lm()함수를 이용하여 회귀분석을 하였다.


# 선형 모델 함수 lm()이용 model <-lm(audiAcc ~ (sameDate + Cum.showCnt + Cum.scrnCnt), data= movie_train) summary(model)    # r-squared(결정계수) 값 등을 확인한다.

# Adjusted R-squared: 0.79 # 독립변수가 많으면 저절로 높아질 수 있는 Multiple R-squared대신 사용

# test data set result result <- predict(model,movie_test[,c("sameDate", "Cum.showCnt", "Cum.scrnCnt")])


lm()함수를 이용하여 하나의 독립변수를 이용하면 단순회귀분석이 가능합니다!!





오늘은 여기까지!!


더 궁금하신 점은 댓글 남겨주세요~


다음은 연관규칙 알고리즘으로 돌아오겠습니다

반응형

+ Recent posts