오늘은 캐글에서 타이타닉 생존율 예측하는 실습을 해보았다.
학부생때는 교수님께서 정해준 모델을 사용해서 파일만 넣으면 됐었는데 이번에는 혼자 데이터 규칙을 찾고 예측 모델도 스스로 만들어야 했다.. 간단해보였지만 은근 어려웠음..
예측 결과 먼저 보여드림
train data set 모델 정확도
kaggle score
훈련 데이터 모델링 했을 땐 정확도가 81이길래 이정도면 뭐 높지 않나? 하고 캐글에 test data 예측 결과 올림..
근데 score 0.6이 나와서 너무 놀랐음. 정확도 81%는 100%가 아니니까 ^^ 첫 문제에 반타작 이상이라는 거에 의의를 둔다.
1. train data set 모델링
훈련 모델 데이터에서 패턴을 찾아야 했다. 어떤 변수가 생존율과 연관이 있을까?
수업 때 '티켓 등급과 나이 성별이 영향이 있을 수 있다' 라는 말씀을 듣고 이 특성은 꼭 고려해보기로 함
그 외에 고민해본 특성들이 있다..
1) Cabin과 Survived의 상관관계
Cabin 위치에 따라 생존율과 상관관계가 있었을까? YES!!
코드랑 실행결과가 지워졌지만 상관관계가 있다고 나왔음
2) 형제자매, 부모자녀 가족단위로 묶기
대피할때 가족관계가 영향을 미치지 않았을까?
구성원이 많을수록 시간이 오래걸려서 생존율이 떨어진다던가..?
SilbSp와 Parch를 하나로 묶고 +1 (나자신) 해서 하나의 가족단위를 만들었다.
# 'Family_Size' 열 생성
data_for_prediction['Family_Size'] = test_data['SibSp'] + test_data['Parch'] + 1
3) 나이 구간별로 나누기
나이별로 패턴이 존재할 것이라고 생각했다. 또한, 연령대별 그룹화 하는 것이 훈련데이터 학습에 용이할 것이라고 생각했음..
그룹화한뒤 원-핫 인코딩을 통해 번주형 데이터를 수치형으로 변환해주었다.
# 나이를 구간별로 나누어 'Age_Group' 열 생성
data_for_prediction['Age_Group'] = pd.cut(data_for_prediction['Age'], bins=[0, 18, 30, 50, 100], labels=['Child', 'Young Adult', 'Adult', 'Elderly'])
# 'Age_Group' 열을 원-핫 인코딩하여 데이터에 추가
one_hot_encoded = pd.get_dummies(data_for_prediction['Age_Group'], prefix='Age_Group')
data_for_prediction = pd.concat([data_for_prediction, one_hot_encoded], axis=1)
위 변수를 하나씩 추가해서 RandomForestClassifier를 했을땐 정확도가 점점 올라갔는데
위의 세 변수 + 그 외 몇 가지를 추가하니까 정확도가 0.8에서 0.6으로 낮아졌다.
오버피팅 현상이었을까.??
결국 1번 변수는 빼고 돌려보니 다시 0.8 로 올라왔음..
3. Test data set 예측하기
# test 데이터 불러오기
test_data = pd.read_csv('titanic/test.csv')
# 사용할 변수 선택: Pclass, Age, Sex, SibSp, Parch
selected_features = ['Pclass', 'Age', 'Sex', 'SibSp', 'Parch']
data_for_prediction = test_data[selected_features]
# Sex 변수를 숫자형으로 변환 (male: 0, female: 1)
data_for_prediction['Sex'] = data_for_prediction['Sex'].map({'male': 0, 'female': 1})
# 누락된 값을 중앙값으로 대체
data_for_prediction['Age'].fillna(data_for_prediction['Age'].median(), inplace=True)
# 'Family_Size' 열 생성
data_for_prediction['Family_Size'] = test_data['SibSp'] + test_data['Parch'] + 1
# 나이를 구간별로 나누어 'Age_Group' 열 생성
data_for_prediction['Age_Group'] = pd.cut(data_for_prediction['Age'], bins=[0, 18, 30, 50, 100], labels=['Child', 'Young Adult', 'Adult', 'Elderly'])
# 'Age_Group' 열을 원-핫 인코딩하여 데이터에 추가
one_hot_encoded = pd.get_dummies(data_for_prediction['Age_Group'], prefix='Age_Group')
data_for_prediction = pd.concat([data_for_prediction, one_hot_encoded], axis=1)
# 예측에 사용할 특성 선택 (기존에 훈련시킨 모델과 동일한 특성)
features_for_prediction = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Family_Size', 'Age_Group_Child', 'Age_Group_Young Adult', 'Age_Group_Adult', 'Age_Group_Elderly']
# test 데이터로 생존 여부 예측
predictions = model.predict(data_for_prediction[features_for_prediction])
# PassengerId에 대한 예측값을 DataFrame으로 생성
result_df = pd.DataFrame({'PassengerId': test_data['PassengerId'], 'Survived': predictions})
# 결과를 CSV 파일로 저장
result_df.to_csv('predictions.csv', index=False)
훈련데이터 모델링을 토대로 변수를 선정하고 테스트 데이터를 예측해보았다.
비록 캐글 0.6 스코어를 달았지만 처음으로 캐글 실습해보았다는 거에 뿌듯하다..
이번 실습은 '일단 해보자' 라는 마음으로 주먹구구식으로 진행한 거 같다.
어떤 변수를 어떻게 선정할건지 기준을 정하고, 패턴을 알아내는게 재밌으면서도 어렵다.
알쏭달쏭 그치만 정확도가 올라올때 도파민 +1..
다음 실습에선 정확도를 끌어올려봐야지!