딥러닝 다중 분류 모델 Multi Classfication 설계하기 (feat 아이리스...

딥러닝 다중 분류 모델 Multi Classfication 설계하기 (feat 아이리스...

다중 분류 문제

0과 1 결과값 중 하나를 선택하는 문제가

아닌, 3개 이상의 결과값을 예측하는 모델을

다중 분류(Mulit Classification)이라 한다.

원-핫 코딩(one-hot-coding)

결과값에 문자열이 포함되어 있다면 이를

0과1로 구성된 숫자로 변경해주는 작업이

필요하다.

사이킷 런 라이브러리의 LabelEncoder()함수를

사용해서 원핫코딩 작업을 진행한다. 예를 들어

결과값이 'a', 'b', 'c' 3개의 값이 있다고 가정하자.

결과값을 다음과 같이 변경하는 것이다.

a => 1 => [1, 0, 0]

b => 2 => [0, 1, 0]

c => 3 => [0, 0, 1]

소프트맥스 활성화 함수(softmax)

입력층에서 받은 데이터는 1보다 큰 수로 이루어져

있다. 우리는 원핫 코딩을 통해 1,0으로 이루어진

리스트로 만들어서 결과값을 예측한다.

여기서 필요한 것이 소프트맥스 활성화 함수다.

소프트맥스는 합계가 1인 형태로 변환시켜준다.

즉, 큰 값은 두드러지게 나타나고 작은 값은 더

작아지도록 만들어, 원핫코딩이 원활하게 되도록

도와주는 활성화 함수다.

실전 예제

1. 데이터 : 아이리스 품종. csv

2. 활성화함수 : ReLU, softmax

3. 최적화함수 : Adam

4. 오차함수 : categorical_crossentropy

# 데이터 로딩

pands를 이용해서 데이터를 불러온다.

데이터의 양식을 확인해본다. 속성과

샘플값이 어떤지, 결과값(클래스)는 어떤

값을 가지고 있는지 확인한다.

데이터를 보면 Iris-setosa/ Iris-virginica 로

결과값이 다른 것을 확인할 수 있다. 총 샘플은

150개가 포함되어 있으며 속성값은

sepal_length, sepal_width, petal_length, petal_width

4개 칼럼으로 분류했다.

1 2 3 import pandas as pd df = pd.read_csv( './dataset/iris.csv' , names = [ "sepal_length" , "sepal_width" , "petal_length" , "petal_width" , "species" ]) print (df) Colored by Color Scripter cs

# 데이터값 시각화하여 사전검증

이제 matplotlib 라이브러리를 사용한다.

데이터를 결과값(클래스)에 따라서 어떤

분포도를 가지고 있는지를 확인해본다.

딥러닝 모델을 설계하고 실행하기 이전에,

먼저 데이터의 분포가 명확히 구분되어야

학습과 예측이 용이하기 때문이다.

그래프를 그려보면, 결과값에 따라서 명확히

구분되는 것을 확인할 수 있다. 특히 line-setosa의

품종은 다른 종들에 비해 더 두드러진 특지을

보이고 있다.

1 2 3 4 5 import seaborn as sns import matplotlib.pyplot as plt sns.pairplot(df, hue = "species" ) plt.show() cs

# 데이터셋 구성

데이터셋에 pandas에서 불러온 데이터를

입력한다. X에는 속성값을 넣고, Y에는

결과값(클래스)를 입력한다.

1 2 3 dataset = df.values X = dataset[:, 0 : 4 ].astype(float) Y_obj = dataset[:, 4 ] cs

# 데이터셋 전처리

사이킷런 라이브러리에서 LabelEncoder()를

호출한다. 클래스(결과값)이 문자열인 경우에

숫자 형태로 변환해주는 함수다. 즉 꽃 종류가

문자열 형태에서 [1,2,3,4] 형태로 변환해준다.

결과값을 출력해보면 3개의 품종이 0, 1, 2형태로

변환된 것을 확인할 수 있다. 문자열을 숫자형태로

변환한 후에야 활성화함수 softmax()를 사용할 수

있기 때문이다.

1 2 3 4 5 from sklearn.preprocessing import LabelEncoder e = LabelEncoder() e.fit(Y_obj) Y = e.transform(Y_obj) cs

# 데이터 전처리 2

이제 keras 라이브러리에서 np_utils 를 호출한다.

up_utils.to_categorical() 함수를 사용하는 것은

0,1,2형태의 수를 [0, 0, 1] 형태로 0과 1로 이루어진

배열로 변환해준다.

결과값을 출력해보면 이제 활성화 함수를 사용하기에

적합한 클래스(결과값)을 얻은 것을 확인할 수 있다.

1 2 3 from keras.utils import np_utils Y_encoded = np_utils.to_categorical(Y) print (Y_encoded) cs

# 딥러닝 모델 설계

모델을 구현하는 단계다.

Sequential()로 모델을 생성한다.

16개의 노드, 4개의 속성을 입력층으로 정하고,

다음층으로 보내는 활성화함수는 ReLU를 사용한다.

출력층에서는 노드를 3개로 정하고 활성화함수로

0과 1 사이의 특징을 도드라지게 하는 softmax()함수를

사용한다.

1 2 3 model = Sequential() model.add(Dense( 16 , input_dim = 4 , activation = 'relu' )) model.add(Dense( 3 , activation = 'softmax' )) cs

# 모델 컴파일

생성한 모델을 컴파일한다.

오차 함수는 categorical_crossentropy()를 사용한다.

최적화 함수는 Adam을 사용한다.

metrics를 정확도로 설정하여 컴파일을 진행한다.

1 2 3 model = Sequential() model.add(Dense( 16 , input_dim = 4 , activation = 'relu' )) model.add(Dense( 3 , activation = 'softmax' )) cs

컴파일한 모델을 실행한다.

epocs는 50을 줘서 모든 샘플이 50번 반복되게 한다.

batch_size는 1을 준다. 즉 한번 모델이 실행될 때

1개의 샘플을 집어넣어서 모델을 학습시킨다.

1 model.fit(X, Y_encoded, epochs = 50 , batch_size = 1 ) cs

# 출력값 확인

출력값을 확인한다.

출력값은 model.evaluate()함수를 사용한다.

속성값과 결과값을 인자로 받아서 결과값을

출력한다.

결과값을 확인해보면 epocs가 50번 돌아갔고,

오차는 점점 줄어들고, 정확도는 점점 올라가는

것을 확인할 수 있다.

최종적으로 학습데이터를 가지고 아이리스 품종을

분류하는 모델은 97.33%의 정확도로 3개의 품종을

분류해내는데 성공했다.

1 print ( "

Accuracy : %.4f" % (model.evaluate(X, Y_encoded)[ 1 ])) cs

from http://incomeplus.tistory.com/243 by ccl(A) rewrite - 2021-12-16 13:00:35