도순씨의 코딩일지
딥러닝 :: 베스트 모델 만들기 본문
이번 실습은 와인의 종류를 예측해보는 것이다.
1. 데이터의 확인과 실행
1
2
3
4
5
6
|
import pandas as pd
df_pre = pd.read_csv("/Users/Downloads/006958-master/deeplearning/dataset/wine.csv", header = None)
df = df_pre.sample(frac = 1)
print(df.head(5))
|
cs |
csv 파일을 읽어오고 sample() 함수를 사용하여 원본 데이터의 몇 %를 사용할 것인지 표기해준다. frac = 1은 원본 데이터의 100%을 의미한다. 그리고 head 함수를 사용하여 처음 다섯 줄만 출력하면 다음과 같은 결과가 나온다.
1
2
3
4
5
6
7
8
|
0 1 2 3 4 5 ... 7 8 9 10 11 12
3058 7.9 0.11 0.49 4.5 0.048 27.0 ... 0.99460 3.24 0.42 10.6 6 0
1962 7.3 0.22 0.37 14.3 0.063 48.0 ... 0.99780 2.89 0.38 9.0 6 0
3870 6.7 0.25 0.26 13.5 0.060 50.0 ... 0.99784 3.39 0.46 9.9 6 0
1272 5.9 0.46 0.00 1.9 0.077 25.0 ... 0.99385 3.50 0.53 11.2 5 1
191 6.4 0.37 0.25 1.9 0.074 21.0 ... 0.99740 3.57 0.62 9.8 6 1
[5 rows x 13 columns]
|
cs |
한 줄당 모두 13개의 정보가 있다. (0~12). 전체 정보를 출력해보면 다음과 같다.
@ 코드
1
|
print(df.info())
|
cs |
@ 실행 결과
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
Data columns (total 13 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 0 6497 non-null float64
1 1 6497 non-null float64
2 2 6497 non-null float64
3 3 6497 non-null float64
4 4 6497 non-null float64
5 5 6497 non-null float64
6 6 6497 non-null float64
7 7 6497 non-null float64
8 8 6497 non-null float64
9 9 6497 non-null float64
10 10 6497 non-null float64
11 11 6497 non-null int64
12 12 6497 non-null int64
dtypes: float64(11), int64(2)
memory usage: 710.6 KB
None
|
cs |
전체 코드는 다음과 같다.
@ 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
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
import os
os.environ['KMP_DUPLICATE_LIB_OK']='True'
# 시드값 설정
seed = 0
numpy.random.seed(seed)
tf.random.set_seed(seed)
# 데이터 입력
df_pre = pd.read_csv("/Users/hansubin/Downloads/006958-master/deeplearning/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]))
|
cs |
@ 실행 결과
1
|
Accuracy: 0.9874
|
cs |
2. 모델 업데이트하기
모델을 재사용하는 방법(save, load_mode())을 이용하여 epoch마다 모델의 정확도를 함께 기록하면서 저장해보자.
1
2
3
4
5
|
MODEL_DIR = './model/'
if not os.path.exists(MODEL_DIR):
os.mkdir(MODEL_DIR) # 폴더 생성
modelpath = "./model/{epoch:02d} - {val_loss:.4f}.hdf5"
|
cs |
os.mkdir을 이용해여 폴더를 생성하고 에포크 횟수와 테스트셋 오차값을 이용하여 파일이름을 만들어 저장한다.
1
|
checkpointer = ModelCheckpoint(filepath = modelpath, monitor = 'val_loss', verbose = 1, save_best_only = True)
|
cs |
checkpointer 변수는 모니터할 값을 지정한다. verbose의 값을 1로 저장하면 해당 함수의 진행 사항이 출력되고, 0으로 저장되면 출력되지 않는다. save_best_only는 앞서 저장한 모델이 나아졌을 때만 저장하게 하는 함수이다.
전체 코드는 다음과 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
from keras.models import Sequential
from keras.layers import Dense
from keras.callbacks import ModelCheckpoint
import pandas as pd
import numpy
import tensorflow as tf
import matplotlib.pyplot as plt
import os
os.environ['KMP_DUPLICATE_LIB_OK']='True'
# 시드값 설정
seed = 0
numpy.random.seed(seed)
tf.random.set_seed(seed)
# 데이터 입력
df_pre = pd.read_csv("/Users/hansubin/Downloads/006958-master/deeplearning/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])
|
cs |
실행 결과를 살펴보면 결과가 더 좋을때만 저장한다는 것을 알 수 있다.
3. 그래프로 확인하기
에포크가 너무 적어도 안되고 너무 많으면 과적합을 일으키기 때문에 적절한 횟수를 지정할 필요가 있다. 모델의 학습 시간에 따른 정확도와 테스트 결과를 그래프를 통해 확인해보려면 다음과 같다.
1
2
|
df = df_pre.sample(frac = 0.15)
history = model.fit(X, Y, validation_split = 0.33, epochs = 3500, batch_size = 500)
|
cs |
sample 함수를 이용하여 원본 데이터의 15%만 가져오게 하엿다. 그리고 batch_size를 늘려 한 번 딥러닝을 가동할 때 더 많이 입력되게끔했다. validation_split를 통해서 33%는 테스트셋으로 사용하였다.
다음으로 그래프를 표현하기 위한 라이브러리를 불러오고 오차와 정확도의 값을 정한다. y_vloss에 테스트셋으로 실험한 결과의 오차값을 저장하고 y_acc에 학습셋으로 측정한 정확도의 값을 저장한다.
1
2
3
4
5
6
7
8
9
10
|
# 테스트셋 오차 값 저장
y_vloss = history.history['val_loss']
# 학습셋으로 측정한 정확도 값을 저장
y_acc = history.history['accuracy']
# 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)
|
cs |
x값을 지정하고 정확도를 파란색으로, 오차를 빨간색으로 표시해주었다.
전체 코드는 다음과 같다.
@ 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
from keras.models import Sequential
from keras.layers import Dense
from keras.callbacks import ModelCheckpoint
import pandas as pd
import numpy
import tensorflow as tf
import matplotlib.pyplot as plt
import os
os.environ['KMP_DUPLICATE_LIB_OK']='True'
# 시드값 설정
seed = 0
numpy.random.seed(seed)
tf.random.set_seed(seed)
# 데이터 입력
df_pre = pd.read_csv("/Users/hansubin/Downloads/006958-master/deeplearning/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 = history.history['val_loss']
# 학습셋으로 측정한 정확도 값을 저장
y_acc = history.history['accuracy']
# 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()
|
cs |
@ 실행 결과
1
2
|
500/653 [=====================>........] - ETA: 0s - loss: 0.0079 - accuracy: 0.9960
653/653 [==============================] - 0s 16us/step - loss: 0.0140 - accuracy: 0.9954 - val_loss: 0.0714 - val_accuracy: 0.9845
|
cs |
4. 학습의 자동 중단
학습이 진행될수록 과적합으로 인해 테스트셋의 실험 결과는 나빠지게 된다. 케라스에는 테스트셋 오차가 줄지 않으면 학습을 멈추게 도와주는 함수가 있다. 바로 EarlyStopping() 함수이다. 해당 함수를 사용하기 위해서는 다음과 같이 import 하면 된다.
1
|
from keras.callbacks import EarlyStopping
|
cs |
EarlyStopping() 함수에 모니터할 값과 테스트 오차가 좋아지지 않아도 몇 번까지 기다릴지(patience) 정한다.
1
2
|
early_stopping_callback = EarlyStopping(monitor = 'var_loss', patience = 100)
|
cs |
그 다음으로 에포크의 횟수와 배치 크기를 정하고 early_stopping_callback 값을 불러온다.
1
|
model.fit(X, Y, validation_split = 0.33, epochs = 3500, batch_size = 500, callbacks = [early_stopping_callback])
|
cs |
전체 코드는 다음과 같다.
@ 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
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
import os
os.environ['KMP_DUPLICATE_LIB_OK']='True'
# 시드값 설정
seed = 0
numpy.random.seed(seed)
tf.random.set_seed(seed)
# 데이터 입력
df_pre = pd.read_csv("/Users/hansubin/Downloads/006958-master/deeplearning/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 = 'var_loss', patience = 100)
model.fit(X, Y, validation_split = 0.33, epochs = 3500, batch_size = 500, callbacks = [early_stopping_callback])
print("\n Accuracy: %.4f" %(model.evaluate(X, Y)[1]))
|
cs |
@ 실행 결과
1
|
Accuracy: 0.9928
|
cs |
* 출처
조태호, 모두의 딥러닝(2017), 길벗
'𝐂𝐎𝐌𝐏𝐔𝐓𝐄𝐑 𝐒𝐂𝐈𝐄𝐍𝐂𝐄 > 𝐃𝐄𝐄𝐏 𝐋𝐄𝐀𝐑𝐍𝐈𝐍𝐆' 카테고리의 다른 글
딥러닝 :: 순환 신경망(RNN) (0) | 2020.08.13 |
---|---|
딥러닝 :: 선형 회귀 적용하기 (0) | 2020.08.12 |
딥러닝 :: 과적합 피하기 (0) | 2020.08.11 |
딥러닝 :: 다중 분류 문제, 상관도 그래프, 원핫코딩 (0) | 2020.08.10 |
딥러닝 :: 데이터 가공하기, 그래프로 표현하기 (0) | 2020.08.10 |