泰坦尼克号之生存预测(2)
- 2019 年 10 月 5 日
- 筆記

泰坦尼克号之生存预测(2)
0.说在前面
1.数据预处理
2.特征选择
3.模型选择
4.结果上传
5.总结
6.作者的话
0.说在前面
昨天写了一篇有关leetcode刷题的文章,今天接着上次的kaggle,进行特征选择,模型选择等的一系列步骤。 关于进群交流的伙伴,可以点击公众号右下角联系我,备注leetcode,进算法群;备注总群,进交流总群!
这里放上上一节(泰坦尼克号之生存预测(1))的地址:
https://mp.weixin.qq.com/s/7pR1wqPaRl6RGApblJ-fJA
1.数据预处理
【客舱号与生存】
Cabin表示客舱号。
首先我们来对数据缺失值,进行填充。
将缺失值设为NA
X_train['Cabin'] = X_train['Cabin'].fillna('NA') X_test['Cabin'] = X_test['Cabin'].fillna('NA')
其次定义一个方法:
用于获取客舱号的第一个字母或数字
def Cabin_First_Letter(x): if x == 'NA': return 'NA' return x[0]
将交叉验证集数据进行上述方法操作
sns.barplot('Cabin_First_Letter', 'Survived', data=X_train.sort_values('Cabin_First_Letter'), ax=axis1)
X_train['Cabin_First_Letter'] = X_train['Cabin'].apply(Cabin_First_Letter) X_test['Cabin_First_Letter'] = X_test['Cabin'].apply(Cabin_First_Letter)
统计客舱号中第一个字母的出现次数:
X_train.groupby('Cabin_First_Letter')['Survived'].count()
结果:
Cabin_First_Letter A 12 B 28 C 41 D 21 E 22 F 8 G 3 NA 488 Name: Survived, dtype: int64
接着,数据处理完了,我们是时候可视化数据,并确定该特征值与生存的关系!
fig, (axis1,axis2) = plt.subplots(1,2,figsize=(15,5)) sns.barplot('Cabin_First_Letter', 'Survived', data=X_train.sort_values('Cabin_First_Letter'), ax=axis1) sns.barplot('Cabin_First_Letter', 'Survived', data=X_test.sort_values('Cabin_First_Letter'), ax=axis2)

这里采用seaborn的barplot绘制柱状图,图中的竖线代表误差棒!图显示的是每一个客舱号第一位数字或字母出现的集中分布趋势!
针对上述这个图,我们得出如下结论:
存活率排序:E>D>>B>C>A>.....
然后定义一个方法,进行封装,依次返回数值!
def Cabin_First_Letter_Code(x): if x == 'E': return 1 if x == 'D': return 2 if x == 'B': return 3 if x == 'C': return 4 if x == 'A': return 5 return 6
然后根据上述的交叉验证数据集的结果,应用到我们的测试集与训练集上。
tannike_train['Cabin'] = tannike_train['Cabin'].fillna('NA') tannike_test['Cabin'] = tannike_test['Cabin'].fillna('NA') tannike_train['Cabin_First_Letter'] = tannike_train['Cabin'].apply(Cabin_First_Letter) tannike_test['Cabin_First_Letter'] = tannike_test['Cabin'].apply(Cabin_First_Letter)
由于当前研究的这个数据为等级资料数据,我们这里用one-hot编码可有效的处理问题:
tannike_train['Cabin_First_Letter'] = tannike_train['Cabin_First_Letter'].apply(Cabin_First_Letter_Code) tannike_test['Cabin_First_Letter'] = tannike_test['Cabin_First_Letter'].apply(Cabin_First_Letter_Code) tannike_train = pd.get_dummies(columns = ['Cabin_First_Letter'], data = tannike_train) tannike_test = pd.get_dummies(columns = ['Cabin_First_Letter'], data = tannike_test)
【登陆港口与生存】
由于登录港口数据已经在前一节的缺失值处理掉了,这里便可以直接对交叉验证集数据可视化:
fig, (axis1,axis2) = plt.subplots(1,2,figsize=(15,5)) sns.barplot('Embarked', 'Survived', data=X_train.sort_values('Embarked'), ax=axis1) sns.barplot('Embarked', 'Survived', data=X_test.sort_values('Embarked'), ax=axis2)

