[λ₯λ¬λ] μ΄μν κ΄λ¬Ό λ°μ΄ν° : κ³Όμ ν© νΌνκΈ°
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λ²μ ν μ€νΈκ° μΆλ ₯λ¨