Kaggle | Alexis Cook의 코드

python
kaggle
titanic
Author

강신성

Published

September 13, 2023

Discussion 탭에서 가장 상위에 있는 안내 자료를 살펴보자.

1. 라이브러리 import

import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestClassifier

2. Data 불러오기

train_data = pd.read_csv("./data/train.csv")
train_data.head()
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S
test_data = pd.read_csv("./data/test.csv")
test_data.head()
PassengerId Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 892 3 Kelly, Mr. James male 34.5 0 0 330911 7.8292 NaN Q
1 893 3 Wilkes, Mrs. James (Ellen Needs) female 47.0 1 0 363272 7.0000 NaN S
2 894 2 Myles, Mr. Thomas Francis male 62.0 0 0 240276 9.6875 NaN Q
3 895 3 Wirz, Mr. Albert male 27.0 0 0 315154 8.6625 NaN S
4 896 3 Hirvonen, Mrs. Alexander (Helga E Lindqvist) female 22.0 1 1 3101298 12.2875 NaN S

3. Alexis의 코드 | forecast

A. Alexis Cook의 분석은 train에서 얼마나 잘 맞출까?


- 원래코드

from sklearn.ensemble import RandomForestClassifier

y = train_data["Survived"]

features = ["Pclass", "Sex", "SibSp", "Parch"]  ## 결측치가 많은 것들과 이상한 녀석들을 배제했다.
X = pd.get_dummies(train_data[features])  ## 변수들 중 범주형 자료를 더미변수로 만든다.
X_test = pd.get_dummies(test_data[features])

model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)
model.fit(X, y)
predictions = model.predict(X_test)  ## 예측값을 담아둔다. predictr.predict(XX)

output = pd.DataFrame({'PassengerId': test_data.PassengerId, 'Survived': predictions})
##output.to_csv('submission_AlexisCook.csv', index=False)  ##파일을 자꾸 만들어서 주석처리했다.
print("Your submission was successfully saved!")
Your submission was successfully saved!

RandomForestClassifier 모듈을 사용하여 fitting 하였다.

- 간단한 수정

y = train_data["Survived"]

features = ["Pclass", "Sex", "SibSp", "Parch"]
X = pd.get_dummies(train_data[features])
X_test = pd.get_dummies(test_data[features])

model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)
model.fit(X, y)

####

predictions = model.predict(X)  ## predict를 train data에 실시
(predictions == y).mean()
0.8159371492704826
model.score(X, y)
0.8159371492704826

score는 모델이 데이터와 맞는 정도를 내준다.

### Alexis Cook의 코드를 수정해보자!

- 코드를 수정해보자.

y = train_data["Survived"]

features = ["Pclass", "Sex", "SibSp", "Parch"]
X = pd.get_dummies(train_data[features])
X_test = pd.get_dummies(test_data[features])

## hyper parameter 조정
model = RandomForestClassifier(n_estimators=5000, max_depth=1000, random_state=1)
model.fit(X, y)

####

predictions = model.predict(X)
model.score(X, y)
0.8170594837261503

바꾼 게 더 좋은 것 같은데???

- 이것도 제출 결과로 만들어보자.

predictions = model.predict(X_test)
pd.read_csv("./data/test.csv")[['PassengerId']].assign(Survived = predictions)#\
#.to_csv("AlexisCook수정_submission.csv", index = False)
PassengerId Survived
0 892 0
1 893 0
2 894 0
3 895 0
4 896 0
... ... ...
413 1305 0
414 1306 1
415 1307 0
416 1308 0
417 1309 0

418 rows × 2 columns

index를 꼭 누락시켜야 한다.

4. 제출결과의 비교

hyper parameter를 조정해서 train score는 더 높아졌지만, 실제 test score는 더 낮아졌다.

- overfitting된 경우 둘의 차이가 극명하게 난다.