3일차 복습
Fashion MNIST로 이항 분류 모델의 구성, 훈련, 테스트, 혼동행렬, 문턱값 조정을 복습
실습 데이터: Fashion MNIST 의류 분류
- 별도의 파일 없이 Keras에서 Fashion MNIST 불러오기
- 원래 10개 클래스 중 드레스(
3)와 코트(4)만 선택 - 드레스(
3)를 음성 클래스0, 코트(4)를 양성 클래스1로 변환 - 소수형 계산 문항은 Colab 실행 결과를 소수점 둘째 자리까지 입력
| 원래 클래스 | 의류 | 이항 분류 레이블 | 의미 |
|---|---|---|---|
3 |
드레스(Dress) | 0 |
음성(negative) |
4 |
코트(Coat) | 1 |
양성(positive) |
퀴즈
딥러닝에서 GPU를 사용하는 핵심 이유는?
- ○대량의 단순 계산을 병렬로 처리하기 위해
- ○훈련 데이터를 영구 저장하기 위해
- ○모든 모델 구조를 자동으로 결정하기 위해
- ○입력 이미지의 해상도를 자동으로 높이기 위해
퀴즈를 풀려면 대화형 기능을 불러와야 합니다.
딥러닝에서 GPU를 사용하는 핵심 이유는?
이미지의 여러 픽셀과 가중치에 같은 종류의 계산을 반복하는 상황을 생각하세요.
Keras가 PyTorch를 백엔드로 사용하게 하려면 os.environ["KERAS_BACKEND"] = 뒤에 무엇을 입력해야 하나요?
백엔드 이름은 프레임워크의 Python 패키지 이름과 같습니다. 정답을 고른 뒤 다음 코드를 실행해 실습 환경과 데이터를 준비하세요.
import os
os.environ["KERAS_BACKEND"] = "torch"
import keras
(x_train, y_train), (x_test, y_test) = (
keras.datasets.fashion_mnist.load_data()
)
"torch""keras""gpu""pytorch""torch"filter_binary(x, y, 3, 4)를 실행할 때 원래 클래스와 새 레이블의 연결로 맞는 것은?
세 번째 인수는 음성 클래스, 네 번째 인수는 양성 클래스입니다. 다음 코드를 실행해 이항 분류 데이터를 준비하세요.
import numpy as np
def filter_binary(x, y, neg_cls, pos_cls):
cond = (y == neg_cls) | (y == pos_cls)
x_bin = x[cond]
y_bin = np.where(y[cond] == neg_cls, 0, 1)
return x_bin, y_bin
x_train_binary, y_train_binary = filter_binary(
x_train, y_train, 3, 4
)
x_test_binary, y_test_binary = filter_binary(
x_test, y_test, 3, 4
)
3) → 0, 코트(4) → 1드레스(3) → 1, 코트(4) → 0드레스(3) → 3, 코트(4) → 4드레스(3) → -1, 코트(4) → 13) → 0, 코트(4) → 1이항 분류에 사용할 훈련 이미지의 수를 입력하세요.
필터링한 배열의 첫 번째 차원을 확인하세요.
x_train_binary.shape[0]
모델을 정의하기 전에 keras.utils.set_random_seed(812)를 실행하는 이유는?
같은 코드와 데이터로 다시 학습했을 때 난수 때문에 결과가 달라지는 상황을 줄이는 설정입니다.
812만 선택하기 위해학습률을 자동으로 0.0812로 설정하기 위해모델의 전체 파라미터 수를 812개로 제한하기 위해Rescaling(1/255) 레이어의 역할은?
각 픽셀값에 1/255을 곱한 뒤 최솟값과 최댓값을 생각하세요.
0~255에서 0~1로 변환한다28 × 28 이미지를 1차원 벡터로 펼친다원래 클래스 번호를 0과 1로 변환한다양성 확률을 최종 클래스 예측으로 변환한다0~255에서 0~1로 변환한다Flatten 레이어의 역할은?
가로와 세로의 픽셀 위치를 한 줄의 입력 특성으로 바꾸는 과정입니다.
이항 분류 모델의 출력층을 Dense(1, activation="sigmoid")로 정의하는 이유는?
두 클래스의 확률은 서로 보완 관계이므로 양성 확률 하나로 표현할 수 있습니다.
1일 확률 하나를 출력하기 위해10개 의류 클래스의 확률을 각각 출력하기 위해28 × 28 이미지의 공간 구조를 그대로 유지하기 위해훈련 이미지와 테스트 이미지를 자동으로 분리하기 위해1일 확률 하나를 출력하기 위해실제 레이블이 1인 이미지에 모델이 0.01을 예측하면 이항 교차 엔트로피 손실은 어떻게 되나요?
실제 양성에서는 예측한 양성 확률이 1에 가까울수록 손실이 작습니다.
0.5가 된다문턱값을 적용하기 전에는 손실을 계산할 수 없다경사하강법의 파라미터 수정 과정으로 가장 적절한 것은?
현재 파라미터에서 손실이 가장 빠르게 증가하는 방향의 반대로 이동합니다.
학습률이 지나치게 클 때 생길 수 있는 문제는?
학습률은 경사 방향으로 이동하는 한 걸음의 크기를 조절합니다.
다음 compile() 코드의 해석으로 가장 적절한 것은?
model.compile(
optimizer=keras.optimizers.SGD(learning_rate=0.001),
loss="binary_crossentropy",
metrics=["accuracy"],
)
optimizer는 파라미터 수정 방법, loss는 최소화할 값, metrics는 학습 중 확인할 평가 지표입니다.
0.001인 SGD로 이항 교차 엔트로피를 줄이며 정확도를 함께 기록한다학습률이 0.001인 SGD로 정확도를 줄이며 이항 교차 엔트로피를 함께 기록한다배치 크기를 0.001로 정하고 평균 제곱 오차와 정확도를 함께 최소화한다문턱값을 0.001로 정하고 테스트 데이터의 혼동행렬을 계산한다0.001인 SGD로 이항 교차 엔트로피를 줄이며 정확도를 함께 기록한다다음 fit() 코드의 해석으로 가장 적절한 것은?
history = model.fit(
x_train_binary,
y_train_binary,
epochs=5,
batch_size=32,
verbose=0,
)
epochs는 전체 데이터의 반복 횟수, batch_size는 한 번의 업데이트에 사용하는 사례 수입니다.
history에 저장한다테스트 데이터를 5개씩 나누어 전체를 32번 학습하고 과정을 history에 저장한다훈련 데이터에서 이미지 32개만 골라 5회 예측하고 모델은 수정하지 않는다훈련 데이터를 한 번만 학습한 뒤 정확도가 높은 5개 배치만 저장한다history에 저장한다다음 코드를 실행했을 때 5번째 에포크의 훈련 정확도를 소수점 둘째 자리까지 입력하세요.
keras.utils.set_random_seed(812)
model = keras.models.Sequential(
[
keras.layers.Rescaling(1/255),
keras.layers.Flatten(),
keras.layers.Dense(1, activation="sigmoid"),
]
)
model.compile(
optimizer=keras.optimizers.SGD(learning_rate=0.001),
loss="binary_crossentropy",
metrics=["accuracy"],
)
history = model.fit(
x_train_binary,
y_train_binary,
epochs=5,
batch_size=32,
verbose=0,
)
history.history["accuracy"][-1]
history.history["accuracy"]에는 에포크별 훈련 정확도가 순서대로 저장됩니다. 마지막 원소를 확인하세요.
훈련에 사용하지 않은 테스트 데이터로 모델을 평가하는 주된 이유는?
학습한 사례를 잘 맞히는 것과 새로운 사례를 잘 맞히는 것은 다른 문제입니다.
테스트 정확도를 소수점 둘째 자리까지 입력하세요.
테스트 데이터는 fit()이 아니라 evaluate()에 전달합니다.
test_loss, test_accuracy = model.evaluate(
x_test_binary,
y_test_binary,
verbose=0,
)
test_accuracy
model.predict(x_test_binary)로 얻은 값의 의미는?
시그모이드 출력은 아직 문턱값을 적용하지 않은 0~1 사이의 값입니다. 다음 코드를 실행하세요.
y_true = y_test_binary
y_prob = model.predict(
x_test_binary, verbose=0
).reshape(-1)
y_prob[:5]
1일 것으로 예측한 확률각 테스트 이미지가 드레스와 코트 중 어느 클래스인지 나타내는 정수각 테스트 이미지가 훈련에 사용된 횟수각 픽셀에 연결된 Dense 레이어의 가중치1일 것으로 예측한 확률예측 확률에 문턱값 0.5를 적용하는 코드로 맞는 것은?
확률이 기준 이상이면 True, 아니면 False가 되고 이를 정수로 바꿉니다.
y_pred_05 = (y_prob >= 0.5).astype(int)y_pred_05 = (y_prob <= 0.5).astype(float)y_pred_05 = np.argmax(y_prob, axis=1)y_pred_05 = model.fit(y_prob, y_true)y_pred_05 = (y_prob >= 0.5).astype(int)혼동행렬의 구성 요소에 대한 설명으로 맞는 것을 모두 고르세요.
드레스는 음성 0, 코트는 양성 1입니다. True와 False는 예측의 정답 여부를 나타냅니다.
from sklearn.metrics import confusion_matrix
y_pred_05 = (y_prob >= 0.5).astype(int)
cm_05 = confusion_matrix(y_true, y_pred_05)
cm_05
문턱값 0.5의 정밀도를 소수점 둘째 자리까지 입력하세요.
코트라고 예측한 이미지 중 실제 코트의 비율입니다.
from sklearn.metrics import precision_score
precision_score(y_true, y_pred_05)
문턱값 0.5의 재현도를 소수점 둘째 자리까지 입력하세요.
실제 코트 중 모델이 코트로 찾아낸 비율입니다.
from sklearn.metrics import recall_score
recall_score(y_true, y_pred_05)
문턱값 0.5의 특이도를 소수점 둘째 자리까지 입력하세요.
실제 드레스 중 드레스로 찾아낸 비율입니다. 음성 레이블 0을 관심 클래스로 지정하세요.
recall_score(y_true, y_pred_05, pos_label=0)
문턱값 0.5의 F1 점수를 소수점 둘째 자리까지 입력하세요.
정밀도와 재현도의 조화 평균입니다.
from sklearn.metrics import f1_score
f1_score(y_true, y_pred_05)
실제 코트를 드레스로 놓치는 위음성(FN)의 비용이 클 때 우선 확인할 지표는?
위음성을 줄이면 직접 높아지는 지표를 선택하세요.
문턱값을 0.5에서 0.3으로 낮출 때 일반적으로 나타나는 변화를 모두 고르세요.
더 낮은 확률도 양성으로 인정하면 양성 예측 범위가 넓어집니다.
문턱값 0.3의 재현도를 소수점 둘째 자리까지 입력하세요.
문턱값별 지표 표를 만든 뒤 0.3 행의 재현도를 확인하세요.
import pandas as pd
from sklearn.metrics import accuracy_score
ths = np.round(np.linspace(0.1, 0.9, 81), 2)
rows = []
for threshold in ths:
y_pred = (y_prob >= threshold).astype(int)
rows.append({
"threshold": threshold,
"accuracy": accuracy_score(y_true, y_pred),
"precision": precision_score(
y_true, y_pred, zero_division=0
),
"recall": recall_score(y_true, y_pred),
"specificity": recall_score(
y_true, y_pred, pos_label=0
),
"f1": f1_score(y_true, y_pred),
})
threshold_results = pd.DataFrame(rows)
threshold_results.loc[
threshold_results["threshold"] == 0.3,
"recall",
].iloc[0] # 재현도
문턱값 0.7의 정밀도를 소수점 둘째 자리까지 입력하세요.
앞에서 만든 표에서 threshold가 0.7인 행의 precision 열을 확인하세요.
threshold_results.loc[
threshold_results["threshold"] == 0.7,
"precision",
].iloc[0]
F1 점수가 가장 높은 문턱값을 소수점 둘째 자리까지 입력하세요.
idxmax()는 F1 값이 가장 큰 행의 위치를 반환합니다.
best_i = threshold_results["f1"].idxmax()
best_threshold = threshold_results.loc[best_i, "threshold"]
best_threshold
ROC 곡선과 ROC-AUC에 대한 설명으로 맞는 것을 모두 고르세요.
문턱값을 바꾸면서 실제 양성을 찾는 비율과 실제 음성을 잘못 양성으로 분류하는 비율을 함께 추적합니다.
1 - 특이도이다ROC 곡선의 세로축 TPR은 재현도와 같다곡선의 각 점은 서로 다른 문턱값의 결과다ROC-AUC는 문턱값 0.5의 정확도만 요약한다1 - 특이도이다, ROC 곡선의 세로축 TPR은 재현도와 같다, 곡선의 각 점은 서로 다른 문턱값의 결과다테스트 데이터의 ROC-AUC를 소수점 둘째 자리까지 입력하세요.
예측 클래스가 아니라 양성 확률을 전달합니다.
from sklearn.metrics import roc_auc_score, roc_curve
fpr, tpr, roc_thresholds = roc_curve(y_true, y_prob)
roc_auc = roc_auc_score(y_true, y_prob)
roc_auc