Allen's 데이터 맛집

[머신러닝] 분류 : 여행 보험 패키지 구매 확률 본문

Project/Kaggle 분석&기계학습

[머신러닝] 분류 : 여행 보험 패키지 구매 확률

Allen93 2023. 9. 25. 00:37

케글 데이터를 가지고 머신러닝 분류모델을 사용하여 여행 보험 패키지 상품을 구매할 확률 값을 예측해 보겠습니다.

 

 

문제 : 여행 보험 패키지 상품을 구매할 확률 값을 구하시오

  • 예측할 값(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