본문 바로가기
Brightics 서포터즈 3기

삼성 SDS Brightics_팀 분석 프로젝트(3)] 07. 개인 의료비🏥 예측 프로젝트✨ (Decision Tree & XGBoost Regression)

by 눈뚜덩이 2022. 8. 29.

 

안녕하세요~

이번 주가 벌써

팀 프로젝트 3주 차네요!

지난 포스팅을 보지 못하셨다면...!

📍팀 분석 프로젝트(1)-전처리 & EDA

https://blog.naver.com/noonddudung2/222849341179

📍팀 분석 프로젝트(2)-상관분석

https://blog.naver.com/noonddudung2/222855108856

위의 두 가지 링크를 참고해 주세요~

이번에 제가 맡은 역할은

Decision Tree Regression과 XGBoost Regression 모델을 활용하여

성별에 따른 의료비를 예측하는 것입니다!

+) 여기서 잠깐!! ✨

아래와 같은 궁금증을 가지실 분들을 위해

잠깐의 TMI 파티를 진행하겠습니당 ㅎㅎ

 

Q1. 갑자기 "성별에 따른" 의료비 예측을 하는 이유는?

A1. 먼저, 성별과 상관없이

의료비 예측하는 것을 맡은 팀원들이 있고,

성별에 따른 의료비 예측을 맡은 팀원 (That's me!!)

들이 있답니다!

따라서, 성별을 포함한 변수들을 종합하여 모델을 돌리면서,

성별에 따른 모델도 돌리는 것이지요!

이것은 정확성을 높여보려는 노력 중 하나이기도 하죠 ㅎㅎ

Q2."나이, 흡연 여부, 지역에 따른" 의료비 예측을 진행하지 않나요?

A2. 나이대, 지역에 따라 분석하면

원본 데이터의 양이 적은데

이것이 또 분산되어

분석하기 적절하지 않다고 판단하였습니다.

또한, 흡연 여부의 경우에는

흡연자와 비흡연자의 데이터양의 차이가 커서

적절하지 않다고 판단하였고요 ㅎㅎ

아래 그래프와 같이

성별의 경우 성비가 비슷하며,

데이터의 양도 분석하기에 적절한

성별에 따른 의료비 예측을 진행해 보았습니다!

01. 프로세스

다시 본론으로 돌아와서

먼저 분석 프로세스 보여드릴게요!

(전처리를 다 마친 상태입니다!)

 

<Female Group>

<Male Group>

📍Filter & Select Column

Filter 함수를 활용해서

데이터를 성별에 따라 분리하고,

Select Column 함수로

성별을 제외한 모든 열을 선택하였어요!

📍Decision Tree Regression Model

& XGB Regression Model

Brightics Studio에서

Split Data로 train data와 test data로 나누고,

model을 활용하여 평가를 진행하였습니다!

📍Python Script

여기서는 GridSearchCV로

하이퍼 파라미터를 튜닝하여

최적화를 하였습니다!

📍Evaluate Regression

다음은 Evaluate Regression으로

평가지표를 확인하였습니다.

02. Decision Tree(의사결정 나무) Regression Model

1. Decision Tree Regression Model 이란?

Decision Tree는

이름처럼 의사 결정 규칙에 의한

나무 구조로 데이터를 보여주는 모델입니다!

시각화하여 볼 수 있으니 해석하기에

편하다는 장점이 있죠ㅎㅎ

입력값에 대한 출력값을 예측하는데,

분류 나무와 회귀 나무가 있습니다.

저희가 사용하는 것이 회귀 나무죠!

2. Decision Tree Regression Train

insurance 데이터에서

Decision Tree Regression Model의

파라미터를 default로 두고 train 시키면

다음과 같은 결과가 나옵니다!

<Female Group>

📍Decision Tree

📍Feature Importances

<Male Group>

📍Decision Tree

📍Feature Importances

전체적으로 보았을 때,

남녀 간의 중요도의 큰 차이는 없었습니다.

그러나, 여성의 경우 남성보다

흡연 여부의 중요성이 0.12 정도 낮고,

bmi의 중요성이 0.06 정도 높은 것으로 판단됩니다.

3. 교차 검증 & 그리드 서치

이제 Python Script에서

교차 검증과 그리드 서치를 실행한 코드를

보여드릴게요!

Decision Tree Regression Model의 경우

criterion, splitter, max_depth, min_samples_split, min_samples_leaf,

min_weight_fraction_leaf, max_features, random_state,

max_leaf_nodes, min_impurity_decrease, ccp_alpha를

파라미터로 가지고 있는데요!

저희 팀은 이 중에 splitter, max_depth, min_samples_leaf,

min_weight_fraction_leaf, max_features, max_leaf_nodes를 활용하여

파라미터를 최적화하기 위한 코드를 작성하였습니다.

(이 코드는 남성 그룹에 대한 그리드 서치 코드인데,

여성 그룹과 코드와 구성이 비슷하기 때문에 예시로 가져왔습니다~)

📍교차 검증 & 그리드 서치 코드

import numpy as np
import pandas as pd

from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV

data = inputs[0]
X_train, X_test, y_train, y_test = train_test_split(
  data.iloc[:,:-1], data.iloc[:,-1], test_size=0.3, random_state=0)

dtm=DecisionTreeRegressor()

parameters={"splitter":["best","random"],
            "max_depth" : [3,5,7,9,11,12],
           "min_samples_leaf":[1,2,3,4,5,6,7,8,9,10],
           "min_weight_fraction_leaf":[0.1,0.2,0.3,0.4,0.5],
           "max_features":["auto","log2","sqrt",None],
           "max_leaf_nodes":[None,10,20,30,40,50,60,70,80,90] }

grid_dtm= GridSearchCV(dtm,param_grid=parameters,cv=5)

grid_dtm.fit(X_train,y_train)

best_model = grid_dtm.best_estimator_
y_predict = grid_dtm.predict(X_test)

df = pd.DataFrame({'charges': y_test ,'prediction': y_predict})
 

📍Best Model

코드를 실행시켜보니

아래와 같은 최적화된 파라미터를 얻을 수 있었습니다!

<Female Group>

<Male Group>

다음과 같이 최적화된 파라미터에서

여성과 남성 그룹의 차이가 있습니다!

4. Evaluate Regression

그리드 서치 전후의 평가 지표 변화를

간단히 정리해 보았습니다.

(소수점 넷째 자리까지 나타내었습니다!)

저희 팀은 평가 지표로 R2, MAE, MAPE를 사용하기로 하였습니다!

(평가 지표에 대한 자세한 내용은 팀원 언니가 맡기로 하였답니다~)

03. XGBoost Regression Model

 

1.XGB Regression Model 이란?

XGBoost Regression Model의 경우

부스팅 계열의 트리 모델로

분류와 회귀에 모두 사용할 수 있습니다!

GBM(Gradient Boosting Machine) 모델에

비하여 수행 시간이 빠르고

과적합 규제 기능을 가진다는 장점이 있습니다.

2. XGB Regression Model Train

insurance 데이터에서 XGB Regression Model의

파라미터를 default로 두고

train 시키면 다음과 같은 결과가 나옵니다!

📍Feature Importances

<Female Group>

 

<Male Group>

종합적으로 보았을 때,

성별에 따른 변수의 중요도 차이가

크지 않습니다.

그러나, 여성의 경우 부양 자녀수와 흡연 여부의

중요도가 0.08로 같지만,

남성의 경우 부양자녀수는 0.10,

흡연 여부는 0.07의 중요도를 가져

부양자녀 수의 중요도가 더 높다는 것을

알 수 있습니다.

3. 교차 검증 & 그리드 서치

XGB Regression Model 같은 경우에는

굉장히 많은 파라미터가 존재해요.

크게 일반 파라미터, 부스터 파라미터, 학습 태스크 파라미터로 나뉘고

그 안에 다양한 파라미터들이 있답니다.

저희 팀은 learning_rate, max_depth,

subsample, colsample_bytree, n_estimators

파라미터를 조정하여 최적화하였습니다.

📍교차 검증 &그리드 서치 코드

import numpy as np
import pandas as pd
import xgboost as xgb
from xgboost.sklearn import XGBRegressor
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV

data = inputs[0]
X_train, X_test, y_train, y_test = train_test_split(
  data.iloc[:,:-1], data.iloc[:,-1], test_size=0.3, random_state=0)
	
xgb = XGBRegressor()
parameters = {
              'learning_rate': [0.05,0.1,0.15], #so called `eta` value
              'max_depth': [5,6,7,8],
              'subsample': [0.5],
              'colsample_bytree': [0.7],
              'n_estimators': [30,40,50,60,70,80]
							 }
xgb_grid = GridSearchCV(xgb,
                        parameters,
                        cv = 5)

xgb_grid.fit(X_train,y_train)

best_model = xgb_grid.best_estimator_
y_predict = xgb_grid.predict(X_test)

df = pd.DataFrame({'charges': y_test ,'prediction': y_predict})

 

📍Best Model

코드를 실행시켜보니

아래와 같은 최적화된 파라미터를 얻을 수 있었습니다!

<Female Group>

 

<Male Group>

4. Evaluate Regression

그리드 서치 전후의 평가 지표 변화를

간단히 정리해 보았습니다.

(소수점 넷째 자리까지 나타내었습니다!)

04. 팀 분석 프로젝트를 하면서 느낀 점

팀 분석 프로젝트가

거의 다 끝나가는데요!

이 프로젝트를 하면서

몰랐던 내용들도 많이 배우고 있습니다 ㅎㅎ

고려해야 할 부분이 많은데,

언니 오빠들이랑

역할을 나누고 이야기도 나누니까

참 좋은 것 같아요!

Brightics Studio를 활용하니까

서로 flow를 이해하기도 쉽다는 것도

팀 분석할 때 큰 장점이었습니다~

앞으로 이 분석 내용을 바탕으로

영상도 제작할 계획이니

남은 포스팅들도 많이 기대해 주세요~

안녕~