logo

회귀

지도학습의 기본 구조

  • 지도학습(supervised learning): 입력 데이터와 정답을 함께 주고 규칙을 학습하는 방식
  • 입력 : 예측에 사용할 정보
  • 정답 : 맞히고 싶은 결과
  • 모델: 사이의 관계를 학습한 예측 규칙
  • 예: 설비 조건 로 생산량 예측

회귀와 분류

  • 회귀(regression): 정답이 연속적인 숫자인 지도학습 문제
    • 예측 결과가 등급이나 이름이 아니라 수치
    • 예: 주택 가격, 공정 수율, 에너지 사용량, 설비 온도
  • 분류(classification): 정답이 범주인 지도학습 문제
    • 예측 결과가 숫자 크기가 아니라 클래스 이름
    • 예: 정상/불량, 합격/불합격, 고장/정상
  • 현장에서는 어떤 범주를 더 중요하게 볼지 먼저 정의해야 함

회귀와 분류의 구분

  • 회귀: 연속적인 수치 예측
  • 분류: 정해진 범주 중 하나 예측
  • 회귀 예측값은 오차 크기로 평가
  • 분류 예측값은 맞음/틀림과 오류 종류로 평가

회귀와 분류의 차이

실습 데이터: California Housing

  • 미국 캘리포니아 지역별 주택 가격 데이터
  • 여러 지역 특성으로 주택 가격 중앙값 예측
  • 표본 수가 많아 훈련/평가 실습에 적합
  • sklearn 공식 예제 데이터 사용
pip install scikit-learn pandas seaborn matplotlib
import pandas as pd
from sklearn.datasets import fetch_california_housing

housing = fetch_california_housing(as_frame=True)
df_house = housing.frame
df_house.head()

학습/평가 데이터 분할

  • 같은 데이터로 학습과 평가를 모두 하면 실전 성능 확인이 어려움
  • 훈련 데이터: 모델이 규칙을 학습하는 데이터
  • 테스트 데이터: 학습 후 처음 보는 평가 데이터
  • random_state: 재현을 위해 데이터 분할 시 난수 발생 방법을 고정
from sklearn.model_selection import train_test_split

X = df_house.drop(columns="MedHouseVal")
y = df_house["MedHouseVal"]

X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    test_size=0.2,
    random_state=42,
)

지도학습 모델의 종류

  • 가중치 방식
    • 입력된 여러 특성에 각각 다른 가중치를 부여하여 종합 점수 도출
    • 예: 선형 모형, 로지스틱 회귀분석, 딥러닝
  • 최근접 이웃(KNN)
    • 유사 사례의 평균 또는 다수결로 예측
  • 의사결정나무 방식
    • 한 번에 한 가지 특성을 기준으로 분기하는 과정을 반복해 최종 예측
    • 예: CART, Random Forest, Gradient Boosting Tree

지도학습 모델 방식 비교

선형 회귀 모델 학습

  • 선형 회귀(linear regression): 입력 변수의 가중합으로 값을 예측
  • 단순하고 빠르며 기준 모델로 적합
  • 복잡한 비선형 패턴은 충분히 잡지 못할 수 있음
from sklearn.linear_model import LinearRegression

linear = LinearRegression()
linear.fit(X_train, y_train)

회귀 예측값 확인

  • predict로 새 데이터의 예측값 생성
  • 실제값과 예측값을 나란히 비교
  • 예측값 단위는 타깃 변수와 동일
y_pred_linear = linear.predict(X_test)

회귀 성능 지표: MAE

  • MAE(Mean Absolute Error): 예측 오차 절댓값의 평균
  • 작을수록 좋음
from sklearn.metrics import mean_absolute_error

mean_absolute_error(y_test, y_pred_linear)

회귀 성능 지표: MSE

  • MSE(Mean Squared Error): 예측 오차 제곱의 평균
  • 작을수록 좋음
  • 큰 오차에 더 큰 패널티를 부여
from sklearn.metrics import mean_squared_error

mean_squared_error(y_test, y_pred_linear)

회귀 성능 지표: R2

  • : 전체 변동 중 모델이 설명한 비율
  • 1에 가까울수록 좋음
from sklearn.metrics import r2_score

r2_score(y_test, y_pred_linear)

