본문 바로가기
Artificial Intelligence/Deep Learning

[딥러닝] classification neural network(분류신경망)

by EunjiBest 2022. 1. 24.

[딥러닝] classification neural network(분류신경망)

 

 

 

머신러닝, 딥러닝의 데이터 문제의 유형은 크게 분류(Classification)과 회귀(regression)으로 나눠진다.

그 중 Classification neural network를 소개해보겠다.

 

분류(Classification)는 데이터가 어느 범주에 속하는지 알아내는 것이다.

그 중 오늘은 가장 기본데이터인 와인은 분류하는 신경망 모형을 만들어보겠다.

 

random seed 설정

일관된 결과값이 나오도록 랜덤 시드를 설정해줘야한다.

numpy와 tensorflow를 import하고 각각 랜덤 시드값을 생성하는 함수를 사용해서 생성한다.

import numpy as np
import tensorflow as tf
np.random.seed(0)
tf.random.set_seed(0)

 

 

data불러오기, feature/target data 나누기 및 확인

 

from sklearn import datasets
raw_wine = datasets.load_wine()

사이킷런 라이브러리를 import시켜 데이터를 불러오고

wine데이터를 불러오기 위해서 load_wine()을 실행해준다.

 

x = raw_wine.data
y = raw_wine.target

x, y로 feature데이터와 target데이터를 설정해준다.

 

>>> print(x.shape)
>>> print(set(y))

(178, 13)
{0, 1, 2}

x(feature)의 차원과 y(target)의 데이터 종류를 확인해준다.

총 13개의 feature가 사용되었고, target의 라벨이 0,1,2 이므로 분류문제라는 것을 알 수 있다.

 

one-hot encoding
>>> from tensorflow.keras.utils import to_categorical
>>> y_hot = to_categorical(y)
>>> print(y_hot)

타깃 데이터가 범주형이니 원핫인코딩을 한다.

to_categorical을 import 해주고, y(target)데이터를 넣준다.

1과0으로 변환이 잘 되었다.

 

 

 

train set, test set 분할

 

from sklearn.model_selection import train_test_split
x_tn, x_te, y_tn, y_te = train_test_split(x,  y_hot, random_state = 0)

트레이닝 데이터와 테스트 데이터로 분할을 한다.

사이킷런에서 분할에 필요한 함수를 import시킨다.

 

train_test_split 함수에 feature데이터와 위에서 one hot인코딩을 한 타깃 데이터를 넣고 실행하면

트레이닝 데이터와 테스트 데이터로 분할이 가능하다.

 

 

신경망 생성
from tensorflow.keras.models import Sequential  #신경망 생성을 선언할 때 사용하는 Sequential함수
from tensorflow.keras.layers import Dense       #신경망 층을 추가할 때 사용되는 Dense함수
from tensorflow.keras.layers import BatchNormalization   #배치 정규화 함수
from tensorflow.kears.layers import Activation           #활성화 함수 사용 함수

n_feat = x_ten.shape[1]  #신경망에 사용되는 피처 개수 저장
n_class = len(set(y))    #클래스 개수 저장
epo = 30                 #학습횟수

model = Squential()      #초기 모형 생성

model.add(Dense(20, input_dim = n_feat)) #add()로 모형에 층 추가. 입쳑층 추가
model.add(BatchNormalization())          #배치 정규화
model.add(Activation('relu'))            #활성화 함수 지정
model.add(Dense(n_class))                #최종 아웃풋 층 지정.
model.add(Activation('softmax'))         #활성화 함수 '소프트 맥스'로 지정

필요한 함수들을 import 시킨 후

신경망에 사용되는 피처 개수를 저장한다. 위에서 확인했듯이 13개의 피처가 사용되니, 13개가 저장될 것이다.

클래스 개수도 저장을 해줘야한다. 사용한 와인 데이터에는 총 3개의 클래스가 존재하니 3이 저장이 된다.

 

입력층에 input_dim이라는 옵션값을 지정해주야한다.

이는 피처의 개수이다. 20은 아웃풋의 차원을 의미한다.

 

 

모형 구조 확인

 

model.summary()

 

 

모형 컴파일
model.compile(loass = 'categorical_crossentropy',
              optimzier = 'adam',
              metrics = ['accuracy'])

만든 모형을 컴파일을 한다. 

이진 분류 문제에서 loss 는 binary_crossentropy를 입력하고

다중 분류 문제(3개 이상 class)에서는 categorical_crossentropy를 입력한다.

 

 

학습
hist = model.fit(x_tn, y_tn, epochs = epo, batch_size = 5)

 

fit을 이용하여 train데이터를 넣어주고, epochs를 넣어준다. 

앞서 모델에서 30으로 설정했으니 총 30 단계로 학습이 진행된다.

batch_size는 한 번 학습할 때 사용되는 미니 배치의 사이즈이다.

 

 

 

평가

 

>>> print(model.evaluate(x_tn, y_tn)[1])
0.8947368

>>> print(model.evaluate(x_te, y_te)[1])
0.93333334

트레이닝 데이터를 이용한 학습 정확도는 89.4%,

테스트 데이터를 이용한 학습 정확도는 93.3%이다.

 

 

 

시각화

 

>>> import numpy as np
>>> epoch = np.arange(1,epo+1)
>>> print(epoch)

>>> accuracy = hist.history['accuracy']
>>> print(accuracy)

>>> loss = hist.history['loss']
>>> print(loss)

numpy 라이브러리를 불러와서 플롯 x축에 적용될 epoch를 설정한다.

각 epoch별 정확도와 손실 정도를 확인할 수 있다.

 

 

 

학습 그래프

 

import matplotlib.pyplot as plt
plt.plot(epoch, accuracy, label = 'accuracy')
plt.xlabel('epoch')
plt.ylabel('accuracy')
plt.legend()
plt.show()

가로축은 epoch, 세로축은 accuarcy로 라벨을 설정해준다.

에포크 진행 단계별로 점차 정확도가 상승하는 것을 볼 수 있다.

 

 

 

손실 그래프

 

import matplotlib.pyplot as plt
plt.plot(epoch, loss, 'r', lable = 'loss')
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend()
plt.show()

학습그래프와 같은 방법으로 손실 플롯을 그려봤다.

가로축은 epoch, 세로축은 loss를 나타내도록 설정한다.

'r'은 플롯 색상이 빨간색이라는 뜻이다.

에포크 진행 단계별로 점차 낮아지는 손실도를 볼 수 있다.

반응형

댓글