R - neuralnet 함수를 사용하여 역전파 알고리즘 사용 예제





이번 예제는 인공신경망. 즉 neuralnet 함수를 이용해서 역전파 알고리즘을 사용하는 예제입니다.


코드

# neuralnet 함수를 이용해 역전파 알고리즘을 사용 가능
install.packages("neuralnet")
library("neuralnet")

set.seed(123)
idx <- sample(1:nrow(iris),0.7 * nrow(iris)) # 7:3으로 나눔
train_iris <- iris[idx, ]
test_iris <- iris[-idx, ]
head(train_iris)

#꽃잎 꽃밭임의 길이를 보고 꽃의 종류 구분하기
train_iris$Species2[train_iris$Species == 'setosa'] <-1
train_iris$Species2[train_iris$Species == 'versicolor'] <-2
train_iris$Species2[train_iris$Species == 'virginica'] <-3
train_iris$Species <- NULL #Species 값이 없어짐
head(train_iris)

test_iris$Species2[test_iris$Species == 'setosa'] <-1
test_iris$Species2[test_iris$Species == 'versicolor'] <-2
test_iris$Species2[test_iris$Species == 'virginica'] <-3
test_iris$Species <- NULL #Species 값이 없어짐
head(test_iris)

#데이터 정규화 : 0~1 범위로 정규화 작업
normal_func <- function(x){
  return ((x-min(x))/ (max(x)-min(x)))
}
#normal_func(c(1,5,4,5))

train_nor <-as.data.frame(lapply(train_iris, normal_func))
train_nor
summary(train_nor)

test_nor <-as.data.frame(lapply(test_iris, normal_func))
test_nor
summary(test_nor)


# 분류모델 생성 ~ 은닉층 1개
model_net <- neuralnet(Species2 ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, data = train_nor,hidden=1)
model_net
plot(model_net)

#모델 성능 평가 (예측) ~ predict()대신 compute()
model_result <- compute(model_net, test_nor[c(1:4)])
model_result

#상관관계
cor(model_result$net.result,test_nor$Species2) # 0.9732786101, 강한양의 상관관계를 보여주고 있다.

model_net2 <- neuralnet(Species2 ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, data = train_nor, hidden=2 ,algorithm = "backprop" ,learningrate = 0.01)
model_net2
plot(model_net2)


model_result2 <- compute(model_net2, test_nor[c(1:4)])
model_result2
cor(model_result$net.result,test_nor$Species2) #0.9732786101

# neuralnet : iris dataset : 입력값을 정규화하지 않고 결과 출력
library(neuralnet)
iris

set.seed(1)
train<-sample(1:nrow(iris),nrow(iris)*0.7)
test <- seq(nrow(iris))[-train]
iristrain <-iris[train, ]
iristest <-iris[test, ]
dim(iristrain); dim(iristest)


#꽃의 종류를 범주형으로 하기 위해 양면화(T,F)
iristrain <- cbind(iristrain, iristrain$Species=='setosa') #칼럼 3개 추가
iristrain <- cbind(iristrain, iristrain$Species=='versicolor')
iristrain <- cbind(iristrain, iristrain$Species=='virginica')
names(iristrain)[6:8] <-c('setosa','virginica','versicolor')
head(iristrain, 3)

#nn model
nn <- neuralnet(setosa + virginica + versicolor ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, data = iristrain,hidden = 3)
plot(nn)

#예측
iristest #칼럼을 추가하지 않음
comp <- compute(nn, iristest[-5])
names(comp)
pred.weight <-comp$net.result
pred.weight
idx <- apply(pred.weight, 1, which.max) #which.max 가장 큰 값
idx

#c('setosa','virginica','versicolor')[3] #1. seto 2. virg 3. vers
pred <-c('setosa','virginica','versicolor')[idx] # 숫자값으로 안보이고 꽃의 종류로 보이게 하기
pred
table(pred,iristest$Species)
(15+0+3)/nrow()


샘플 데이터





본 포스팅은 KIC 캠퍼스에서 박영권 강사의 지도하에 공부하며 작성한 리포트입니다.
혹시 잘못된 내용이 있거나 문제 소지시 댓글 남겨주시면 조치하겠습니다.






댓글(0)

Designed by JB FACTORY