ํ์ ์์ ํ์์ ์์กด์จ ์์ธกํ๊ธฐ
์ ์ฒด ์ฝ๋
# -*- coding: utf-8 -*-
# ์ฝ๋ ๋ด๋ถ์ ํ๊ธ์ ์ฌ์ฉ๊ฐ๋ฅ ํ๊ฒ ํด์ฃผ๋ ๋ถ๋ถ์
๋๋ค.
# ๋ฅ๋ฌ๋์ ๊ตฌ๋ํ๋ ๋ฐ ํ์ํ ์ผ๋ผ์ค ํจ์๋ฅผ ๋ถ๋ฌ์ต๋๋ค.
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
# ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ถ๋ฌ์ต๋๋ค.
import numpy as np
import tensorflow as tf
# ์คํํ ๋๋ง๋ค ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํด ์ค์ ํ๋ ๋ถ๋ถ์
๋๋ค.
np.random.seed(3)
tf.random.set_seed(3)
# ์ค๋น๋ ์์ ํ์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ๋ค์
๋๋ค.
Data_set = np.loadtxt("../dataset/ThoraricSurgery.csv", delimiter=",")
# ํ์์ ๊ธฐ๋ก๊ณผ ์์ ๊ฒฐ๊ณผ๋ฅผ X์ Y๋ก ๊ตฌ๋ถํ์ฌ ์ ์ฅํฉ๋๋ค.
X = Data_set[:,0:17]
Y = Data_set[:,17]
# ๋ฅ๋ฌ๋ ๊ตฌ์กฐ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค(๋ชจ๋ธ์ ์ค์ ํ๊ณ ์คํํ๋ ๋ถ๋ถ์
๋๋ค).
model = Sequential()
model.add(Dense(30, input_dim=17, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# ๋ฅ๋ฌ๋์ ์คํํฉ๋๋ค.
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X, Y, epochs=100, batch_size=10)
model ํจ์ : ๋ชจ๋ธ์ ์ค์ ํ๊ณ ๊ตฌ๋ (= ๋ฅ๋ฌ๋์ ๊ตฌ์กฐ)
model = Sequential() : ๋ฅ๋ฌ๋์ ๊ตฌ์กฐ๋ฅผ ์ง๊ณ ์ธต์ ์ค์ ํ๋ ๋ถ๋ถ
model.compile() :์ปดํ์ผ
model.fit() : ๋ชจ๋ธ์ ์ค์ ๋ก ์ํ
์ ๋ ฅ์ธต ์ถ๋ ฅ์ธต ์๋์ธต
model = Sequential()
model.add(Dense(30, input_dim=17, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
๋ฅ๋ฌ๋ = ํผ์ ํธ๋ก ์์ ํผ์ ํธ๋ก ์ธต์ ์ฐจ๊ณก์ฐจ๊ณก ์ถ๊ฐํ๋ ํํ
Sequential()ํจ์๋ฅผ model๋ก ์ ์ธํ๊ณ model.add() - ์๋ก์ด ์ธต ์ถ๊ฐ
์ ์ฝ๋๋ ๋๊ฐ์ ์ธต์ ๊ฐ์ง ๋ชจ๋ธ์ ๋ง๋ ๊ฒ์ด๋ค
๋งจ ๋ง์ง๋ง ์ธต = ์ถ๋ ฅ์ธต (๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค.) ๋๋จธ์ง = ์๋์ธต
๊ฐ๊ฐ์ ์ธต์ Denseํจ์๋ก ๊ตฌ์ฒด์ ๊ตฌ์กฐ๋ฅผ ๊ฒฐ์ , ๋ช ๊ฐ์ ๋ ธ๋๋ฅผ ๋ง๋ค๊ฒ์ธ์ง
model.add(Dense(30, input_dim=17, activation='relu'))
: 30๊ฐ์ ๋ ธ๋๋ฅผ ๋ง๋ค๊ฒ ๋ค
: input_dim = ์ ๋ ฅ ๋ฐ์ดํฐ์์ ๋ช ๊ฐ์ ๊ฐ์ ๊ฐ์ ธ์ฌ ๊ฒ์ธ๊ฐ?
::: ๋ฐ์ดํฐ์์ 17๊ฐ์ ๊ฐ์ ๋ฐ์ ์๋์ธต์ผ๋ก 30๊ฐ์ ๋ ธ๋๋ฅผ ๋ณด๋ธ๋ค
- keras๋ ์ ๋ ฅ์ธต์ ๋ฐ๋ก ๋ง๋๋ ๊ฒ์ด ์๋๋ผ, ์ฒซ ๋ฒ์งธ ์๋์ธต์ input_dim ๋ฅผ ์ ์ => ์ฒซ๋ฒ์งธ Dense๊ฐ ์๋์ธต+์ ๋ ฅ์ธต ์ญํ
- ๋๋ฒ์งธ Dense๋ ์ถ๋ ฅ์ธต์ ์๋ฏธ
์๋์ธต์ ๊ฐ ๋ ธ๋๋ 17๊ฐ์ ์ ๋ ฅ ๊ฐ์์ ์์์ ๊ฐ์ค์น๋ฅผ ๊ฐ์ง๊ณ ๊ฐ ๋ ธ๋๋ก ์ ์ก๋์ด ํ์ฑํ ํจ์๋ฅผ ๋ง๋๋ค
๊ทธ๋ฆฌ๊ณ ํ์ฑํ ํจ์๋ฅผ ๊ฑฐ์น ๊ฒฐ๊ด๊ฐ์ด ์ถ๋ ฅ์ธต์ผ๋ก ์ ๋ฌ๋๋ค.
activation๋ถ๋ถ์ ์ํ๋ ํ์ฑํ ํจ์ ์ ๊ธฐ (๋ ๋ฃจ)
์ถ๋ ฅ์ธต : model.add(Dense(1, activation='sigmoid'))์ถ๋ ฅ์ธต์ ๋ ธ๋ ์๋ 1 (์ถ๋ ฅ๊ฐ์ ํ๋๋ก ์ ํด์ ๋ณด์ฌ ์ค์ผ ํ๋ฏ๋ก)์ด ๋ ธ๋์์ ์ ๋ ฅ ๋ฐ์ ๊ฐ ์ญ์ ํ์ฑํ ํจ์๋ฅผ ๊ฑฐ์ณ ์ต์ข ์ถ๋ ฅ ๊ฐ์ผ๋ก ๋์์ผ ํจ (์๊ทธ๋ชจ์ด๋ ์ฌ์ฉ)
๋ชจ๋ธ ์ปดํ์ผ
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
- ์ด๋ค ์ค์ฐจํจ์ ์ฌ์ฉํ ์ง ์ ํ๋ค
- (ํ๊ท ์ ๊ณฑ ์ค์ฐจ ํจ์ ์ฌ์ฉ - ์๋ ดํ๊ธฐ๊น์ง ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆผ/// ๊ต์ฐจ ์ํธ๋กํผ ๊ณ์ด์ ํจ์๋ ์ฌ์ฉ ๊ฐ๋ฅ)
- ์ต์ ํ ์ํ ๋ฐฉ๋ฒ ๊ฒฐ์
- metrics() ์ปดํ์ผ๋ ๋ ๋ชจ๋ธ ์ํ ๊ฒฐ๊ณผ ๋ํ๋๊ฒ๋ ์ค์
- ์ ํ๋ ์ธก์ ์ ์ฌ์ฉ๋๋ ํ ์คํธ ์ํ์ ํ์ต ๊ณผ์ ์์ ์ ์ธ์ํด์ผ๋ก์จ ๊ณผ์ ํฉ ๋ฌธ์ ๋ฐฉ์ง
๊ต์ฐจ ์ํธ๋กํผ
์ฃผ๋ก ๋ถ๋ฅ ๋ฌธ์ ์์ ์ฌ์ฉ
ํนํ, ์์ธก ๊ฐ์ด ์ฐธ.๊ฑฐ์ง ๋ ์ค ํ๋ ์ผ ๋ ์ดํญ ๊ต์ฐจ ์ํธ๋กํผ (binary crossentropy) ์ฌ์ฉ ( ์ฌ๋ง(0),์์กด(1) ๋ ์ค ํ๋)
๋ฅ๋ฌ๋ ๊ด๋ จ keras์์ ๋ง์ด ์ฌ์ฉ๋๋ ์ค์ฐจ ํจ์
๋ชจ๋ธ ์คํํ๊ธฐ
model.fit(X, Y, epochs=100, batch_size=10)
model.fit() ์ปดํ์ผ ๋จ๊ฒ์์ ์ ํด์ง ํ๊ฒฝ์ ์ฃผ์ด์ง ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ ์คํ์ํฌ ๋ ์ฌ์ฉ๋๋ ํจ์
1 epoch (์ํฌํฌ) = ํ์ต ํ๋ก์ธ์ค๊ฐ ๋ชจ๋ ์ํ(์ฒซ๋ฒ์งธํ์,๋๋ฒ์งธ ํ์....)์ ๋ํด ํ ๋ฒ ์คํ๋๋ ๊ฒ
epochs = 100 ๊ฐ ์ํ์ด ์ฒ์๋ถํฐ ๋๊น์ง 100๋ฒ ์ฌ์ฌ์ฉ๋ ๋๊น์ง ์คํ ๋ฐ๋ณต
batch size = ์ํ์ ํ ๋ฒ์ ๋ช ๊ฐ์ฉ ์ฒ๋ฆฌํ ๊ฒ์ธ๊ฐ?
10 : ์ ์ฒด 470๊ฐ์ ์ํ์ 10๊ฐ์ฉ ๋์ด์ ์ง์ด๋ฃ์ด๋ผ
๋๋ฌด ํฌ๋ฉด ํ์ต ์๋๊ฐ ๋๋ ค์ง๊ณ ๋๋ฌด ์์ผ๋ฉด ๊ฐ ์คํ ๊ฐ์ ํธ์ฐจ๊ฐ ์๊ฒจ ์ ์ฒด ๊ฒฐ๊ด๊ฐ์ด ๋ถ์์
์์ ์ ์ปดํจํฐ๊ฐ ๊ฐ๋นํ ๋งํผ์ batch size๋ก ์ค์ !
์คํ๊ฒฐ๊ณผ