본문 바로가기
● 인공지능, 분석/20.08 생코_머신러닝

생활코딩_Tensorflow_Iris_범주형(분류),분류 VS 회귀

by 0ver-grow 2020. 8. 18.
반응형

분류는 확률예측

https://bit.ly/2DJ9TQJ

꽃잎의 여러 특징을 독립 변수로 하여 아이리스의 품종을 구분하는 모델을 구현한다.

 

아이리스 데이터의 종속변수는 수치형이 아닌 품종이니 범주형 데이터이다.

회귀와 분류를 나누는 차이는 종속변수의 데이터타입이다.

범주형 데이터는 다음 코드가 추가된다.

노란색은 범주형데이터를 위한 코드지만

pd.get_dummies(아이리스)는 무엇일까?

종속변수가 '품종'하나인데 왜 Dense(3)일까?


이전 수식에선 입력이든 출력이든 전부 다 숫자가 들어갔다.

그러나 종속변수의 값이 숫자가 아닌 범주형이기에 숫자가 아닌 것이 수식의 결과가 될 수는 없다.

범주형 데이터는 수식에 사용될 수 있도록 특정 과정을 거쳐야 한다.

범주들을 칼럼으로 만들어준다.

 

원핫인코딩을 통해 데이터가 0 또는 1의 숫자형태로 변환된다.

 

그렇다면 어떻게 원핫인코딩을 할 수 있을까?

판다스의 코드를 통해 데이터내에 범주형 데이터만 골라서 원핫인코딩을 진행한다.

 

독립/종속변수만 분리해주면 데이터 학습 준비 끝!

 

이제 변형된 테이블을 통해 진행해보자.

독립변수는 4개

종속변수는 3개

그렇기 때문에 종속변수가 '품종'하나지만

원핫인코딩을 통해 종속변수가 3개가 됐기에 Dense(3)인 것이다.


Softmax, Crossentropy?

일상에서 분류 예측하기

비가 올지 안올지, 합격/불합격, 동전의 앞 뒤 등 0 ~ 100%로 확률값으로 분류를 표현한다.

분류 모델도 이렇게 표현하기 위한 도구가 바로 Sigmoid, Softmax이다.

우린 비율 예측을 위해 Softmax를 사용한다.

 

 

이전에 학습했던 데이터들은 +-등 모든 숫자들을 대상으로 했다.

하지만 분류모델에선 이 수식이 모든 숫자들을 예측하는 것이 아니다.

지금은 최소 0, 최대 1을 맞추려는 것이다.

0과 1사이의 결과를 얻기 위해선 softmax함수로 위 식을 감싸줘야 한다.

앞서 배웠던 퍼셉트론의 모양을 구체적으로 보면 오른쪽 사진처럼 최종결과 이전에 함수식이 숨겨져 있다.

 

숫자를 예측했던 회귀모델에선 이렇게 감싸는 함수f가 없었다.

입력을 그대로 출력으로 만드는 Identity함수가 있었기 때문이다.

이 함수의 역할은 퍼셉트론이 어떤 형태로 출력되어야 하는지 조절하는 역할

 

이런 함수들을 활성화 함수라고 부른다.

 

Loss는 모델의 결과가 실제 결과와 차이가 있는지를 보는 지표

로스를 작게 맞추는게 학습의 목표이다.

학습이 제대로 되게 하려면 문제 유형에 맞게 LOSS를 지정해줘야 한다.

분류문제에 적용한 결과 다음과 같이 나타난다.

하지만 분류문제에선 loss보다 사람이 보기 더 좋은 평가지표가 있다. 바로 정확도이다.

정확도가 0이면 다 틀린 것이다. 1에 가까울수록 정확도가 높은 것

분류문제는 회귀문제보다 어렵다

확률개념이 쓰이기 때문이다.

 

범주형 데이터를 확률의 개념과 연관지어 생각하면 확률이란 개념에 다가서기 쉽다.


import tensorflow as tf
import pandas as pd

df = pd.read_csv("https://raw.githubusercontent.com/blackdew/tensorflow1/master/csv/iris.csv")
df.head()

# one hot encoding
df = pd.get_dummies(df)
df.head()

df.columns

# 독립, 종속 변수 분리
독립 = df[['꽃잎길이', '꽃잎폭', '꽃받침길이', '꽃받침폭']]
종속 = df[['품종_setosa', '품종_versicolor',
       '품종_virginica']]
print(독립.shape, 종속.shape)
# 모델 구조 만들기
X  = tf.keras.layers.Input(shape=[4])
# 분류이므로 softmax사용
y = tf.keras.layers.Dense(3, activation='softmax')(X)
model = tf.keras.models.Model(X,y)
model.compile(loss='categorical_crossentropy',
              metrics='accuracy')
# 모델 학습하기_FIT
model.fit(독립,종속,epochs=200, verbose=0)
model.fit(독립,종속,epochs=10)

예측결과와 종속변수 데이터 비교하기

# Using Model
# 맨 뒤 5개
model.predict(독립[-5:])

array([[8.9337162e-05, 1.8595180e-01, 8.1395888e-01], [1.5478616e-04, 3.1026983e-01, 6.8957537e-01], [2.2494979e-04, 2.9168722e-01, 7.0808780e-01], [8.8395915e-05, 1.3387185e-01, 8.6603975e-01], [3.8285679e-04, 3.0820015e-01, 6.9141704e-01]], dtype=float32)

 

print(종속[-5:])

# 학습한 가중치 출력하기
# 2차원 표의 형태임
model.get_weights()

반응형