iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 30
0
自我挑戰組

Kaggle的解題挑戰 2018版系列 第 30

[Day31] Kaggle的解題挑戰 2018版 - Kaggle實戰 Titanic

Titanic

在經過漫長的前置點數的學習之後,讓我們來實作一題Kaggle的入門題目吧,不過,畢竟我也不是直的資料科學家,我們就用別人寫好的Example來複製貼上吧,差別在於,我們有了前置點數的訓練,看得懂和比較有能力可以改動這些程式碼了。

  • 下載資料
    下載網址
    https://www.kaggle.com/c/titanic/data
    選擇Download All

  • 如何training
    老實說,我看了下面參考資料的教學,老實說,我目前不打算提高準確率,只想單純的把這題目用最簡單的方式解完,那我們要如何做呢?我們直接使用和教學一樣的Random Forest來進行分析的東西,得出訓練的結果。 另外,目前看來資料清洗的動作也是少不了的。

  • 程式碼
    基本下我是參考參考資料裏面的程式碼,然後整理一下這樣。我會在最下面的Cell來觀看資料,觀察完就清掉,這樣目前是比較清淨,不過,真的比較複雜還是要另外分開做筆記,不過我覺得觀察和資料的程式碼分開是比較不會搞亂掉。

%matplotlib inline
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.ensemble import RandomForestRegressor
from sklearn.pipeline import Pipeline,make_pipeline
from sklearn.ensemble import GradientBoostingClassifier, RandomForestClassifier
from sklearn.feature_selection import SelectKBest
from sklearn import cross_validation, metrics
from sklearn.grid_search import GridSearchCV, RandomizedSearchCV
import warnings
warnings.filterwarnings('ignore')

train = pd.read_csv('train.csv',dtype={"Age": np.float64})
test = pd.read_csv('test.csv',dtype={"Age": np.float64})
PassengerId=test['PassengerId']

# all_data = pd.concat([train, test], ignore_index = True)
data = train.append(test)
data.reset_index(inplace=True, drop=True)

data['Family_Size'] = data['Parch'] + data['SibSp']
data['Title1'] = data['Name'].str.split(", ", expand = True)[1]
data['Title1'] = data['Title1'].str.split(".", expand = True)[0]
data['Title2'] = data['Title1'].replace(['Mlle','Mme','Ms','Dr','Major','Lady','the Countess','Jonkheer','Col','Rev','Capt','Sir','Don','Dona'],
         ['Miss','Mrs','Miss','Mr','Mr','Mrs','Mrs','Mr','Mr','Mr','Mr','Mr','Mr','Mrs'])
data['Ticket_info'] = data['Ticket'].apply(lambda x : x.replace(".","").replace("/","").strip().split(' ')[0] if not x.isdigit() else 'X')
data['Embarked'] = data['Embarked'].fillna('S')
data['Fare'] = data['Fare'].fillna(data['Fare'].mean())
data["Cabin"] = data['Cabin'].apply(lambda x : str(x)[0] if not pd.isnull(x) else 'NoCabin')

data['Sex'] = data['Sex'].astype('category').cat.codes
data['Embarked'] = data['Embarked'].astype('category').cat.codes
data['Pclass'] = data['Pclass'].astype('category').cat.codes
data['Title1'] = data['Title1'].astype('category').cat.codes
data['Title2'] = data['Title2'].astype('category').cat.codes
data['Cabin'] = data['Cabin'].astype('category').cat.codes
data['Ticket_info'] = data['Ticket_info'].astype('category').cat.codes

dataAgeNull = data[data["Age"].isnull()]
dataAgeNotNull = data[data["Age"].notnull()]
remove_outlier = dataAgeNotNull[(np.abs(dataAgeNotNull["Fare"]-dataAgeNotNull["Fare"].mean())>(4*dataAgeNotNull["Fare"].std()))|
                      (np.abs(dataAgeNotNull["Family_Size"]-dataAgeNotNull["Family_Size"].mean())>(4*dataAgeNotNull["Family_Size"].std()))                     
                     ]
rfModel_age = RandomForestRegressor(n_estimators=2000,random_state=42)
ageColumns = ['Embarked', 'Fare', 'Pclass', 'Sex', 'Family_Size', 'Title1', 'Title2','Cabin','Ticket_info']
rfModel_age.fit(remove_outlier[ageColumns], remove_outlier["Age"])

ageNullValues = rfModel_age.predict(X= dataAgeNull[ageColumns])
dataAgeNull.loc[:,"Age"] = ageNullValues
data = dataAgeNull.append(dataAgeNotNull)
data.reset_index(inplace=True, drop=True)

dataTrain = data[pd.notnull(data['Survived'])].sort_values(by=["PassengerId"])
dataTest = data[~pd.notnull(data['Survived'])].sort_values(by=["PassengerId"])

dataTrain = dataTrain[['Survived', 'Age', 'Embarked', 'Fare',  'Pclass', 'Sex', 'Family_Size', 'Title2','Ticket_info','Cabin']]
dataTest = dataTest[['Age', 'Embarked', 'Fare', 'Pclass', 'Sex', 'Family_Size', 'Title2','Ticket_info','Cabin']]

from sklearn.ensemble import RandomForestClassifier
 
rf = RandomForestClassifier(criterion='gini', 
                             n_estimators=1000,
                             min_samples_split=12,
                             min_samples_leaf=1,
                             oob_score=True,
                             random_state=1,
                             n_jobs=-1) 

rf.fit(dataTrain.iloc[:, 1:], dataTrain.iloc[:, 0])
# print("%.4f" % rf.oob_score_)

submit = pd.read_csv('./gender_submission.csv')
rf_res =  rf.predict(dataTest)
submit['Survived'] = rf_res
submit['Survived'] = submit['Survived'].astype(int)
submit.to_csv('submit.csv', index= False)
  • 上傳
    我們在最後會產生一個submit.csv的檔案。將這個預測結果上傳至Kaggle。
    上傳網址:
    https://www.kaggle.com/c/titanic/submit

  • 結果
    https://ithelp.ithome.com.tw/upload/images/20181031/20103074QxFL9VnftQ.png
    1547名,感覺好像還ok,大約是前16%的排名,不過,因為是別人的程式碼,也沒啥好吹噓的。

感想

去年也是利用這個題目報名,但某天太累忘了po文就中斷了,今年異想天開的開了三個題目,感覺是完全是時間不夠和文章品質不佳,所以放棄另外二個題目,專心把這個Kaggle的挑戰完成,基本上在這樣有限的時間裏(畢竟還要上班),能寫出一定品質的文章,有些題目也沒寫的很好,不過算是對自已的一個挑戰,真的很有參加馬拉賽的感覺,中途的漫長和孤單旁人可以無法了解,也有認識的人早早就棄權了,讓人覺得技術真的是條孤單的路,不過完賽真的有種痛快的感覺(差點打成痛風),就像保哥說的,或許技術人一輩子都可以參加一次,感受一下這特別的滋味。

參考資料:
[資料分析&機器學習] 第4.1講 : Kaggle競賽-鐵達尼號生存預測(前16%排名)
[機器學習專案] Kaggle競賽-鐵達尼號生存預測(Top 3%)
Kaggle Titanic 生存预测(Top1.4%)完整代码分享


上一篇
[Day30] Kaggle的解題挑戰 2018版 - scikit-learn
系列文
Kaggle的解題挑戰 2018版30

尚未有邦友留言

立即登入留言