주제
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 선형 회귀 학습
- 학습 후 가격과 예측 가격 시각화

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

from math import sqrt
sqrt(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
- 해당 데이터는 스케일링을 해도 성능의 차이가 없다는 것을 알 수 있다

- Ridge 규제 사용
from sklearn.linear_model import Ridge
r = Ridge()
r.fit(X_train_scaled, Y_train)
y_r = r.predict(X_test_scaled)

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 모델 검증
- 시각화

- 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 확인
- 선형 회귀나 결정 트리보다 훨씬 좋은 점수가 나왔다

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

'Data Science > TIL (Today I Learned)' 카테고리의 다른 글
| 프로그래머스 데이터분석 데브코스 1기 - 56일차 (1) | 2024.02.12 |
|---|---|
| 프로그래머스 데이터분석 데브코스 1기 - 55일차 (0) | 2024.02.09 |
| 프로그래머스 데이터분석 데브코스 1기 - 53일차 (0) | 2024.02.07 |
| 프로그래머스 데이터분석 데브코스 1기 - 52일차 (1) | 2024.02.06 |
| 프로그래머스 데이터분석 데브코스 1기 - 51일차 (0) | 2024.02.05 |