머신러닝 활용 품질관리

Chapter.8 머신러닝 활용 품질관리(4)

devjjun 2026. 6. 19. 09:10

TIL(Today I Learned)


1️⃣실무에 바로 쓰는 머신러닝 기초 5 & 실습 과제

부족한 개념 

  • SVM(Support Vector Machine)
  • 추가 모델(K-NN, 나이브 베이즈, Naive Bayes, 신경망(MLP) 또는 딥러닝 모델 
  • 모델 평가 방법 정리 

SVM(Support Vector Machine)

데이터를 가장 잘(안전 여유 공간을 크게) 구분하는 경계를 찾는 알고리즘 

 

  • 장점
    • 차원이 높은 데이터에서도 좋은 성능 
    • 결정 경계(SVM이 찾은 최적의 분류선)을 명확하게 찾는 경우, 예측 성능 우수
  • 단점
    • 파라미터(C, 커널 종류 등) 적절히 찾아야 하므로 튜닝 비용이 큼 
    • 대규모 데이터 세트에 대해서는 학습 속도 느릴 수 있음 
  • SVM 코드 예시 
더보기
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, classification_report

# 1. 데이터 로드
iris = load_iris()
X = iris.data       # 특징(feature) 데이터
y = iris.target     # 타깃(target) 데이터
print(X.shape)
print(y.shape)

# 2. 데이터 분할 (train : test = 8 : 2)
X_train, X_test, y_train, y_test = train_test_split(X, y,
                                                    test_size=0.2,
                                                    random_state=42,
                                                    stratify=y)

# 3. SVM(Support Vector Machine)
# C, gamma 등의 하이퍼파라미터를 설정해서 더 최적화 가능
svm_model = SVC()
svm_model.fit(X_train, y_train)

# 4. 예측
y_pred_svm = svm_model.predict(X_test)

# 5. 성능 평가
# Accuracy(정확도)와 정밀 평가(classification_report)를 이용해 비교

print("=== SVM ===")
print("Accuracy:", accuracy_score(y_test, y_pred_svm))
print(classification_report(y_test, y_pred_svm, target_names=iris.target_names))
  • 결과

추가 모델 

  • K-NN(K-최근접 이웃): 간단하지만 대규모 데이터에서 계산량이 큼 

  • 나이브 베이즈(Naive Bayes): 통계적 가정(독립성) 기반하므로 계산 빠름

  • 신경망(MLP) 또는 딥러닝 모델: 복잡도는 높지만 대규모 데이터에서 강점 

모델 평가 방법 

Corss Entropy, Hinge Loss 

  • 분류 모델에 사용되는 손실 함수 
    1. Binary Cross Entropy/ Cross Entropy
      •  Binary Cross Entropy 2진 분류에서 자주사용
      • 일반적으로 다중 분류에서 Cross Entropy 사용 
      • 예측 확률이 실제 레이블과 얼마나 차이가 있는지 측정 
    2. Hinge Loss 
      • SVM에서 많이 사용 
      • 마진을 고려하여 오분류 된 샘플에 페널티를 부여 

혼동 행렬(Confusion Matrix)

  • .실제 클래스와 예측 클래스의 관게를 행렬 형태로 나타낸 것 

Precision, Recall, F1-Score

  • Precision(정밀도): 예측을 Positive라고 한 사례 중, 실제로 Positive인 비율.
  • Recall(재현율): 실제 Positive 사례 중, 모델이 Positive로 맞춘 비율.
  • F1-score: Precision과 Recall의 조화평균.

ROC 곡선과 AUC

  • ROC 곡선 
    • 임계값(Threshold)을 변화시키며, TPR(True Positive Rate)과 FPR(False Positive Rate)의
      변화를 시각화한 곡선
      • TPR(True Positive Rate): 실제 양성 샘플 중 모델이 양성이라고 예측한 부분 
      • FPR(False Positive Rate): 실제 음성 샘플 중 모델이 양성이라고 예측한 부분 
    • 데이터 불균형 상황에서 사용 
  • AUC
    • ROC 곡선 아래 면적, 1에 가까우수록 모델이 우수함 
  • 불균형 데이터에서도 모델 성능 비교에 유용 

더보기
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_curve, roc_auc_score

# 1. 데이터 로드 (유방암 데이터셋: 이진 분류)
data = load_breast_cancer()
X = data.data
y = data.target

# 2. 학습/테스트 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                    test_size=0.2, 
                                                    random_state=42,
                                                    stratify=y)

