불균형 클래스
Coddy Machine Learning 여정의 지도 학습 섹션에 포함된 레슨. 58개 중 24번째.
환자 100명 중 95명이 건강할 때 항상 건강하다고 답하는 모델은 정확도 95%를 기록하지만, 환자는 한 명도 찾아내지 못합니다. 불균형 클래스에서는 정확도가 실제보다 좋게 보입니다:
두 가지 수정 사항입니다. stratify=y는 두 세트 모두에서 95 대 5의 비율을 유지하므로, 테스트 세트에 찾아낼 수 있는 아픈 환자가 포함됩니다. class_weight="balanced"는 각 희귀 행의 가중치를 높입니다:
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.25, random_state=0, stratify=y)
model = LogisticRegression(max_iter=1000, class_weight="balanced")균형 모델은 더 많은 사례를 포착하는 대신 정확도를 조금 희생합니다. 드문 사례에서는 정확도가 아니라 재현율과 정밀도를 살펴보세요.
챌린지
중급공장의 베어링 중 약 5%는 일찍 고장 납니다. 시작 코드는 시험 장비의 기록을 분할하고 기본 모델의 점수를 계산하지만, 테스트 세트에는 고장 난 베어링이 2개뿐이므로 0.993이라는 값은 별 의미가 없습니다.
- 두 세트가 고장 난 베어링을 동일한 비율로 포함하도록 분할을 수정하세요.
- 고장 난 행에 더 큰 가중치를 부여하는 두 번째 모델을 학습시키고, 아래와 같이 결과 줄을 출력하세요.
다른 시험 장비의 경우:
Faulty bearings: train 8.1%, test 7.8%
Plain: accuracy 0.947, recall 0.417
Balanced: accuracy 0.900, recall 0.833직접 해보기
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, recall_score
# 시험 장치에서 측정한 베어링 하나당 한 행: faulty가 1이면 측정 직후 고장 났다는 뜻입니다
parts = pd.read_csv("bearings.csv")
features = ["vibration_mm_s", "temp_c", "noise_db", "hours_k"]
X = parts[features]
y = parts["faulty"]
# 이 데이터 분할을 수정하세요
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
print(f"Faulty bearings: train {y_train.mean() * 100:.1f}%, test {y_test.mean() * 100:.1f}%")
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
plain = LogisticRegression(max_iter=1000)
plain.fit(X_train, y_train)
pred = plain.predict(X_test)
print(f"Plain: accuracy {accuracy_score(y_test, pred):.3f}, recall {recall_score(y_test, pred):.3f}")
# 아래에 코드를 작성하세요
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
지도 학습의 모든 레슨
직접 연습해 보세요: 온라인 Python 컴파일러