前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >泰坦尼克号之生存预测(2)

泰坦尼克号之生存预测(2)

作者头像
公众号guangcity
发布2019-09-20 14:32:36
4780
发布2019-09-20 14:32:36
举报
文章被收录于专栏:光城(guangcity)光城(guangcity)

泰坦尼克号之生存预测(2)

0.说在前面

1.数据预处理

2.特征选择

3.模型选择

4.结果上传

5.总结

6.作者的话

0.说在前面

昨天写了一篇有关leetcode刷题的文章,今天接着上次的kaggle,进行特征选择,模型选择等的一系列步骤。 关于进群交流的伙伴,可以点击公众号右下角联系我,备注leetcode,进算法群;备注总群,进交流总群!

这里放上上一节(泰坦尼克号之生存预测(1))的地址:

https://mp.weixin.qq.com/s/7pR1wqPaRl6RGApblJ-fJA

1.数据预处理

客舱号与生存

Cabin表示客舱号。

首先我们来对数据缺失值,进行填充。

将缺失值设为NA

代码语言:javascript
复制
X_train['Cabin'] = X_train['Cabin'].fillna('NA')
X_test['Cabin'] = X_test['Cabin'].fillna('NA')

其次定义一个方法:

用于获取客舱号的第一个字母或数字

代码语言:javascript
复制
def Cabin_First_Letter(x):
    if x == 'NA':
        return 'NA'
    return x[0]

将交叉验证集数据进行上述方法操作

代码语言:javascript
复制
sns.barplot('Cabin_First_Letter', 'Survived', data=X_train.sort_values('Cabin_First_Letter'), ax=axis1) 
代码语言:javascript
复制
X_train['Cabin_First_Letter'] = X_train['Cabin'].apply(Cabin_First_Letter)
X_test['Cabin_First_Letter'] = X_test['Cabin'].apply(Cabin_First_Letter) 

统计客舱号中第一个字母的出现次数:

代码语言:javascript
复制
X_train.groupby('Cabin_First_Letter')['Survived'].count()

结果:

代码语言:javascript
复制
Cabin_First_Letter
A      12
B      28
C      41
D      21
E      22
F       8
G       3
NA    488
Name: Survived, dtype: int64

接着,数据处理完了,我们是时候可视化数据,并确定该特征值与生存的关系!

代码语言:javascript
复制
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>.....

然后定义一个方法,进行封装,依次返回数值!

代码语言:javascript
复制
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

然后根据上述的交叉验证数据集的结果,应用到我们的测试集与训练集上。

代码语言:javascript
复制
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编码可有效的处理问题:

代码语言:javascript
复制
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) 

登陆港口与生存

由于登录港口数据已经在前一节的缺失值处理掉了,这里便可以直接对交叉验证集数据可视化:

代码语言:javascript
复制
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编码即可!

代码语言:javascript
复制
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 合并处理!

代码语言:javascript
复制
X_train['Fam_Size'] = X_train['SibSp']  + X_train['Parch'] 
X_test['Fam_Size'] = X_test['SibSp']  + X_test['Parch'] 

可视化:

代码语言:javascript
复制
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编码!

代码语言:javascript
复制
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.特征选择

这里以全集特征训练!删除某一特征训练结果测试,后续~~

代码语言:javascript
复制
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!

代码语言:javascript
复制
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!

代码语言:javascript
复制
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.结果上传

首先通过上述建立的模型进行预测,并输出到上传文件中,然后再上传 !

代码语言:javascript
复制
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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-10-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 光城 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 泰坦尼克号之生存预测(2)
    • 0.说在前面
      • 1.数据预处理
        • 2.特征选择
          • 3.模型选择
            • 4.结果上传
              • 5.总结
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档