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
- 분류 모델에 사용되는 손실 함수
- Binary Cross Entropy/ Cross Entropy
- Binary Cross Entropy 2진 분류에서 자주사용
- 일반적으로 다중 분류에서 Cross Entropy 사용
- 예측 확률이 실제 레이블과 얼마나 차이가 있는지 측정
- Hinge Loss
- SVM에서 많이 사용
- 마진을 고려하여 오분류 된 샘플에 페널티를 부여
- Binary Cross Entropy/ Cross Entropy
혼동 행렬(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): 실제 음성 샘플 중 모델이 양성이라고 예측한 부분
- 데이터 불균형 상황에서 사용
- 임계값(Threshold)을 변화시키며, 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 평균만 내뱉는 모델이고 사용 의도가 무엇ㅇ인가 싶었다. 그런데 이게 바닥선 역할을 한다는 걸 알고 나니, 다른 모델이 "학습을 제대로 한 건지, 평균만 찍어도 나오는 수준인지" 판단하는 기준이 된다는 게 납득됐다. 잘 만든 모델이라는 건 결국 비교 대상이 있어야 증명되는 거였다.
'머신러닝 활용 품질관리' 카테고리의 다른 글
| Chapter.8 머신러닝 활용 품질관리(6) (0) | 2026.06.23 |
|---|---|
| Chapter.8 머신러닝 활용 품질관리(5) (0) | 2026.06.22 |
| Chapter.8 머신러닝 활용 품질관리(3) (0) | 2026.06.17 |
| Chapter.8 머신러닝 활용 품질관리(2) (0) | 2026.06.16 |
| Chapter.8 머신러닝 활용 품질관리(1) (0) | 2026.06.15 |