주제

1. Regression 모델링에 대해
2. 실습 #1 (Linear Regression)
3. 실습 #2 (Decision Tree)

 

1. Regression 모델링에 대해

1.1 Regression 모델링 정의

  • 연속적인 값을 예측하기 위해 사용되는 알고리즘(주택 가격 예측, 주식 가격 예측 등)

 

1.2 Regression 성능 평가

  • Mean Absolute Error(MAE)
  • Mean Squared Error(MSE)
  • Root Mean Squared Error(RMSE)

 

1.3 Regression 알고리즘 종류

  • Linear Regression(선형 회귀)
    • 선형 관계에 있는 한 개의 독립변수와 한 개의 종속 변수가 있을 때 레이블값을 가장 잘 표현하는 직선을 그리는 것
  • Decision Tree(결정 트리)
    • 분류에도 사용 가능
    • 직관적이으로 이해가 가능
    • 그리드 서치를 통해 트리 구성이 가능
    • 오버피팅이 쉽게 발생함
    • 사이킷런에는 두 종류가 존재 : DecisionTreeRegressor, DecisionTreeClassifier
  • Random Forest
    • 분류에도 사용 가능
    • 앙상블 학습방법의 일종
    • 결정 트리의 과적합 문제를 방지하기 위해 다수의 결정 트리를 사용하여 그 결과를 평균(혹은 다수결)하는 방식
    • RandomForestClassifier
  • Deep Learning
    • 분류에도 사용 가능

 

2. 실습 #1 (Linear Regression)

  • CMU Stat Lib Archive의 1970년대 미국 인구조사 서비스(US Census Service)에서 수집한 보스턴의 주택 가격 데이터를 사용
  • 데이터 셋 : https://lib.stat.cmu.edu/datasets/boston

2.1 문제 정의

  • 13개의 특성을 사용하여 지역별 중간 주택가격 예측하기

2.2 데이터 전처리

  • 총 506개의 행, 14개 열
  • 결측치는 없음
  • 모두 수치형 데이터 → 인코딩 필요없음
  • 모든 특성이 상관관계가 높게 나옴(가장 큰 것은 lstat으로 저소득층의 비율은 음의 상관관계를 가짐) → 모두 사용

2.3 선형 회귀 학습

  • 학습 후 가격과 예측 가격 시각화

실제 가격 vs. 예측 가격

2.4 성능 평가

  • Mean Squared Error(MSE)를 사용하여 평가
mse = sklearn.metrics.mean_squared_error(Y_test, Y_pred)

 

MSE

from math import sqrt
sqrt(mse)

MSE

  • 특성 스케일링 진행 후 성능 비교
from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)
  • 스케일링 후 MSE
    • 해당 데이터는 스케일링을 해도 성능의 차이가 없다는 것을 알 수 있다

스케일링 후 MSE

  • Ridge 규제 사용
from sklearn.linear_model import Ridge

r = Ridge()
r.fit(X_train_scaled, Y_train)
y_r = r.predict(X_test_scaled)

ridge 규제 후 MSE

 

 

3. 실습 #2 (Decision Tree)

  • 같은 데이터를 이용, 하지만 이번에는 decision tree를 사용
  • Grid Search란?
    • 주어진 모델의 최적의 하이퍼파라미터를 찾기 위해 사용
    • 하이퍼파라미터 조합(그리드)을 시스템적으로 탐색하여 최적의 조합 탐색
    • 이 파라미터들은 트리가 얼마나 깊게, 얼마나 세분화되어 성장할지를 결정함
max_depth min_samples_split min_samples_leaf max_leaf_nodes
트리의 최대 깊이 노드를 분할하기 위해 필요한 최소 샘플의 수 리프 노드가 되기 위해 필요한 최소 샘플의 수 트리가 가질 수 있는 리프 노드의 최대 개수

 

3.1 모델 학습

from sklearn.tree import DecisionTreeRegressor

regressor = DecisionTreeRegressor()

parameters = {
    'max_depth':(1,2,3,4,5,6,7,8,9,10),
    'min_samples_split': [2, 10, 20],
    'min_samples_leaf': [1, 5, 10],
    'max_leaf_nodes': [5, 10, 20],
}
  • 그리드 서치
from sklearn.model_selection import GridSearchCV

# 최적의 조합을 확인할 parameter를 넘겨준다
# cv=5는 데이터를 5개로 나눠서 교차 검증
# scoring은 보통 mse로 하는데 mse는 적을수록 좋다는 뜻. scoring은 점수이니 높을수록 좋은 성능이라고 하기 위해
# negative mse가 반환되지 못하게 하는 파라미터를 지정
regressors = GridSearchCV(regressor, parameters, cv=5, scoring='neg_mean_squared_error')
regressors.fit(X_train, Y_train)
# 최고의 조합을 변수에 저장
reg = regressors.best_estimator_

 

3.2 모델 검증

  • 시각화

실제 가격 vs. 예측 가격

  • MSE 점수
    • 선형 회귀 모델보다는 나아진 점수

MSE

  • 전체 트리 시각화
    • 최적의 최대 깊이는 7
    • 루트 노드는 rm(주택당 평균 방의 수)으로 나뉨

전체 트리

 

 

 

숙제

  • 이 데이터를 랜덤 포레스트 모델로 학습해보기
  • 랜덤 포레스트 학습
from sklearn.ensemble import RandomForestRegressor

rf = RandomForestRegressor(
    n_estimators=100,
    random_state=42
)
rf.fit(X_train, Y_train)
# 예측
Y_pred = rf.predict(X_test)
  • MSE 확인
    • 선형 회귀나 결정 트리보다 훨씬 좋은 점수가 나왔다

랜덤 포레스트의 MSE

  • 훈련 세트와 테스트 세트 점수 비교
    • 과적합 문제가 있는 것으로 보인다
print(rf.score(X_train, Y_train))
print(rf.score(X_test, Y_test))

훈련/테스트 세트 점수

 

+ Recent posts