然后我们对其进行生存排序:
C>Q>S
由于只有三类,直接对训练集与测试集进行one-hot编码即可!
tannike_train = pd.get_dummies(tannike_train,columns = ['Embarked']) tannike_test = pd.get_dummies(tannike_test,columns = ['Embarked'])
Pclass 客舱等级(1/2/3等舱位) 同Embarked操作,这个就不阐述了!
【兄弟姐妹与生存】
SibSp 兄弟姐妹数或配偶数
Parch 父母数或子女数
将其与Parch 合并处理!
X_train['Fam_Size'] = X_train['SibSp'] + X_train['Parch'] X_test['Fam_Size'] = X_test['SibSp'] + X_test['Parch']
可视化:
fig, (axis1,axis2) = plt.subplots(1,2,figsize=(15,5)) sns.barplot('Fam_Size', 'Survived', data=X_train.sort_values('Parch'), ax=axis1) sns.barplot('Fam_Size', 'Survived', data=X_test.sort_values('Parch'), ax=axis2)

特征处理:
分为三类:Solo,Nuclear,Big,并对训练集与测试集进行one-hot编码!
import numpy as np def Family_feature(train, test): for i in [train, test]: i['Fam_Size'] = np.where((i['SibSp']+i['Parch']) == 0 , 'Solo', np.where((i['SibSp']+i['Parch']) <= 3,'Nuclear', 'Big')) del i['SibSp'] del i['Parch'] return train, test tannike_train, tannike_test = Family_feature(tannike_train, tannike_test) tannike_train = pd.get_dummies(tannike_train,columns = ['Fam_Size']) tannike_test = pd.get_dummies(tannike_test,columns = ['Fam_Size'])
Fare同理操作!
2.特征选择
这里以全集特征训练!删除某一特征训练结果测试,后续~~
X_train_ = tannike_train.loc[X_train.index] X_test_ = tannike_train.loc[X_test.index] Y_train_ = label.loc[X_train.index] Y_test_ = label.loc[X_test.index] X_test_.head(3) X_test_ = X_test_[X_train_.columns] X_test_.head(3) tannike_test = tannike_test[tannike_train.columns] tannike_test.head()
3.模型选择
【xgboost】
这里选用xgboost进行测试,下面是选择的最优情况的代码,线下测试:0.8097014925373134,线上测试0.80621!
import xgboost as xgb from sklearn.preprocessing import LabelEncoder gbm = xgb.XGBClassifier(max_depth=3, n_estimators=300, learning_rate=0.06,scoring='r3', cv=10, verbose=1, n_jobs=4,) gbm.fit(X_train_, Y_train_) gbm.score(X_test_,Y_test_)
【随机森林】
线下测试:0.8022388059701493,线上测试0.80621!
rf_ = RandomForestClassifier(random_state = 10, warm_start = True, n_estimators = 900, max_depth = 6, max_features = 'sqrt',min_samples_leaf=1) rf_.fit(X_train_, Y_train_) rf_.score(X_test_,Y_test_)
4.结果上传
首先通过上述建立的模型进行预测,并输出到上传文件中,然后再上传 !
s = pd.read_csv('./gender_submission.csv') predictions = p.predict(tannike_test) # p为模型分类器 submission = pd.DataFrame({"PassengerId": s.PassengerId, "Survived": predictions.astype(np.int32)}) submission.to_csv("submission-pipe.csv", index=False)

5.总结
- 泰坦尼克号数据大多属于等级资料,需要用one-hot编码;
- 特征选择,加权的重要性;
- 交叉验证集构建;
- 多模型选择与模型融合;
- 当前这个模型单一,特征提取没有进行逐一删选,后续~~
学习参考
https://www.kesci.com/home/project/5af18c294b7639369e6c289c