Study/class note

머신러닝 / R 로 신경망 모델 만들기(분류), 파이썬으로 신경망 모델 만들기(분류)

chanzae 2022. 2. 22. 16:55

68 R 로 신경망 모델 만들기(분류)

와인의 등급을 분류하는 신경망

 

#1. 데이터 로드

#2. 결측치 확인

#3. 정규화 진행

#4. 훈련데이터와 테스트 데이터 분리

#5. 모델 설정

#6. 모델 훈련

#7. 테스트 데이터 예측

#8. 모델 평가

#9. 모델 성능 개선

#1. 데이터 로드
wine <- read.csv("c:\\data\\wine.csv", stringsAsFactors = T)
unique(wine$Type)

#2. 결측치 확인
colSums(is.na(wine))

#3. 정규화
normalize <- function(x){ return( (x - min(x)) / (max(x) - min(x)) ) }
wine_norm <- as.data.frame(lapply(wine[,-1], normalize))
summary(wine_norm)

wine2 <- cbind(Type = wine$Type, wine_norm)  #label은 문자형이라서 정규화를 안했었음
head(wine2)

#4. 훈련데이터, 테스트 데이터 분리
library(caret)
set.seed(1)
k <- createDataPartition(wine2$Type, p = 0.9, list = FALSE)
train_data <- wine2[k,]
test_data <- wine2[-k,]

nrow(train_data)  #162
nrow(test_data)  #16

#5. 모델 설정
install.packages("nnet")  #분류를 위한 신경망 모델
library(nnet)

#6. 모델 훈련
set.seed(1)  # 가중치 초기값을 어느 자리에서든 똑같이 하기 위해 설정
model <- nnet(Type ~., data = train_data, size = 2)
      # size = 2는 은닉층 1개로 하고 은닉층의 뉴런의 갯수를 2개로 하겠다는 뜻

#7. 테스트 데이터 예측
result <- predict(model, test_data[,-1], type = "class")
result

#8. 모델 평가
sum(result == test_data[,1]) / length(test_data[,1])

#9. 모델 성능 개선
model2 <- nnet(Type ~., data = train_data, size = 5) # 은닉층의 뉴런 수 5개
result2 <- predict(model2, test_data[,-1], type = "class")
sum(result2 == test_data[,1]) / length(test_data[,1])

 

문제357. iris 품종을 분류하는 인공신경망을 R로 구현하시오.

#1.데이터 로드
iris <- read.csv("c:\\data\\iris2.csv", stringsAsFactors = T)
head(iris)  # 마지막 컬럼(Species)이 label

#2. 결측치
colSums(is.na(iris))

#3. 정규화
normalize <- function(x){ return( x - min(x) / (max(x) - min(x) ))}

iris_norm <- as.data.frame(lapply(iris[,-5], normalize))
iris_scaled <- cbind(Species = iris$Species, iris_norm)  # label을 1번인덱스에 붙임
head(iris_scaled)

#4. 데이터 분리
library(caret)
set.seed(1)
k <- createDataPartition(iris_scaled$Species, p = 0.9, list = F)
train_data <- iris_scaled[k,]
test_data <- iris_scaled[-k,]

nrow(train_data)  #135
nrow(test_data)  #15

#5. 모델설정
library(nnet)

#6. 모델훈련
set.seed(1)
model_iris <-nnet(Species ~., data = train_data, size = 2) 

#7. 테스트 데이터 예측
result_iris <- predict(model_iris, test_data[,-1], type = "class")

#8. 모델 평가 
sum(result_iris == test_data[,1]) / length(test_data[,1])  #0.8

#9. 성능개선
set.seed(1)
model_iris2 <-nnet(Species ~., data = train_data, size = 5) 
result_iris2 <- predict(model_iris2, test_data[,-1], type = "class")
sum(result_iris2 == test_data[,1]) / length(test_data[,1])  #1

 

 

