본문 바로가기
[인공지능]

[TensorFlow] 지도학습 전체과정 3 (Feat. 딥러닝)

by Hevton 2020. 12. 15.
반응형

이번 실습은 실습 1, 2의 '회귀' 방식과는 다른 '분류' 방식입니다.

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

종속변수가 양적 데이터이면 회귀, 범주형 데이터이면 분류 알고리즘을 사용합니다.

이렇게 문제의 종류에 맞게 알고리즘을 사용해야합니다.

 

 

범주형 데이터에 대한 모델을 구성하기 위해, 모형인 퍼셉트론과 수식(퍼셉트론 = 구조 모형, 수식도 맞는 말인 것 같음)을 구상하다 보면

종속변수 값이 범주형이기 때문에 식으로 구성하는 데에 어려움을 마주하게 된다.

 

범주형 데이터는 수식에 사용할 수 있는 형태로 바꿔줘야 한다.

 

모든 범주들을 컬럼으로 만들어준다. 모든 값을 0으로 설정한 상태에서, 데이터의 순서에 맞게 값을 0에서 1로 바꿔줘서 표의 값들이 0 또는 1의 값으로 구성되게끔 해준다. 이렇게 범주형 데이터를 1과 0의 데이터로 바꿔주는 과정을 '원핫인코딩' 이라고 한다.

딥러닝 모델을 사용하기 위해서는 모든 범주형 변수를 원핫인코딩해줘야한다. 그리고 이것은 코드 한 줄로 가능하다.

이렇게 종속변수의 값을 0 또는 1로 해 주었으므로, 식의 결과도 이에 맞게 바꿔줘야한다.

( ' ex . x1w1 + x2w2 + x3w3 + x4w4 = y1 '의 수식의 결과의 범위를 0~1로 지정해줘야 하는 것 )

 

 

우리는 만드는 분류 모델이 하는 일은, 분류를 '추측' 하는 것이다.

이렇게 분류를 0과 1의 확률값으로 표현해주게 하는 것이 바로 Softmax이다.

Softmax : 분류를 비율로 예측하기 위해 사용함.

 

Softmax 같이, 퍼셉트론의 출력 형태를 지정해 주는 함수가 활성화 함수라고 한다.

퍼셉트론의 정확한 모형은 위와 같다. 최종 결과를 얻기 전에 활성화 함수를 거치게 되는데, 회귀 같은 경우는 y = x 함수를 거치므로, 거치지 않는다고 느끼는 것이다.

 

 

 

실습

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

---

# 1. 과거의 데이터를 준비한다.
파일경로 = 'https://raw.githubusercontent.com/blackdew/tensorflow1/master/csv/iris.csv'
아이리스 = pd.read_csv(파일경로)
아이리스.head()
꽃잎길이	꽃잎폭	꽃받침길이	꽃받침폭	품종
0	5.1	3.5	1.4	0.2	setosa
1	4.9	3.0	1.4	0.2	setosa
2	4.7	3.2	1.3	0.2	setosa
3	4.6	3.1	1.5	0.2	setosa
4	5.0	3.6	1.4	0.2	setosa

---

# 원핫인코딩
인코딩 = pd.get_dummies(아이리스)
인코딩.head()
꽃잎길이	꽃잎폭	꽃받침길이	꽃받침폭	품종_setosa	품종_versicolor	품종_virginica
0	5.1	3.5	1.4	0.2	1	0	0
1	4.9	3.0	1.4	0.2	1	0	0
2	4.7	3.2	1.3	0.2	1	0	0
3	4.6	3.1	1.5	0.2	1	0	0
4	5.0	3.6	1.4	0.2	1	0	0

---

# 컬럼명 얻어낼 때 유용ㅎ
print(인코딩.columns)
Index(['꽃잎길이', '꽃잎폭', '꽃받침길이', '꽃받침폭', '품종_setosa', '품종_versicolor',
       '품종_virginica'],
      dtype='object')

---

# 독립변수, 종속변수 분리
독립 = 인코딩[['꽃잎길이', '꽃잎폭', '꽃받침길이', '꽃받침폭']]
종속 = 인코딩[['품종_setosa', '품종_versicolor','품종_virginica']]
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)합니다. verbose=0 설정은 출력이 눈에 안보이게.
model.fit(독립, 종속, epochs=1000, verbose=0)
model.fit(독립, 종속, epochs=10)
Epoch 1/10
5/5 [==============================] - 0s 2ms/step - loss: 0.1522 - accuracy: 0.9600
Epoch 2/10
5/5 [==============================] - 0s 2ms/step - loss: 0.1524 - accuracy: 0.9667
Epoch 3/10
5/5 [==============================] - 0s 2ms/step - loss: 0.1520 - accuracy: 0.9600
Epoch 4/10
5/5 [==============================] - 0s 2ms/step - loss: 0.1520 - accuracy: 0.9600
Epoch 5/10
5/5 [==============================] - 0s 1ms/step - loss: 0.1520 - accuracy: 0.9667
Epoch 6/10
5/5 [==============================] - 0s 2ms/step - loss: 0.1519 - accuracy: 0.9667
Epoch 7/10
5/5 [==============================] - 0s 1ms/step - loss: 0.1515 - accuracy: 0.9600
Epoch 8/10
5/5 [==============================] - 0s 1ms/step - loss: 0.1517 - accuracy: 0.9600
Epoch 9/10
5/5 [==============================] - 0s 2ms/step - loss: 0.1520 - accuracy: 0.9667
Epoch 10/10
5/5 [==============================] - 0s 1ms/step - loss: 0.1513 - accuracy: 0.9600

---

# 모델을 이용/ 맨 앞 5개 출력
model.predict(독립[0:5])
array([[9.9931622e-01, 6.8379036e-04, 3.7454004e-08],
       [9.9712342e-01, 2.8762459e-03, 4.0995798e-07],
       [9.9860615e-01, 1.3937430e-03, 1.4475366e-07],
       [9.9573439e-01, 4.2648888e-03, 6.7179639e-07],
       [9.9942160e-01, 5.7840091e-04, 2.8364250e-08]], dtype=float32)

---

# 정답과 비교
종속[0:5]


품종_setosa	품종_versicolor	품종_virginica
0	1	0	0
1	1	0	0
2	1	0	0
3	1	0	0
4	1	0	0

---

# 학습한 가중치 / 편향 ( = 수식구성값들) 출력
model.get_weights()
[array([[ 0.7818587 , -0.07720096, -0.6534189 ],
        [ 2.8638961 ,  0.3299472 , -1.3522689 ],
        [-3.4076378 ,  0.50236946,  1.4556484 ],
        [-4.0547843 , -1.9089344 ,  2.2882714 ]], dtype=float32),
 array([ 1.4463296,  1.5059994, -1.6538583], dtype=float32)]

 

 

출처 - opentutorials.org/

반응형