df_pre๋ผ๋ ๊ณต๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ต๋๋ค.
sample() ํจ์ : ์๋ณธ ๋ฐ์ดํฐ์ ๋ช %๋ฅผ ์ฌ์ฉํ ์ง๋ฅผ ์ง์ , ์๋ณธ ๋ฐ์ดํฐ์์ ์ ํด์ง ๋น์จ๋งํผ ๋๋ค์ผ๋ก ๋ฝ์์ค๋ ํจ์
frac = 1 : ์๋ณธ ๋ฐ์ดํฐ์ 100%๋ฅผ ๋ถ๋ฌ์ค๋ผ๋ ์๋ฏธ (frac = 0.5๋ก ์ง์ ํ๋ฉด 50%๋ง ๋๋ค)
df_pre = pd.read_csv(’../dataset/wine.csv’, header=None)
df = df_pre.sample(frac=1)
print(df.info())
Data |
columns (total 13 columns): |
||
0 |
6497 |
non-null |
float64 |
1 |
6497 |
non-null |
float64 |
2 |
6497 |
non-null |
float64 |
3 |
6497 |
non-null |
float64 |
4 |
6497 |
non-null |
float64 |
5 |
6497 |
non-null |
float64 |
6 |
6497 |
non-null |
float64 |
7 |
6497 |
non-null |
float64 |
8 |
6497 |
non-null |
float64 |
9 |
6497 |
non-null |
float64 |
10 |
6497 |
non-null |
float64 |
11 |
6497 |
non-null |
int64 |
12 |
6497 |
non-null |
int64 |
dtypes: float64(11), int64(2) |
|||
memory usage: 710.6 KB |
์ด 6497๊ฐ์ ์ํ,
13๊ฐ์ ์์ฑ
0 |
์ฃผ์์ฐ ๋๋ |
7 |
๋ฐ๋ |
1 |
์์ธํธ์ฐ ๋๋ |
8 |
pH |
2 |
๊ตฌ์ฐ์ฐ ๋๋ |
9 |
ํฉ์ฐ์นผ๋ฅจ ๋๋ |
3 |
์๋ฅ ๋น๋ถ ๋๋ |
10 |
์์ฝ์ฌ ๋์ |
4 |
์ผํ๋ํธ๋ฅจ ๋๋ |
11 |
์์ธ์ ๋ง(0~10๋ฑ๊ธ) |
5 |
์ ๋ฆฌ ์ํฉ์ฐ ๋๋ |
12 |
class (1: ๋ ๋์์ธ, 0: ํ์ดํธ์์ธ) |
6 |
์ด ์ํฉ์ฐ ๋๋ |
0~11๊น์ง์ ํด๋นํ๋ 12๊ฐ์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ 13๋ฒ์งธ ํด๋์ค๋ฅผ ๋ง์ถ๋ ๊ณผ์
#X,Y๊ฐ ์ค์
dataset = df.values
X = dataset[:,0:12]
Y = dataset[:,12]
<๋ฅ๋ฌ๋ ์คํ>
- 4๊ฐ์ ์๋์ธต์ ๋ง๋ค์ด ๊ฐ๊ฐ 30, 12, 8, 1๊ฐ์ ๋ ธ๋ ๋ถ์ฌ
- ์ดํญ ๋ถ๋ฅ(binary classification) ๋ฌธ์ ์ด๋ฏ๋ก ์ค์ฐจ ํจ์๋ binary_crossentropy๋ฅผ ์ฌ์ฉ, ์ต์ ํ ํจ์๋ก adam()์ ์ฌ์ฉ
- ์ ์ฒด ์ํ์ด 200ํ ๋ฐ๋ณต๋์ด ์ ๋ ฅ๋ ๋๊น์ง ์คํ ๋ฐ๋ณต.
- ํ ๋ฒ์ ์ ๋ ฅ๋๋ ์ ๋ ฅ ๊ฐ์ 200๊ฐ์ฉ ๋๊ฒ๋ ํ์ฌ ์ข ํฉ
from keras.models import Sequential
from keras.layers import Dense
from keras.callbacks import ModelCheckpoint, EarlyStopping
import pandas as pd
import numpy
import tensorflow as tf
import matplotlib.pyplot as plt
# seed ๊ฐ ์ค์
seed = 0
numpy.random.seed(seed)
tf.random.set_seed(3)
# ๋ฐ์ดํฐ ์
๋ ฅ
df_pre = pd.read_csv('../dataset/wine.csv', header=None)
df = df_pre.sample(frac=1)
dataset = df.values
X = dataset[:,0:12]
Y = dataset[:,12]
# ๋ชจ๋ธ ์ค์
model = Sequential()
model.add(Dense(30, input_dim=12, activation='relu'))
model.add(Dense(12, 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=200)
# ๊ฒฐ๊ณผ ์ถ๋ ฅ
print("\n Accuracy: %.4f" % (model.evaluate(X, Y)[1]))
Accuracy: 0.9858
์ ํ๋ : 98.58%
๋ชจ๋ธ ์ ๋ฐ์ดํธ
์ํฌํฌ(epoch)๋ง๋ค ๋ชจ๋ธ์ ์ ํ๋๋ฅผ ํจ๊ป ๊ธฐ๋กํ๋ฉด์ ์ ์ฅ
- ๋จผ์ ๋ชจ๋ธ์ด ์ ์ฅ๋ ํด๋ ์ง์ .(ํ์ฌ ๋๋ ํฐ๋ฆฌ ์์ model ํด๋)
- ํด๋น ํด๋๊ฐ ์๋์ง ํ์ธํ๊ณ ์์ผ๋ฉด ํด๋ ์์ฑ.
- ์ํฌํฌ ํ์์ ์ด๋์ ํ ์คํธ์ ์ค์ฐจ ๊ฐ์ ์ด์ฉํด ํ์ผ ์ด๋ฆ์ ๋ง๋ค์ด hdf 5๋ผ๋ ํ์ฅ์๋ก ์ ์ฅ (์๋ฅผ ๋ค์ด, 100๋ฒ์งธ ์ํฌํฌ๋ฅผ ์คํํ๊ณ ๋ ๊ฒฐ๊ณผ ์ค์ฐจ๊ฐ 0.0612๋ผ๋ฉด, ํ์ผ๋ช ์ 100-0.0612.hdf 5)
import os
MODEL_DIR = ’./model/’ # ๋ชจ๋ธ์ ์ ์ฅํ๋ ํด๋
if not os.path.exists(MODEL_DIR): # ๋ง์ผ ์์ ํด๋๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด
os.mkdir(MODEL_DIR) # ์ด ์ด๋ฆ์ ํด๋๋ฅผ ๋ง๋ค์ด ์ค
modelpath=”./model/{epoch:02d}-{val_loss:.4f}.hdf5”
๋ชจ๋ธ ์ ์ฅ -์ผ๋ผ์ค์ ์ฝ๋ฐฑ ํจ์ ์ค ModelCheckpoint() ํจ์
checkpointer๋ผ๋ ๋ณ์์ ๋ชจ๋ํฐํ ๊ฐ์ ์ง์ ํฉ๋๋ค.
ํ ์คํธ ์ค์ฐจ๋ ์ผ๋ผ์ค ๋ด๋ถ์์ val_loss๋ก ๊ธฐ๋ก(์ฐธ๊ณ ๋ก ํ์ต ์ ํ๋๋ acc, ํ ์คํธ์ ์ ํ๋๋ val_acc, ํ์ต์ ์ค์ฐจ๋ loss๋ก ๊ฐ๊ฐ ๊ธฐ๋ก).
๋ชจ๋ธ์ด ์ ์ฅ๋ ๊ณณ์ ์์ ๋ง๋ modelpath๋ก ์ง์ ํ๊ณ verbose์ ๊ฐ์ 1๋ก ์ ํ๋ฉด ํด๋น ํจ์์ ์งํ ์ฌํญ์ด ์ถ๋ ฅ๋๊ณ , 0์ผ๋ก ์ ํ๋ฉด ์ถ๋ ฅ๋์ง ์์ต๋๋ค.
from keras.callbacks import ModelCheckpoint
checkpointer = ModelCheckpoint(filepath=modelpath, monitor=‘val_loss’, verbose=1,save_best_only=True)
model.fit(X, Y, validation_split=0.2, epochs=200, batch_size=200, verbose=0, callbacks=[checkpointer])
์คํ๊ฒฐ๊ณผ
Epoch 00194: saving model to ./model/194-0.0629.hdf5 Epoch 00195: saving model to ./model/195-0.0636.hdf5 Epoch 00196: saving model to ./model/196-0.0630.hdf5 Epoch 00197: saving model to ./model/197-0.0695.hdf5 Epoch 00198: saving model to ./model/198-0.0724.hdf5 Epoch 00199: saving model to ./model/199-0.0635.hdf5
Epoch 0~199๊น์ง ์ด 200๊ฐ์ ๋ชจ๋ธ์ด model ํด๋์ ์ ์ฅ.
์ ์ฅ๋ ํ์ผ์ ์ด๋ฆ = ์ํฌํฌ ์์ ์ด๋์ ํ ์คํธ์ ์ค์ฐจ ๊ฐ
ModelCheckpoint() ํจ์์ ๋ชจ๋ธ์ด ์์ ์ ์ฅํ ๋ชจ๋ธ๋ณด๋ค ๋์์ก์ ๋๋ง ์ ์ฅํ๊ฒ๋ ํ๋ ค๋ฉด save_best_only ๊ฐ = True
from keras.models import Sequential
from keras.layers import Dense
from keras.callbacks import ModelCheckpoint
import pandas as pd
import numpy
import os
import tensorflow as tf
# seed ๊ฐ ์ค์
numpy.random.seed(3)
tf.random.set_seed(3)
df_pre = pd.read_csv('../dataset/wine.csv', header=None)
df = df_pre.sample(frac=1)
dataset = df.values
X = dataset[:,0:12]
Y = dataset[:,12]
# ๋ชจ๋ธ์ ์ค์
model = Sequential()
model.add(Dense(30, input_dim=12, activation='relu'))
model.add(Dense(12, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# ๋ชจ๋ธ ์ปดํ์ผ
model.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy'])
# ๋ชจ๋ธ ์ ์ฅ ํด๋ ์ค์
MODEL_DIR = './model/'
if not os.path.exists(MODEL_DIR):
os.mkdir(MODEL_DIR)
# ๋ชจ๋ธ ์ ์ฅ ์กฐ๊ฑด ์ค์
modelpath="./model/{epoch:02d}-{val_loss:.4f}.hdf5"
checkpointer = ModelCheckpoint(filepath=modelpath, monitor='val_loss', verbose=1, save_best_only=True)
# ๋ชจ๋ธ ์คํ ๋ฐ ์ ์ฅ
model.fit(X, Y, validation_split=0.2, epochs=200, batch_size=200, verbose=0, callbacks=[checkpointer])
ํ์ต์๊ฐ์ ๋ฐ๋ฅธ ์ ํ๋์ ํ ์คํธ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋ํ๋ก ํํํ๊ธฐ
df = df_pre.sample(frac=0.15)
history = model.fit(X, Y, validation_split=0.33, epochs=3500, batch_size=500)
history =๋ชจ๋ธ์ด ํ์ต๋๋ ๊ณผ์ ์ ์ฅ
๊ธด ํ์ต์ ์๋ฅผ ์ง์ผ ๋ณด๊ธฐ ์ํด ์ํฌํฌ(epoch)๋ฅผ 3,500์ผ๋ก ์กฐ์ ํ์์ต๋๋ค.
์๊ฐ์ด ๋๋ฌด ์ค๋ ๊ฑธ๋ฆฌ์ง ์๋๋ก sample() ํจ์๋ฅผ ์ด์ฉํ์ฌ ์ ์ฒด ์ํ ์ค 15%๋ง ๋ถ๋ฌ์ค๊ฒ ํ๊ณ , ๋ฐฐ์น ํฌ๊ธฐ๋ 500์ผ๋ก ๋๋ ค ํ ๋ฒ ๋ฅ๋ฌ๋์ ๊ฐ๋ํ ๋ ๋ ๋ง์ด ์ ๋ ฅ๋๊ฒ๋ ํ์ต๋๋ค. ๋ถ๋ฌ์จ ์ํ ์ค 33%๋ ๋ถ๋ฆฌํ์ฌ ํ ์คํธ์ ์ผ๋ก ์ฌ์ฉํ์์ต๋๋ค.
๊ทธ๋ํ๋ก ํํํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ถ๋ฌ์ค๊ณ ์ค์ฐจ์ ์ ํ๋์ ๊ฐ์ ์ ํฉ๋๋ค. y_vloss์ ํ ์คํธ์ (33%)์ผ๋ก ์คํํ ๊ฒฐ๊ณผ์ ์ค์ฐจ ๊ฐ์ ์ ์ฅํ๊ณ , y_acc์ ํ์ต์ (67%)์ผ๋ก ์ธก์ ํ ์ ํ๋์ ๊ฐ์ ์ ์ฅํฉ๋๋ค.
import matplotlib.pyplot as plt
y_vloss=history.history['val_loss']
y_acc=history.history['acc']
x ๊ฐ์ ์ง์ ํ๊ณ ์ ํ๋๋ฅผ ํ๋์์ผ๋ก, ์ค์ฐจ๋ฅผ ๋นจ๊ฐ์์ผ๋ก ํ์
x_len = numpy.arange(len(y_acc))
plt.plot(x_len, y_vloss, "o", c="red", markersize=3)
plt.plot(x_len, y_acc, "o", c="blue", markersize=3)
์ ์ฒด ์ฝ๋
from keras.models import Sequential
from keras.layers import Dense
from keras.callbacks import ModelCheckpoint
import pandas as pd
import numpy
import os
import matplotlib.pyplot as plt
import tensorflow as tf
# seed ๊ฐ ์ค์
numpy.random.seed(3)
tf.random.set_seed(3)
df_pre = pd.read_csv('../dataset/wine.csv', header=None)
df = df_pre.sample(frac=0.15)
dataset = df.values
X = dataset[:,0:12]
Y = dataset[:,12]
# ๋ชจ๋ธ์ ์ค์
model = Sequential()
model.add(Dense(30, input_dim=12, activation='relu'))
model.add(Dense(12, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# ๋ชจ๋ธ ์ปดํ์ผ
model.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy'])
# ๋ชจ๋ธ ์ ์ฅ ํด๋ ์ค์
MODEL_DIR = './model/'
if not os.path.exists(MODEL_DIR):
os.mkdir(MODEL_DIR)
# ๋ชจ๋ธ ์ ์ฅ ์กฐ๊ฑด ์ค์
modelpath="./model/{epoch:02d}-{val_loss:.4f}.hdf5"
checkpointer = ModelCheckpoint(filepath=modelpath, monitor='val_loss', verbose=1, save_best_only=True)
# ๋ชจ๋ธ ์คํ ๋ฐ ์ ์ฅ
history = model.fit(X, Y, validation_split=0.33, epochs=3500, batch_size=500)
# y_vloss์ ํ
์คํธ์
์ผ๋ก ์คํ ๊ฒฐ๊ณผ์ ์ค์ฐจ ๊ฐ์ ์ ์ฅ
y_vloss=history.history['val_loss']
# y_acc ์ ํ์ต ์
์ผ๋ก ์ธก์ ํ ์ ํ๋์ ๊ฐ์ ์ ์ฅ
y_acc=history.history['acc']
# x๊ฐ์ ์ง์ ํ๊ณ ์ ํ๋๋ฅผ ํ๋์์ผ๋ก, ์ค์ฐจ๋ฅผ ๋นจ๊ฐ์์ผ๋ก ํ์
x_len = numpy.arange(len(y_acc))
plt.plot(x_len, y_vloss, "o", c="red", markersize=3)
plt.plot(x_len, y_acc, "o", c="blue", markersize=3)
plt.show()
ํ์ต์ ์ ์ ํ๋๋ ์๊ฐ์ด ํ๋ฅผ์๋ก ์ข์์ง์ง๋ง ํ ์คํธ ๊ฒฐ๊ณผ๋ ์ด๋ ์ ๋ ์ด์ ์๊ฐ์ด ํ๋ฅด๋ฉด ๋ ๋์์ง์ง ์๋๋ค
ํ์ต์ ์๋ ์ค๋จ
ํ์ต์ด ์งํ๋ ์๋ก ํ์ต์ ์ ์ ํ๋๋ ์ฌ๋ผ๊ฐ์ง๋ง ๊ณผ์ ํฉ ๋๋ฌธ์ ํ ์คํธ์ ์ ์คํ ๊ฒฐ๊ณผ๋ ์ ์ ๋๋น ์ง๊ฒ ๋ฉ๋๋ค.
EarlyStopping() ํจ์ : ํ์ต์ด ์งํ๋์ด๋ ํ ์คํธ์ ์ค์ฐจ๊ฐ ์ค์ง ์์ผ๋ฉด ํ์ต์ ๋ฉ์ถ๊ฒ ํ๋ ํจ์
early_stopping_callback์ EarlyStopping() ํจ์์ ๋ชจ๋ํฐํ ๊ฐ๊ณผ ํ ์คํธ ์ค์ฐจ๊ฐ ์ข์์ง์ง ์์๋ ๋ช ๋ฒ๊น์ง ๊ธฐ๋ค๋ฆด์ง ์ ์ฅ
from keras.callbacks import EarlyStopping
early_stopping_callback = EarlyStopping(monitor=‘val_loss’, patience=100)
์์ ์ ํ ๊ทธ๋๋ก ์ํฌํฌ ํ์์ ๋ฐฐ์น ํฌ๊ธฐ ๋ฑ์ ์ค์ ํ๊ณ early_stopping_callback ๊ฐ์ ๋ถ๋ฌ์ต๋๋ค.
model.fit(X, Y, validation_split=0.33, epochs=2000, batch_size=500, callbacks=[early_stopping_callback])
์ ์ฒด ์ฝ๋(์๋ ์ค๋จ)
from keras.models import Sequential
from keras.layers import Dense
from keras.callbacks import EarlyStopping
import pandas as pd
import numpy
import tensorflow as tf
# seed ๊ฐ ์ค์
numpy.random.seed(3)
tf.random.set_seed(3)
df_pre = pd.read_csv('../dataset/wine.csv', header=None)
df = df_pre.sample(frac=0.15)
dataset = df.values
X = dataset[:,0:12]
Y = dataset[:,12]
model = Sequential()
model.add(Dense(30, input_dim=12, activation='relu'))
model.add(Dense(12, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy'])
# ์๋ ์ค๋จ ์ค์
early_stopping_callback = EarlyStopping(monitor='val_loss', patience=100)
# ๋ชจ๋ธ ์คํ
model.fit(X, Y, validation_split=0.2, epochs=2000, batch_size=500, callbacks=[early_stopping_callback])
# ๊ฒฐ๊ณผ ์ถ๋ ฅ
print("\n Accuracy: %.4f" % (model.evaluate(X, Y)[1]))
์คํ๊ฒฐ๊ณผ
Epoch 1531/2000 780/780 [==============================] - 0s 8us/step - loss: 0.0303 - accuracy: 0.9872 - val_loss: 0.0586 - val_accuracy: 0.9795
Epoch 1532/2000 780/780 [==============================] - 0s 6us/step - loss: 0.0308 - accuracy: 0.9859 - val_loss: 0.0627 - val_accuracy: 0.9795
Epoch 1533/2000 780/780 [==============================] - 0s 8us/step - loss: 0.0294 - accuracy: 0.9872 - val_loss: 0.0599 - val_accuracy: 0.9795 975/975 [==============================] - 0s 16us/step
Accuracy: 0.9877
์ํฌํฌ๋ฅผ 2,000์ผ๋ก ์ค์ ํ์์ง๋ง, ๋์ค์ ๊ณ์ฐ์ด ๋ฉ์ถ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๋ชจ๋ธ ์ ๋ฐ์ดํธ ํจ์ + ํ์ต ์๋ ์ค๋จ ํจ์ ์ ์ฒด ์ฝ๋
from keras.models import Sequential
from keras.layers import Dense
from keras.callbacks import ModelCheckpoint,EarlyStopping
import pandas as pd
import numpy
import os
import tensorflow as tf
# seed ๊ฐ ์ค์
numpy.random.seed(3)
tf.random.set_seed(3)
df_pre = pd.read_csv('../dataset/wine.csv', header=None)
df = df_pre.sample(frac=0.15)
dataset = df.values
X = dataset[:,0:12]
Y = dataset[:,12]
model = Sequential()
model.add(Dense(30, input_dim=12, activation='relu'))
model.add(Dense(12, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy'])
# ๋ชจ๋ธ ์ ์ฅ ํด๋ ๋ง๋ค๊ธฐ
MODEL_DIR = './model/'
if not os.path.exists(MODEL_DIR):
os.mkdir(MODEL_DIR)
modelpath="./model/{epoch:02d}-{val_loss:.4f}.hdf5"
# ๋ชจ๋ธ ์
๋ฐ์ดํธ ๋ฐ ์ ์ฅ
checkpointer = ModelCheckpoint(filepath=modelpath, monitor='val_loss', verbose=1, save_best_only=True)
# ํ์ต ์๋ ์ค๋จ ์ค์
early_stopping_callback = EarlyStopping(monitor='val_loss', patience=100)
model.fit(X, Y, validation_split=0.2, epochs=3500, batch_size=500, verbose=0, callbacks=[early_stopping_callback,checkpointer])
Epoch 01344: val_loss did not improve from 0.05648
Epoch 01345: val_loss did not improve from 0.05648
Epoch 01346: val_loss improved from 0.05648 to 0.05631, saving model to ./model/1346-0.0563.hdf5
Epoch 01395: val_loss did not improve from 0.05631
Epoch 01396: val_loss did not improve from 0.05631
Epoch 01397: val_loss did not improve from 0.05631
Epoch 01398: val_loss improved from 0.05631 to 0.05524, saving model to ./model/1398-0.0552.hdf5
Epoch 01496: val_loss did not improve from 0.05524
Epoch 01497: val_loss did not improve from 0.05524
Epoch 01498: val_loss did not improve from 0.05524
'๋ฅ๋ฌ๋ > Today I learned :' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฅ๋ฌ๋] ์ด๋ฏธ์ง ์ธ์ , ์ปจ๋ณผ๋ฃจ์ ์ ๊ฒฝ๋ง(CNN) (0) | 2021.03.27 |
---|---|
[๋ฅ๋ฌ๋] ์ ํ ํ๊ท ์ ์ฉํ๊ธฐ (0) | 2021.03.26 |
[๋ฅ๋ฌ๋] ์ด์ํ ๊ด๋ฌผ ๋ฐ์ดํฐ : ๊ณผ์ ํฉ ํผํ๊ธฐ (0) | 2021.03.24 |
[๋ฅ๋ฌ๋] ๋ค์ค ๋ถ๋ฅ ๋ฌธ์ : ๋ถ๊ฝ(Iris) ํ์ข ๋ถ๋ฅ (0) | 2021.03.23 |
[๋ฅ๋ฌ๋] ํผ๋ง ์ธ๋์ธ ๋น๋จ๋ณ ์์ธกํ๊ธฐ (0) | 2021.03.22 |