案例实战|泰坦尼克号船员获救预测(XGBoost提交结果)
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("计算结束")
与本案例相关的算法原理,推荐阅读:
6 机器学习:提升树(boosting tree)算法的思想
关于这个系列的完整代码,请进入公众号界面,点击Github源码,进入GitHub界面下载,自己跑一跑。
算法channel会有系统地,认真地推送:机器学习(包含深度学习,强化学习等)的理论,算法,实践,源码实现。期待您的参与!