k-최근접 이웃

  • 새로운 데이터 포인트의 클래스나 값을 예측하기 위해 가장 가까운 개의 이웃을 참조
  • 회귀는 평균, 분류는 다수결로 예측 수행
  • 가 작으면 노이즈에 민감해질 수 있음
  • 가 커지면 계산 비용이 증가
  • 훈련 단계가 없고, 계산이 예측 시점에 이루어지는 게으른 학습(lazy learning) 방식

KNN 회귀 모델 학습

from sklearn.neighbors import KNeighborsRegressor
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler

knn = make_pipeline(
    StandardScaler(),  # 거리 기반 모델이므로 표준화
    KNeighborsRegressor(n_neighbors=7),
)

knn.fit(X_train, y_train)
y_pred_knn = knn.predict(X_test)

mean_absolute_error(y_test, y_pred_knn)
r2_score(y_test, y_pred_knn)

의사결정나무

  • 한 번에 한 가지 특성을 이용해 불순도(impurity)를 낮추는 방향으로 데이터셋을 두 개로 나눔
  • 일정 기준을 만족할 때까지 분기를 반복
    • 예: 불순도가 일정 값 이하
    • 예: 데이터셋 크기가 일정 값 이하
    • 예: 정해진 분기 횟수에 도달
  • 스무고개 놀이와 같은 원리
  • 해석이 쉽고, 복잡한 결정경계에도 잘 적용됨
  • 여러 특성을 동시에 고려해야 하는 경우에는 잘 맞지 않을 수 있음
  • 과대적합이 발생하기 쉬움

의사결정나무 분기 예시

의사결정나무 모델 학습

from sklearn.tree import DecisionTreeRegressor

tree = DecisionTreeRegressor(max_depth=6, random_state=42)
tree.fit(X_train, y_train)

y_pred_tree = tree.predict(X_test)
mean_absolute_error(y_test, y_pred_tree)
r2_score(y_test, y_pred_tree)

의사결정나무 시각화

from sklearn.tree import plot_tree
import matplotlib.pyplot as plt

plt.figure(figsize=(20, 12))
plot_tree(tree, feature_names=X.columns, max_depth=2);

의사결정나무 시각화 예시

어떤 방법을 쓸 것인가?

  • 공짜 점심은 없다(no free lunch) 정리
    • 모든 머신러닝 방법의 성능은 평균적으로 똑같음
    • 모든 경우에 우수한 머신러닝 방법은 없음
  • 데이터의 특성에 따라 더 잘 작동하는 방법이 다름
  • 딥러닝은 주로 자연어, 이미지 등 비정형 데이터에 강점
  • 의사결정나무는 주로 표 형태의 데이터에 강점
  • 데이터의 특성을 어느 정도 짐작할 수는 있지만 미리 확인할 방법은 없음
  • 여러 방법을 시도해보고 가장 성능이 좋은 방법이 그 데이터에 맞는 방법

No Free Lunch 정리의 의미

퀴즈

실습 데이터: 전기차 에너지 소비량

  • 동일한 전기차 모델로 수행한 수업용 합성 주행 시험 500건
  • 주행 조건으로 100km당 에너지 소비량 예측
  • 모든 입력 변수가 숫자형이므로 앞에서 사용한 회귀 코드를 그대로 적용
  • 에너지 소비량 단위: kWh/100km
컬럼설명
outside_temp_c외기 온도(°C)
avg_speed_kmh평균 주행 속도(km/h)
stop_count100km당 정차 횟수
route_grade_pct평균 도로 경사도(%)
payload_kg탑승자와 화물 중량(kg)
hvac_power_kw냉난방 평균 소비 전력(kW)
tire_pressure_kpa평균 타이어 공기압(kPa)
energy_consumption_kwh_100km100km당 에너지 소비량(kWh/100km)

데이터 불러오기와 X, y 선택

import pandas as pd

df_ev = pd.read_excel("ev_energy.xlsx")
df_ev.head()
X = df_ev.drop(columns="energy_consumption_kwh_100km")
y = df_ev["energy_consumption_kwh_100km"]
  • 위에서 사용한 데이터 분할과 회귀 모델 코드를 다시 실행하여 다음 문제에 답하세요.