대학원 일기

13장: 인공신경망 본문

School/Data Mining and Statistics

13장: 인공신경망

대학원생(노예) 2023. 10. 16. 01:33
## 13.3 보스톤 집값 예측 - 회귀 문제

# 데이터 확인 
install.packages("neuralnet")
install.packages("MASS")
library(neuralnet) # 다층 인공신경망의 학습 & 예측
library(MASS) # 보스턴 주택 가격 데이터셋

head(Boston)

# 분석 대상 데이터 할당
# dataset
# input data: crim, zn, indus, chas, nox, rm, age, dis, rad, tax, ptratio, black, lstat, mediv
# output data: mediv(주택 가격)
data <- Boston[, c(1,2,4,5,9,14)] # 위 input data 중 선택
head(data)

# 결측치 확인 
na <- apply(data, 2, is.na) # isna는 결측치 확인을 해줌
na
apply(na, 2, sum) # 결측치 확인

# 데이터 정규화
maxs <- apply(data, 2, max) # 각 열별로 최댓값 할당
maxs
mins <- apply(data, 2, min) # 각 열별로 최솟값 할당
mins
data.scaled <- scale(data, center = mins, scale = maxs - mins) # 정규화
data.scaled

# 학습용과 테스트용 데이터 분리 
n <- nrow(data.scaled)  # 정규화된 데이터의 행의 수

set.seed(1234) # 난수 발생을 위한 초기값
index <- sample(1:n, round(0.8*n)) # 난수를 통해 1~n 사이의 행 중 80%에 해당하는 숫자를 무작위로 추출
index

train <- as.data.frame(data.scaled[index,]) # 훈련용 data
head(train)

test  <- as.data.frame(data.scaled[-index,]) # 테스터용 data
head(test)

# 학습용 입출력 변수 할당 
names.col <- colnames(train) # 훈련용 데이터의 항목명 추출
names.col

var.dependent <- names.col[6] # 마지막 열을 출력 변수로 지정
var.dependent

var.independent <- names.col[-6] # 마지막 열을 제외한 변수를 입력변수로 지정
var.independent

f.var.independent <- paste(var.independent, collapse = " + ") # 입력 변수 "+"로 연결
f.var.independent

f <- paste(var.dependent, "~", f.var.independent) # 출력변수와 입력 변수를 "~"로 연결
f

# 학습 및 모형 출력 
# 모형 구성과 학습
model <- neuralnet(f, 
                   data = train, # data는 학습 데이터로
                   hidden = c(3, 2), # 은닉층의 노드 수 (1층:3개, 2층: 2개)
                   linear.output = T)
plot(model) 

# 테스트 
predicted <- compute(model, test)
predicted$net.result
head(predicted$net.result)

predicted.real <- predicted$net.result * (maxs[6] - mins[6]) + mins[6]  
predicted.real
head(predicted.real)

test.real <- test$medv * (maxs[6] - mins[6]) + mins[6]  
test.real

# 실제값 대비 예측값 비교(분포)
plot(test.real,  predicted.real,
     xlim=c(0, 50), ylim=c(0, 50),
     main="실제값 대비 예측값 분포",
     xlab="실제값", ylab="예측값",
     col="red", 
     pch=18, cex=0.7)
abline(0, 1, col="blue", lty=2)

MAPE.model <- sum(abs(test.real - predicted.real)/test.real * 100) / length(test.real)
MAPE.model # 오차

## 13.4 붓꽃 종의 분류(분류문제)

# 데이터 확인
# install.packages("neuralnet")
library(neuralnet)

iris

data <- iris

# 결측치 확인
na <- apply(data, 2, is.na)
na
apply(na, 2, sum)

# 데이터 정규화
maxs <- apply(data[,1:4], 2, max)
maxs

mins <- apply(data[,1:4], 2, min)
mins

data[,1:4] <- scale(data[,1:4], center = mins, scale = maxs - mins)
data[,1:4]

# 출력 데이터 생성
data$setosa     <- ifelse(data$Species == "setosa", 1, 0)
data$virginica  <- ifelse(data$Species == "virginica", 1, 0)
data$versicolor <- ifelse(data$Species == "versicolor", 1, 0)
head(data)

# 학습용과 테스트용 데이터 분리
n <- nrow(data)

set.seed(2000)
index <- sample(1:n, round(0.8*n))
index

train <- as.data.frame(data[index,])
head(train)

test <- as.data.frame(data[-index,])
head(test)

# 학습용 입출력 데이터
f.var.independent <- "Sepal.Length + Sepal.Width + Petal.Length + Petal.Width"
f.var.dependent   <- "setosa + versicolor + virginica"
f <- paste(f.var.dependent, "~", f.var.independent)
f

# 학습 및 모형 출력
nn <- neuralnet(f, data=train, hidden=c(6, 6), linear.output=F)
plot(nn)

# 테스트 
predicted <- compute(nn, test[,-5:-8])
predicted$net.result

idx <- max.col(predicted$net.result)
idx

species   <- c('setosa', 'versicolor', 'virginica')
predicted <- species[idx]
predicted

# 실제 값 대비 예측 값 비교(분포)
table(test$Species, predicted)

t <- table(test$Species, predicted)
tot <- sum(t)
tot
same <- sum(diag(t))
same
same / tot

## The end of Chap.13 Neural Networks

'School > Data Mining and Statistics' 카테고리의 다른 글

12장: 시뮬레이션  (0) 2023.10.16
11장: 네트워크 분석(노드 연결)  (0) 2023.10.16
10장: Naver OPEN API  (0) 2023.10.16
9장: OPEN API  (0) 2023.10.16
8장: 웹 스크래핑 코드  (0) 2023.10.16
Comments