분류 복습
설비 불량 데이터로 분류, 앙상블, 혼동행렬, 문턱값 조정을 복습
실습 데이터: 설비 불량 예측
- 설비 센서와 공정 지표로 불량 여부 예측
- 전체 12,000건, 입력 변수 8개
defect는0=정상,1=불량- 불량
1을 양성(positive) 클래스로 설정
| 컬럼 | 설명 |
|---|---|
temp_index |
온도 지표 |
pressure_index |
압력 지표 |
vibration_index |
진동 지표 |
speed_index |
속도 지표 |
current_index |
전류 지표 |
humidity_index |
습도 지표 |
cycle_time_index |
공정 시간 지표 |
inspection_index |
검사 지표 |
defect |
불량 여부(0=정상, 1=불량) |
수업에서 사용한 defect_classification.csv를 Colab 현재 폴더에 업로드한 뒤 실행하세요.
import pandas as pd
df_defect = pd.read_csv("defect_classification.csv")
df_defect.head()
퀴즈
설비 불량 여부 예측이 분류 문제에 해당하는 이유는?
- ○정답이
0=정상과1=불량이라는 두 범주이기 때문에 - ○입력 변수가 모두 연속형 숫자이기 때문에
- ○전체 데이터가 12,000건으로 고정되어 있기 때문에
- ○각 입력 변수의 평균을 계산할 수 있기 때문에
퀴즈를 풀려면 대화형 기능을 불러와야 합니다.
설비 불량 여부 예측이 분류 문제에 해당하는 이유는?
분류와 회귀는 입력 변수의 자료형보다 예측하려는 정답의 형태로 구분합니다.
0=정상과 1=불량이라는 두 범주이기 때문에입력 변수가 모두 연속형 숫자이기 때문에전체 데이터가 12,000건으로 고정되어 있기 때문에각 입력 변수의 평균을 계산할 수 있기 때문에0=정상과 1=불량이라는 두 범주이기 때문에입력 변수 X와 정답 y를 올바르게 분리한 코드는?
defect는 맞혀야 할 정답이므로 입력 변수에서 제외합니다.
X = df_defect.drop(columns="defect")
y = df_defect["defect"]
X = df_defect.drop(columns="defect"), y = df_defect["defect"]X = df_defect["defect"], y = df_defect.drop(columns="defect")X = df_defect.drop(index="defect"), y = df_defect.indexX = df_defect.copy(), y = df_defect.copy()X = df_defect.drop(columns="defect"), y = df_defect["defect"]y.value_counts().sort_index()의 결과를 바탕으로 맞는 설명을 모두 고르세요.
0과 1의 개수 차이를 확인하고, 다수 클래스가 많은 상황에서 정확도의 한계를 생각하세요.
y.value_counts().sort_index()
test_size=0.2로 분할한 테스트 데이터의 행 수를 입력하세요.
다음 코드를 실행한 뒤 X_test.shape[0]을 확인하세요.
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
X, y,
test_size=0.2,
random_state=42,
stratify=y,
)
X_train.shape, X_test.shape
데이터 분할에서 stratify=y를 사용하는 목적으로 가장 적절한 것은?
불량처럼 상대적으로 적은 클래스가 분할 과정에서 한쪽에 치우치지 않도록 하는 설정입니다.
결정트리 분류 모델의 작동 방식으로 가장 적절한 것은?
결정트리의 각 분기점은 한 입력 변수와 문턱값을 사용해 관측치를 두 갈래로 나눕니다.
최근접 이웃(KNN) 분류에 대한 설명으로 가장 적절한 것은?
KNN은 거리 기반 모델입니다. 측정 범위가 큰 변수가 거리 계산을 지배하지 않도록 표준화를 함께 고려합니다.
로지스틱 회귀분석의 분류 과정으로 가장 적절한 것은?
로지스틱 함수는 선형 결합을 0과 1 사이의 값으로 변환하며, 이 값을 양성 확률로 해석합니다.
앙상블이 단일 모델보다 안정적일 수 있는 이유는?
개별 모델의 오류가 완전히 같지 않을 때 여러 판단을 결합하는 효과가 생깁니다.
랜덤 포레스트와 배깅의 관계를 가장 잘 설명한 것은?
배깅은 서로 다른 복원추출 표본에서 여러 모델을 학습하고 결과를 평균이나 다수결로 결합합니다.
배깅, 부스팅, 스태킹에 대한 설명으로 맞는 것을 모두 고르세요.
독립적인 병렬 결합, 순차적인 오류 보완, 예측을 다시 입력으로 사용하는 2단계 구조를 구분하세요.
수업과 같은 랜덤 포레스트를 학습하는 코드로 맞는 것은?
다음 코드를 실행해 이후 문항에서 사용할 rf_clf를 만드세요.
from sklearn.ensemble import RandomForestClassifier
rf_clf = RandomForestClassifier(
n_estimators=200,
random_state=42,
)
rf_clf.fit(X_train, y_train)
RandomForestClassifier(n_estimators=200, random_state=42)를 만든 뒤 fit(X_train, y_train)을 실행한다RandomForestClassifier(n_estimators=1, random_state=42)를 만든 뒤 테스트 데이터로 학습한다DecisionTreeClassifier(max_depth=200)를 만든 뒤 확률값만 전달해 학습한다RandomForestRegressor(n_estimators=200)를 사용해 불량 여부의 평균만 계산한다RandomForestClassifier(n_estimators=200, random_state=42)를 만든 뒤 fit(X_train, y_train)을 실행한다학습한 랜덤 포레스트의 변수 중요도에 대한 설명으로 맞는 것을 모두 고르세요.
중요도를 내림차순으로 정렬하고 첫 번째 행을 확인하세요. 중요도는 학습된 모델 내부의 활용 정도입니다.
importance = pd.DataFrame({
"feature": X.columns,
"importance": rf_clf.feature_importances_,
}).sort_values("importance", ascending=False)
importance
inspection_index이다변수 중요도는 모델이 예측에 변수를 활용한 정도이며 인과관계를 뜻하지 않는다중요도의 합은 모델의 테스트 정확도와 같다중요도가 낮은 변수는 어떤 모델에서도 반드시 삭제해야 한다inspection_index이다, 변수 중요도는 모델이 예측에 변수를 활용한 정도이며 인과관계를 뜻하지 않는다혼동행렬의 구성 요소에 대한 설명으로 맞는 것을 모두 고르세요.
True와 False는 예측의 정답 여부, Positive와 Negative는 모델이 예측한 클래스를 나타냅니다. 다음 코드로 이후 문항의 예측값도 준비하세요.
from sklearn.metrics import confusion_matrix
prob = rf_clf.predict_proba(X_test)[:, 1]
y_pred_05 = (prob >= 0.5).astype(int)
cm_05 = confusion_matrix(y_test, y_pred_05)
cm_05
문턱값 0.5의 혼동행렬에서 실제 불량을 불량으로 맞게 예측한 진양성(TP) 건수를 입력하세요.
confusion_matrix(y_test, y_pred_05)의 출력은 [[TN, FP], [FN, TP]] 순서입니다. 오른쪽 아래 값을 확인하세요.
문턱값 0.5의 정확도를 소수점 넷째 자리까지 입력하세요.
전체 2,400건 중 TN과 TP에 해당하는 올바른 예측의 비율입니다.
from sklearn.metrics import accuracy_score
accuracy_score(y_test, y_pred_05)
문턱값 0.5의 정밀도를 소수점 넷째 자리까지 입력하세요.
불량이라고 예측한 사례 중 실제 불량의 비율입니다.
from sklearn.metrics import precision_score
precision_score(y_test, y_pred_05)
문턱값 0.5의 재현도를 소수점 넷째 자리까지 입력하세요.
실제 불량 412건 중 모델이 불량으로 찾아낸 비율입니다.
from sklearn.metrics import recall_score
recall_score(y_test, y_pred_05)
문턱값 0.5의 특이도를 소수점 넷째 자리까지 입력하세요.
실제 정상 중 정상으로 찾아낸 비율입니다. 0을 양성처럼 지정해 재현도를 계산할 수 있습니다.
recall_score(y_test, y_pred_05, pos_label=0)
문턱값 0.5의 F1 점수를 소수점 넷째 자리까지 입력하세요.
F1은 정밀도와 재현도의 조화 평균입니다.
from sklearn.metrics import f1_score
f1_score(y_test, y_pred_05)
실제 불량 제품을 정상으로 놓치는 비용이 큰 상황에서 우선 확인할 지표는?
놓친 불량은 위음성(FN)입니다. FN을 줄일 때 직접 높아지는 지표를 선택하세요.
rf_clf.predict_proba(X_test)[:, 1]이 반환하는 값의 의미는?
predict_proba()의 열은 클래스별 예측 확률이며 [:, 1]은 클래스 1 열을 선택합니다.
prob = rf_clf.predict_proba(X_test)[:, 1]
prob[:5]
1일 것으로 예측한 확률각 테스트 관측치의 최종 정상·불량 클래스 번호각 입력 변수의 랜덤 포레스트 중요도훈련 데이터에서 불량인 행의 위치 번호1일 것으로 예측한 확률불량 확률이 문턱값 이상이면 1, 아니면 0으로 바꾸는 코드는?
확률과 기준값을 비교하면 불리언 배열이 만들어지고, 이를 정수로 바꾸면 False=0, True=1이 됩니다.
(prob >= threshold).astype(int)(prob <= threshold).astype(float)prob.mean(axis=1)rf_clf.feature_importances_ >= threshold(prob >= threshold).astype(int)문턱값을 0.5에서 0.3으로 낮출 때 나타난 변화로 맞는 것을 모두 고르세요.
다음 코드로 두 문턱값을 비교하세요. 문턱값을 낮추면 더 많은 사례가 불량으로 분류됩니다.
rows = []
for threshold in [0.3, 0.5]:
y_pred = (prob >= threshold).astype(int)
tn, fp, fn, tp = confusion_matrix(y_test, y_pred).ravel()
rows.append({
"threshold": threshold,
"tn": tn, "fp": fp, "fn": fn, "tp": tp,
"precision": precision_score(y_test, y_pred),
"recall": recall_score(y_test, y_pred),
})
threshold_comparison = pd.DataFrame(rows).set_index("threshold")
threshold_comparison.round(4)
문턱값 0.3의 정밀도를 소수점 넷째 자리까지 입력하세요.
문턱값별 비교표에서 0.3 행의 precision 열을 확인하세요.
threshold_comparison.loc[0.3, "precision"]
문턱값 0.3의 재현도를 소수점 넷째 자리까지 입력하세요.
문턱값별 비교표에서 0.3 행의 recall 열을 확인하세요.
threshold_comparison.loc[0.3, "recall"]
0.10부터 0.90까지 0.01 간격으로 탐색했을 때 F1이 가장 높은 문턱값과 F1의 조합은?
다음 코드는 양 끝점을 포함하고 부동소수점 문턱값을 두 자리로 고정합니다. argmax는 최대 F1의 위치를 반환합니다.
import numpy as np
ths = np.round(np.linspace(0.1, 0.9, 81), 2)
f1 = []
for threshold in ths:
y_pred = (prob >= threshold).astype(int)
f1.append(f1_score(y_test, y_pred))
i = np.argmax(f1)
ths[i], f1[i]
0.29, F1 0.6995문턱값 0.30, F1 0.6968문턱값 0.50, F1 0.6465문턱값 0.70, F1 0.49380.29, F1 0.6995ROC 곡선이 보여주는 정보를 가장 잘 설명한 것은?
양성을 더 많이 찾아내려 하면 실제 음성을 양성으로 잘못 판정하는 사례도 늘 수 있습니다. ROC 곡선은 이 두 비율의 균형을 여러 기준에서 비교합니다.
랜덤 포레스트의 ROC-AUC를 소수점 넷째 자리까지 입력하세요.
ROC-AUC는 특정 문턱값의 예측 클래스가 아니라 양성 확률로 계산합니다. 1에 가까울수록 양성과 음성을 순위로 구분하는 성능이 높습니다.
from sklearn.metrics import roc_auc_score
roc_auc_score(y_test, prob)