# 3. 모델 생성 및 학습
model = LogisticRegression(max_iter=500)  # 반복횟수를 충분히 늘려줌
model.fit(X_train, y_train)

# 4. 예측(특히 ROC-AUC 계산을 위해 확률값이 필요하므로 predict_proba 사용)
y_proba = model.predict_proba(X_test)[:, 1]  
# predict_proba의 결과 shape는 (샘플 수, 클래스 수).
# 여기서는 양성 클래스(1)에 대한 확률만 사용

# 5. ROC 곡선 계산
fpr, tpr, thresholds = roc_curve(y_test, y_proba)
# fpr: False Positive Rate
# tpr: True Positive Rate (재현율)
# thresholds: 임계값(이 값을 기준으로 양성/음성 분류가 달라짐)

# 6. AUC 계산
auc_score = roc_auc_score(y_test, y_proba)

# 7. ROC 곡선 시각화
plt.figure()
plt.plot(fpr, tpr, label=f'Logistic (AUC = {auc_score:.3f})')
plt.plot([0, 1], [0, 1], linestyle='--')  # 랜덤 분류선
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.legend()
plt.show()

print("ROC-AUC Score:", auc_score)
  • 결과

와인 데이터셋 분류 실습

실습 과정에서 부족한 점 

  • 타겟의 분류값이 3개인 데이터에서 혼동행렬과 ROC-AUC 그래프 분석
    • OVR(One vs Rest): 각 클래스를 하나씩 꺼내서 나머지 전부와 비교  
    • OVO(One vs One): 클래스끼리 1:1로 비교
from sklearn.metrics import roc_auc_score

auc_ovr = roc_auc_score(
    y_test,
    model.predict_proba(X_test),
    multi_class='ovr', # multi_class='ovo'
    average='macro'
)

print(auc_ovr)
  • 타겟의 컬럼이 3개라면? 
    • 다중출력: 각각 따로따로 출력 

실무에 바로 쓰는 머신러닝 5주차 실습 .ipynb - Colab

 

Google Colab Notebook

Run, share, and edit Python notebooks

colab.research.google.com

 


2️⃣프로젝트 부트캠프: NASA 엔진 수명 예측 실습 (4)

베이스라인 모델 구성 

평균회귀(DummyRegressor, strategy='mean')는 피처를 전혀 안 쓰고 train RUL 평균만 출력하는 바닥선,
선형회귀는 선형 관계만 잡는 기준선,
의사결정나무(DecisionTreeRegressor)는 비선형·상호작용을 잡는 모델로 구성. 

평가 방식 

GroupKFold 교차검증도 검토했지만, 우선 제공된 train/test로 한 번만 평가해 점수를 빠르게 보는 방식으로 진행

데이터 구조

RUL_FD001.txt는 각 엔진(100대) 마지막 시점의 RUL 100개만 담고 있다. 그래서 test 전체(13,096행)로 예측하면 예측값 개수(13,096)와 정답 개수(100)가 안 맞아 ValueError

-> test.groupby('unit').last()로 유닛별 마지막 행 100개만 추출해서 예측하는 것.

평가 지표 선정 

sklearn.metrics의 mean_squared_error, mean_absolute_error 사용.

  • RMSE는 np.sqrt(mean_squared_error(...))로 계산 . RUL 예측에선 RMSE/MAE를 주로 보고, 추후 C-MAPSS 전용 score(늦은 예측에 더 큰 벌점)를 추가

어려웠던 부분 

  • 코랩을 사용하는 과정에서 노트북 단위로 분할하여 진행할 때 매 노트북마다 새롭게 CSV 형태로 저장해야 함
    하지만 파일명 착오가 발생
  • 위 결과로 인하여 Test 예측 값과 정답값 비교 과정에서 행의 개수가 맞지 않아 수정하는데에 많은 시간을 할애 

💡 느낀점

베이스라인을 평균회귀, 선형회귀, 의사결정나무 세 가지로 잡았는데, 이렇게 단순한 것부터 쌓아 올리는 이유를 직접 코드를 짜보며 이해하게 됐다. 특히 평균회귀는 피처를 하나도 안 쓰고 그냥 RUL 평균만 내뱉는 모델이고 사용 의도가 무엇ㅇ인가 싶었다. 그런데 이게 바닥선 역할을 한다는 걸 알고 나니, 다른 모델이 "학습을 제대로 한 건지, 평균만 찍어도 나오는 수준인지" 판단하는 기준이 된다는 게 납득됐다. 잘 만든 모델이라는 건 결국 비교 대상이 있어야 증명되는 거였다.