Study/생활코딩 머신러닝야학

[생활코딩 머신러닝야학] 텐서플로우 Day4

growingtree 2020. 8. 26. 19:59

출처 : https://ml.yah.ac/

 

9. 세번째 딥러닝- 아이리스 품종 분류 

https://www.opentutorials.org/module/4966/28987

 

세번째 딥러닝 - 아이리스 품종 분류 - Tensorflow 1

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

www.opentutorials.org

요약정리

1. 아이리스 품종 분류

iris.csv 데이터셋의 일부 

iris데이터를 살펴봤을 때, '꽃잎길이', '꽃잎폭', '꽃받침길이', '꽃받침폭'을 독립변수로 두고 '품종'을 종속변수로 설정한다. 이전(lemonade, boston)에는 종속변수가 수치형 변수였는데, iris 데이터는 종속변수가 '품종' 으로 숫자가 아니고 범주형 데이터이다.

우리가 모델의 종류를 회귀와 분류로 나누는 기준은 종속변수의 데이터타입이다. 그래서 종속변수가 양적(수치형)이면 회귀(regression)모델을 사용하고 범주형이면 분류(classification)모델을 사용한다.

 

이전과 같은 과정으로 반복한다. 

1. 과거의 데이터를 준비한다

2. 모델의 구조를 만든다.

3. 데이터로 모델을 학습(fit)한다

4. 모델을 이용한다. 

import pandas as pd
import tensorflow as tf

#과거의 데이터를 준비한다. 
iris = pd.read_csv("iris.csv")
iris = pd.get_dummies(iris)

independ = iris[['꽃잎길이','꽃잎폭','꽃받침길이','꽃받침폭']]
depend = iris[['품종']]
print(independ.shape, depend.shape)

#모델의 구조를 만든다.
X= tf.keras.layers.Input(shape=[4])
Y= tf.keras.layers.Dense(3, activation='softmax')(X)
model = tf.keras.models.Model(X,Y)
model.complie(loss='categorical_crossentropy')

#데이터로 모델을 학습(fit)한다.
model.fit(independ,depend,epochs=100)

#모델을 이용한다.
print("Prediction:",model.predict(independ[0:5]))

모델의 구조를 만들 때 회귀모델과 조금 다른 것을 체크해야한다. 

 

2. 원핫인코딩

iris 데이터를 가지고 퍼셉트론을 만들어보자. 퍼셉트론을 만든 후 수식으로 표현해보면,, iris 데이터의 종속변수 (범주형 데이터)는 수식에 쓸 수 가 없다. 

범주형 데이터를 수식을 표현하기 위해 약간의 수정작업을 거친다.

 

1. 모든 범주를 칼럼으로 만든다. 

2. 모든 값이 0인 상태에서 첫번째 데이터가 setosa면 1로 바꿔주고, 두번째 데이터가 virginica면 1로 바꿔준다,

3 나머지 데이터도 마찬가지로 0과 1로 표현해준다.

 

이렇게 0과 1로 표시해주는 것을 원핫인코딩이라고 한다.

범주형 데이터를 원핫인코딩을 통해 숫자형태로 바꿔주는것이다.

또 범주형 칼럼은 1개가 아니고 여러개일 수 도 있다. iris 데이터도 setosa, virginica, versicolor 이렇게 총 3개의 범주형 칼럼으로 표현할 수 있다. 

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

pandas library 에서 한줄의 코드만 작성하면 원핫인코딩이 가능하다!

pd.get_dummies(dataset_name)

독립변수가 4개이니 입력층은 4개다.

종속변수의 개수가 '품종' 1개에서 '품종.setosa' , '품종.virginica' , '품종.versicolor' 3개로 늘어났다. 

setosa인지 아닌지 판별하는 출력수식 1개

veriginca 인지아닌지 판별하는 출력수식 1개 

veriscolor 인지 아닌지 판별하는 출력수식 1개

그러므로 위의 그림처럼 출력값이 3개로(y1, y2, y3) 늘어난 것이다   

3. 소프트맥스 

분류모델이 하는 일은 '분류를 추측'하는 일이다. 분류를 추측하는 건 어떻게 표현할까?

"비가 올 확률 30%야." , "이번 시험에 합격할 확률은 90%야~"

우리는 0에서 100사이의 확률값으로 분류를 표현한다.

 

분류모델이 분류를 추측하는 것도 확률로 표현해주는게 좋지 않을까?

그렇게 확률로 보여주는 함수가 바로 sigmoidsoftmax인데, 그 중 우리는 softmax를 사용할 것이다.

분류를 위해 softmax 함수를 사용한다는 것만 알아두면 된다.

 

* sigmoid 와 softmax의 차이를 추가로 공부해보기.(추후 수정)

 

위의 그림을 참고해서 보면, 첫번째 행에서 setosa가 1이고 나머지가 0인 경우이므로 setosa일 확률이 100%이다.

두번째 행에 setosa 일 확률이 0.7 이고 virginica일 확률이 0.3 이면 setosa일 확률이 70%이고, virginica일 확률이 30%이다.

밑의 퍼셉트론 수식을 보면 y가 가질 수 있는 값의 범위는 -무한대 부터 +무한대 까지이다. 하지만 우리는 분류문제를 '확률값'으로 예측하고 싶었다. 그러므로, y가 가질 수 있는 값의 범위를 -무한대에서 +무한대가 아니라 0부터 1까지로 변경해야한다. 

분류예측값을 확률로 보여주는 함수가 바로 softmax 함수라고 했으니 퍼셉트론의 수식을 softmax로 감싸준다. 

 

회귀에서는 결과를 내기 전 수식을 감싸는 함수가 없었는데 그 이유는 입력값을 그대로 출력값으로 나오는 (y=x) identity 함수 때문이다. 즉 우리는 회귀모델에 identity가 잇었다고 재정의가 할 수 있다.

이런 함수(identity, softmax)의 역할은 퍼셉트론의 출력이 어떤 형태로 나가는지 조절하는 역할이다.

이러한 함수를 활성함수(activation function) 이라고 부른다.

 

loss는출력이 내놓은 결과가 실제 정답과 얼마나 차이가 있는지 보는 것이다. 즉 loss를 작게 만드는 것이 학습의 목표이다. 학습이 제대로 되게하려면 문제의 유형에 맞게 loss를 잘 지정해야한다. 문제에 따라 loss를 다르게 지정해야하는 것 정도만 알면 된다. 분류에 사용하는 loss는 cross entropy 이고 회귀에서 사용되는 loss 는 mse라고 이해하면 된다.

여기서 하나만 더 나가면 분류에서 더 자주 사용되는 부분 중 metrics = accuracy 하면 더 사람이 잘 보기 쉬움

 

4. 실습

import tensorflow as tf
import pandas as pd 
iris= pd.read_csv("iris.csv")
iris.head() 
encoding = pd.get_dummies(iris)
encoding.head() 

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")
model.fit(independ, depend, epochs=100) 

 

accuracy가 변하지 않더라도 loss 가 변하면 학습이 되고 있는 것이다.

model.predict(independ[-5:]) # 맨 끝에서부터 5번째까지 
print(depend[-5:]) # 진짜 정답데이터

model.get_weights() #학습한 가중치 출력

 

반응형