ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kaggle] Titanic - Machine Learning from Disaster
    개발/머신러닝-딥러닝 2022. 1. 23. 02:29

    이제 케글도 정리하고 싶어서 시작한다.

    첫번째 글은 모두가 아는 타이타닉 생존자 예측.

     

    0. 목표

    데이터는 타이타닉호의 승객들에 대한 정보와 생존 유무가 있으며,

    TrainSet의 생존 유무를 label로 하여 학습한 후에, TestSet의 승객정보를 통해 생존 유무를 예측하는 것이 목표이다.

     

    1. 전체 데이터 확인

    총 12개의 feature가 있고, 이 중 Survived를 제외한 나머지 정보들을 이용해 Survived를 예측하는 것이 목표이다.

     

    이 데이터에는 대부분 결측치가 없으나, 선실을 나타내는 Cabin에 결측이가 많이 있다. 총 891개의 데이터 중 687개의 결측치는 굉장히 크다. 또 Age에도 꽤 많은 결측값들이 있다.

     

    숫자 데이터간 상관계수 확인.

    Survived와 상관계수가 높은 데이터는 없으나, Pclass나 Fare가 약한 상관관계를 보이며,

    Pclass와 Fare간은 그보다 조금 더 높은 상관관계가 있으므로, 공선성을 주의해야 할 것 같다.

     

     

    2. 데이터 세부 정보 파악

     

    1) Pclass

    Survived와 약한 상관관계를 보였던 Pclass를 보면, 티켓의 등급에 따라서 생존율의 차이가 있음을 알 수 있다.

     

    2) Sex

    성별별로 생존율을 확인해보면, 생존한 사람의 경우 여성의 비율이 높고, 그렇지 않은 경우 남성의 비율이 높다.

    이를 통해 타이타닉호 생존 분석의 기본 전제가 되는 '여자가 생존한다.'를 만들 수 있고, 이 전제만 사용하여 TestSet에 적용시켜서 결과를 Submission하면 78%정도의 정답률이 나온다. 이것보다는 높은 모델을 만드는 것이 목표.

     

    3) Age

    각 나이대 별로 생존율의 차이를 볼 수 있다.

    20세 이하 승객들의 생존율이 다른 나이대보다 비교적 높음을 볼 수 있다.

     

    4) SibSp, Parch

    SibSp는 형제자매, 부인을 나타내고, Parch는 부모와 자식을 나타낸다.

    사망자들 보다 생존자들 중에서 가족이 있는 승객들의 비율이 높았다. 그러나 이는 가족이 있으면 같이 집계되기 때문에 그럴 수도 있다.

     

    3. 데이터 가공

    일단 캐글의 Code탭에 가면 다양한 처리 방법들이 있지만 내가 사용한 것을 적어본다.

    나도 위의 다양한 방법들 중에서 마음에 드는 것들을 몇 개 추려서 적용했다.

     

    1) fill_age

    Age의 결측값이 많았으므로, 이를 채워줄 방법을 찾아야 한다.

    승객들의 Name 항목에서 Mrs, Miss와 같이 결혼 유무를 유추해 볼 수 있는 호칭들이 있고, 이는 나이와 연관이 있을 것 같다.

    그래서 일단 다른 나라의 언어로 된 칭호들부터 통일하고, 

    나이의 결측값들을 칭호에 따라서 각 칭호에 맞는 평균 나이로 채워넣었다.

     

    2) fill_embarked

    출발지를 나타내는 embarked도 약간의 결측값이 있는데, 이는 가장 많은 값으로 대체해주었다.

     

    3) make_familly

    SibSp와 Parch는 같이 승선한 가족과 관련있으므로, Familly로 합쳤다.

     

    4) ageband

    나이를 나타내는 Age는 연속적이라고 할 수 있는데, 

    위에서 분석했듯이, 나이가 20세 이하인 승객들의 생존율이 높았는데, 이는 이들이 아이~청소년이기 때문일 것이고,

    그렇다면 나이대별로 구분해서 생각해 볼 수 있을 것 같다.

    그래서 나이의 최대값, 최소값을 기준으로 5개의 섹션으로 구분해서 범주화했다.

     

    5) 문자형 데이터 라벨링

    Sex는 male/female로 구분되어있고, Embarked는 C/Q/S의 세가지로 구분되어있다.

    이는 문자로 구분되니까, 학습에 사용하기 위해 숫자로 라벨링 해준다. 두 가지 방법을 사용해봤다.

     

    6) 학습에 사용하지 않을 Feature제거

    Name, Ticket, PassengerId: 값이 대부분 달라서, 학습에 도움이 되지 않을 것으로 판단해 삭제한다.

    Salutation: 이름에서 호칭을 추출한 것으로 나이를 채우는데에 사용했으므로 삭제한다.

    Cabin: 결측값이 너무 많으므로 함부로 채워서는 안될것 같아서 제외한다.

    Fare: Survived와 약한 상관관계가 있으나 학습에 사용할 경우 성능이 하락함을 보였다. 이는 아마 Pclass와의 공선성때문일 것 같고, 그렇다면 Survived와 상관관계가 더 높은 Pclass를 사용한다.

     

     

    4. 학습

    이진분류의 기본인 로지스틱 회귀와 이 데이터에서 성능이 좋다고 알려진 랜덤포레스트와 XGBoost분류기를 사용했다.

     

    1) Logistic Regression

    2) RandomForest

    파라미터는 GridSerchCV를 통해 최적화 한 값을 선택했다.

     

    3) XGBClassifier

    파라미터에 대한 이해가 부족해 최적화를 하기 힘들었다...

     

    5. 예측

    단일 모델 성능으로는 RandomForest의 정확도가 가장 높았다.

    RandomForest로 학습한 모델의 성능이 가장 좋았고, 이를 사용해 Test셋을 예측한 결과를 Submit했다.

    결과는 0.77201이 나왔다. 이는 약 78%이긴 한데..... 성능을 좀 더 개선시켜보자.

     

    LR + RandomForest + XGBClassifier

    세 개의 모델이 예측한 결과값을 투표를 통해 최종 결과값을 내보낸다.

    세 개의 모델 중 두 개 이상이 1이라고 예측했으면 1을 주고 그 외의 경우 0을 주었다.

    이를 제출한 결과 0.78708로 단일 모델만 사용한 결과보다 성능이 조금 더 개선되었다.

     

    성능 개선을 시도하다가 하루 10번 제출 횟수를 모두 채웠고, 이 결과로 마무리 했다...

     

    6. 감상

    성능을 끌어올리기는 어렵다...

    pytorch를 이용해 간단한 Fully connected모델을 만들어 예측해보았으나 성능이 전혀 나아지지 않았고,

    위에서 사용한 모델과 다른 SVC같은 모델을 사용해도 개선되지 않았다.

     

    80%이상의 성능을 내는 코드들을 봤더니,

    데이터 가공 부분에서는 칭호를 나처럼 언어를 번역한 것이 아니라, Others로 통합하여 사용하고,

    나이를 그냥 전체 평균을 내서 사용하는 등의 방식을 사용한 것이 많았고,

    모델부분에서는 KFold를 사용해 교차검증 하는 방법을 사용하는것이 많았다.

     

    머신러닝 예측의 가장 기본이 되는 문제지만 이런 기본 문제조차 성능을 개선하기 어려웠다.

    Feature 가공 부분에서 내가 원하는 대로 가공했으나, 이렇게 하는 것이 맞는 것인지 확인하기 어려웠다.

    사용한 모델에 대한 이해도 조금 부족했을 수 있으며,

    다양한 모델에 대한 이해가 높아진다면 딥러닝 모델도 만들어서 조금 더 높은 성능을 내보고 싶다.

    댓글

Designed by Tistory.