
안녕하세요~
이번 주가 벌써
팀 프로젝트 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를 이해하기도 쉽다는 것도
팀 분석할 때 큰 장점이었습니다~
앞으로 이 분석 내용을 바탕으로
영상도 제작할 계획이니
남은 포스팅들도 많이 기대해 주세요~
안녕~

※ 본 포스팅은 삼성SDS Brightics 서포터즈 3기 활동의 일환으로 작성하였습니다.
#삼성SDSBrightics #BrighticsStudio #브라이틱스 #모델링 #데이터분석
#Brightics서포터즈 #브라이틱스서포터즈 #데이터시각화 #EDA #회귀분석
'Brightics 서포터즈 3기' 카테고리의 다른 글
삼성 SDS Brightics_팀 영상 프로젝트(1)] 09. 보험비🏥 예측 프로젝트 영상 제작기🎬 (feat. 유한상사) (0) | 2022.09.13 |
---|---|
삼성 SDS Brightics_팀 분석 프로젝트(4)] 08. 개인 의료비🏥 예측 프로젝트✨ (feat. 느낀 점) (0) | 2022.09.05 |
삼성 SDS Brightics_팀 분석 프로젝트(2)] 06. 개인 의료비🏥 예측 프로젝트✨ (피어슨 vs. 스피어만 상관계수) (0) | 2022.08.22 |
[삼성 SDS Brightics_팀 분석 프로젝트(1)] 05.개인 의료비🏥 예측 프로젝트✨ (0) | 2022.08.16 |
[삼성 SDS Brightics_개인 분석 프로젝트(3)] 04.고객🛍 특성 분석 with K-means 군집화 (0) | 2022.07.10 |