import pandas as pd
df = pd.read_csv(’../dataset/sonar.csv’, header=None)
print(df.info())
Range Index: 208 entries,0 to 207 |
|||
Data columns (total 61 columns): |
|||
0 |
208 |
non-null |
float64 |
1 |
208 |
non-null |
float64 |
… |
… |
… |
… |
59 |
208 |
non-null |
float64 |
60 |
208 |
non-null |
object |
Dtypes: float64(60), object(1) |
|||
memory usage: 99.2+ KB |
Index๊ฐ 208๊ฐ์ด๋ฏ๋ก ์ด ์ํ์ ์๋ 208๊ฐ์ด๊ณ , ์ปฌ๋ผ ์๊ฐ 61๊ฐ์ด๋ฏ๋ก 60๊ฐ์ ์์ฑ๊ณผ 1๊ฐ์ ํด๋์ค๋ก ์ด๋ฃจ์ด์ ธ ์์
๋ชจ๋ ์ปฌ๋ผ์ด ์ค์ํ(float64)์ธ๋ฐ, ๋งจ ๋ง์ง๋ง ์ปฌ๋ผ๋ง ๊ฐ์ฒดํ์ธ ๊ฒ์ผ๋ก ๋ณด์,
๋ง์ง๋ง์ ๋์ค๋ ์ปฌ๋ผ์ ํด๋์ค์ด๋ฉฐ ๋ฐ์ดํฐํ ๋ณํ์ด ํ์ํ ๊ฒ์ ์ ์ ์์
from keras.models import Sequential
from keras.layers.core import Dense
from sklearn.preprocessing import LabelEncoder
import pandas as pd
import numpy
import tensorflow as tf
# seed ๊ฐ ์ค์
numpy.random.seed(3)
tf.random.set_seed(3)
# ๋ฐ์ดํฐ ์
๋ ฅ
df = pd.read_csv('../dataset/sonar.csv', header=None)
'''
# ๋ฐ์ดํฐ ๊ฐ๊ด ๋ณด๊ธฐ
print(df.info())
# ๋ฐ์ดํฐ์ ์ผ๋ถ๋ถ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ
print(df.head())
'''
dataset = df.values
X = dataset[:,0:60]
Y_obj = dataset[:,60]
# ๋ฌธ์์ด ๋ณํ
e = LabelEncoder()
e.fit(Y_obj)
Y = e.transform(Y_obj)
# ๋ชจ๋ธ ์ค์
model = Sequential()
model.add(Dense(24, input_dim=60, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# ๋ชจ๋ธ ์ปดํ์ผ
model.compile(loss='mean_squared_error',
optimizer='adam',
metrics=['accuracy'])
# ๋ชจ๋ธ ์คํ
model.fit(X, Y, epochs=200, batch_size=5)
# ๊ฒฐ๊ณผ ์ถ๋ ฅ
print("\n Accuracy: %.4f" % (model.evaluate(X, Y)[1]))
Accuracy: 1.0000
์ ๋ง๋ก 100% ์ ํ๋์ ๋ชจ๋ธ์ด ๋ง๋ค์ด์ง ๊ฒ์ผ๊น?
๊ณผ์ ํฉ(overfitting) : ๋ชจ๋ธ์ด ํ์ต ๋ฐ์ดํฐ์ ์์์๋ ์ผ์ ์์ค ์ด์์ ์์ธก ์ ํ๋๋ฅผ ๋ณด์ด์ง๋ง, ์๋ก์ด ๋ฐ์ดํฐ์ ์ ์ฉํ๋ฉด ์ ๋ง์ง ์๋ ๊ฒ
์์ ํ ์๋ก์ด ๋ฐ์ดํฐ์ ์ ์ฉํ๋ฉด ์ด ์ ์ ํตํด ์ ํํ ๋ ๊ทธ๋ฃน์ผ๋ก ๋๋์ง ๋ชปํ๊ฒ ๋๋ค
์ด๋ก์ ์ ์ ๊ณผ์ ํฉ๋ ๋ชจ๋ธ์, ๊ฒ์์ ์ ์ ์ผ๋ฐ ๋ชจ๋ธ์ ๋ํ๋ธ๋ค.
๊ณผ์ ํฉ์ ์ธต์ด ๋๋ฌด ๋ง๊ฑฐ๋ ๋ณ์๊ฐ ๋ณต์กํด์ ๋ฐ์ํ๊ธฐ๋ ํ๊ณ ํ ์คํธ์ ๊ณผ ํ์ต์ ์ด ์ค๋ณต๋ ๋ ์๊ธฐ๊ธฐ๋ ํ๋ค.
๊ณผ์ ํฉ์ ๋ฐฉ์งํ๋ ค๋ฉด ?
1. ํ์ต์ ํ๋ ๋ฐ์ดํฐ์ ๊ณผ ์ด๋ฅผ ํ ์คํธํ ๋ฐ์ดํฐ์ ์ ์์ ํ ๊ตฌ๋ถํ ๋ค์ ํ์ต๊ณผ ๋์์ ํ ์คํธ๋ฅผ ๋ณํํ๋ฉฐ ์งํ
์๋ฅผ ๋ค์ด, ๋ฐ์ดํฐ์ ์ด ์ด 100๊ฐ์ ์ํ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ ๊ฐ์ ์ ์ผ๋ก ๋๋๋๋ค.
70๊ฐ ์ํ์ ํ์ต์ ์ผ๋ก |
30๊ฐ ์ํ์ ํ ์คํธ์ ์ผ๋ก |
์ ๊ฒฝ๋ง์ ๋ง๋ค์ด 70๊ฐ์ ์ํ๋ก ํ์ต์ ์งํํ ํ ์ด ํ์ต์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅ=‘๋ชจ๋ธ’
๋ชจ๋ธ์ ๋ค๋ฅธ ์ ์ ์ ์ฉํ ๊ฒฝ์ฐ ํ์ต ๋จ๊ณ์์ ๊ฐ์ธ๋์๋ ๊ทธ๋๋ก ๋ค์ ์ํ, ๋ฐ๋ผ์ ๋๋จธ์ง 30๊ฐ์ ์ํ๋ก ์คํํด์ ์ ํ๋๋ฅผ ์ดํด๋ณด๋ฉด ํ์ต์ด ์ผ๋ง๋ ์ ๋์๋์ง๋ฅผ ์ ์ ์์
๋ฅ๋ฌ๋ ๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ ์ถฉ๋ถํ ์กฐ์ ํ์ฌ ๊ฐ์ฅ ๋์ ๋ชจ๋ธ์ด ๋ง๋ค์ด์ง๋ฉด, ์ด๋ฅผ ์ค์ํ์ ๋์ ํ์ฌ ํ์ฉํ๋ ๊ฒ์ด ๋ฐ๋ก ๋จธ์ ๋ฌ๋์ ๊ฐ๋ฐ ์์
๊ทธ๋ฐ๋ฐ ์ง๊ธ๊น์ง ์ฐ๋ฆฌ๋ ํ ์คํธ์ ์ ๋ง๋ค์ง ์๊ณ ํ์ตํด ์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ๋ ๋งค๋ฒ ์ฐ๋ฆฌ๋ ์ ํ๋(Accuracy)๋ฅผ ๊ณ์ฐํ ์ ์์์ง์. ์ด์งธ์ ๊ฐ๋ฅํ์๊น์? ์ง๊ธ๊น์ง ํ์ต ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํด ์ ํ๋๋ฅผ ์ธก์ ํ ๊ฒ์ ๋ฐ์ดํฐ์ ๋ค์ด์๋ ๋ชจ๋ ์ํ์ ๊ทธ๋๋ก ํ ์คํธ์ ํ์ฉํ ๊ฒฐ๊ณผ์ ๋๋ค.
ํ์ต์ ์ฌ์ฉ๋ ์ํ์ ํ ์คํธ์ ์ธ ์ ์์ผ๋ฏ๋ก ํ์ต ๋จ๊ณ์์ ํ ์คํธํ ์ํ์ ์๋์ผ๋ก ๋นผ๊ณ , ์ด๋ฅผ ํ ์คํธํ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ์ ์ ํ๋๋ฅผ ๊ณ์ฐํ๋ ๊ฒ์ด์ง์. ์ด๋ฌํ ๋ฐฉ๋ฒ์ ๋น ๋ฅธ ์๊ฐ์ ๋ชจ๋ธ ์ฑ๋ฅ์ ํ์ ํ๊ณ ์์ ํ ์ ์๋๋ก ๋์ ์ค๋๋ค.
ํ์ง๋ง ๋จธ์ ๋ฌ๋์ ์ต์ข ๋ชฉ์ ์ ๊ณผ๊ฑฐ์ ๋ฐ์ดํฐ๋ฅผ ํ ๋๋ก ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์์ธกํ๋ ๊ฒ์ ๋๋ค. ์ฆ, ํ ์คํธ์ ์ ๋ง๋ค์ด ์ ํํ ํ๊ฐ๋ฅผ ๋ณํํ๋ ๊ฒ์ด ๋งค์ฐ ์ค์ํฉ๋๋ค. ํ์ต์ ๋ง ๊ฐ์ง๊ณ ํ๊ฐํ ๋, ์ธต์ ๋ํ๊ฑฐ๋ ์ํฌํฌ(epoch) ๊ฐ์ ๋์ฌ ์คํ ํ์๋ฅผ ๋๋ฆฌ๋ฉด ์ ํ๋๊ฐ ๊ณ์ํด์ ์ฌ๋ผ๊ฐ ์ ์์ต๋๋ค. ํ์ง๋ง ํ์ต ๋ฐ์ดํฐ์ ๋ง์ผ๋ก ํ๊ฐํ ์์ธก ์ฑ๊ณต๋ฅ ์ด ํ ์คํธ์ ์์๋ ๊ทธ๋๋ก ๋ํ๋์ง๋ ์์ต๋๋ค. ์ฆ, ํ์ต์ด ๊น์ด์ ธ์ ํ์ต์ ๋ด๋ถ์์์ ์ฑ๊ณต๋ฅ ์ ๋์์ ธ๋ ํ ์คํธ์ ์์๋ ํจ๊ณผ๊ฐ ์๋ค๋ฉด ๊ณผ์ ํฉ์ด ์ผ์ด๋๊ณ ์๋ ๊ฒ์ด์ง์. ์ด๋ฅผ ๊ทธ๋ํ๋ก ํํํ๋ฉด
ํ์ต์ ์งํํด๋ ํ ์คํธ ๊ฒฐ๊ณผ๊ฐ ๋ ์ด์ ์ข์์ง์ง ์๋ ์ง์ ์์ ํ์ต์ ๋ฉ์ถฐ์ผ ํฉ๋๋ค. ์ด๋์ ํ์ต ์ ๋๊ฐ ๊ฐ์ฅ ์ ์ ํ ๊ฒ์ผ๋ก ๋ณผ ์ ์์ต๋๋ค.
์์ ์ ์ฃผ์ด์ง ๋ฐ์ดํฐ๋ฅผ ํ์ต์ ๊ณผ ํ ์คํธ์ ์ผ๋ก ๋๋๋ ์์ ๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ๋ถ๋ฌ์จ X ๋ฐ์ดํฐ์ Y ๋ฐ์ดํฐ์์ ๊ฐ๊ฐ ์ ํด์ง ๋น์จ(%)๋งํผ ๊ตฌ๋ถํ์ฌ ํ ๊ทธ๋ฃน์ ํ์ต์ ์ฌ์ฉํ๊ณ ๋ค๋ฅธ ํ ๊ทธ๋ฃน์ ํ ์คํธ์ ์ฌ์ฉํ๊ฒ ํ๋ ํจ์๊ฐ sklearn ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ train_test_split() ํจ์์ ๋๋ค. ๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ํ์ต์ ๊ณผ ํ ์คํธ์ ์ ๋ง๋ค ์ ์์ต๋๋ค. ํ์ต์ ์ 70%, ํ ์คํธ์ ์ 30%๋ก ์ค์ ํ์ ๋์ ์์ ๋๋ค.
from sklearn.model_selection import train_test_split
# ํ์ต์
๊ณผ ํ
์คํธ์
์ ๊ตฌ๋ถ
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=seed)
๊ทธ๋ฆฌ๊ณ ๋ชจ๋ธ์ ์คํํ๋ ๋ถ๋ถ์์ ์์์ ๋ง๋ค์ด์ง ํ์ต์ ์ผ๋ก ํ์ต์, ํ ์คํธ์ ์ผ๋ก ํ ์คํธ๋ฅผ ํ๊ฒ ํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์คํํฉ๋๋ค.
model.fit(X_train, Y_train, epochs=130, batch_size=5)
# ํ
์คํธ์
์ ๋ชจ๋ธ ์ ์ฉ
print("\n Test Accuracy: %.4f" % (model.evaluate(X_test, Y_test)[1]))
โํ์ต์ด ๋๋ ํ ํ ์คํธํด ๋ณธ ๊ฒฐ๊ณผ๊ฐ ๋ง์กฑ์ค๋ฌ์ธ ๋ ์ด๋ฅผ ๋ชจ๋ธ๋ก ์ ์ฅํ์ฌ ์๋ก์ด ๋ฐ์ดํฐ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์์ ํ์ตํ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋ธ๋ก ์ ์ฅํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์คํํฉ๋๋ค.
from keras.models import load_model
model.save(‘my_model.h5’)
๋ถ๋ฌ์ค๊ธฐ:
model = load_model(‘my_model.h5’)
์ ์ฒด ์ฝ๋
from keras.models import Sequential, load_model
from keras.layers.core import Dense
from sklearn.preprocessing import LabelEncoder
import pandas as pd
import numpy
import tensorflow as tf
# seed ๊ฐ ์ค์
seed = 0
numpy.random.seed(seed)
tf.random.set_seed(3)
df = pd.read_csv('../dataset/sonar.csv', header=None)
dataset = df.values
X = dataset[:,0:60]
Y_obj = dataset[:,60]
e = LabelEncoder()
e.fit(Y_obj)
Y = e.transform(Y_obj)
# ํ์ต์
๊ณผ ํ
์คํธ์
์ ๋๋
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=seed)
model = Sequential()
model.add(Dense(24, input_dim=60, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
model.fit(X_train, Y_train, epochs=130, batch_size=5)
model.save('my_model.h5') # ๋ชจ๋ธ์ ์ปดํจํฐ์ ์ ์ฅ
del model # ํ
์คํธ๋ฅผ ์ํด ๋ฉ๋ชจ๋ฆฌ ๋ด์ ๋ชจ๋ธ์ ์ญ์
model = load_model('my_model.h5') # ๋ชจ๋ธ์ ์๋ก ๋ถ๋ฌ์ด
print("\n Test Accuracy: %.4f" % (model.evaluate(X_test, Y_test)[1])) # ๋ถ๋ฌ์จ ๋ชจ๋ธ๋ก ํ
์คํธ ์คํ
Test Accuracy: 0.8095
k๊ฒน ๊ต์ฐจ ๊ฒ์ฆ
๋ฅ๋ฌ๋ ํน์ ๋จธ์ ๋ฌ๋ ์์ ์ ํ ๋ ๋ ์ด๋ ค์ด ๋ฌธ์ ์ค ํ๋๋ ์๊ณ ๋ฆฌ์ฆ์ ์ถฉ๋ถํ ํ ์คํธํ์์ด๋ ๋ฐ์ดํฐ๊ฐ ์ถฉ๋ถ์น ์์ผ๋ฉด ์ข์ ๊ฒฐ๊ณผ๋ฅผ ๋ด๊ธฐ๊ฐ ์ด๋ ต๋ค๋ ๊ฒ์ ๋๋ค. ์์ ๊ฐ์ง๊ณ ์๋ ๋ฐ์ดํฐ์ ์ฝ 70%๋ฅผ ํ์ต์ ์ผ๋ก ์จ์ผ ํ์ผ๋ฏ๋ก ํ ์คํธ์ ์ ๊ฒจ์ฐ ์ ์ฒด ๋ฐ์ดํฐ์ 30%์ ๊ทธ์ณค์ต๋๋ค. ์ด ์ ๋ ํ ์คํธ๋ง์ผ๋ก๋ ์ค์ ๋ก ์ผ๋ง๋ ์ ์๋ํ๋์ง ํ์ ํ๊ธฐ๋ ์ฝ์ง ์์ต๋๋ค.
์ด๋ฌํ ๋จ์ ์ ๋ณด์ํ๊ณ ์ ๋ง๋ ๋ฐฉ๋ฒ์ด ๋ฐ๋ก k๊ฒน ๊ต์ฐจ ๊ฒ์ฆ(k-fold cross validation)์ ๋๋ค.
k๊ฒน ๊ต์ฐจ ๊ฒ์ฆ์ด๋ ๋ฐ์ดํฐ์ ์ ์ฌ๋ฌ ๊ฐ๋ก ๋๋์ด ํ๋์ฉ ํ ์คํธ์ ์ผ๋ก ์ฌ์ฉํ๊ณ ๋๋จธ์ง๋ฅผ ๋ชจ๋ ํฉํด์ ํ์ต์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ฐ์ง๊ณ ์๋ ๋ฐ์ดํฐ์ 100%๋ฅผ ํ ์คํธ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, 5๊ฒน ๊ต์ฐจ ๊ฒ์ฆ(5-fold cross validation):
sklearn์ StratifiedKFold() : ๋ฐ์ดํฐ๋ฅผ ์ํ๋ ์ซ์๋งํผ ์ชผ๊ฐ ๊ฐ๊ฐ ํ์ต์ ๊ณผ ํ ์คํธ์ ์ผ๋ก ์ฌ์ฉ๋๊ฒ ๋ง๋๋ ํจ์
from sklearn.model_selection import StratifiedKFold
n_fold = 10
skf = StratifiedKFold(n_splits=n_fold, shuffle=True, random_state=seed)
10๊ฐ์ ํ์ผ๋ก ์ชผ๊ฐ ํ ์คํธํ๋ 10๊ฒน ๊ต์ฐจ ๊ฒ์ฆ.
n_fold์ ๊ฐ์ 10์ผ๋ก ์ค์ ํ ๋ค StratifiedKFold() ํจ์์ ์ ์ฉ.
๊ทธ ๋ค์ ๋ชจ๋ธ์ ๋ง๋ค๊ณ ์คํํ๋ ๋ถ๋ถ์ for ๊ตฌ๋ฌธ์ผ๋ก ๋ฌถ์ด n_fold๋งํผ ๋ฐ๋ณต
for train, test in skf.split(X, Y):
model = Sequential()
model.add(Dense(24, input_dim=60, activation=‘relu’))
model.add(Dense(10, activation=‘relu’))
model.add(Dense(1, activation=‘sigmoid’))
model.compile(loss=‘mean_squared_error’, optimizer=‘adam’, metrics=[‘accuracy’])
model.fit(X[train], Y[train], epochs=100, batch_size=5)
์ ํ๋(Accuracy)๋ฅผ ๋งค๋ฒ ์ ์ฅํ์ฌ ํ ๋ฒ์ ๋ณด์ฌ์ค ์ ์๊ฒ accuracy ๋ฐฐ์ด์ ๋ง๋ญ๋๋ค
accuracy = []
for train, test in skf.split(X, Y):
(์ค๋ต)
k_accuracy = "%.4f" % (model.evaluate(X[test], Y[test])[1])
accuracy.append(k_accuracy)
print("\n %.f fold accuracy:" % n_fold, accuracy)
์ ์ฒด ์ฝ๋
from keras.models import Sequential
from keras.layers.core import Dense
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import StratifiedKFold
import numpy
import pandas as pd
import tensorflow as tf
# seed ๊ฐ ์ค์
seed = 0
numpy.random.seed(seed)
tf.set_random_seed(seed)
df = pd.read_csv('../dataset/sonar.csv', header=None)
dataset = df.values
X = dataset[:,0:60]
Y_obj = dataset[:,60]
e = LabelEncoder()
e.fit(Y_obj)
Y = e.transform(Y_obj)
# 10๊ฐ์ ํ์ผ๋ก ์ชผ๊ฐฌ
n_fold = 10
skf = StratifiedKFold(n_splits=n_fold, shuffle=True, random_state=seed)
# ๋น accuracy ๋ฐฐ์ด
accuracy = []
# ๋ชจ๋ธ์ ์ค์ , ์ปดํ์ผ, ์คํ
for train, test in skf.split(X, Y):
model = Sequential()
model.add(Dense(24, input_dim=60, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
model.fit(X[train], Y[train], epochs=100, batch_size=5)
k_accuracy = "%.4f" % (model.evaluate(X[test], Y[test])[1])
accuracy.append(k_accuracy)
# ๊ฒฐ๊ณผ ์ถ๋ ฅ
print("\n %.f fold accuracy:" % n_fold, accuracy)
์คํ ๊ฒฐ๊ณผ
10 fold accuracy: ['0.8182', '0.7143', '0.8095', '0.8095', '0.7619', '0.8095', '0.8571', '0.9500', '0.7500', '0.8000']
10๋ฒ์ ํ ์คํธ๊ฐ ์ถ๋ ฅ๋จ
'๋ฅ๋ฌ๋ > Today I learned :' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฅ๋ฌ๋] ์ ํ ํ๊ท ์ ์ฉํ๊ธฐ (0) | 2021.03.26 |
---|---|
[๋ฅ๋ฌ๋] ์์ธ์ ์ข ๋ฅ ์์ธกํ๊ธฐ (0) | 2021.03.25 |
[๋ฅ๋ฌ๋] ๋ค์ค ๋ถ๋ฅ ๋ฌธ์ : ๋ถ๊ฝ(Iris) ํ์ข ๋ถ๋ฅ (0) | 2021.03.23 |
[๋ฅ๋ฌ๋] ํผ๋ง ์ธ๋์ธ ๋น๋จ๋ณ ์์ธกํ๊ธฐ (0) | 2021.03.22 |
[๋ฅ๋ฌ๋] ๋ชจ๋ธ ์ค๊ณํ๊ธฐ (0) | 2021.03.21 |