본문 바로가기
코딩/Machine Learning

10. 회귀(Regression)_3

by 세자책봉 2021. 1. 2.
728x90

권철민 저, '파이썬 머신러닝 완벽 가이드', 2019.02.28

내 맘대로 요약 공부 중(문제시 비공개 및 삭제)

최초 작성일 2021.1.2

10.1 회귀 트리

- 회귀를 위한 트리를 생성하고 이를 기반으로 회귀 예측을 하는 것

- 분류 트리와의 다른 점은, 회귀 트리는 리프 노드에 속한 데이터 값의 평균값을 구해 회귀 예측값을 계산함

데이터 세트를 분할하여 트리 규칙으로 변환
범위에 소속된 데이터의 평균을 최종 리프노드의 결정값으로 함

- 결정 트리, 랜덤 포레스트, GBM, XGBoost, LightGBM 등 트리 기반의 알고리즘은 분류와 회귀 가능

알고리즘 회귀 Estimator 클래스 분류 Estimator 클래스
결정 트리(Decision Tree) DecisionTreeRegressor DecisionTreeClassifier
Gradient Boosting GradientBoostingRegressor GradientBoostingClassifier
XGBoost XGBRegressor XGBClassifier
LightGBM LGBMRegressor LGBMClassifier

- 랜덤 포레스트 회귀(RandomForestRegressor) 활용 보스턴 주택 가격 예측 수행

랜덤 포레스트 기반의 회귀 코드

- get_model_cv_prediction() → 결정 트리, GBM, XGBoost, LightGBM 모두 이용

편하게 하려고 함수 만든거
단순비교시, XGBRegressor의 성능이 가장 좋다

- 회귀 트리 Regressor는 회귀 계수를 제공하는 coef_ 속성이 없음

- feature_importances_ 속성을 활용하여 피처별 중요도 시각화

중요한 것은 feature_importances_ 속성을 활용하여 시각화 해야한다는 것

- 가장 밀접한 관계를 가지는 feature인 'RM'만 사용하여 선형 회귀와 결정 트리 회귀로 'PRICE' 예측 비교

- 100개의 데이터만 샘플링

.sample 속성 활용

- LinearRegression, DecisionTreeRegressor를 max_depth= 2, 7 비교

- 학습된 Regressor에 RM 값을 4.5~8.5 사이의 100개 테스트 데이터 세트 제공

기본에 충실한 코드 진행

 

선형 회귀는 직선으로 예측 회귀선을 표현하지만, 회귀 트리는 데이터 지점에 따라 계단형으로 예측 회귀선을 표현

10.2 회귀 실습 - 자전거 대여 수요 예측

- https://www.kaggle.com/c/bike-sharing-demand/data 

 

Bike Sharing Demand

Forecast use of a city bikeshare system

www.kaggle.com

먼저 데이터 불러오기
데이터 확인(non-null, type, 수량 등)

- Datetime Column의 object type(년-월-일 시:분:초)을 가공해야 함(년, 월, 일, 시간으로  각각 추출)

pandas의 apply(pd.to_datetime) 기능을 활용하여 추출

- 필요 없는 Column 삭제(datetime, casual, resistered)

- Kaggle에서 요구한 성능 평가 방법은 RMSLE(Root Mean Square Log Error)

RMSLE 함수 생성 시 log() 대신 lp.log1p()를 사용했다는 것을 확인. 언더플로 오류 방지를 위함

- LinearRegression 활용하여 회귀 예측 진행

오류가 상당히 크다

- 실제 값과 예측값의 차이 확인(Top 5개)

수치상으로 확인해도 예측 오류가 크다..

- 먼저 Target값 분포가 왜곡된 형태를 이루고 있는지 확인(Best: 정규분포 형태)

- pandas DataFrame의 hist() 속성 활용

정규 분포가 아닌 0~200 사이에 왜곡된 것을 확인

- Target값의 분포가 왜곡된 것을 확인 → log변환(np.log1p() 사용)

정규 분포의 형태는 아니지만, 왜곡 정도가 많이 약화됨

- log변환된 값들은 np.expm1() 속성을 활용하여 원래 스케일로 변환하여 평가

RMSLE는 감소, RMSE는 증가

- 각 피처의 회귀 계수 값 시각화

year의 회귀계수가 지나치게 크지만, 자전거 대여 회수와 연관성을 찾기 어려움

- 연도를 나타내는 카테고리형 피처지만, 숫자형으로 되어 있음

- 숫자형 카테고리 값을 선형 회귀에 사용할 경우 숫자형 값에 영향을 크게 받을 수 있으므로 원-핫 인코딩 적용해야 함

- pandas의 get_dummies() 활용

- year, month, hour, holiday, workingday, season, weather 변환

원-핫 인코딩 후 성능이 향상된 것을 볼 수 있음

- 각 피처의 회귀 계수 시각화

선형 회귀시 피처를 어떻게 인코딩하느냐.. 중요..

- 회귀 트리를 이용한 성능 평가

위 데이터의 경우 회귀 트리를 이용한 결과가 더 좋게 나오는 것을 확인

10.3 회귀 실습 - 캐글 주택 가격: 고급 회귀 기법

- https://www.kaggle.com/c/house-prices-advanced-regression-techniques/data 

 

House Prices - Advanced Regression Techniques

Predict sales prices and practice feature engineering, RFs, and gradient boosting

www.kaggle.com

- 데이터 전처리(Preprocessing)

데이터 확인
NULL 데이터 확인

- Target Data인 SalePrice 데이터의 분포도가 정규 분포인지 확인

