Kaggle 泰坦尼克號

Max_Lyu發表於2019-05-31

  

  上次已經講了怎麼下載資料,這次就不說廢話了,直接開始。首先匯入相應的模組,然後檢視一下資料情況。對資料有一個大致的瞭解之後,開始進行下一步操作。

  

一、分析資料

 1、Survived 的情況

train_data['Survived'].value_counts() 

  

 2、Pclass 和 Survived 之間的關係

train_data.groupby('Pclass')['Survived'].mean()

   

 3、Embarked 和 Survived 之間的關係

train_data.groupby('Embarked')['Survived'].value_counts()
sns.countplot('Embarked',hue='Survived',data=train_data)

  

二、特徵處理

  先將 label 提取出來,然後將 train 和 test 合併起來一起處理。

y_train = train_data.pop('Survived').astype(str).values
data = pd.concat((train_data, test_data), axis=0)

 1、對 numerical 資料進行處理

  (1)SibSp/Parch (兄弟姐妹配偶數 / 父母孩子數)

  由於這兩個屬性都和 Survived 沒有很大的影響,將這兩個屬性的值相加,表示為家屬個數。

data['FamilyNum'] = data['SibSp'] + data['Parch']

  (2)Fare (費用)

  它有一個缺失值,需要將其補充。(這裡是參考別人的,大神總能發現一些潛在的資訊:票價和 Pclass 和 Embarked 有關)  因此,先看一下他們之間的關係以及缺失值的情況。

train_data.groupby(by=["Pclass","Embarked"]).Fare.mean()

    

  缺失值 Pclass = 3, Embarked = S,因此我們將其置為14.644083.

data["Fare"].fillna(14.644083,inplace=True)

  還有 Age 的缺失值也需要處理,我是直接將其設定為平均值。

 2、對 categorical 資料進行處理

  (1)對 Cabin 進行處理

  Cabin雖然有很多空值,但他的值的開頭都是字母,按我自己的理解應該是對應船艙的位置,所以取首字母。考慮到船艙位置對救生是有一定影響的,雖然有很多缺失值,但還是把它保留下來,而且由於 T 開頭的只有一條資料,因此將它設定成數量較小的 G。

data['Cabin'] = data['Cabin'].str[0]
data['Cabin'][data['Cabin']=='T'] = 'G'

  (2)對 Ticket 進行處理

  將 Ticket 的頭部取出來當成新列。

data['Ticket_Letter'] = data['Ticket'].str.split().str[0]
data['Ticket_Letter'] = data['Ticket_Letter'].apply(lambda x:np.nan if x.isnumeric() else x)
data.drop('Ticket',inplace=True,axis=1)

  (3)對 Name 進行處理

  名字這個東西,雖然它裡面的稱呼可能包含了一些身份資訊,但我還是打算把這一列給刪掉...

data.drop('Name',inplace=True,axis=1)

  (4)統一將 categorical 資料進行 One-Hot

  One-Hot 大致的意思在之前的文章講過了,這裡也不再贅述。

data['Pclass'] = data['Pclass'].astype(str)
data['FamilyNum'] = data['FamilyNum'].astype(str)
dummied_data = pd.get_dummies(data)

  (5)資料處理完畢,將訓練集和測試集分開

X_train = dummied_data.loc[train_data.index].values
X_test = dummied_data.loc[test_data.index].values

三、構建模型

  這裡用到了 sklearn.model_selection 的 GridSearchCV,我主要用它來調參以及評定 score。

 1、XGBoost

xgbc = XGBClassifier()
params = {'n_estimators': [100,110,120,130,140], 
          'max_depth':[5,6,7,8,9]}
clf = GridSearchCV(xgbc, params, cv=5, n_jobs=-1)
clf.fit(X_train, y_train)
print(clf.best_params_)
print(clf.best_score_) 
  {'max_depth': 6, 'n_estimators': 130}
  0.835016835016835 

 2、Random Forest

rf = RandomForestClassifier()
params = {
    'n_estimators': [100,110,120,130,140,150],
    'max_depth': [5,6,7,8,9,10],
}
clf = GridSearchCV(rf, params, cv=5, n_jobs=-1)
clf.fit(X_train, y_train)
print(clf.best_params_)
print(clf.best_score_)
  {'max_depth': 8, 'n_estimators': 110}
  0.8294051627384961

四、模型融合

from sklearn.ensemble import VotingClassifier
xgbc = XGBClassifier(n_estimators=130, max_depth=6)
rf = RandomForestClassifier(n_estimators=110, max_depth=8)

vc = VotingClassifier(estimators=[('rf', rf),('xgb',xgbc)], voting='hard')
vc.fit(X_train, y_train)

  準備就緒,預測並儲存模型與結果

y_test = vc.predict(X_test)

# 儲存模型
from sklearn.externals import joblib
joblib.dump(vc, 'vc.pkl')

submit = pd.DataFrame(data= {'PassengerId' : test_data.index, 'Survived': y_test})
submit.to_csv('./input/submit.csv', index=False)

  最後提交即可,提交的方式也在上一篇提到過了。Over~    專案地址:Titanic

  

  想要第一時間獲取更多有意思的推文,可關注公眾號: Max的日常操作

                            

 

相關文章