import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestClassifierKaggle | Alexis Cook의 코드
python
kaggle
titanic
Discussion 탭에서 가장 상위에 있는 안내 자료를 살펴보자.
1. 라이브러리 import
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된 경우 둘의 차이가 극명하게 난다.