- sns.distplot 활용

정규분포에서 왼쪽으로 치우친 형태

- Target 데이터 로그 변환(np.log1p() 변환 → expm1() 환원)

Target 데이터의 분포가 정규 분포로 변환 되었음

- NULL값이 지나치게 많은 PoolQC, MiscFeature, Alley, Fence, FireplaceQu 삭제

- 단순 식별자인 Id 삭제

- 숫자형 피처의 Null 값은 평균값으로 대체

.fillna() 활용
house_df 중 피처별 null 개수를 합산 확인하는데, 합이 0보다 큰 피처의 dtype이 문자형

- 문자형 피처를 원-핫 인코딩으로 변환(pandas의 get_dummies() 활용)

- get_dummies()는 자동으로 문자열 피처를 원-핫 인코딩 변환 및 NULL 값을 None 칼럼으로 대체함

- 원-핫 인코딩시 칼럼 개수 증가하므로 확인 필요

더 이상 NULL 값은 존재하지 않음

- 선형 회귀 모델 학습/예측/평가

먼저, 모델별로 RMSE를 반환하는 함수 생성
Lasso가 성능이 가장 안좋게 나옴

- 피처별 회귀 계수 시각화

상위 10개, 하위 10개의 피처명과 회귀 계수를 갖는 Series 객체 반환
Lasso의 경우 회귀 계수 값이 매우 작으며, GrLivArea가 가장크고 나머지는 너무 작은 경향(문제가 있음)

- 데이터 분할 문제인지 검증(분할하지 않고 진행)

5 폴드 세트 학습으로도 성능이 좋지 않은 Lasso, 하이퍼 파라미터를 변화시키며 최적 값을 도출해야함

- 하이퍼 파라미터 튜닝을 위한 별도의 함수 생성(print_best_params(model, params))

Lasso 모델이 알파를 0.001로 했을 때 성능이 매우 향상되었다

- 최적 alpha 값을 설정한 뒤, 다시 데이터를 분할하여 학습/예측/평가 및 시각화 수행

WOW 이전보다 성능이 월등하게 좋아진 것을 확인!!

- 데이터 세트를 추가적으로 가공하여 모델 튜닝 진행(1. 피처 데이트 세트 분포도, 2. 이상치 데이터 처리)

- 모든 숫자형 피처의 데이터 분포도를 확인하여 왜곡 정도 확인

- scipy.stats 모듈의 skew() 함수로 쉽게 추출 가능

- skew() 적용 시 원-핫 인코딩이 적용된 숫자형 피처는 제외해야 함(원본으로 해야 한다는 소리)

object type이 아닌 친구들만 불러와서 확인

- 왜곡 정도가 높은 피처를 로그 변환

- 다시, 문자열을 원-핫 인코딩 시키고 데이터 세트 분할, 최적 alpha값 및 RMSE값 파악 수행

그렇다면, 최적 alpha 값으로 다시 모델을 학습/예측/평가 및 시각화

- 최적 alpha 값으로 모델 학습/예측/평가 및 시각화

아직 만족스럽게 결과가 도출되지는 않았다. 2개는 주택 면적이 1개는 전체적인 퀄리티를 1순위로 하고 있기 때문이다.

- 2개에서 회귀 계수가 높은 피처인 GrLivArea의 데이터 분포 확인(책에서는 3개가 GrLivArea)

일반적으로 주거공간이 클수록 가격이 비싸기 때문에, 양의 상관관계를 가지고 있음을 직관적으로 알 수 있음

- 위 그래프의 오른쪽 하단 2개의 점은 이상치 데이터가 확실(주거공간이 큰데 가격이 저렴함)

- GrLivArea >4000 & SalePrice <500000

4개의 이상치를 제거

- 다시 데이터 세트 분할, 최적 alpha값 및 RMSE값 파악 수행

오호... alpha 값이 바뀜
더 이상 성능이 좋아지지는 않지만, 책에서는 성능이 확 좋아지는 것으로 나옴

- 회귀 트리 모델 학습/예측/평가

- XGBoost, LightGBM

- 수행 시간이 오래 걸리므로 최적 파라미터를 적용한 상태에서 수행

짤린부분 n_jobs=-1
피처별 중요도가 두 모델이 다르다.

- 회귀 모델의 예측 결과를 혼합하여 최종 예측하기

- Ridge 모델 + Lasso 모델

책에서는 성능이 좋아졌지만, 여기서는 Ridge가 제일 좋다
책에서는 분명 성능이 좋아졌는데.. 여기서는 LGBM이 가장 좋다(근데 미미함)

- 스태킹 앙상블 모델을 통한 회귀 예측

- 개별 기반 모델 + 최종 메타 모델(개별 모델의 예측 데이터를 학습데이터로 학습)

- 개별모델, 원래 학습 데이터, 원래 테스트용 데이터를 입력 받음

개별 모델별로 데이터를 반환시킨 후 최종 예측을 해보자

- 반환된 데이터를 스태킹 형태로 결합부터!

성능이 가장 좋게 나온것으로 확인.. 스태킹을 잘 활용해야 한다

 

반응형

'코딩 > Machine Learning' 카테고리의 다른 글

12. 군집화(Clustering)  (2) 2021.01.09
11. 차원 축소(Dimension Reduction)  (0) 2021.01.03
9. 회귀(Regression)_2  (0) 2021.01.01
8. 회귀(Regression)_1  (0) 2020.12.27
7. 분류(Classification)_3  (0) 2020.12.13

댓글