머신러닝 프로젝트 워크플로우
머신러닝(Machine Learning) 프로젝트는 단순한 모델 학습이 아니라, 문제를 정의하고 데이터를 처리하여 실제 적용까지 연결하는 일련의 과정이다.
아래 워크플로우는 실무에서 반복적으로 사용되는 핵심 단계들을 정리한 것이다.
1. Problem Definition (문제 정의)
- 해결하고자 하는 문제를 명확히 정의하고 예측하고자 하는 값(Target)과 설명 변수(Features)를 구분한다.
- 문제 유형에 따라 접근 방식이 달라진다.
| 문제 유형 | 설명 | 예시 |
|---|
| 회귀 (Regression) | 연속적인 수치 예측 | 주택 가격, 기온, 수요량 |
| 분류 (Classification) | 범주형 클래스 예측 | 암 진단(양성/음성), 리뷰 감성 |
| 군집화 (Clustering) | 라벨 없이 유사한 데이터 그룹화 | 고객 세분화, 뉴스 분류 |
목표 정의가 명확해야 모델 선정과 평가 기준도 명확해진다.
2. Data Collection (데이터 수집)
- 프로젝트 성패는 데이터 확보에 달려 있다.
- 데이터의 양, 질, 다양성이 중요하다.
데이터 출처
- 내부 시스템: DB, Excel, CSV 등
- 웹 크롤링/스크래핑:
BeautifulSoup, Selenium
- 공개 데이터셋: Kaggle, UCI, AI Hub, Data.go.kr
- 센서/IoT 데이터: Wearable, Smart Home 등
- API 수집: OpenWeatherMap, Twitter API 등
3. Data Preprocessing (데이터 전처리)
모델 학습 전, 데이터의 노이즈를 제거하고 구조화하는 단계
주요 작업
- 결측치 처리: 제거, 평균/중앙값 대체, 예측 기반 보간
- 이상치 탐지: Boxplot, Z-score, IQR
- 정규화/표준화:
MinMaxScaler: 0~1 스케일
StandardScaler: 평균=0, 분산=1
- 범주형 인코딩:
Label Encoding: 순서가 있는 경우
One-Hot Encoding: 순서 없는 카테고리
- 날짜/시간 처리: 시간대 분리, 주중/주말 구분 등
- Feature Engineering: 기존 변수 조합, 도메인 지식 활용 생성
4. 데이터 분할 & 교차검증
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)
from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, X, y, cv=5)
5. Model Selection (모델 선택)
문제의 성격과 데이터 특성에 따라 적합한 모델을 선택하는 것이 중요하다.
회귀(Regression) 문제
| 기본 모델 | 설명 |
|---|
LinearRegression | 선형 관계를 가정한 간단한 모델 |
Ridge, Lasso | 정규화 기법을 적용한 선형 회귀 |
RandomForestRegressor | 비선형 관계에 강한 앙상블 트리 |
XGBoost, LightGBM | 고성능 부스팅 기반 모델 |
분류(Classification) 문제
| 기본 모델 | 설명 |
|---|
LogisticRegression | 이진/다중 클래스 분류에 적합 |
KNN, SVM | 거리 기반 또는 결정 경계 기반 모델 |
RandomForestClassifier | 앙상블 기반의 견고한 성능 |
XGBoostClassifier | 캐글 우승자들이 선호하는 모델 |
딥러닝(Deep Learning)
| 분야 | 모델 | 특징 |
|---|
| 이미지 | CNN, ResNet | 시각적 패턴 인식에 최적 |
| 시계열 | RNN, LSTM | 순차 데이터에 적합 |
| 자연어 | BERT, GPT | 문맥 기반 텍스트 처리 |
6. Model Training (모델 학습)
선택한 모델을 데이터를 통해 학습시킨다.
python
# 랜덤포레스트 분류 모델 생성 및 학습
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(n_estimators=100)
model.fit(X_train, y_train) # 학습 시작
- 학습 데이터(X_train, y_train)를 기반으로 모델을 학습
- 학습 중 과적합(overfitting) 여부를 모니터링
7. Model Evaluation (모델 평가)
학습된 모델의 성능을 다양한 지표를 통해 평가하여, 문제 해결 능력을 정량적으로 분석한다.
회귀(Regression) 문제 평가 지표
| 지표 | 설명 |
|---|
| MSE (Mean Squared Error) | 예측값과 실제값의 차이를 제곱하여 평균 |
| MAE (Mean Absolute Error) | 예측값과 실제값의 차이를 절대값으로 평균 |
| RMSE (Root Mean Squared Error) | MSE의 제곱근으로, 단위를 원래대로 복원 |
| R² Score (결정계수) | 모델이 데이터를 얼마나 잘 설명하는지 (1에 가까울수록 좋음) |
분류(Classification) 문제 평가 지표
| 지표 | 설명 |
|---|
| Accuracy (정확도) | 전체 샘플 중 정답 비율 |
| Precision (정밀도) | 양성으로 예측한 것 중 실제 양성의 비율 |
| Recall (재현율) | 실제 양성 중에서 모델이 맞힌 비율 |
| F1-score | 정밀도와 재현율의 조화 평균 |
| Confusion Matrix (오차 행렬) | TP, FP, FN, TN으로 예측 결과 분석 |
| ROC-AUC | 임계값 변화에 따른 성능 시각화 및 정량화 |
python
from sklearn.metrics import classification_report, confusion_matrix
y_pred = model.predict(X_test)
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
손실 함수 (Loss Function)
손실 함수는 모델이 예측한 값과 실제 값 사이의 차이를 계산하여, 모델의 성능을 수치화하는 데 사용된다.
학습 과정 중 경사하강법(Gradient Descent)을 통해 가중치를 업데이트할 때 오차 정보를 제공하는 핵심 요소이다.
회귀 문제에서의 대표 손실 함수
분류 문제에서의 대표 손실 함수
| 함수명 | 수식 | 설명 |
|---|
| Binary Cross Entropy | +(1-y_i)%5Clog(1-%5Chat%7By%7D_i)%5D) | 이진 분류 문제에서 예측확률과 실제값의 오차 측정 |
| Categorical Cross Entropy | 다중 클래스 분류에 사용. 예측확률이 정답 클래스에 가까울수록 낮은 손실 | |
| Sparse Categorical Cross Entropy | 라벨이 원-핫 인코딩이 아닐 경우 사용 | |
✔️ 회귀는 연속형 출력 → MSE/MAE
✔️ 분류는 클래스 확률 → Cross Entropy 기반 손실 사용
시각 자료로 보는 손실 함수

