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