이 블로그글은 2019년 조재영(Kevin Jo), 김승수(SeungSu Kim)님의 딥러닝 홀로서기 세미나를 수강하고 작성한 글임을 밝힙니다.
하이퍼 파라미터 튜닝을 할 대 test accuracy를 봐도 되는가?
plt.text
를 통해 test accuracy를 표시한 것은 큰 오류이다. Test accuracy는 모델의 최종 성능 평가를 위해 보존된 데이터로, 하이퍼파라미터 튜닝 중에 확인하거나 활용해서는 안된다. 이를 통해 튜닝을 진행하면 Test 데이터에 과적합될 위험이 있으며, 모델의 일반화 성능 평가가 왜곡될 수 있다. Test 데이터는 반드시 최종 평가 단계에서만 사용해야 합니다.코드 수정
var1 = 'n_layer'
var2 = 'hid_dim'
df = load_exp_result('exp1')
list_v1 = df[var1].unique()
list_v2 = df[var2].unique()
list_data = []
for value1 in list_v1:
for value2 in list_v2:
row = df.loc[df[var1] == value1]
row = row.loc[df[var2] == value2]
train_accs = list(row.train_accs)[0]
val_accs = list(row.val_accs)[0]
max_val_acc = max(val_accs) # 최대 val accuracy 계산
print(f"Max Val Accuracy: {max_val_acc}")
for epoch, train_acc in enumerate(train_accs):
list_data.append({'type': 'train', 'Acc': train_acc, 'max_val_acc': max_val_acc, 'epoch': epoch, var1: value1, var2: value2})
for epoch, val_acc in enumerate(val_accs):
list_data.append({'type': 'val', 'Acc': val_acc, 'max_val_acc': max_val_acc, 'epoch': epoch, var1: value1, var2: value2})
df = pd.DataFrame(list_data)
g = sns.FacetGrid(df, row=var2, col=var1, hue='type', margin_titles=True, sharey=False)
g = g.map(plt.plot, 'epoch', 'Acc', marker='.')
def show_acc(x, y, metric, **kwargs):
plt.scatter(x, y, alpha=0.3, s=1)
metric = "Max Val Acc: {:1.3f}".format(list(metric.values)[0])
plt.text(0.05, 0.95, metric, horizontalalignment='left', verticalalignment='center', transform=plt.gca().transAxes, bbox=dict(facecolor='yellow', alpha=0.5, boxstyle="round,pad=0.1"))
g = g.map(show_acc, 'epoch', 'Acc', 'max_val_acc')
g.add_legend()
g.fig.suptitle('Train Accuracy vs Val Accuracy')
plt.subplots_adjust(top=0.89)
plt.show()
Optimizer를 Adam으로 했을때 학습이 잘 안되는데 이유는?
Ensemble을 사용하여 성능을 높일 수 없을까?