🏅 Kaggle

Kaggle - [ Titanic - Machine Learning from Disaster ]

date
Jul 14, 2023
slug
kaggle-01
author
status
Public
tags
Kaggle
Python
Machine Learning
summary
머신러닝을 사용하여 타이타닉 호에서 살아남은 승객을 예측하는 모델 만들기
type
Post
thumbnail
category
🏅 Kaggle
updatedAt
Jul 28, 2023 07:33 AM

Titanic ML competition

머신러닝을 사용하여 타이타닉 호에서 살아남은 승객을 예측하는 모델 만들기

EDA

train, test 수치형 데이터 분포 비교
notion image
train 과 test 의 데이터 분포가 대체적으로 비슷함을 알 수 있다.
 

전처리

  1. Age, Embarked, Cabin 결측치 채우기
      • Age
        • 18세를 기준으로 성인과 미성년으로 나누고, 각각의 분포를 확인해서 평균과 중앙값 중 어느 것으로 대체할지 결정하기
        • Name 에서 호칭의 정보를 가지고 성인과 미성년으로 나누기
        • Parch 와 SibSp 정보도 활용하기
      • Embarked
        • 최빈값으로 대체
      • Cabin
        • 다른 컬럼들을 가지고 결측치 채우기
        • 객실 위치 (A, B, C ..) 가 중요한 것이므로 방 번호는 제거하기
  1. 범주형 데이터 encoding 하기
 
Age 결측치 채우기
미성년자, 성인 Age 분포 비교
notion image
미성년자는 미성년자라는 사실이 중요하다고 가정, 평균이나 중앙값 아무거나 상관없다.
성인의 경우 정규 분포 형태가 아니므로 중앙값으로 대체하기
# Age 결측치 채우기 # 미성년자의 나이 평균, 성인의 중앙값 구하기 train_minor_mean, train_adult_median = train_minor['Age'].mean(), train_adult['Age'].median() test_minor_mean, test_adult_median = test_minor['Age'].mean(), test_adult['Age'].median() # Name 에서 호칭만 가져오기 train['Title'] = train['Name'].apply(lambda x: x.split(',')[1].split('.')[0] if len(x.split(',')) > 1 else '') # 가져온 호칭에서 맨 앞의 ' '제거 train['Title'] = train['Title'].apply(lambda x : str(x)[1:]) # Master 는 어린 남성을 나타내는 말이므로 train 미성년자의 Age 평균으로 대체 train.loc[train['Title'] == 'Master', 'Age'] = train_minor_mean # Dr 은 의사를 나타내는 말이므로 train 성인의 Age 중앙값으로 대체 train.loc[train['Title'] == 'Dr', 'Age'] = train_adult_median # Mrs 는 결혼한 여성을 나타내는 말이므로 train 성인의 Age 중앙값으로 대체 train.loc[train['Title'] == 'Mrs', 'Age'] = train_adult_median # Parch == 0 이면 미성년자가 혼자 탔을리 없으므로 성인으로 가정 train.loc[train['Parch'] == 0, 'Age'] = train_adult_median # Parch 와 SibSp 가 모두 1명이라도 있다면 누군가의 자녀라고 판단, 미성년으로 가정 train.loc[(train['SibSp'] > 0) & (train['Parch'] > 0), 'Age'] = train_minor_mean # Parch 만 있고 SibSp 가 없다면 부모라고 판단, 성인으로 가정 train.loc[(train['SibSp'] == 0) & (train['Parch'] > 0), 'Age'] = train_adult_median
 
Embarked 결측치 채우기
# Embarked 결측치 채우기 # 최빈값으로 대체 train.loc[train['Embarked'].isnull(), 'Embarked'] = train['Embarked'].mode()[0]
 
Cabin 결측치 채우기
# Cabin 결측치 채우기 # Cabin 이 두 개이상 등록된 사람은 제일 처음 것 하나로 변경 train.loc[~train['Cabin'].isnull(), 'Cabin'] = train.loc[~train['Cabin'].isnull(), 'Cabin'].apply(lambda x : x.split()[0] if len(x) > 1 else '') # 객실 위치만 뽑아내기 train['Location'] = train['Cabin'].str[:1] # Locatin 예측에 사용할 컬럼 loc_cols = [ 'Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked', 'Title' ] # train Location 예측에 사용할 train, test, 정답값 train_train_loc = train[~train['Location'].isnull()][loc_cols] train_test_loc = train[train['Location'].isnull()][loc_cols] train_y = train[~train['Location'].isnull()]['Location'] # 결측값 예측 lgbm_for_cabin = lightgbm.LGBMClassifier( random_state=42, learning_rate = 0.001 ) lgbm_for_cabin.fit(train_train_loc, train_y) train_loc_pred = lgbm_for_cabin.predict(train_test_loc) # 예측값으로 Location 결측치 채우기 train.loc[train['Location'].isnull(), 'Location'] = train_loc_pred
 
범주형 데이터 인코딩
# 범주형 데이터 인코딩 # one hot encoding ohe = OneHotEncoder(handle_unknown='ignore') # OneHotEncoder를 적용한 후 DataFrame으로 변환하여 대입 train_encoded = pd.DataFrame(ohe.fit_transform(train[cat_col]).toarray(), columns=ohe.get_feature_names_out(cat_col)) # cat_col 제거 train = train.drop(columns=cat_col).copy() # train_encoded 를 기존의 train과 합치기 train = pd.concat([train, train_encoded], axis=1)
 

 
전처리를 직관적으로 잘 했다는 생각이 들어서 하이퍼 파라미터 튜닝을 하지 않고 base line 모델로만 돌려서 제출했다.
notion image
결과는 성별만으로 예측한 것과 점수 차이가 크게 나지 않는다.
확률을 공부해야 하는 이유인 것 같다.
 
📈
1. 확률을 계산해서 feature 골라보기 2. random_search, grid_search 활용해서 점수 높여보기
 
(시각화 코드 참고: https://www.kaggle.com/abocadobaby)