-
[ 보험료 예측 모델 생성(2) _ 다양한 Regression model ]About_Datascience/ML 2023. 3. 13. 17:36
저번 EDA 및 전처리를 통해 학습을 시키기 위한 데이터가 준비되었으니
이번엔 다양한 Regression model 들을 이용하여 모델링을 진행해보고 평가까지 해보고자 한다.
다양한 Regression 을 활용한 보험료 예측 모델
0. Import Necessary Module
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import missingno as msno from sklearn.preprocessing import MinMaxScaler from sklearn.preprocessing import StandardScaler from sklearn.preprocessing import OneHotEncoder from sklearn.preprocessing import LabelEncoder from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures from sklearn.svm import SVR from sklearn.tree import DecisionTreeRegressor from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import train_test_split from sklearn.metrics import r2_score
1. Training data / Test data - Data Split
# 숫자형 데이터들만 copy()를 사용하여 복사 X_num = df[['age','bmi','children']].copy() # 변환했던 범주형 데이터들과 concat을 사용하여 합치기 X_final = pd.concat([X_num, region, sex, smoker],axis=1) # 보험료 컬럼(charges)을 y 값으로 설정 y_final = df[['charges']].copy() # Data Split X_train , X_test , y_train, y_test = train_test_split( X_final , y_final , test_size=0.33, random_state=0)
잘 나누어졌는지 확인 나누어진 데이터는 이런 식으로 되어 있다.
X_test[:10]
2. Feature Scaling
- 다차원의 값들을 비교 분석하기 쉽게 만든다.
- 변수들 간의 단위 차이가 있을 경우 필요하다.
- Overflow , Underflow를 방지해준다.
< Feature Scaling 의 대표적인 3가지 방법 >
1. MinMaxScaler
- 최대/최소값이 각각 1, 0이 되도록 스케일링
- 모든 feature 값이 0~1사이에 있도록 데이터를 재조정한다. 다만 이상치가 있는 경우 변환된 값이 매우 좁은 범위로 압축될 수 있다.
- 이상치를 제외한 나머지 데이터들이 안 보이게 된다.
- 따라서 outlier 즉 이상치에 매우 민감하다고 할 수 있다.
2. StandardScaler
- 기본 스케일. 평균과 표준편차 사용
- 평균을 제거하고 데이터를 단위 분산으로 조정한다.
- 그러나 이상치가 있다면 평균과 표준편차에 영향을 미쳐 변환된 데이터의 확산은 매우 달라지게 된다.
- 따라서 이상치가 있는 경우 균형 잡힌 척도를 보장할 수 없다.
3. RobustScaler
- 아웃라이어의 영향을 최소화한 기법이다. 중앙값(median)과 IQR(interquartile range)을 사용한다.
- ( IQR = Q3 - Q1 ): 즉, 25퍼센타일과 75퍼센타일의 값들을 다룬다.
- 때문에 StandardScaler와 비교해보면 표준화 후 동일한 값을 더 넓게 분포 시키고 있음을 확인 할 수 있다.
"" 결론적으로 ""
* 모든 Scaler 처리 전에는 outlier 제거가 선행되어야 한다.
* 또한 데이터의 분포 특징에 따라 적절한 Scaler를 적용해주는 것이 좋다.
이번 실습에서는 Standard Scaler 를 이용하여 스케일링을 진행하도록 할 것이다.
s_scaler = StandardScaler() # train 데이터는 fit_transform X_train = s_scaler.fit_transform(X_train.astype(np.float)) # test 데이터는 transform만 해줌. 기억할 것. X_test = s_scaler.transform(X_test.astype(np.float))
3. Regression
Regression 간단한 절차 요약
- Regression ( ) : 객체 생성
- fit ( ) : 학습
- predict ( ) : 예측
- score ( ) : 평가
3-1 . Linear Regression 적용
# fit model lr = LinearRegression().fit(X_train,y_train) # predict y_train_pred = lr.predict(X_train) y_test_pred = lr.predict(X_test) # Score 확인 print("lr.coef_ : {}".format(lr.coef_)) print("lr.intercept_ : {}".format(lr.intercept_)) print("lr Train score %.3f, lr Test score: %.3f"% ( lr.score(X_train, y_train), lr.score(X_test, y_test)))
3-2. Polynomial Regression 적용
> 다항회귀는 데이터들간의 형태가 비선형 일때 데이터에 각 특성의 제곱을 추가해주어 특성이 추가된 비선형 데이터를 선형 회귀 모델로 훈련시키는 방법이다.
> Linear Regression 과 같은 방법을 사용하지만 , 그 전에 Polynomial features를 사용하여 fitting을 시켜주는 것이 차이점이다.
< Flow >
- PolynomialFeatures함수를 통해 현재 데이터를 다항식 형태로 변경한다. (각 특성의 제곱 혹은 그 이상을 추가)
- degree 옵션으로 차수를 조절한다.
- include_bias 옵션은 True로 할 경우 0차항(1)도 함께 만든다.
- 이렇게 만들어진 다항식 모델에 x를 fit transform하여 새로운 데이터를 생성한다.
# Polynomial features poly = PolynomialFeatures(degree=3) X_poly = poly.fit_transform(X_final) X_train , X_test , y_train, y_test = train_test_split( X_poly , y_final , test_size=0.33, random_state=0) # Standard Scaler sc = StandardScaler() X_train = sc.fit_transform(X_train.astype(np.float)) X_test = sc.transform(X_test.astype(np.float)) # fit model poly_lr = LinearRegression().fit(X_train,y_train) # predict y_train_pred = poly_lr.predict(X_train) y_test_pred = poly_lr.predict(X_test) # Score 확인 print("Poly Train score %.3f, Poly Test score: %.3f"% ( poly_lr.score(X_train, y_train), poly_lr.score(X_test, y_test)))
3-3. Support Vector Regression 적용
> 학습 데이터의 분류 예측 에 사용되는 SVM을 ε-무감도 손실함수를 도입하여, 임의의 실수 값을 예측하도록 일반화한 방법
> 대표적인 분류 알고리즘 SVM에서 소개된 손실함수를 도입하여 회귀식을 구성하는 SVR(Support Vector Regression)
> 회귀계수 크기를 작게하여 회귀식을 평평하게 만들되, 실제값과 추정값의 차이를 작도록 고려하는 선을 찾자 !
< SVR의 매개변수 ' C ' >
- 얼마나 많은 데이터 샘플이 다른 클래스에 놓이는 것을 허용하는지 결정함
- 오차를 허용할 수 있는 범위
svr = SVR(kernel='linear', C=300) X_train , X_test , y_train, y_test = train_test_split( X_final , y_final , test_size=0.33, random_state=0) sc = StandardScaler() X_train = sc.fit_transform(X_train.astype(np.float)) X_test = sc.transform(X_test.astype(np.float)) # fit model svr = svr.fit(X_train,y_train.values.ravel()) y_train_pred = svr.predict(X_train) y_test_pred = svr.predict(X_test) # Score 확인 print('SVR Train score : %.3f, SVR Test score: %.3f' % ( svr.score(X_train, y_train), svr.score(X_test, y_test)))
3-4. Random Forest Regression 적용
> 랜덤 포레스트(RF) : 앙상블 학습 기법을 사용한 모델로 , 주어진 데이터로부터 여러 개의 모델을 학습한 다음, 예측 시 여러 모델의 예측 결과들을 종합해 사용하여 정확도를 높이는 기법으로, Decision tree와 비교하였을 때 좀 더 안정적이고 over-fitting을 회피할 수 있어 noise에 강하다.
* 앙상블 (2~5% 정도 정확도가 향상되는 결과를 가져올 수 있음)
- 데이터 셋을 가지고 훈련 데이터셋을 여러 개를 만든다.
- 랜덤하게 구성해서, 데이터의 6~70% 정도 복수의 예측 모델을 결합하여 더 나은 성능의 예측을 하려는 것이다.
- 단일 모델을 사용할 때보다 성능 부산이 감소
- 과적합(Over-fitting) 방지
- 각 데이터 셋에 대해서 서로 다른 분류 모델을 적용하여 데이터를 분류한다.
- 그럼 비슷하지만 결과가 각각 달라질 수 있다. 각각의 결과를 취합(combine)하여 예측을 함.
- voting(투표,다수결)로 결정한다.
* 배깅(bagging) : 동일한 모델과 모수를 사용하는 대신 훈련 데이터를 랜덤하게 선택해서 다수결 모델 적용. Random Forest도 배깅 기법의 예이다.
* 부스팅 기법( Boosting )
- 사용할 모델을 점진적으로 늘려감 ex) AdaBoost , Gradient Boost , XGBoost
- 일반적으로 의사결정나무 모형을 사용함.
- 가중치를 적용해서 그에 따라 결과를 다르게 할 수 있다는 특징이 있다.
- Bagging/ Boosting -> 부스팅이 배깅보다 좀 더 세련된 방법임.
forest = RandomForestRegressor(n_estimators=100, criterion='mse', random_state=1, n_jobs=-1) X_train , X_test , y_train, y_test = train_test_split( X_final , y_final , test_size=0.33, random_state=0) sc = StandardScaler() X_train = sc.fit_transform(X_train.astype(np.float)) X_test = sc.transform(X_test.astype(np.float)) # fit model forest.fit(X_train, y_train.values.ravel()) y_train_pred = forest.predict(X_train) y_test_pred = forest.predict(X_test) # Score 확인 print("Forest Train score : %.3f, Forest Test score: %.3f" %( forest.score(X_train, y_train), forest.score(X_test, y_test)))
3-5. Decision Tree Regression 적용
- 의사 결정 나무는 여러 가지 규칙을 순차적으로 적용하면서 독립 변수 공간을 분할하는 분류 모형이다.
- 의사결정을 위한 이진 분류를 하는 형태의 트리 , Feature를 사용하여 학습을 시키고 분류.
- 분류와 회귀 분석에 모두 사용될 수 있기 때문에 CART(Classification And Regression Tree) 라고도 한다.
- 전체 학습 데이터 집합(부모노드)을 해당 독립 변수의 값이 기준값보다 작은 데이터 그룹(자식 노드1) 과 해당 독립 변수의 값이 기준 값보다 큰 데이터 그룹
(자식노드 2) 로 나눈다.
- 각각의 자식 노드에 대해 1~2의 단계를 반복하여 하위의 자식 노드를 만든다. 단, 자식 노드에 한 가지 클래스의 데이터만 존재한다면 더 이상 자식 노드를 나누지 않고 중지한다.
- 자식 노드 나누기를 연속적으로 적용하면 노드가 계속 증가하는 나무와 같은 형태이다.
<문제점>
- 주어진 데이터셋에 대해 훌륭한 작업을 수행했음. 하지만 오직 훈련 데이터셋 한정일 때 얘기임.
- Decision Tree에서 대전제가 있는데 그것은 error-free, noise-free . 였다. 하지만 현실,현업에서는 noise가 많이 껴있다.
- 훈련 데이터셋은 실제 환경에 대한 완벽한 샘플들을 포함하고 있지 않음
(noise, inconsistencies(불일치성,일관성x) 하지만 실제 환경에서는 noise, inconsistencies, 등이 있음. 그래서 제대로 된 분류의 정확도가 감소하고 오류를 범할 수 있다.
- 이러한 문제점들 때문에 나오게 된 알고리즘이 Random Forest 이다.
dt = DecisionTreeRegressor(random_state=0) X_train , X_test , y_train, y_test = train_test_split( X_final , y_final , test_size=0.33, random_state=0) sc = StandardScaler() X_train = sc.fit_transform(X_train.astype(np.float)) X_test = sc.transform(X_test.astype(np.float)) # fit model dt = dt.fit(X_train, y_train.values.ravel()) y_train_pred = dt.predict(X_train) y_test_pred = dt.predict(X_test) # Score 확인 print("Decision Tree Train score : %.3f, Decision Tree Test score: %.3f" %( dt.score(X_train, y_train), dt.score(X_test, y_test)))
4. 마무리 ( Regression model 비교 )
# 앞에서 만든 regressor 변수들과 라벨을 묶어서 하나의 리스트로 모으기 regressor = [(lr, 'Linear Regression'), (poly_lr,'Polynomial Regression'), (svr, 'Support Vector Regression'), (forest,'Random Forest Regression'), (dt, 'Decision Tree Regression')] for reg, label in regressor: print(80*'_','\n') reg = reg.fit(X_train,y_train.values.ravel()) y_train_pred = reg.predict(X_train) y_test_pred = reg.predict(X_test) print(f"{label} train score : %.3f, {label} test score : %.3f" %( reg.score(X_train, y_train), reg.score(X_test, y_test)))
Train score 는 Decision Tree 가 0.999로 가장 높으나 , Test score를 보면 0.701로 모델들 중 가장 낮은 것을 알 수 있다.
따라서 위의 모델들 중 Test score가 0.842 인 Random Forest Regression 모델이 가장 학습이 잘 된 모델이라 할 수 있다.
'About_Datascience > ML' 카테고리의 다른 글
[ SVM을 이용한 얼굴 사진 분류모델 ] (2) 2023.03.17 [ Iris data를 이용한 SVM kernel 실습 ] (0) 2023.03.17 [ About _ SVM 이론 ] (0) 2023.03.17 [ 보험료 예측 모델 생성(1) _ 간단한 EDA 및 전처리 ] (0) 2023.03.13