보험 데이터에 다항 회귀 및 의사 결정 트리 회귀기 구현: 종합 가이드
머신러닝 분야에서 회귀 모델은 연속적인 결과를 예측하는 데 중요한 역할을 합니다. 이 기사에서는 다항 회귀와 의사 결정 트리 회귀기를 보험 데이터셋에 적용하는 방법을 단계별로 안내하며, 데이터 전처리, 모델 구축, 평가 및 최적화 과정을 다룹니다. 숙련된 데이터 과학자이든 초보자이든 관계없이 이 종합 가이드는 이러한 회귀 기법을 효과적으로 구현하고 비교할 수 있는 지식을 제공합니다.
목차
- 소개
- 데이터셋 개요
- 데이터 전처리
- 데이터를 학습 및 테스트 세트로 분할하기
- 다항 회귀 모델 구축 및 평가
- 의사 결정 트리 회귀기 구현하기
- 하이퍼파라미터 튜닝 및 그 영향
- 교차 검증 및 모델 안정성
- 모델 비교
- 결론 및 모범 사례
소개
머신러닝은 다양한 예측 작업에 적합한 다양한 회귀 기법을 제공합니다. 이 가이드는 두 가지 방법에 중점을 둡니다:
- 다항 회귀: 독립 변수와 종속 변수 간의 다항 관계를 고려하여 선형 회귀를 확장합니다.
- 의사 결정 트리 회귀기: 결정 트리와 같은 모델을 사용하여 연속적인 값을 예측합니다.
이러한 모델을 보험 데이터셋에 적용하면 연령, BMI, 흡연 습관 등의 요인을 기반으로 보험 비용을 예측할 수 있습니다.
데이터셋 개요
우리는 Kaggle의 보험 데이터셋을 사용하며, 이 데이터셋은 다음과 같은 특징을 포함하고 있습니다:
- Age: 주요 수혜자의 나이.
- Sex: 수혜자의 성별.
- BMI: 체질량 지수.
- Children: 보험에 가입된 자녀 수.
- Smoker: 흡연 상태.
- Region: 수혜자의 거주 지역.
- Charges: 건강 보험에 의해 청구된 개인 의료 비용.
목표는 다른 특징을 기반으로 Charges
를 예측하는 것입니다.
데이터 전처리
효과적인 데이터 전처리는 정확한 머신러닝 모델을 구축하는 데 필수적입니다. 이 섹션에서는 범주형 변수를 처리하기 위한 레이블 인코딩과 원-핫 인코딩을 다룹니다.
레이블 인코딩
레이블 인코딩은 범주형 텍스트 데이터를 머신러닝 알고리즘에 필수적인 숫자 형태로 변환합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
from sklearn import preprocessing import pandas as pd # Load dataset data = pd.read_csv('S07_datasets_13720_18513_insurance.csv') X = data.iloc[:, :-1] Y = data.iloc[:, -1] # Initialize LabelEncoder le = preprocessing.LabelEncoder() # Encode 'sex' and 'smoker' columns X['sex'] = le.fit_transform(X['sex']) X['smoker'] = le.fit_transform(X['smoker']) |
출력:
1 2 3 4 |
age sex bmi children smoker region 0 19 0 27.900 0 1 southwest 1 18 1 33.770 1 0 southeast ... |
원-핫 인코딩
원-핫 인코딩은 범주형 변수를 머신러닝 알고리즘이 예측을 더 잘할 수 있는 형태로 변환합니다.
1 2 3 4 5 6 7 8 9 |
from sklearn.preprocessing import OneHotEncoder from sklearn.compose import ColumnTransformer # Initialize ColumnTransformer with OneHotEncoder for 'region' columnTransformer = ColumnTransformer([('encoder', OneHotEncoder(), [5])], remainder='passthrough') # Apply transformation X = columnTransformer.fit_transform(X) print(X) |
출력:
1 2 3 4 |
[[0. 0. 0. ... 27.9 0. 1.] [0. 0. 1. ... 33.77 1. 0.] ... ] |
데이터를 학습 및 테스트 세트로 분할하기
데이터셋을 분할하면 모델의 성능을 보지 못한 데이터에서 평가할 수 있어 실제 성능을 더 잘 추정할 수 있습니다.
1 2 3 4 |
from sklearn.model_selection import train_test_split # Split data into training and testing sets (80-20 split) X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.20, random_state=1) |
다항 회귀 모델 구축 및 평가
다항 회귀는 독립 변수와 종속 변수 간의 비선형 관계를 모델이 적합할 수 있도록 합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures from sklearn.metrics import r2_score # Initialize PolynomialFeatures with degree 2 poly = PolynomialFeatures(degree=2) X_poly = poly.fit_transform(X_train) # Initialize and fit Linear Regression model model = LinearRegression() model.fit(X_poly, y_train) # Predict on test set y_pred = model.predict(poly.transform(X_test)) # Evaluate model r2 = r2_score(y_test, y_pred) print(f'Polynomial Regression R2 Score: {r2:.2f}') |
출력:
1 |
Polynomial Regression R2 Score: 0.86 |
R² 점수 0.86은 보험 비용 분산의 약 86%가 모델에 의해 설명된다는 것을 나타냅니다.
의사 결정 트리 회귀기 구현하기
의사 결정 트리는 특징 값에 따라 데이터를 하위 집합으로 분할하여 관계를 복잡하게 모델링할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 |
from sklearn.tree import DecisionTreeRegressor # Initialize Decision Tree Regressor with max_depth=4 dt_model = DecisionTreeRegressor(max_depth=4) dt_model.fit(X_train, y_train) # Predict on test set y_pred_dt = dt_model.predict(X_test) # Evaluate model r2_dt = r2_score(y_test, y_pred_dt) print(f'Decision Tree Regressor R2 Score: {r2_dt:.2f}') |
출력:
1 |
Decision Tree Regressor R2 Score: 0.87 |
놀랍게도, 이번 경우 의사 결정 트리 회귀기는 다항 회귀 모델보다 약간 높은 R² 점수를 기록했습니다.
하이퍼파라미터 튜닝 및 그 영향
max_depth
와 같은 하이퍼파라미터는 의사 결정 트리의 복잡성을 제어하여 모델 성능에 큰 영향을 미칩니다.
1 2 3 4 5 6 7 |
# Experimenting with different max_depth values for depth in [2, 3, 4, 10]: dt_model = DecisionTreeRegressor(max_depth=depth, random_state=1) dt_model.fit(X_train, y_train) y_pred_dt = dt_model.predict(X_test) r2_dt = r2_score(y_test, y_pred_dt) print(f'max_depth={depth} => R2 Score: {r2_dt:.2f}') |
출력:
1 2 3 4 |
max_depth=2 => R2 Score: 0.75 max_depth=3 => R2 Score: 0.86 max_depth=4 => R2 Score: 0.87 max_depth=10 => R2 Score: 0.75 |
- Max Depth=2: 낮은 R² 점수로 모델이 과소적합됨.
- Max Depth=3 & 4: 높은 R² 점수로 최적의 성능을 보임.
- Max Depth=10: 과적합으로 인해 테스트 세트 성능이 감소됨.
결론: 적절한 max_depth
선택은 편향과 분산의 균형을 맞추어 모델이 보지 못한 데이터에 잘 일반화되도록 하는 데 중요합니다.
교차 검증 및 모델 안정성
교차 검증, 특히 K-Fold 교차 검증은 데이터를 k개의 하위 집합으로 나누고 모델을 반복적으로 학습 및 테스트하여 모델 성능에 대한 더 견고한 추정을 제공합니다.
1 2 3 4 5 6 7 8 9 10 |
from sklearn.model_selection import cross_val_score # Initialize Decision Tree Regressor dt_model = DecisionTreeRegressor(max_depth=4, random_state=1) # Perform 5-Fold Cross-Validation cv_scores = cross_val_score(dt_model, X, Y, cv=5, scoring='r2') print(f'Cross-Validation R2 Scores: {cv_scores}') print(f'Average R2 Score: {cv_scores.mean():.2f}') |
출력:
1 2 |
Cross-Validation R2 Scores: [0.85 0.86 0.87 0.88 0.86] Average R2 Score: 0.86 |
이점: 교차 검증은 단일 학습-테스트 분할에 의존한 모델 평가의 위험을 완화하여 보다 일반화된 성능 지표를 제공합니다.
모델 비교
모델 | R² 점수 |
---|---|
다항 회귀 | 0.86 |
의사 결정 트리 회귀기 | 0.87 |
통찰:
- 의사 결정 트리 회귀기는 이 경우 다항 회귀보다 약간 더 뛰어남.
- 적절한 하이퍼파라미터 튜닝은 의사 결정 트리의 성능을 크게 향상시킴.
- 두 모델 모두 장점이 있으며, 선택은 특정 사용 사례와 데이터 특성에 따라 다름.
결론 및 모범 사례
이 가이드에서는 보험 데이터셋에 다항 회귀와 의사 결정 트리 회귀기를 구현하는 방법을 살펴보았습니다. 주요 요점은 다음과 같습니다:
- 데이터 전처리: 범주형 변수의 적절한 인코딩은 모델 정확도에 필수적입니다.
- 모델 평가: R² 점수는 모델 성능을 평가하는 신뢰할 수 있는 지표입니다.
- 하이퍼파라미터 튜닝:
max_depth
와 같은 파라미터 조정은 과적합과 과소적합을 방지할 수 있습니다. - 교차 검증: 성능 지표의 신뢰성을 높입니다.
모범 사례:
- 데이터 이해: 모델링 전에 데이터셋을 탐색하고 이해하여 정보에 기반한 전처리 및 모델링 결정을 내립니다.
- 특징 엔지니어링: 새로운 특징을 생성하거나 기존 특징을 변환하여 기본 패턴을 포착하는 것을 고려합니다.
- 모델 선택: 여러 알고리즘을 실험하여 특정 작업에 가장 적합한 성능을 보이는 모델을 식별합니다.
- 정규화 기법: 의사 결정 트리에서 가지치기와 같은 기법을 사용하여 과적합을 방지합니다.
- 지속적인 학습: 최신 머신러닝 기법과 모범 사례를 지속적으로 업데이트합니다.
이러한 관행을 준수함으로써 데이터셋과 목표에 맞는 견고하고 정확한 예측 모델을 구축할 수 있습니다.
다양한 데이터셋에서 이러한 모델을 실험하고 모델 성능을 더욱 향상시키기 위한 고급 기법을 탐구함으로써 데이터 과학 여정을 강화하십시오.