查看原文
其他

案例实战|泰坦尼克号船员获救预测(XGBoost提交结果)

2017-12-30 alg-flody 算法channel


01

回顾

泰坦尼克号的案例系列已经推送了2个,分别解决了数据预处理:特征工程,数据清洗等,包括模型的BaseLine阶段的求解,关于这两篇文章,请参考:

案例实战|泰坦尼克号船员获救预测(数据预处理部分)

案例实战|泰坦尼克号船员获救预测(算法求解)

其中在算法求解部分,小编脑子出现短路,在第一个求解中本想调用逻辑回归,但是错误地调成了线性回归,图片如下所示:


现在修正为如下,修改为调用 LogisticRegression,逻辑回归分类器,得出的正确预测精度为81.36% 。



特别感谢读者:GnahzNib 和 灵风,是你们帮助我发现的,谢谢你们!另外,对已经阅读和可能以后看到的读者,大家注意这个问题!接下来,任何问题,还希望大家帮小编指正。


已经对泰坦尼克号获救预测的准确度达到了83.%,但是我们在提交前,还想借助xgboost再把预测结果优化下。


在此尝试对几种算法集成到stacker中,然后综合考虑这几个集成算法的预测结果,然后输入到xgboost中,根据实际的训练集中的Survived真实情况,用xgboost进行修正。


最后拿xgboost训练后的结果再对测试集预测,这个结果就可以作为最终的预测结果提交到kaggle中了。



02

Stacker

已经拿随机森林分类器,Adboost分类器,GBDT分类器,支持向量机分类器,对泰坦尼克号的获救情况作出预测,并且绘制了特征图,下面再总结下其中几个分类器得到的特征的重要程度表格:



对以上3种算法特征重要程度取平均后:



绘制柱状图如下所示:

为了混用这几种算法,我们组合几种集成算法,先列出求解训练集的结果,测试集的结果的函数 get_oof()。


#train:泰坦尼克号训练数据集

#test:泰坦尼克号测试集

ntrain = np.shape(train)[0]

ntest = np.shape(test)[0]

#交叉验证的份数

NFOLDS = 3


#返回经过clf分类器预测后的Survived结果,

#oof_train :训练集的Survived情况

#oof_test:测试集的Survived情况

def get_oof(clf, x_train, y_train, x_test):

    oof_train = np.zeros((ntrain,))

    oof_test = np.zeros((ntest,))

    oof_test_skf = np.empty((NFOLDS, ntest))


    for i, (train_index, test_index) in enumerate(kf):

        x_tr = x_train[train_index] #交叉验证中训练集x值

        y_tr = y_train[train_index] #交叉验证中训练集y值

        x_te = x_train[test_index] #交叉验证中测试集x值


        clf.fit(x_tr, y_tr) #训练阶段


        oof_train[test_index] = clf.predict(x_te) #交叉验证中测试集的x值

        

        #直接对测试集test做预测

        oof_test_skf[i, :] = clf.predict(x_test) 


    oof_test[:] = oof_test_skf.mean(axis=0)

    

    return oof_train.reshape(-1, 1), oof_test.reshape(-1, 1)


组合几种算法,这个思想可以称为 stacker,具体过程如下所示:


# Create Numpy arrays of train, test and target ( Survived) dataframes to feed into our models

y_train = train['Survived'].ravel()

train = train.drop(['Survived'], axis=1)

x_train = train.values # Creates an array of the train data

x_test = test.values # Creats an array of the test data


rf_oof_train, rf_oof_test = get_oof(rfc,x_train, y_train, x_test) # Random Forest

ada_oof_train, ada_oof_test = get_oof(adboost, x_train, y_train, x_test) # AdaBoost 

gb_oof_train, gb_oof_test = get_oof(gbc,x_train, y_train, x_test) # Gradient Boost

svc_oof_train, svc_oof_test = get_oof(sv,x_train, y_train, x_test) # Support Vector Classifier


x_train = np.concatenate((  rf_oof_train, ada_oof_train, gb_oof_train, svc_oof_train), axis=1)

x_test = np.concatenate(( rf_oof_test, ada_oof_test, gb_oof_test, svc_oof_test), axis=1)


因此,最终汇总的结果如下:



03

将预测结果导入到xgboost中

关于xgboost的算法原理,下载和安装xgboost的文章,大家可以参考本公众号的之前推送,下面,直接实战。


导入xgboost:

import xgboost as xgb


x_train是stacker组合预测的船员的生还情况,y_train是训练集中船员的实际生还情况:


print("开始计算")

gbm = xgb.XGBClassifier(

 n_estimators= 2000,

 max_depth= 4,

 min_child_weight= 2,


 gamma=0.9,                        

 subsample=0.8,

 colsample_bytree=0.8,

 objective= 'binary:logistic',

 nthread= -1,

 scale_pos_weight=1). fit(x_train, y_train)

#这是提交的结果

predictions = gbm.predict(x_test)


print("计算结束")


与本案例相关的算法原理,推荐阅读:

机器学习逻辑回归:原理解析及代码实现

机器学习逻辑回归:算法兑现为python代码

机器学习集成算法:XGBoost思想

机器学习集成算法:XGBoost模型构造

机器学习:XGBoost 安装及实战应用

机器学习:提升树(boosting tree)算法的思想


关于这个系列的完整代码,请进入公众号界面,点击Github源码,进入GitHub界面下载,自己跑一跑。




算法channel会有系统地,认真地推送:机器学习(包含深度学习,强化学习等)的理论,算法,实践,源码实现。期待您的参与!


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存