본문 바로가기
AI

[Deep Learning] 아이리스 품종 분류, 원핫인코딩, 활성화함수

by shur_ 2023. 9. 5.

 

양적(숫자형) -> 숫자형

범주형 -> 분류형

 

기계적으로 외워져버린 판별법이다.

대신 변수가 숫자형인지 범주형인지는 잘 파악할 것.

 


종속변수의 값이 범주형일 때는 어떻게 할까?

숫자가 아닌 것이 수식의 결과로 나올 수는 없을 것이다.

수식에서는 입력이든 출력이든 숫자만 들어갈 수 있다.

 

범주형 데이터를 수식에 사용할 수 있도록 바꾸어 주어야한다.

 

 

범주형 데이터를 0과 1로 바꾸어주는 과정을 '원핫인코딩(onehot-encoding)' 이라고 한다.

 

 

import pandas as pd
import tensorflow as tf

# 데이터 준비
아이리스 = pd.read_csv('iris.csv')
print(아이리스.shape)

# 원핫인코딩
아이리스 = pd.get_dummies(아이리스)
아이리스.columns

독립 = 아이리스[['꽃잎길이', '꽃잎폭', '꽃받침길이', '꽃받침폭']]
종속 = 아이리스[['품종_setosa', '품종_versicolor','품종_virginica']]

print(독립.shape, 종속.shape)

 

 

 

아이리스.head()

 

# 모델 준비
X = tf.keras.Input(shape=[4])
Y = tf.keras.layers.Dense(3, activation = 'softmax')(X)
model = tf.keras.Model(X,Y)
model.compile(loss = 'categorical_crossentropy', metrics = 'accuracy')

model.summary()

 

 

 

+ layer에 이름을 붙일 수도 있다.

# 모델 준비
X = tf.keras.Input(shape=[4], name = 'iris')
Y = tf.keras.layers.Dense(3, activation = 'softmax', name = 'category')(X)
model = tf.keras.Model(X,Y)
model.compile(loss = 'categorical_crossentropy', metrics = 'accuracy')

model.summary()

Layer의 이름이 바뀌었다.  name 지정 안하면 자동으로 넘버링 지정해서 보여줌.

 

 

 

 

독립변수 4개, 종속변수 3개 이므로 3개의 수식을 찾아내야 할 것 같다.

위의 코드에서 처음보는 낯선 것들이 보인다. activation, categorical_crossentropy, accuracy ...

나중에 제대로 이해하면서 해결하자. 우선 범주형에는 이렇게 쓰이는 것이다. 숫자형이면 loss가 'mse' 이고.

 

 

지금까지 해왔던 수식은 y = w1x1 + w2x2 ... 였지만 이번 수식은 softmax가 감싸준다.

 

사실 퍼셉트론에는 최종결과가 나오기전에 함수 하나가 추가되어 있는데, 숫자를 예측했던 회귀 모델에서도 감싸고 있는 녀석이 있었다.

입력을 그대로 출력으로 내보내는 Identity 함수가 있었다 !

이번 범주형 수식에는 activation(활성화함수)에 softmax를 지정해주는 것이다.

 

accuracy를 지정해주면 결과에서 정확도를 보여준다. 1이면 100% 맞춘 것이고, 0이면 틀린 것이다.

 

# 데이터로 모델 학습
model.fit(독립, 종속, epochs=500, verbose = 0)
model.fit(독립, 종속, epochs=10)

accuracy 확인 가능.

loss가 떨어지면 accuracy가 올라가는 것도 볼 수 있음.

 

 

# 모델을 이용
model.predict(독립[:5])

각 칼럼의 값이 1에 가까울수록 그 품종인 것을 알 수 있다.

 

model.get_weights()

y1 = w1x1 + w2x2 + w3x3 + w4x4 + b 가 독립변수 4개, 종속변수 1개 ( 품종 1가지 )를 나타내는 수식이었으면,

 

품종에서 첫 번째 column 이었던 setosa의 수식은 0.4763671x1+ 0.93662786x2 -2.4667342x3 -2.1798112x4 + 1.3018354 가 된다.(x1, x2, x3, x4는 데이터 값)

 

 

 

 

#품종이 2 class 일 때

1. 품종을 0, 1의 값으로 치환.
  - 종속변수가 1개
  - sigmoid, binary_crossentropy 사용

2. 품종을 onehot encoding => 0칼럼, 1칼럼
  - 종속변수 2개
  - softmax, categorical_crossentropy 사용.

댓글