🏅 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 수치형 데이터 분포 비교
train 과 test 의 데이터 분포가 대체적으로 비슷함을 알 수 있다.
전처리
- Age, Embarked, Cabin 결측치 채우기
- Age
- 18세를 기준으로 성인과 미성년으로 나누고, 각각의 분포를 확인해서 평균과 중앙값 중 어느 것으로 대체할지 결정하기
- Name 에서 호칭의 정보를 가지고 성인과 미성년으로 나누기
- Parch 와 SibSp 정보도 활용하기
- Embarked
- 최빈값으로 대체
- Cabin
- 다른 컬럼들을 가지고 결측치 채우기
- 객실 위치 (A, B, C ..) 가 중요한 것이므로 방 번호는 제거하기
- 범주형 데이터 encoding 하기
Age 결측치 채우기
미성년자, 성인 Age 분포 비교
미성년자는 미성년자라는 사실이 중요하다고 가정, 평균이나 중앙값 아무거나 상관없다.
성인의 경우 정규 분포 형태가 아니므로 중앙값으로 대체하기
# 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 모델로만 돌려서 제출했다.
결과는 성별만으로 예측한 것과 점수 차이가 크게 나지 않는다.
확률을 공부해야 하는 이유인 것 같다.
1. 확률을 계산해서 feature 골라보기
2. random_search, grid_search 활용해서 점수 높여보기
(시각화 코드 참고: https://www.kaggle.com/abocadobaby)