Allen's 데이터 맛집
[머신러닝] 분류 : 여행 보험 패키지 구매 확률 본문
케글 데이터를 가지고 머신러닝 분류모델을 사용하여 여행 보험 패키지 상품을 구매할 확률 값을 예측해 보겠습니다.
문제 : 여행 보험 패키지 상품을 구매할 확률 값을 구하시오
- 예측할 값(y): TravelInsurance (여행보험 패지지를 구매했는지 여부 0:구매 안 함, 1:구매)
- 평가: roc-auc 평가지표
- data: t2-1-train.csv, t2-1-test.csv
- 제출 형식
id, TravelInsurance
0, 0.3
1, 0.48
2, 0.3
3, 0.83
시험 환경 셋팅
train 데이터와 test 데이터를 가져옵니다.
# 라이브러리 불러오기
import pandas as pd
# 데이터 불러오기
train = pd.read_csv("../input/big-data-analytics-certification/t2-1-train.csv")
test = pd.read_csv("../input/big-data-analytics-certification/t2-1-test.csv")
EDA
train, test 데이터에 대해서 shape, head, info, 기술통계값을 확인합니다.
# 데이터 사이즈
train.shape, test.shape
>>> ((1490, 10), (1490, 10))
# 샘플 확인
train.head()
# type 확인
train.info()
# 카테고리 수 확인
train.describe(include="object")
# 카테고리 수 확인
test.describe(include="object")
# Employment Type 컬럼 카테고리
train['Employment Type'].value_counts()
# Employment Type 컬럼 카테고리
test['Employment Type'].value_counts()
>>> Private Sector/Self Employed 1056
>>> Government Sector 434
>>> Name: Employment Type, dtype: int64
---
>>> Private Sector/Self Employed 360
>>> Government Sector 134
>>> Casual employment 3
>>> Name: Employment Type, dtype: int64
# 수치형 통계 값
train.describe(exclude="object")
# 수치형 통계 값
test.describe(exclude="object")
데이터 전처리
train, test 데이터 각각 결측치를 확인합니다.
train과 test의 결측치에 대해서 각각 동일하게 각 데이터의 평균값으로 결측값을 대체합니다.
# 결측치 처리
train['AnnualIncome'] = train['AnnualIncome'].fillna(train['AnnualIncome'].mean())
test['AnnualIncome'] = test['AnnualIncome'].fillna(test['AnnualIncome'].mean())
# target값 변수에 옮기기
target = train.pop('TravelInsurance')
# 데이터 합치기
df = pd.concat([train, test])
df.shape
>>> (1987, 9)
LabelEncoder를 사용하여 범주형 데이터(문자열로 표현된 카테고리)를 숫자로 변환합니다.
데이터를 train 및 test 세트로 다시 분리합니다.
수치형 특성 중에서 'AnnualIncome' 열에 대해서 Min-Max 스케일링을 적용합니다.
Min-Max 스케일링은 각 특성의 최솟값을 0으로, 최댓값을 1로 변환하여 데이터를 일정 범위로 조정합니다.
# 레이블 인코딩
from sklearn.preprocessing import LabelEncoder
cols = df.select_dtypes(include="object").columns
le = LabelEncoder()
for col in cols:
df[col] = le.fit_transform(df[col])
# train test 다시 분리
train = df[:train.shape[0]].copy()
test = df[train.shape[0]:].copy()
# 스케일
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
train['AnnualIncome'] = scaler.fit_transform(train[['AnnualIncome']])
test['AnnualIncome'] = scaler.transform(test[['AnnualIncome']])
검증 데이터 분리
train_test_split함수를 사용하여 데이터를 분할합니다.
from sklearn.model_selection import train_test_split
X_train, X_val, y_train, y_val = train_test_split(train, target, test_size=0.2, random_state=2022)
X_train.shape, X_val.shape, y_train.shape, y_val.shape
>>> ((1192, 9), (298, 9), (1192,), (298,))
모델 학습 및 평가
DecisionTreeClassifier, RandomForestClassifier, xgboost 분류 모델을 사용하여 문제에서 제시했던 평가지표(roc_auc_score)를 책정하여 가장 좋은 모델을 찾습니다.
# 의사결정나무
from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier(random_state=2022)
model.fit(X_train, y_train)
pred = model.predict_proba(X_val)
# 평가
from sklearn.metrics import roc_auc_score
roc_auc_score(y_val, pred[:,1])
>>> 0.698787878787
# 랜덤포레스트
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(random_state=2022)
model.fit(X_train, y_train)
pred = model.predict_proba(X_val)
roc_auc_score(y_val, pred[:,1])
>>> 0.76590909090909
# xgboost
import xgboost as xgb
model = xgb.XGBRFClassifier(random_state=2022)
model.fit(X_train, y_train)
pred = model.predict_proba(X_val)
roc_auc_score(y_val, pred[:,1])
>>> 0.765277777777
예측
가장 예측 결괏값이 좋았던 RandomForestClassifier을 최종 모델로 선정하고 문제에서 제시했던 id, TravelInsurance형태의 데이터프레임을 새로 만들고 확인을 위해 head()로 데이터를 확인합니다.
# test 데이터 예측
model = RandomForestClassifier(random_state=2022)
model.fit(X_train, y_train)
pred = model.predict_proba(test)
# 예측한 데이터 -> 데이터프레임으로
submit = pd.DataFrame()
submit['id'] = test['id']
submit['TravelInsurance'] = pred[:,1]
# 예측한 데이터 확인
submit.head()
csv파일로 저장 후 다시 출력을 하여 확인을 해봅니다.
총 497개의 데이터로 각 id마다 여행자 보험을 패키지를 구매할 확률값을 보여줍니다.
# csv 저장
submit.to_csv("2022.csv", index=False)
# csv 확인
pd.read_csv("2022.csv")
케글:https://www.kaggle.com/datasets/tejashvi14/travel-insurance-prediction-data/data