본문 바로가기

Study/class note

머신러닝 / 병렬작업, 사회적 연결망

ㅇ특화된 머신러닝

1. 대용량 데이터를 병렬로 작업해서 데이터 분석하는 방법

2. 사회적 연결망

3. 오라클과 R연동

4. R로 웹스크롤링

 

 

91 병렬로 작업을 수행하는 방법

ㅇ병렬 컴퓨팅이란?

동시에 많은 계산을 하는 연산의 한 방법인데 크고 복잡한 문제를 작게 나눠서 동시에 병렬적으로 해결하는 방법

 

ㅇ병렬처리란?

멀티코어 CPU환경에서 하나의 작업을 분할해서 각각의 코어가 병렬적으로 처리하는 것

코어(cored)란? CPU(컴퓨터의 두뇌)에서 실질적으로 연산을 담당하는 장치

과거에는 CPU 1개당 코어가 1개가 들어갔으나 현재 출시되는 CPU에는 많게는 32개까지 들어가는 멀티코어로 구성되어 있음.

 

쓰래드(thread) : 코어에 할당된 작업공간

 코어가 일을하는 노동자라고 하면 쓰래드는 노동자가 동시에 할 수 있는 업무의 갯수

#1. R에서 쓰레드 갯수 확인 + 병렬작업 위한 패키지 설치
install.packages("future")
install.packages("future.apply")
install.packages("furrr")

library(future)
library(future.apply)

availableCores() # 쓰레드 갯수 16

#3. 실험을 위해 테스트 데이터 만들기
library(dplyr)

# 컬럼3개짜리 각각 10000개의 난수 생성
data.frame( t1 = rnorm(10000),
            t2 = rnorm(10000),
            t3 = rnorm(10000) ) %>%write.csv(.,"testfiles.csv")  #.은 현재 디렉토리

#4. 병렬처리 하지 않았을 때의 수행속도 확인
a <- system.time({for (i in 1:500){
  read.csv("testfiles.csv") }
  })
a

 사용자  시스템 elapsed 
  16.47    0.14   16.63 

> 병렬처리 안했을 때 16초 수행

 

#5. 병렬처리 했을 때의 수행속도 확인
# 작업관리자 먼저 열기
plan(multisession, workers = 8)
library(future.apply)

a2 <- system.time({future_lapply(1:500, function(x){read.csv("testfiles.csv")})})
a2

 사용자  시스템 elapsed 
   0.77    0.09    3.91 

> 병렬로 작업했더니 4초로 줄었음

 

※ 주의사항 : 동시에 작업할 갯수를 쓰래드의 갯수보다 작게 지정해줘야함. 만약에 시스템에 지정된 쓰래드의 갯수보다 더 많이 지정하게 되면 오히려 성능이 느려짐.

 

 

ㅇ머신러닝 모델 생성시 병렬작업해서 모델 생성하는 방법

1. 독일은행 데이터의 채무 불이행자를 예측하는 배깅모델을 병렬작업 없이 수행

#1. 데이터 로드
credit <- read.csv("c:\\data\\credit.csv", stringsAsFactors = TRUE)

#2. 훈련데이터, 테스트데이터 분리
library(caret)
set.seed(1)
k <- createDataPartition(credit$default, p = 0.8, list = F)
train_data <- credit[k,]
test_data <- credit[-k,]

nrow(train_data)  #800
nrow(test_data)  #200

#3. 앙상블 + 자동튜닝모델 생성과 훈련(병렬작업 없이 수행)
library(adabag)
library(caret)
trCtrl <- trainControl(method = 'cv', number = 10)   # 10폴드 교차검증으로 최적의 하이퍼 파라미터 찾음

set.seed(1)
a <- system.time( {
  m2 <-  train(default ~., data = train_data, trControl = trCtrl, method = "treebag")
  })
a
#사용자  시스템 elapsed 
#2.86    0.03    2.89    -> 약 3초 걸림

#4. 모델 예측
result2 <- predict(m2, test_data)

#5. 모델 평가
sum(result2 == test_data$default) / length(test_data$default)  # 0.775

> 병렬처리 하지 않았을 때는 약 3초 걸림.

 

2. 독일은행 데이터의 채무 이행자를 예측하는 배깅 모델 생성을 병렬작업으로 수행

#1. 병렬처리를 위한 패키지 library
library(parallel)
library(doParallel)

#2. 데이터 로드
credit <- read.csv("c:\\data\\credit.csv", stringsAsFactors = TRUE)

#3. 훈련 데이터, 테스트 데이터 분리
library(caret)
set.seed(1)
k <- createDataPartition(credit$default, p = 0.8, list = F)
train_data <- credit[k,]
test_data <- credit[-k,]

#4. 앙상블 + 자동튜닝 모델 생성(병렬작업 수행)
library(adabag)
library(caret)
trCtrl <- trainControl(method = 'cv', number = 10)