69 파이썬으로 신경망 모델 만들기(분류)

수치예측 : from sklearn.neural_network import MLPRegressor

분류 : from sklearn.neural_network import MLPClassifier

 

"와인의 품질을 분류하는 인공신경망 만들기"

#1. 데이터 로드
import pandas as pd
wine = pd.read_csv("c:\\data\\wine.csv")
wine.head()

#2. 결측치 확인
wine.isnull().sum()

#3. 정규화 진행
x = wine.iloc[:, 1:]
y = wine['Type']

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
x_scaled = scaler.fit_transform(x)

#4. 데이터 분리
from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(x_scaled, y, test_size = 0.1, random_state = 0)

print(x_train.shape, x_test.shape, y_train.shape, y_test.shape)  #(160, 13) (18, 13) (160,) (18,)

#5. 모델 생성
from sklearn.neural_network import MLPClassifier

model = MLPClassifier(random_state = 0)

#6. 모델 훈련
model.fit(x_train, y_train)

#7. 예측
result = model.predict(x_test)

#8. 평가
sum(result == y_test) / len(y_test) * 100   # 100%
#9. 성능개선
from sklearn.model_selection import GridSearchCV

param_grid = {'hidden_layer_sizes' : [(100,50), (200,50),(100,100),(200,200)],
              'activation' : ['relu','identity','tanh', 'logistic'],
              'solver':['lbfgs','sgd','adam'] }

model2 = GridSearchCV( MLPClassifier(random_state = 0), param_grid, n_jobs = -1, verbose = 2)

model2.fit(x_train, y_train)

#최적의 하이퍼 파라미터의 조합을 확인하는 코드
print(model2.best_params_)

result2 = model2.predict(x_test)

sum(result2 == y_test) / len(y_test) * 100   #94.44444444444444

> 기존층은 은닉1층에 뉴런수 100개였는데(default) 성능개선에서 은닉2층으로하고 grid search를 돌려보니 오히려 정확도가 떨어짐. 2층까지 할 필요 없는 데이터였기 때문 > 층이 많고 뉴런의 갯수가 많다고 마냥 좋은 결과가 나오는 것은 아님.

 

 

문제358. (오늘의 마지막 문제) iris 데이터로 분류하는 파이선 신경망을 생성하세요.

#1. 데이터 로드
import pandas as pd
iris = pd.read_csv("c:\\data\\iris2.csv")
iris.head()

#2. 결측치 확인
iris.isnull().sum()

#3. 정규화 진행
x = iris.iloc[:, :-1]
y = iris.iloc[:,-1]

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
x_scaled = scaler.fit_transform(x)

#4. 데이터 분리
from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(x_scaled, y, test_size = 0.1, random_state = 0)

print(x_train.shape, x_test.shape, y_train.shape, y_test.shape)  #(135, 4) (15, 4) (135,) (15,)

#5. 모델 생성
from sklearn.neural_network import MLPClassifier

model = MLPClassifier(random_state = 0)

#6. 모델 훈련
model.fit(x_train, y_train)

#7. 예측
result = model.predict(x_test)

#8. 평가
sum(result == y_test) / len(y_test) * 100  

#9. 성능개선
from sklearn.model_selection import GridSearchCV

param_grid = {'hidden_layer_sizes' : [100, 50, 10, 150, 200],   #은닉1층만 설정함
              'activation' : ['relu','identity','tanh', 'logistic'],
              'solver':['lbfgs','sgd','adam'] }

model2 = GridSearchCV( MLPClassifier(random_state = 0), param_grid, n_jobs = -1, verbose = 2)

model2.fit(x_train, y_train)

#최적의 하이퍼 파라미터의 조합을 확인하는 코드
print('최적의 하이퍼 파라미터 :', model2.best_params_)

result2 = model2.predict(x_test)

sum(result2 == y_test) / len(y_test) * 100
반응형