­

泰坦尼克号之生存预测(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