cl <- makeCluster(detectCores() -1)  # 현재 시스템 코어 갯수의 마이너스 1개를 cl에 넣음
cl

registerDoParallel(cl)

set.seed(1)
a <- system.time({
  m2 <- train(default ~., data = train_data, trControl = trCtrl, method = "treebag",
              allowParallel = TRUE)
})
a
# 사용자  시스템 elapsed 
# 0.61    0.06    4.67 

#5. 모델 예측
result2 <- predict(m2, test_data)

#6. 모델 평가
sum(result2 == test_data$default) / length(test_data$default)  # 0.775

병렬처리하기 전에 먼저 R studio를 한번 껐다가 켜고 수행해야 제대로 결과를 확인할 수 있음.

 

## 병렬 프로세서를 정리하는 방법
stopCluster(cl)
on.exit(stopCluster(cl))

 

 

92 사회적 연결망

사회적 연결망 분석이란 사회 연결망 데이터를 활용하여 사회 연결망과 사회구조 등을 사회과학적으로 분석하는 하나의 방식. 

인간과 인간의 관계, 인간과 사회의 관계 등 다양한 관계들을 과학적으로 밝히고 분석하는 것. 20세기 후반부터 인터넷과 소셜 미디어의 발전으로 분석이 활발하게 이루어지고 있음.

 

ㅇ igraph를 이용해서 emp테이블의 사원간의 관계도를 시각화 하기

#1. 데이터 로드
emp <- read.csv("c:\\data\\emp2.csv",header = T)
emp

#2. emp테이블을 셀프조인해서 사원이름을 출력하고 관리자 이름 출력
x <- merge(emp, emp, by.x = "mgr", by.y = "empno")

a <- x[, c("ename.x", "ename.y")]
a

#3. 그래프 그리기 위해서 사원이름과 관리자 이름 연결시키는 데이터프레임 생성
install.packages("igraph")
library(igraph)

b <- graph.data.frame(a, directed = T)
b

#4. 그래프 그리기
plot(b)

ㅇ글로벌 회사들의 소송관계도를 사회적 연결망으로 시각화하기

node2.csv는 노드명(node)과 노드번호(idx)로 회사 이름과 회사번호로 구성됨.

link2.csv는 source와 target으로 구성되어 있으면 각각 회사명을 뜻하고, source_idx, target_idx는 회사번호 소송관계 데이터임

#1. 데이터 로드
node_df <- read.csv("c:\\data\\node2.csv")
link_df <- read.csv("c:\\data\\link2.csv")

str(node_df)
str(link_df)

#2. 시각화
install.packages("networkD3")

library(networkD3)
library(dplyr)

network1 <- forceNetwork(Links = link_df,  # 소송관계도 데이터 프레임명
                         Nodes = node_df,  # 회사이름, 회사번호가 있는 데이터 프레임명
                         Source = 'source_idx',  # 소송하는 회사번호
                         Target = 'target_idx',  # 소송당하는 회사번호
                         NodeID = 'node',  # 회사명
                         Group = 'idx',   # 회사번호
                         opacityNoHover = TRUE,  #정적일때 불투명도
                         zoom = TRUE,  # False로 하면 해당 노드의 동그라미만 보이고
                                       # TRUE로 하면 연관된 회사들이 선명하게 도임
                         bounded = TRUE,  # 그래프가 화면 밖으로 빠져나가지 않게
                         fontSize = 15,  # 글씨 크기
                         linkDistance = 75,  # 연결선 길이
                         opacity = 0.9)  # 불투명 정도
network1

 

문제439. (오늘의 마지막 문제) 영화 기생충에 나오는 배우들의 관계도를 사회적 연결망 그래프로 시각화 하시오.

#1. 데이터 로드
node_df <- read.csv("c:\\data\\node3.csv")
link_df <- read.csv("c:\\data\\link3.csv")

head(node_df)
head(link_df)

#2. 시각화
install.packages("networkD3")

library(networkD3)
library(dplyr)

network1 <- forceNetwork(Links = link_df,  # 관계도 데이터 프레임명
                         Nodes = node_df,  # 인물 데이터 프레임명
                         Source = 'source_idx',  #관계1
                         Target = 'target_idx',  # 관계2
                         NodeID = 'node',  # 인물명
                         Group = 'idx',   # 인물번호
                         opacityNoHover = TRUE,  #정적일때 불투명도
                         zoom = TRUE,  # False로 하면 해당 노드의 동그라미만 보이고
                                       # TRUE로 하면 연관된게 선명하게 도임
                         bounded = TRUE,  # 그래프가 화면 밖으로 빠져나가지 않게
                         fontSize = 15,  # 글씨 크기
                         linkDistance = 300,  # 연결선 길이
                         opacity = 0.9)  # 불투명 정도
network1

 

반응형