스터디📖/ML, DL

Tensorflow (python) - 14, 15, 16, 17강 세번째 딥러닝 - 아이리스 품종 분류

호프 2021. 9. 1. 22:54

https://opentutorials.org/course/4570/28987

 

세번째 딥러닝 - 아이리스 품종 분류 - 생활코딩

수업소개 아이리스 품종을 분류하는 딥러닝 모델을 텐서플로우를 이용하여 만들어 보고, 분류모델과 회귀모델의 차이점을 이해합니다. 범주형 변수의 처리 방법인 원핫인코딩을 해야하는 이유

opentutorials.org

14강 아이리스 품종 분류

아이리스 꽃 데이터

종속변수가 수치형 변수가 아닌 범주형 데이터(품종)

  • 종속 변수가 양적 데이터인 경우 -> 회귀(regression) 알고리즘 사용
  • 종속 변수가 범주형 데이터인 경우 -> 분류(classificatior) 알고리즘 사용

분류 모델 코드

# 1.과거의 데이터를 준비합니다.
아이리스 = pd.read_csv('iris.csv')
아이리스 = pd.get_dummies(아이리스)
독립 = 아이리스[['꽃잎길이', '꽃잎폭', '꽃받침길이', '꽃받침폭']]
종속 = 아이리스[['품종']]
print(독립.shape, 종속.shape)

# 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')

# 3.데이터로 모델을 학습(FIT)합니다.
model.fit(독립, 종속, epochs=1000)

# 4. 모델을 이용합니다
print("Predictions: ", model.preict(독립[0:5]))

 

15강 원핫인코딩

독립변수 4개, 종속변수 1개

꽃잎길이 꽃잎폭 꽃받침길이 꽃받침폭 품종
5.1 3.5 1.4 0.2 setosa
4.9 3 1.4 0.2 versicolor
4.7 3.2 1.3 0.2 virginica
4.6 3.1 1.5 0.2 setosa

범주형 데이터 -> 수식에 사용할 수 있는 형태로 바꿔주는 과정 필요
범주형 데이터를 1과 0의 데이터로 바꿔주는 과정을 원핫인코딩이라 함

아이리스 = pd.read_csv('iris.csv')
# 원핫인코딩
아이리스 = pd.get_dumies(아이리스)

독립변수 4개, 종속변수 3개

꽃잎길이 꽃잎폭 꽃받침길이 꽃받침폭 품종.setosa 품종.versicolor 품종.virginica
5.1 3.5 1.4 0.2 1 0 0
4.9 3 1.4 0.2 0 1 0
4.7 3.2 1.3 0.2 0 0 1
4.6 3.1 1.5 0.2 1 0 0

퍼셉트론:

 

16강 softmax

분류 예측

ex) 내일은 비가 올 확률이 30%야.

 

👉 분류 모델이 분류를 추측하는 것을 사람이 표현하듯 확률로 표현하게 해주기 위한 도구: sigmoid, softmax

softmax

분류모델에서는 수식의 결과인 y 값이 최솟값은 0, 최댓값은 1이 나오도록 해야 함

softmax 함수를 Activation 함수로 넣어 감싸주면 됨.

Y = tf.keras.layers.Dense(3, activation='softmax')(X)

loss

loss 는 모델이 내놓는 결과가 실제 정답과 차이가 있는가를 나타내는 지표

👉 문제에 따라 문제 유형에 알맞은 loss를 사용해주어야 함.

  • 분류에 사용하는 loss: cross entropy
  • 회귀에 사용하는 loss: mse

❗ 분류 문제에는 "정확도" 라는 지표가 존재. -> compile 부분을 저장해주면 결과에서 정확도를 함께보여줌. 

(1 = 100% 맞은 것, 0 = 틀린 것)

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

 

17강 아이리스 품종 분류 (실습)

# 라이브러리 사용
import tensorflow as tf
import pandas as pd

#################################
# 1. 과거의 데이터를 준비합니다.
파일경로 = 'https://raw.githubusercontent.com/blackdew/tensorflow1/master/csv/iris.csv'
아이리스 = pd.read_csv(파일경로)
아이리스.head()

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

#독립변수, 종속변수
독립 = 인코딩[['꽃잎길이', '꽃잎폭', '꽃받침길이', '꽃받침폭']]
종속 = 인코딩[['품종_setosa', '품종_versicolor', '품종_virginica']]
print(독립.shape, 종속.shape)

#################################
# 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')

#################################
# 3. 데이터로 모델을 학습(FIT)합니다.
model.fit(독립, 종속, epochs=1000)

#################################
# 4. 모델을 이용합니다.
model.predict(독립[0:5]) #처음 다섯 개의 데이터를 가지고 예측
model.predict(독립[-5:]) #뒤의 다섯 개의 데이터를 가지고 예측

# 학습한 가중치
model.get_weights() # 각각의 칼럼이 setosa, versicolor, virginica일 확률을 나타내는 수식의 가중치