아이리스 데이터를 살펴보면 꽃잎과 꽃받침의 데이터를 가지고 품종을 예측하는 것이다.
이전에 예측했던 예제의 종속변수는 양적 데이터 였지만 아이리스 데이터의 종속 변수는 범주형 데이터 타입이다.
앞의 회귀와 어떤 차이가 있는지 코드로 살펴 보자.
#1.과거의 데이터를 준비합니다. 부분에서는 회귀에서 못보던 get_dummies 코드가 추가된 것을 알 수있다.
#2. 모델의 구조를 만듭니다. 부분에서는 종속변수의 갯수가 3개이고 activation 부분과 loss 부분이 달라진것을 알 수 있습니다 .
코드에 대해 알아 보기 전에 원-핫 인코딩에 대해 알아 봅시다.
원핫인코딩
범주형 자료는 수식으로 표현 할 수 없기 때문에 딥러닝 모델을 사용할 수없다.
원핫인코딩은 범주형 데이터를 1과 0의 데이터 바꿔주는 과정을 원핫 인코딩이라고 한다.
딥러닝 모델을 사용하기 위해서는 모든 범주형 데이터를 원-핫 인코딩 해줘야 한다.
판다스에서는 모든 범주형 데이터를 한번에 원-핫 인코딩 해주는 get_dummies 함수를 지원한다 .
위의 사진에서 위쪽 데이터 프레임에 원핫인코딩을 진행 시키면 아래 데이터 프레임처럼 변환 된다.
원-핫 인코딩으로 인해 독립변수는 그대로 4개이지만 종속변수는 3개로 변환되었다.
그로인해 종속 변수가 3개이므로 우리가 찾아야하는 수식은 3개가 되었다.
독립변수가 4개 종속변수가 3개이므로 아까 #2 X, Y 부분이 바뀐 4와 3으로 되어있었다.
Softmax
우리가 만드는 분류모델이 하는일은 분류를 추측하는 것이다.
우리는 위의 사진처럼 비가올 확률을 30%, 시험에 합격할 확률은 99%, 동전의 앞면이 나올 확률은 50% 이런식으로 확류로 분류를 추측한다.
분류모델이 분류를 추측하는 것도 사람이 표현하도록 확률로 표현해주는 도구가 sigmod 와 softmax 이다.
다시 데이터프레임을 보면서 이야기하면 빨간색 테두리 안의 숫자는 iris 데이터로 예측한 품종의 결과에 대한 확률이다.
그러므로 y1, y2, y3 수식에 softmax 함수를 사용하면 확률에대해 각 품종의 확률을 반환 받을 수 있다.
다시 2번의 코드를 보면 이제 마지막에 loss 부분과 accuracy 부분만 남았는데 ,
간단히 이해하면 회귀를 예측할때는 loss = ‘mse’를 사용하고 분류를 예측할 때
‘categorical_crossentropy’를 사용하면 된다. 그리고 loss는 0에 가까울수록 예측도가 좋은 것이다.
또 마지막에 metrics=’accuracy’ 이부분은 그림에서 빨간색 테두리리 안에 있는 정확도를 표시해주는 파라미터라고 생각하면된다. 생략하고 싶다면 파라미터를 입력하지 않으면 된다.
마지막으로 코드를 살펴 보자 .
아이리스 품종 예측 실습
# 라이브러리 사용
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()
# 독립변수와 종속변수 분리.
독립 = 인코딩.iloc[:,:4]
종속 = 인코딩.iloc[:,4:]
print(독립변수.shape,종속변수.shape)
(150, 4) (150, 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' 를 입력하면 오류가 발생해서 빼고 진행했다 ㅠ
# 3.데이터로 모델을 학습(FIT)합니다.
model.fit(독립, 종속, epochs=1000, verbose=0)
model.fit(독립, 종속, epochs=10)
# 모델을 이용합니다.
model.predict(독립[0:5])
print(종속[0:5])
독립변수를 입력하면 거의 setosa를 1에 가까운 값으로 예측하고 있음을 알 수 있다.
# weights & bias 출력
print(model.get_weights())
'데이터 분석 > 코딩야학' 카테고리의 다른 글
코딩야학 - 데이터 전처리, 효율높은 모델링 (0) | 2020.08.24 |
---|---|
코딩야학 - 히든레이어 (0) | 2020.08.24 |
코딩야학 - 보스턴 집값 예측 (2) | 2020.08.20 |
코딩야학-레모네이드 판매 예측 실습 (0) | 2020.08.20 |
코딩야학-지도 학습 (0) | 2020.08.19 |