강의자료/머신러닝

[딥러닝실습] pandas와 tensorflow를 이용한 아이리스 품종 분류

파아란기쁨 2022. 7. 12. 10:41

오늘은 아이리스의 품종을 분류하는 분류 모델을 만드는 방법을 실습해 보겠습니다. 

 

실습과정

지도학습의 실습과정은 다음과 같습니다.

1. 과거의 데이터를 준비합니다.(과거의 데이터에서 원인과 결과 즉 독립변수와 종속변수를 찾아 냅니다.)

2. 모델의 구조를 만듭니다. 

3. 데이터로 모델을 학습합니다.

4. 모델을 이용합니다.

 

실습 도구

https://colab.research.google.com/

실습은 코랩을 이용해서 진행하겠습니다.

과거 데이터 준비
###########################
# 라이브러리 사용
import tensorflow as tf
import pandas as pd
from sklearn import datasets

 
###########################
# 1.과거의 데이터를 준비합니다.
아이리스 = datasets.load_iris()

독립 = pd.DataFrame(아이리스['data'],columns=아이리스['feature_names'])
종속 = pd.DataFrame(아이리스['target'],columns=['품종']) 
print(독립.head())
print(종속.head())

사이킷런에서 제공해 주고 있는 아이리스 데이터를 가지고 준비를 해 보겠습니다.

아이리스의 키값을 살펴 보면 다음과 같습니다.

dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename', 'data_module'])

data 는 아이리스의 샘플데이터이고target은 아이리스의 품종으로 0:setosa,1:versicolor,2:verginica 입니다.

target_names 은 아이리스의 품종

DESCR은 데이터에 대한 설명

feature_names 는 데이터의 특성에 대한 이름으로 이루어져 있습니다.

 

처음 시작하는 5개의 데이터를 살펴 보면 다음과 같습니다.

품종은 다음과 같이 setosa,versicolor,virginica 와 같이 3가지 품종을 가지고 있습니다.

출처:https://en.wikipedia.org/wiki/

 

5개의 데이터를 살펴 보면 위와 같이 모두 setosa 인 것을 확인 할 수 있습니다.

 

여기서 타겟 데이터가 보스턴집값 예측과 다른것을 확인 하셨나요?

기존의 보스턴 집값은 금액(숫자)를 예측하는 회귀모델이었다면 아이리스는 품중을 setosa/versicolor/virginica 와 같이 3가지로 분류하는 분류 모델입니다.

바로 범주형 데이터 입니다.

 

이때 타겟 데이터를 0,1,2 와 같이 품종을 분류해야 됩니다.

이때는 원핫인코딩을 해 주어야 합니다.

 

원핫인코딩

원핫인코딩이란?

위와 같이 아이리스 데이터의 품종이  setosa/versicolor/virginica 와 같이 범주형 데이터가 들어 입력 되는 경우 딥러닝 알고리즘은 이러한 범주형 데이터를 숫자 데이터로 변환해야 합니다.

이렇게 숫자 데이터로 변환하는 과정을 원핫인코딩이라고 하며 다음과 같이 인코딩을 할 수 있다.

출처: 생활코딩

위와 같이 품종을 테이블 형태의 숫자 값을 변환한다.

출처:생활코딩

데이터를 읽어서 get_dummies 로 원핫인코딩을 하면 범주형 데이터가 숫자형 데이터로 바뀐다. 

이렇게 원핫인코딩을 하면 독립변수가 3개가 됩니다. 즉 y1,y2,y3을 찾는 함수가 됩니다.

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

원핫 인코딩 된 데이터의 모습

여기서 꽃잎길이,꽃잎폭,꽃받침길이,꽃받침폭이 독립변수이고

품종이 종속 변수 임을 알 수 있습니다.

 

하지만 위의 데이터에서 target 은 0,1,2 와 같은 숫자이므로 타겟이 원핫인코딩이 되지 않습니다.

이때 종속변수를 범주형 변수로 바꾸어 줍니다.

#타겟을 범주형데이터로 변환해 주자
종속 = 종속.astype('category')
print(종속.head())
print(종속.dtypes)

