050 회귀 파트 총정리
키워드: 총정리, 회귀, 베스트 프랙티스
개요
이 글에서는 회귀 파트(36~49번)에서 다룬 내용을 종합적으로 정리합니다. 회귀 문제의 기본 개념부터 고급 기법까지 핵심 내용을 복습하고 베스트 프랙티스를 제시합니다.
회귀 파트 학습 내용 요약
기본 개념 (36~37번)
# 050 회귀 문제 정의
# 050 - 연속적인 수치를 예측하는 문제
# 050 - 예: 주택 가격, 매출, 온도 등
# 050 주요 평가 지표
metrics = {
'지표': ['MSE', 'RMSE', 'MAE', 'R²', 'MAPE'],
'특징': [
'제곱 오차 평균, 이상치 민감',
'MSE의 제곱근, 원본 단위',
'절대 오차 평균, 로버스트',
'설명력 (0~1), 가장 직관적',
'백분율 오차, 스케일 무관'
],
'공식': [
'mean((y-ŷ)²)',
'√MSE',
'mean(|y-ŷ|)',
'1 - SS_res/SS_tot',
'mean(|y-ŷ|/y) × 100'
]
}
import pandas as pd
print("회귀 평가 지표:")
print(pd.DataFrame(metrics).to_string(index=False))
실전 프로젝트 (3839, 4344번)
# 050 다룬 프로젝트들
projects = {
'프로젝트': ['캘리포니아 주택', '자동차 가격', '매출 예측'],
'데이터 특성': [
'지리적 데이터, 인구 통계',
'범주형 특성 많음',
'시계열 특성'
],
'핵심 기법': [
'기본 AutoML 적용',
'범주형 인코딩, 특성 중요도',
'Lag 특성, 이동 평균'
],
'글 번호': ['038-039', '043', '044']
}
print("\n실전 프로젝트 요약:")
print(pd.DataFrame(projects).to_string(index=False))
데이터 전처리 (40~42번)
# 1. 특성 스케일링 (040번)
from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler
scalers = {
'StandardScaler': '평균 0, 분산 1로 변환',
'MinMaxScaler': '0~1 범위로 변환',
'RobustScaler': '이상치에 강건 (중앙값, IQR 사용)'
}
print("\n특성 스케일링 방법:")
for name, desc in scalers.items():
print(f" {name}: {desc}")
# 2. 타겟 변환 (041번)
import numpy as np
# 050 로그 변환 (비대칭 분포에 효과적)
y_original = np.array([100, 500, 1000, 10000])
y_log = np.log1p(y_original) # log(1+y)
y_recovered = np.expm1(y_log) # exp(y)-1
print(f"\n로그 변환 예시:")
print(f" 원본: {y_original}")
print(f" 로그: {y_log.round(2)}")
# 3. 이상치 처리 (042번)
outlier_methods = ['IQR 방법', 'Z-Score', 'Isolation Forest', '클리핑']
print(f"\n이상치 탐지/처리 방법: {', '.join(outlier_methods)}")
고급 기법 (45~49번)
# 050 앙상블 기법 (045번)
ensemble_methods = {
'방법': ['Bagging', 'Boosting', 'Stacking', 'Voting'],
'대표': ['Random Forest', 'XGBoost/LightGBM', 'Meta Learner', '평균/가중평균'],
'FLAML': ['estimator_list', 'estimator_list', 'ensemble=True', '수동 구현']
}
print("\n앙상블 기법:")
print(pd.DataFrame(ensemble_methods).to_string(index=False))
# 050 교차 검증 (046번)
cv_strategies = {
'전략': ['KFold', 'TimeSeriesSplit', 'GroupKFold'],
'용도': ['일반 데이터', '시계열 데이터', '그룹 데이터'],
'FLAML': ['n_splits=5', 'split_type="time"', '커스텀 필요']
}
print("\n교차 검증 전략:")
print(pd.DataFrame(cv_strategies).to_string(index=False))
FLAML 회귀 베스트 프랙티스
기본 설정
from flaml import AutoML
def get_optimized_automl_config(data_type='general', time_budget=120):
"""데이터 유형별 최적 FLAML 설정"""
base_config = {
'task': 'regression',
'time_budget': time_budget,
'verbose': 1,
'seed': 42,
}
if data_type == 'general':
return {
**base_config,
'metric': 'r2',
'n_splits': 5,
}
elif data_type == 'timeseries':
return {
**base_config,
'metric': 'mse',
'split_type': 'time',
'n_splits': 5,
}
elif data_type == 'skewed_target':
return {
**base_config,
'metric': 'mape', # 비율 기반 오차
'n_splits': 5,
}
elif data_type == 'large_data':
return {
**base_config,
'metric': 'r2',
'n_splits': 3, # 폴드 수 줄임
'early_stop': True,
}
return base_config
# 050 설정 확인
print("데이터 유형별 권장 설정:")
for dtype in ['general', 'timeseries', 'skewed_target', 'large_data']:
config = get_optimized_automl_config(dtype, 60)
print(f"\n{dtype}:")
for k, v in config.items():
print(f" {k}: {v}")
전체 회귀 파이프라인
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error
import numpy as np
class RegressionPipeline:
"""FLAML 기반 회귀 파이프라인"""
def __init__(self, time_budget=120, use_log_transform=False):
self.time_budget = time_budget
self.use_log_transform = use_log_transform
self.scaler = StandardScaler()
self.automl = AutoML()
def preprocess(self, X, y, fit=True):
"""전처리"""
if fit:
X_scaled = self.scaler.fit_transform(X)
else:
X_scaled = self.scaler.transform(X)
if self.use_log_transform:
y_transformed = np.log1p(y)
else:
y_transformed = y
return X_scaled, y_transformed
def fit(self, X, y):
"""학습"""
X_processed, y_processed = self.preprocess(X, y, fit=True)
self.automl.fit(
X_processed, y_processed,
task='regression',
time_budget=self.time_budget,
metric='r2',
verbose=0
)
print(f"최적 모델: {self.automl.best_estimator}")
return self
def predict(self, X):
"""예측"""
X_processed = self.scaler.transform(X)
y_pred = self.automl.predict(X_processed)
if self.use_log_transform:
y_pred = np.expm1(y_pred)
return y_pred
def evaluate(self, X, y):
"""평가"""
y_pred = self.predict(X)
metrics = {
'R²': r2_score(y, y_pred),
'MAE': mean_absolute_error(y, y_pred),
'RMSE': np.sqrt(mean_squared_error(y, y_pred)),
'MAPE': np.mean(np.abs((y - y_pred) / (y + 1e-8))) * 100
}
return metrics
# 050 사용 예
print("\n파이프라인 사용 예:")
print(" pipeline = RegressionPipeline(time_budget=120)")
print(" pipeline.fit(X_train, y_train)")
print(" metrics = pipeline.evaluate(X_test, y_test)")
문제 유형별 체크리스트
checklists = {
'일반 회귀': [
'□ 데이터 탐색 (분포, 결측치, 이상치)',
'□ 특성 스케일링 적용',
'□ FLAML AutoML 학습',
'□ 특성 중요도 분석',
'□ 잔차 분석'
],
'비대칭 타겟': [
'□ 타겟 분포 확인 (왜도)',
'□ 로그 변환 적용',
'□ MAPE 메트릭 사용',
'□ 예측 후 역변환',
'□ 원본 스케일에서 평가'
],
'시계열 특성': [
'□ 시간 순서 유지',
'□ Lag 특성 생성',
'□ 이동 평균 특성',
'□ split_type="time" 설정',
'□ 미래 데이터 누출 방지'
],
'이상치 많음': [
'□ IQR/Z-Score로 탐지',
'□ 제거 vs 클리핑 결정',
'□ MAE 메트릭 사용',
'□ 로버스트 스케일러',
'□ 트리 모델 우선 사용'
]
}
print("\n문제 유형별 체크리스트:")
for problem_type, checklist in checklists.items():
print(f"\n{problem_type}:")
for item in checklist:
print(f" {item}")
흔한 실수와 해결책
mistakes = {
'실수': [
'테스트 데이터로 스케일링 fit',
'시계열에서 랜덤 분할',
'로그 변환 후 역변환 누락',
'이상치 무시',
'단일 메트릭만 확인'
],
'문제점': [
'데이터 누출',
'미래 정보 누출',
'잘못된 스케일의 예측',
'모델 성능 저하',
'불완전한 평가'
],
'해결책': [
'fit_transform은 train만',
'TimeSeriesSplit 사용',
'np.expm1()로 역변환',
'IQR/클리핑 적용',
'R², MAE, RMSE 모두 확인'
]
}
print("\n흔한 실수와 해결책:")
print(pd.DataFrame(mistakes).to_string(index=False))
다음 단계
next_topics = {
'파트': ['Part 4 (51-65)', 'Part 5 (66-80)', 'Part 6 (81-100)'],
'주제': ['시계열 예측', '고급 기능', '프로젝트 & 배포'],
'핵심 내용': [
'ARIMA, Prophet, 시계열 FLAML',
'하이퍼파라미터, 커스텀 모델',
'실전 프로젝트, 모델 배포'
]
}
print("\n다음 학습 내용:")
print(pd.DataFrame(next_topics).to_string(index=False))
핵심 요약
회귀 파트 핵심 포인트
- 평가 지표: 문제에 맞는 지표 선택 (R², MAE, RMSE, MAPE)
- 데이터 전처리: 스케일링, 타겟 변환, 이상치 처리
- 교차 검증: 데이터 유형에 맞는 분할 전략
- 앙상블:
ensemble=True로 자동 앙상블 - 모델 해석: SHAP, PDP로 예측 설명
FLAML 회귀 핵심 설정
# 050 기본 설정
automl.fit(
X_train, y_train,
task="regression", # 필수
time_budget=120, # 예산 (초)
metric="r2", # 평가 지표
n_splits=5, # CV 폴드
ensemble=True, # 앙상블 활성화
verbose=1 # 로그 출력
)
# 050 시계열용
automl.fit(
X_train, y_train,
task="regression",
time_budget=120,
split_type="time", # 시계열 분할
metric="mse"
)
정리
회귀 파트에서 학습한 내용:
- 36번: 회귀 문제 정의와 FLAML 적용
- 37번: MSE, RMSE, MAE, R², MAPE 평가 지표
- 38-39번: 캘리포니아/보스턴 주택 가격 예측
- 40번: 특성 스케일링 (Standard, MinMax, Robust)
- 41번: 타겟 로그 변환
- 42번: 이상치 탐지 및 처리
- 43번: 자동차 가격 예측 프로젝트
- 44번: 매출 예측 프로젝트
- 45번: 앙상블 기법
- 46번: 교차 검증 전략
- 47번: 잔차 분석과 모델 진단
- 48번: 다중 출력 회귀
- 49번: SHAP 기반 모델 해석
다음 글 예고
다음 글부터는 Part 4: 시계열 예측을 시작합니다. 첫 번째 글에서는 시계열 데이터의 기본 개념과 특성에 대해 알아봅니다.
FLAML AutoML 마스터 시리즈 #050