ํผ๋ง์ธ๋์ธ์ ์ฐ๋ฆฌ๋๋ผ ์ฌ๋๊ณผ ๊ฐ์ ๋ฟ๋ฆฌ๋ฅผ ๊ฐ์ง ‘๋ชฝ๊ณจ๋ก์ด๋๊ณ’๋ก ์ฃผ์์ ์ฝฉ๊ณผ ํธ๋ฐ๊ฐ์ ์๋ฌผ์ด์๊ณ , ๋จน์ ๊ฒ์ ํญ์ ํ์กฑํ์ง ๋ชปํ๋ค. ์ด ๋๋ฌธ์ ๊ทธ๋ค์ ์กฐ๊ธ๋ง ๋จน์ด๋ ์ ์์กดํ ์ ์๋๋ก ๋ชธ์์ ์์์ ์ถ์ ํด ๋์ผ๋ ค๋ ์ ์ ์๋ฅผ ๊ฐ์ง๊ฒ ๋์๋ค.
๊ทธ๋ฌ๋ ๋ฏธ๊ตญ์ผ๋ก ์ด์ฃผํ๊ณ ์์ํ์ด ์๊ตฌํ๋๋ฉด์ ๋ชป ๋จน๋ ์ํฉ์ ์ ๋ฆฌํ๊ฒ ์ ์ํ ์ ์ ์๊ฐ ๋น๋ง์ ์ด๋ํด ๊ฐ์ข ์ฑ์ธ๋ณ์ ์ ๋ฐํ๋ค. ๊ทธ ํ ๊ทธ๋ค์ ์์, ๊ทธ ์์์ ์์๋ค๊น์ง ๋น๋ง, ๋น๋จ๋ณ ๋ฑ ์ฑ์ธ๋ณ ๋ฐ๋ณ๋ฅ ์ด ์ฆ๊ฐํ๊ธฐ ์์ํ๋ค.
ํผ๋ง์ธ๋์ธ์ ์ธ๊ณ์์ ๋น๋จ๋ณ ๋ฐ๋ณ๋ฅ ์ด ๊ฐ์ฅ ๋ง์ ์ข ์กฑ์ด ๋์๊ณ , ํผ๋ง ์กฑ์ ๋จ์ 63%, ์ฌ์ 70%๊ฐ ๋น๋จ๋ณ์ ๊ฑธ๋ ธ๋ค๋ ๋ณด๊ณ ๊ฐ ์ต๊ทผ ๋ฐํ๋๊ธฐ๋ ํ๋ค.
pima-indians-diabetes.csv : 768๋ช ์ ์ธ๋์ธ์ผ๋ก๋ถํฐ 8๊ฐ์ ์ ๋ณด์ 1๊ฐ์ ํด๋์ค๋ฅผ ์ถ์ถํ ๋ฐ์ดํฐ
• ์ํ ์: 768
• ์์ฑ: 8
- ์ ๋ณด 1 (pregnant): ๊ณผ๊ฑฐ ์์ ํ์
- ์ ๋ณด 2 (plasma): ํฌ๋๋น ๋ถํ ๊ฒ์ฌ 2์๊ฐ ํ ๊ณต๋ณต ํ๋น ๋๋(mm Hg)
- ์ ๋ณด 3 (pressure): ํ์ฅ๊ธฐ ํ์(mm Hg)
- ์ ๋ณด 4 (thickness): ์ผ๋๊ทผ ํผ๋ถ ์ฃผ๋ฆ ๋๊ป(mm)
- ์ ๋ณด 5 (insulin): ํ์ฒญ ์ธ์๋ฆฐ(2-hour, mu U/ml)
- ์ ๋ณด 6 (BMI): ์ฒด์ง๋ ์ง์(BMI, weight in kg/(height in m)2)
- ์ ๋ณด 7 (pedigree): ๋น๋จ๋ณ ๊ฐ์กฑ๋ ฅ
- ์ ๋ณด 8 (age): ๋์ด
• ํด๋์ค: ๋น๋จ(1), ๋น๋จ ์๋(0)
pandas๋ฅผ ํ์ฉํ ๋ฐ์ดํฐ ๋ถ์
import pandas as pd
# ํผ๋ง ์ธ๋์ธ ๋น๋จ๋ณ ๋ฐ์ดํฐ์
์ ๋ถ๋ฌ์ต๋๋ค. ๋ถ๋ฌ์ฌ ๋ ๊ฐ ์ปฌ๋ผ์ ํด๋นํ๋ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค.
df = pd.read_csv('../dataset/pima-indians-diabetes.csv',
names = ["pregnant", "plasma", "pressure", "thickness", "insulin", "BMI", "pedigree", "age", "class"])
read_csv() : csv ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ
csv ํ์ผ์๋ ๋ฐ์ดํฐ๋ฅผ ์ค๋ช ํ๋ ํ ์ค์ด ํ์ผ ๋งจ ์ฒ์์ ๋์ต๋๋ค. ์ด๋ฅผ ํค๋(header)๋ผ๊ณ ํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง csv ํ์ผ์๋ ํค๋๊ฐ ์์ต๋๋ค. ์ด์ names๋ผ๋ ํจ์๋ฅผ ํตํด ์์ฑ๋ณ ํค์๋๋ฅผ ์ง์ ํด ์ฃผ์์ต๋๋ค.
# ์ฒ์ 5์ค์ ๋ด
๋๋ค.
print(df.head(5))
# ๋ฐ์ดํฐ์ ์ ๋ฐ์ ์ธ ์ ๋ณด๋ฅผ ํ์ธํด ๋ด
๋๋ค.
print(df.info())
# ๊ฐ ์ ๋ณด๋ณ ํน์ง์ ์ข๋ ์์ธํ ์ถ๋ ฅํฉ๋๋ค.
print(df.describe())
๋ฐ์ดํฐ์ ์ผ๋ถ ์ปฌ๋ผ๋ง ๋ณด๊ณ ์ถ์ ๋, ์๋ฅผ ๋ค์ด ์์ ํ์(pregnant)์ ๋น๋จ๋ณ ๋ฐ๋ณ ์ฌ๋ถ(class)๋ง ํ์ธํด ๋ณด๊ณ ์ถ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ ๋ ฅํฉ๋๋ค.
# ๋ฐ์ดํฐ ์ค ์์ ์ ๋ณด์ ํด๋์ค ๋ง์ ์ถ๋ ฅํด ๋ด
๋๋ค.
print(df[['plasma', 'class']])
๋ฐ์ดํฐ ๊ฐ๊ณตํ๊ธฐ - ์์ ํ์๋น ๋น๋จ๋ณ ๋ฐ๋ณ ํ๋ฅ ๊ณ์ฐ
์ด ํ๋ก์ ํธ์ ๋ชฉ์ ์ ๋น๋จ๋ณ ๋ฐ๋ณ์ ์์ธกํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ๋ชจ๋ ์ ๋ณด๋ ๋น๋จ๋ณ ๋ฐ๋ณ๊ณผ ์ด๋ค ๊ด๊ณ๊ฐ ์๋์ง๋ฅผ ์ค์ ์ ๋์์ผ ํฉ๋๋ค.
print(df[[‘pregnant’,‘class’]].groupby([‘pregnant’], as_index=False).mean().sort_values(by=‘pregnant’, ascending=True))
๋จผ์ groupby() ํจ์๋ฅผ ์ฌ์ฉํด pregnant ์ ๋ณด๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ ์ ๊ทธ๋ฃน์ ๋ง๋ค์์ต๋๋ค.
as_index=False๋ pregnant ์ ๋ณด ์์ ์๋ก์ด ์ธ๋ฑ์ค(index)๋ฅผ ๋ง๋ค์ด ์ค๋๋ค.
mean() ํจ์๋ฅผ ์ฌ์ฉํด ํ๊ท ์ ๊ตฌํ๊ณ sort_values() ํจ์๋ฅผ ์จ์ pregnant ์ปฌ๋ผ์ ์ค๋ฆ์ฐจ์(ascending)์ผ๋ก ์ ๋ฆฌํ๊ฒ๋ ์ค์ ํ์์ต๋๋ค.
matplotlib๋ฅผ ์ด์ฉํด ๊ทธ๋ํ๋ก ํํํ๊ธฐ
matplotlib ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ข ๋ ์ ๊ตํ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฌ๊ฒ๋ ๋์์ฃผ๋
seaborn ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด ๊ฐ ์ ๋ณด๋ผ๋ฆฌ ์ด๋ค ์๊ด๊ด๊ณ๊ฐ ์๋์ง๋ฅผ ์์๋ณด๊ฒ ์ต๋๋ค.
import matplotlib.pyplot as plt
import seaborn as sns
# ๋ฐ์ดํฐ ๊ฐ์ ์๊ด๊ด๊ณ๋ฅผ ๊ทธ๋ํ๋ก ํํํด ๋ด
๋๋ค.
colormap = plt.cm.gist_heat #๊ทธ๋ํ์ ์์ ๊ตฌ์ฑ์ ์ ํฉ๋๋ค.
plt.figure(figsize=(12,12)) #๊ทธ๋ํ์ ํฌ๊ธฐ๋ฅผ ์ ํฉ๋๋ค.
# ๊ทธ๋ํ์ ์์ฑ์ ๊ฒฐ์ ํฉ๋๋ค. vmax์ ๊ฐ์ 0.5๋ก ์ง์ ํด 0.5์ ๊ฐ๊น์ธ ์๋ก ๋ฐ์ ์์ผ๋ก ํ์๋๊ฒ ํฉ๋๋ค.
sns.heatmap(df.corr(),linewidths=0.1,vmax=0.5, cmap=colormap, linecolor='white', annot=True)
plt.show()
heatmap() ํจ์๋ ๋ ํญ๋ชฉ์ฉ ์ง์ ์ง์ ๋ค ๊ฐ๊ฐ ์ด๋ค ํจํด์ผ๋ก ๋ณํํ๋์ง๋ฅผ ๊ด์ฐฐํ๋ ํจ์์ ๋๋ค.
๋ ํญ๋ชฉ์ด ์ ํ ๋ค๋ฅธ ํจํด์ผ๋ก ๋ณํํ๊ณ ์์ผ๋ฉด 0์, ์๋ก ๋น์ทํ ํจํด์ผ๋ก ๋ณํ ์๋ก 1์ ๊ฐ๊น์ด ๊ฐ์ ์ถ๋ ฅํฉ๋๋ค.
vmax๋ ์์์ ๋ฐ๊ธฐ๋ฅผ ์กฐ์ ํ๋ ์ธ์์ ๋๋ค.
cmap์ ๋ฏธ๋ฆฌ ์ ํด์ง matplotlib ์์์ ์ค์ ๊ฐ์ ๋ถ๋ฌ์ต๋๋ค.
์์ ์ค์ ๊ฐ์ https://matplotlib.org/users/colormaps.html์์ ํ์ธํ ์ ์์ต๋๋ค.
๋น๋จ๋ณ ๋ฐ๋ณ ์ฌ๋ถ๋ฅผ ๊ฐ๋ฆฌํค๋ class ํญ๋ชฉ์ ๋ณด๋ฉด pregnant๋ถํฐ age๊น์ง ์๊ด๋๊ฐ ์ซ์๋ก ํ์๋์ด ์๊ณ , ์ซ์๊ฐ ๋์์๋ก ๋ฐ์ ์์
๊ทธ๋ํ๋ฅผ ํตํด plasma ํญ๋ชฉ(๊ณต๋ณต ํ๋น ๋๋)์ด class ํญ๋ชฉ๊ณผ ๊ฐ์ฅ ์๊ด๊ด๊ณ๊ฐ ๋๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
์ฆ, ์ด ํญ๋ชฉ์ด ๊ฒฐ๋ก ์ ๋ง๋๋ ๋ฐ ๊ฐ์ฅ ์ค์ํ ์ญํ ์ ํ๋ค๋ ๊ฒ์ ์์ธกํ ์ ์์ต๋๋ค.
์ด์ plasma์ class ํญ๋ชฉ๋ง ๋ฐ๋ก ๋ผ์ด ๋ ํญ๋ชฉ ๊ฐ์ ๊ด๊ณ๋ฅผ ๊ทธ๋ํ๋ก ๋ค์ ํ๋ฒ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
grid = sns.FacetGrid(df, col='class')
grid.map(plt.hist, 'plasma', bins=10)
plt.show()
๋น๋จ๋ณ ํ์์ ๊ฒฝ์ฐ(class=1) plasma ํญ๋ชฉ์ ์์น๊ฐ 150 ์ด์์ธ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
์ด๋ ๊ฒ ๊ฒฐ๊ณผ์ ๋ฏธ์น๋ ์ํฅ์ด ํฐ ํญ๋ชฉ์ ๋ฐ๊ฒฌํ๋ ๊ฒ์ด ‘๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ๊ณผ์ ’์ ํ ์์ ๋๋ค.
๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ๊ณผ์ ์ ๋ฅ๋ฌ๋์ ๋น๋กฏํ์ฌ ๋ชจ๋ ๋จธ์ ๋ฌ๋์ ์ฑ๋ฅ ํฅ์์ ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ๊ณผ์ ์ ๋ชจ์์ง ๋ฐ์ดํฐ์ ๋น ์ง ๊ฐ์ด ์๋ค๋ฉด ํ๊ท ์ด๋ ์ค์๊ฐ์ผ๋ก ๋์นํ๋ ๋ฑ์ ๊ณผ์ , ์ ํ ๊ด๊ณ์๋ ์ด์ ๋ฐ์ดํฐ๊ฐ ๋ผ์ด ์์ง๋ ์์์ง๋ฅผ ์ ๊ฒํ๋ ๊ณผ์ ๋ฑ์ด ํฌํจ๋ฉ๋๋ค. SVM, RF๋ฑ์ ๋จธ์ ๋ฌ๋ ๊ธฐ๋ฒ์ ์ค์ํ ์์ฑ์ ๋ฝ์ ๋ด๋ Feature extraction ๊ณผ์ ๋ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ์ ํฌํจํ์ง๋ง, ๋ฅ๋ฌ๋์ ์ค์ํ ์์ฑ์ ๋ด๋ถ์ ์ผ๋ก ๋ฝ์๋ด๋ฏ๋ก ์ด ๊ณผ์ ์ ํ์ ์์ต๋๋ค.
keras ๋ก ๋น๋จ๋ณ ์์ธก ์คํ
# ๋ฅ๋ฌ๋์ ๊ตฌ๋ํ๋ ๋ฐ ํ์ํ ์ผ๋ผ์ค ํจ์๋ฅผ ๋ถ๋ฌ์ต๋๋ค.
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
# ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ถ๋ฌ์ต๋๋ค.
import numpy
import tensorflow as tf
# ์คํํ ๋๋ง๋ค ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํด ์ค์ ํ๋ ๋ถ๋ถ์
๋๋ค.
numpy.random.seed(3)
tf.random.set_seed(3)
# ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ ์ต๋๋ค.
dataset = numpy.loadtxt("../dataset/pima-indians-diabetes.csv", delimiter=",")
X = dataset[:,0:8]
Y = dataset[:,8]
# ๋ชจ๋ธ์ ์ค์ ํฉ๋๋ค.
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# ๋ชจ๋ธ์ ์ปดํ์ผํฉ๋๋ค.
model.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy'])
# ๋ชจ๋ธ์ ์คํํฉ๋๋ค.
model.fit(X, Y, epochs=200, batch_size=10)
# ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
print("\n Accuracy: %.4f" % (model.evaluate(X, Y)[1]))
seed ๊ฐ์ ์ค์ ํ๋ค๋ ๊ฒ์ ๊ทธ ๋๋ค ํ ์ด๋ธ ์ค์์ ๋ช ๋ฒ์งธ ํ ์ด๋ธ์ ๋ถ๋ฌ์ ์ธ์ง๋ฅผ ์ ํ๋ ๊ฒ์ ๋๋ค.
๋ฐ๋ผ์ seed ๊ฐ์ด ๊ฐ์ผ๋ฉด ๋๊ฐ์ ๋๋ค ๊ฐ์ ์ถ๋ ฅํฉ๋๋ค.
์ง๊ธ ์ฐ๋ฆฌ๊ฐ ๋ณด๊ณ ์๋ ์ฝ๋์ฒ๋ผ ๋ํ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด์ ํ ์ํ๋ก ๊ธฐ๋ฐ์ผ๋ก ๋ฅ๋ฌ๋์ ๊ตฌํํ ๋๋ ์ผ์ ํ ๊ฒฐ๊ด๊ฐ์ ์ป๊ธฐ ์ํด ๋ํ์ด seed ๊ฐ๊ณผ ํ ์ํ๋ก seed ๊ฐ์ ๋ชจ๋ ์ค์ ํด์ผ ํฉ๋๋ค
(๋จ, seed ๊ฐ์ ์ด๋ ๊ฒ ์ง์ ํด๋ ์ฌ์ ํ ์ถ๋ ฅ ๊ฐ์ด ๋ฏธ์ธํ๊ฒ ๋ค๋ฅผ ์ ์์ต๋๋ค. ์ด๋ ํ ์ํ๋ก๋ฅผ ๊ตฌ๋์ํค๋ cuDNN ๋ฑ์ ๋ด๋ถ ์ํํธ์จ์ด๊ฐ ์์ฒด์ ์ผ๋ก ๋ ๋ค๋ฅธ ๋๋ค ํ ์ด๋ธ์ ์์ฑํ๊ธฐ ๋๋ฌธ์ธ๋ฐ, ํ์ฌ ์ด ๋ถ๋ถ์ seed ๊ฐ์ ์ง์ ํ ๋ฐฉ๋ฒ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ ์ต์ข ๋ฅ๋ฌ๋ ๊ฒฐ๊ณผ๋ ์ฌ๋ฌ ๋ฒ ์คํํ์ฌ ํ๊ท ์ ๊ตฌํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ ์ ํฉ๋๋ค)
๋ฅ๋ฌ๋ ๋ชจ๋ธ์ ์๋์ธต์ ํ๋ ๋ ์ถ๊ฐ, ์ธต์ ์ถ๊ฐํ ๋๋ model.add() ํจ์๋ฅผ ์ด์ฉํด ์๋ก์ด ์ค์ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
๋ ์ค ํ๋๋ฅผ ๊ฒฐ์ ํ๋ ์ดํญ ๋ถ๋ฅ(binary classification) ๋ฌธ์ ์ด๋ฏ๋ก ์ค์ฐจ ํจ์๋ binary_crossentropy๋ฅผ ์ฌ์ฉํ๊ณ , ์ต์ ํ ํจ์๋ก adam์ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ ์ฒด ์ํ์ด 200๋ฒ ๋ฐ๋ณตํด์ ์ ๋ ฅ๋ ๋๊น์ง ์คํ์ ๋ฐ๋ณตํฉ๋๋ค.
ํ ๋ฒ์ ์ ๋ ฅ๋๋ ์ ๋ ฅ ๊ฐ์ 10๊ฐ๋ก ํ๊ณ ์ข ํฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ํ๋ก๊ทธ๋จ์ด ์์ฑ๋ฉ๋๋ค.
- 0s 109us/sample - loss: 0.5015 - accuracy: 0.7253
Accuracy: 0.7253
์ฝ 72.53%์ ์์ธก ์ ํ๋