종속 = pd.get_dummies(종속)
print(종속.head())

 

독립변수와 종속변수 분리
# 종속변수, 독립변수
독립 = 아이리스[['꽃잎길이', '꽃잎폭', '꽃받침길이', '꽃받침폭']]
종속 = 아이리스[['품종_setosa', '품종_versicolor', '품종_virginica']]
print(독립.shape, 종속.shape)

4개의 독립변수와 3개의 종속 변수 형태로 분리 되어 있는 모양을 확인 할 수 있습니다.

모델의 구조 만들기
###########################
# 2. 모델의 구조를 만듭니다
X = tf.keras.layers.Input(shape=[4])
Y = tf.keras.layers.Dense(3, activation='softmax')(X)
model = tf.keras.models.Model(X, Y)
model.compile(loss='categorical_crossentropy',
              metrics='accuracy')

여기서는 종속변수가 4개이고 독립변수가 3개인 모델을 찾는 구조를 만듭니다.

이때 3개 중에서 분류 예측에서는 setosa 일 확률/versicolor 일 확률/virginica 일 확률 과 같이 이러한 확률은 몇 퍼센트야 라고 표현을 해주게 되는데  이렇게 확률을 만들어 주는 것이 시그모이드와 소프트맥스(softmax)입니다.

오늘은 sotfmax 를 이용해서 모델을 만들어 보도록 하겠습니다.

Y = tf.keras.layers.Dense(3, activation='softmax')(X) # 여기에서 활성화 함수를 softmax를 사용해 주면 확률로 만들어 주게 됩니다.

참고로 소프트맥스의 활성화 함수는 다음과 같은 식을 가지고 있습니다.

 동작하는 형태를 살펴 보면 다음과 같습니다.

출처:생활코딩

f가 softmax 활성화 함수가 되며 y1을 만드는 확률, y2가 만들어지는 확률,y3이 만들어지는 확률을 계산해 주게 됩니다.

이때 회귀모델에서는 입력을 그대로 보내는 identity를 범주형 데이터에서는 softmax라는 함수로 감싸주는 형태가 됩니다.

model.compile(loss='categorical_crossentropy',
              metrics='accuracy')

분류모델의 손실 함수는 categorical_crossentropy 를 사용합니다.

여기서는 softmax의 분류모델 손실함수는 categorical_crossentropy 를 사용한다는 정도로 만 이해 합시다.

평가지표 accuracy 의 의미는 1에 가깝고 높을 수록 좋은 모델이라는 것을 의미합니다.

데이터로 모델을 학습(FIT)합니다.
###########################
# 3.데이터로 모델을 학습(FIT)합니다.
model.fit(독립, 종속, epochs=1000, verbose=0)
모델을 이용합니다.
###########################
# 4. 모델을 이용합니다
# 맨 처음 데이터 5개
print(model.predict(독립[:5]))
print(종속[:5])

맨처음 데이터 5개를 모델에 넣어 보면 위의 표와 같은 확률로 결과를 출력합니다.

첫번째 데이터는 1에 가깝고 나머지는 0 에 가까운 수임을 확인 할 수 있습니다.

e-01 은 소수점을 왼쪽으로 한자리 이동, e-09는 소수점을 앞으로 9자리 이동해 주면 됩니다.

학습한 가중치 살펴 보기
# 모델의 수식확인
model.get_weights()

첫번째 열은 setosa 를 출력하기 위한 가중치 값으로 

y1 = w1x1 + w2x2 + w3x3 + w4x4 + b1 에서 w1,w2,w3,w4 의 값에 해당 됩니다. 

 


오늘은 분류모델을 만드는 방법을 살펴 보았습니다.

 

 

<참고>

생활코딩 - https://opentutorials.org/course/4570/28974

 

 

사업자 정보 표시
원당컴퓨터학원 | 기희경 | 인천 서구 당하동 1028-2 장원프라자 502호 | 사업자 등록번호 : 301-96-83080 | TEL : 032-565-5497 | Mail : icon001@naver.com | 사이버몰의 이용약관 바로가기
1 2 3 4 5 6 7 8 ··· 31