Chapter 10: 모델 최적화 및 불확실성 추정
이 장에서는 모델의 성능을 극한으로 끌어올리는 하이퍼파라미터 최적화(Hyperparameter Optimization)와 예측 결과의 신뢰도를 평가하는 불확실성 추정 기법을 다룹니다.
하이퍼파라미터 최적화 (Hyperparameter Optimization)
최고의 모델을 만들기 위해서는 모델의 설정을 결정하는 하이퍼파라미터를 세밀하게 조정해야 합니다. 자동화된 최적화 기법을 통해 효율적으로 성능을 높이는 방법을 알아봅니다.
import deepchem as dc
import tensorflow as tf
import tensorflow.keras.layers as layers
import numpy as np
# 학습된 전사 인자(TF) 결합 모델의 출력을 최대화하는 입력을 찾습니다.
# 먼저 모델을 구축합니다.
features = tf.keras.Input(shape=(101, 4))
prev = features
for i in range(3):
prev = layers.Conv1D(
filters=15, kernel_size=10, activation=tf.nn.relu, padding="same"
)(prev)
prev = layers.Dropout(rate=0.5)(prev)
logits = layers.Dense(units=1)(layers.Flatten()(prev))
output = layers.Activation(tf.math.sigmoid)(logits)
keras_model = tf.keras.Model(inputs=features, outputs=[output, logits])
model = dc.models.KerasModel(
keras_model,
loss=dc.models.losses.SigmoidCrossEntropy(),
output_types=["prediction", "loss"],
batch_size=1000,
model_dir="../tf",
)
model.restore()
# 무작위 서열로 시작합니다.
best_sequence = np.random.randint(4, size=101)
best_score = float(model.predict_on_batch([dc.metrics.to_one_hot(best_sequence, 4)]))
# 서열에 무작위 변화를 주고, 점수가 높아지는 경우에만 해당 변화를 유지합니다.
for step in range(1000):
index = np.random.randint(101)
base = np.random.randint(4)
if best_sequence[index] != base:
sequence = best_sequence.copy()
sequence[index] = base
score = float(model.predict_on_batch([dc.metrics.to_one_hot(sequence, 4)]))
if score > best_score:
best_sequence = sequence
best_score = score
print("최적 서열(Best sequence):", "".join(["ACGT"[i] for i in best_sequence]))
print("최고 점수(Best score):", score)예측 불확실성 추정 (Estimating Uncertainty)
예측 한 번이 생사와 직결될 수 있는 생명과학 분야에서, 모델이 자신의 예측을 얼마나 확신하는지 아는 것은 매우 중요합니다. 딥러닝 모델의 결과에 수반되는 불확실성을 어떻게 측정하고 해석하는지 살펴봅니다.
import deepchem as dc
import numpy as np
import matplotlib.pyplot as plt
# 모델 예측의 불확실성을 추정합니다.
# 먼저 모델을 생성하고 학습을 진행합니다.
tasks, datasets, transformers = dc.molnet.load_delaney(featurizer="GraphConv")
train_dataset, valid_dataset, test_dataset = datasets
model = dc.models.GraphConvModel(
n_tasks=1, mode="regression", dropout=0.2, uncertainty=True
)
model.fit(train_dataset, nb_epoch=100)
# 테스트 세트에서 예측값과 그 불확실성을 예측합니다.
y_pred, y_std = model.predict_uncertainty(test_dataset)
# 예측된 불확실성(표준 편차)과 실제 절대 오차 사이의 관계를 시각화합니다.
plt.scatter(y_std, np.abs(y_pred - test_dataset.y))
plt.plot([0, 0.7], [0, 1.4], "k:")
plt.xlim([0.1, 0.7])
plt.xlabel("예측된 표준 편차(Predicted Standard Deviation)")
plt.ylabel("절대 오차(Absolute Error)")
plt.show()