문제 유형별로 자주 사용되는 평가 지표와 손실 함수(Loss Function)를 한눈에 정리한 표
| 문제 유형 | 주요 평가 지표 | 대표 손실 함수 |
|---|
| 회귀 (Regression) | MSE, RMSE, MAE, R² Score | MSE, MAE, Huber Loss |
| 이진 분류 (Binary) | Accuracy, Precision, Recall, F1-score, AUC | Binary Cross Entropy |
| 다중 분류 (Multi) | Accuracy, Macro F1, Confusion Matrix | Categorical / Sparse Categorical CrossEntropy |
| 불균형 분류 | Precision, Recall, F1-score, AUC | Class-weighted Cross Entropy, Focal Loss |
8. Hyperparameter Tuning (하이퍼파라미터 튜닝)
주요 기법
| 방법 | 설명 |
|---|
| Grid Search | 가능한 모든 조합을 탐색하는 전수 조사 방식 |
| Random Search | 랜덤 샘플링을 통해 일부 조합만 시도 |
| Bayesian Optimization | 과거 탐색 결과를 기반으로 다음 후보를 똑똑하게 추천 |
| Optuna / Hyperopt | 자동화된 고성능 하이퍼파라미터 튜닝 라이브러리 |
| Cross-Validation 기반 | 과적합을 방지하며 일반화 성능 확보 가능 |
예시 코드: GridSearchCV
python
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestClassifier
params = {
'n_estimators': [50, 100, 200],
'max_depth': [3, 5, 7]
}
grid = GridSearchCV(RandomForestClassifier(), param_grid=params, cv=5)
grid.fit(X_train, y_train)
print(grid.best_params_) # 최적 파라미터 출력
9. Model Deployment (모델 배포)
배포 방식 요약
| 방식 | 설명 |
|---|
| Flask / FastAPI | Python 기반 API 서버 구축으로 손쉬운 배포 가능 |
| Streamlit / Gradio | 빠르게 웹 기반 데모 제작 가능 |
| Docker | 컨테이너로 환경 일관성 확보 및 배포 자동화 |
| AWS / GCP / Azure | 클라우드 인프라 기반 확장성 높은 배포 가능 |
| ONNX / TFLite | 경량화된 모델로 IoT 및 모바일 디바이스 적용 가능 |
💾 예시 코드: FastAPI + pickle
#모델 저장
python
import pickle
#학습된 모델 저장
with open('model.pkl', 'wb') as f:
pickle.dump(model, f)