지도학습: 회귀
머신러닝의 주요 접근
- 지도 학습
- 비지도 학습
- 강화 학습
지도학습 supervised learning
- 라벨이 있는 데이터로부터 학습
- 입력(x)과 출력(y) 간의 관계 모형화
- 머신 러닝의 90% 이상을 차지하는 학습 형태
- 종류:
- 회귀(regression): 연속적인 y를 예측하는 것
- 분류(classification): 여러 종류의 값들을 구분하는 것. 범주형 y를 예측하는 것
지도학습 예시
- 스팸 메일 필터링: 이메일 내용을 분석하여 스팸 여부를 판단
- 이미지 분류: 이미지를 특정 카테고리로 자동 분류
- 질병 예측: 환자의 데이터를 기반으로 질병 발병 확률 예측
- 주가 예측: 과거 주식 데이터를 이용해 미래 주가를 예측
회귀 알고리즘
- Linear Regression
- Support Vector Regression
- Nearest Neighbors
- Decision Tree
- Naive Bayes
- Artificial Neural Network
중고차 가격 데이터
- 중고차 데이터
df = pd.read_excel('car.xlsx')
- X와 y
y = df['price']
X = df.drop(columns='price') # price를 제외한 나머지
X = pd.get_dummies(X, drop_first=True) # 범주형 변수 더미코딩 - 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
선형 모델
- 선형 회귀분석과 동일
from sklearn.linear_model import LinearRegression
linear_model = LinearRegression()
linear_model.fit(X_train, y_train) - 모델의 계수(statsmodels와 달리 해석에 필요한 정보들을 제공하지는 않음)
linear_model.coef_
- 예측
y_pred_linear = linear_model.predict(X_test)
선형 모델 성능 테스트
from sklearn.metrics import *
- RMSE: 오차 제곱의 평균의 제곱근
- 표준편차는 편차 제곱의 평균(분산)의 제곱 근
root_mean_squared_error(y_test, y_pred_linear)
- 결정계수(R²)
r2_score(y_test, y_pred_linear)
지표의 직접 계산
- RMSE
import numpy as np
np.sqrt(np.mean((y_test - y_pred_linear) ** 2)) - 결정계수(R²)
mse = np.mean((y_test - y_pred_linear) ** 2) # 예측 값과 차이
y_mean = np.mean(y_test)
var = np.mean((y_test - y_mean) ** 2) # 평균 값과 차이
1 - mse / var
Decision Tree
- 회귀 및 분류
- 트리 기반 알고리즘
- 내부 노드에서는 한 특징 값에 따라 분기
- 잎 노드는 최종 예측 결과를 제공
- 이해하기 쉽고 시각화가 가능
- 과적합(overfitting)이 발생하기 쉬운 단점
- 여러 개의 트리를 만드는 Random Forest, Boosting Tree 등의 방법이 있음
랜덤 포레스트 회귀
- 의사결정나무를 무작위로 100개 만들어서 각각의 가격 예측을 평균
from sklearn.ensemble import RandomForestRegressor
rf_model = RandomForestRegressor(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train) - 예측
y_pred_rf = rf_model.predict(X_test)
특징 중요도 feature importance
- 여러 예측의 평균이므로 각각의 특징이 어떻게 기여하는지 해석은 불가능
- 다만 각각의 예측에 자주/많이 사용되는 정도를 이용해서 상대적 중요도를 보일 수는 있음
import matplotlib.pyplot as plt
import numpy as np
importances = rf_model.feature_importances_
feature_names = X.columns
indices = np.argsort(importances)[::-1]
plt.bar(range(X.shape[1]), importances[indices], align="center")
plt.xticks(range(X.shape[1]), feature_names[indices], rotation=90);
평가
- RMSE
root_mean_squared_error(y_test, y_pred_rf)
- 결정계수(R²)
r2_score(y_test, y_pred_rf)
- 선형 모형에 비해 설명가능성은 낮지만 대체로 예측 성능은 높음