DACON - 항공사 고객 만족도 예측 경진대회
2022.02.07 ~ 2022.02.18 동안 진행되었던 DACON 항공사 고객 만족도 예측 경진대회 참가 후기입니다.
본 글에서는 데이터 분석 진행 과정을 요약하여 적어보려 합니다.
아래의 링크는 제가 한 코드를 전부를 공유해놓은 주소입니다.
저는 종료가 하루 남은 현재 시점에 517명 중 19등의 점수를 받았습니다.
(사진은 24등인데, 19등과 점수가 동일합니다 ㅎㅎ)
해당 대회의 평가 산식은 'Accuracy'였고, 저는 public : 0.938 점수를 받았습니다.
저도 다른 분들의 코드를 참고하여 점수를 좀 더 올리면서 흥미를 유발하려 했던 것 같습니다.
이 글을 보신 분들이 조금이라도 얻어가시는 게 있으시면 좋겠습니다.
DataSet 확인
test, train data를 로드하고, 데이터의 개수, 피쳐의 수, 결측치 존재 유무 등을 간단하게 확인했습니다.
df_train.shape
df_test.shape
df_train.info()
df_test.info()
import missingno as msno
msno.matrix(df_train)
EDA
모델을 통한 예측에 있어 좋은 점수를 받기 위해서는 EDA가 매우 중요하다고 생각합니다.
Feature를 연속형과 이산형, 범주형으로 분류하여 시각화를 해보고, Insight를 얻으려 노력했습니다.
그리고 각 Feature 간의 상관관계(Correlation)를 살펴보았습니다.
특이했던 부분은 어떤 항목에서 점수를 0점을 줬는데 target(만족)=1 인 데이터가 많았다는 것입니다.
저는 이를 귀찮아서 대충 0점으로 몰아서 준 게 아닐까 생각하였고, 다른 분들은 결측치를 0으로 채운 거다 라는 접근을 하셨습니다.
numeric_feature = ['Age', 'Flight Distance', 'Departure Delay in Minutes', 'Arrival Delay in Minutes']
ordinal_feature = ['Seat comfort', 'Departure/Arrival time convenient', 'Food and drink', 'Gate location',
'Inflight wifi service', 'Inflight entertainment', 'Online support', 'Ease of Online booking',
'On-board service', 'Leg room service', 'Baggage handling', 'Checkin service', 'Cleanliness', 'Online boarding']
categorical_feature = ['Gender', 'Customer Type', 'Type of Travel', 'Class']
from sklearn.preprocessing import LabelEncoder
corr_df = df_train.copy()
corr_df[corr_df.columns[corr_df.dtypes=='O']] = corr_df[corr_df.columns[corr_df.dtypes=='O']].astype(str).apply(LabelEncoder().fit_transform)
plt.figure(figsize=(35,25))
heat_table = corr_df.corr()
mask = np.zeros_like(heat_table)
mask[np.triu_indices_from(mask)] = True
heatmap_ax = sns.heatmap(heat_table, annot=True, mask = mask, cmap='coolwarm')
heatmap_ax.set_xticklabels(heatmap_ax.get_xticklabels(), fontsize=15, rotation=45)
heatmap_ax.set_yticklabels(heatmap_ax.get_yticklabels(), fontsize=15)
plt.title('correlation between features', fontsize=40)
plt.show()
Feature Engineering
Feature Engineering 부분에서는 아래의 과정을 진행했습니다.
- Age :
- 나잇대별로 구분. (10대, 20대, 30대 ,,,)
- Departure Delay in Minutes, Arrival Delay in Minutes :
- 처음에는 출발 딜레이가 크게 존재하면 도착 딜레이가 존재하겠구나 생각하고 만족도에 많은 영향을 주겠다 생각했는데, 출발 딜레이와 도착 딜레이를 비교해보니 한쪽만 0인 값들이 존재.
- 출발이든 도착이든 "지연"이 중요하겠다 생각하여, 두 피쳐의 평균값인 피쳐 Delay 생성 후 두 피쳐 삭제.
- 편향되어 있어 Log transformation 적용.
- 0이 존재하는 점수 피쳐들 :
- Seat comfort랑 Food and drink가 0이면 무조건 만족(target=1), Seat comfort랑 Leg room service가 0이면 무조건 만족(target=1) 등 관계를 찾아보았음.
- 위의 조건에 해당하는 경우 0 값을 5로 변경 or 위의 조건에 해당하는 경우에 1 값을 갖는 피쳐 생성 등 다양한 시도 -> 결과적으로는 점수가 올라가진 않음
- One-hot Encoding
- Feature Drop
- id - 학습에 관련 없음
- Food and drink - Seat comfort와의 다중 공선 성과 많은 결측치
- Departure/Arrival time convenient - 많은 결측치 및 target과의 낮은 상관계수
- Inflight entertainment - target과 낮은 상관계수 (0을 어떻게 처리할지 모르겠음)
- Online support - target과 낮은 상관계수
- Ease of Online booking - target과 낮은 상관계수
Modeling & Prediction
모델링은 이번 대회를 진행하면서 처음 알게 된 pycaret으로 진행해보았습니다.
다양한 모델들을 비교해주는 유용한 라이브러리인 것 같습니다.
저는 pycaret을 활용하여 Accuracy 기준으로 4개의 모델을 선정하였고, soft voting을 사용하여 정확도를 올리고자 했습니다.
from pycaret.classification import *
clf1 = setup(data = df_train,
silent = True,
target = 'target',
session_id = 20201809,
n_jobs = 7)
#상위 모델 4개를 선택
best = compare_models(n_select=4, fold = 10,
cross_validation=True,
sort='Accuracy')
blend_4_soft = blend_models(estimator_list=best, method='soft', choose_better = True)
final_blend_4_soft = finalize_model(blend_4_soft)
prediction = predict_model(final_blend_4_soft, data = df_test)
Submission
submission = pd.read_csv("./data/sample_submission.csv")
submission['target'] = prediction['Label']
submission.head()
submission.to_csv("./data/submission_pycaret_4.csv",index=False)
Reference
https://dacon.io/competitions/official/235871/overview/description
https://github.com/Park-taenam/DACON/tree/main/Airlines
'Etc > Kaggle & DACON' 카테고리의 다른 글
[DACON] 집값 예측 경진대회 (0) | 2022.02.04 |
---|---|
[DACON] 펭귄 몸무게 예측 경진대회 (0) | 2022.01.11 |
[Kaggle] Titanic 필사 - 이유한님 (0) | 2022.01.09 |
댓글