首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

泰坦尼克号船员获救预测

01

回顾

泰坦尼克号船员获救案例的数据原来的模样:

经过数据预处理后,解决了以下问题:

数据的Nan值问题

特征选取问题

新的特征创建

数据清洗问题

非数值型特征转换为可以计算的数值型

得到数据是直接可以feed到机器学习算法中,进行求解的:

下面,介绍利用这些数据,进行模型求解,预测船员的获救情况。

02

BaseLine阶段:逻辑回归初步求解

首先,用predictors定义模型求解中用到的特征列,筛选掉特征Name_length,所以选择最终的所有特征:

predictors = ["Pclass","Sex","Age","Fare","Embarked","FamilySize","IsAlone","Title","Has_Cabin"]

往往第一阶段的模型求解,也称为BaseLine阶段,先选用常用的模型,得到一个基本结果,然后再优化。

借助sklearn的API,先做出一个基本的预测,预测过程的思路如下:

fromsklearn.linear_modelimportLinearRegression

fromsklearn.cross_validationimportKFold

#3层交叉验证

kf = KFold(train.shape[0], n_folds=3, random_state=1)

#先拿逻辑回归预测

lr = LinearRegression()

#存储三部分预测结果

predictions=[]

#手动实施交叉验证算法

for tr,te in kf:

train_predictors= train[predictors].iloc[tr,:]

train_target= train["Survived"].iloc[tr]

lr.fit(train_predictors,train_target)

test_predictions= lr.predict(train[predictors].iloc[te,:])

predictions.append(test_predictions)

#三部分预测结果合并为1个(819个,训练集的数据个数)

predictions = np.concatenate(predictions,axis=0)

#逻辑回归,自己定义一个阈值0.5,如果结果大于0.5,则认为这个小伙子被救了,否则over.

predictions[predictions>0.5] = 1

predictions[predictions

#模型精度计算公式:预测对的个数/总的个数

accuracy = sum(predictions[predictions==train["Survived"]]) / len(predictions)

accuracy

0.274

可以看到,用逻辑回归算法,预测的精度很低,不过,没关系,我们会接下来尝试其他的算法。上面这个过程,也可以直接调用sklearn的API,几行代码搞定上述过程。

from sklearn import cross_validation

#lr:逻辑回归对象

#train[predictors]: 特征列

#train["Survived"]: 标签列

# cv=3:3层交叉验证

scores = cross_validation.cross_val_score(lr,train[predictors], train["Survived"],cv=3)

print(scores.mean())

0.406

03

再进一点:尝试几种其他算法

可以看到,逻辑回归的分类预测,结果不好,如何优化? 一般,试试几种集成算法和SVM,包括:

RandomForestClassifier

AdaBoostClassifier

GradientBoostingClassifier

SVC

3.1RandomForestClassifier

from sklearn.ensemble import RandomForestClassifier

rfc =RandomForestClassifier(random_state=1,n_estimators=35,\

min_samples_split=2, min_samples_leaf=1)

kf = cross_validation.KFold(train.shape[0],n_folds=3,random_state=1)

scores = cross_validation.cross_val_score(rfc,train[predictors],train["Survived"],cv=kf)

print(scores.mean())

0.815

随机森林算法,准确度达到了0.815,比02节的逻辑回归算法预测精度提高了很多。

3.2AdaBoostClassifier

from sklearn.ensemble import AdaBoostClassifier

adboost = AdaBoostClassifier(random_state=1,n_estimators=50,\

learning_rate=0.5)

kf = cross_validation.KFold(train.shape[0],n_folds=3,random_state=1)

scores = cross_validation.cross_val_score(adboost,\

train[predictors],train["Survived"],\

cv=kf)

print(scores.mean())

准确度:0.822

3.3GradientBoostingClassifier

from sklearn.ensemble import GradientBoostingClassifier

gbc = GradientBoostingClassifier(random_state=1,n_estimators=50,\

max_depth=5, min_samples_leaf=2, verbose=0)

kf = cross_validation.KFold(train.shape[0],n_folds=3,random_state=1)

scores = cross_validation.cross_val_score(gbc,\

train[predictors],train["Survived"],\

cv=kf)

print(scores.mean())

准确度:0.830

3.4SVC

from sklearn.svm import SVC

sv = SVC(random_state=1,kernel='linear',C=0.02)

kf = cross_validation.KFold(train.shape[0],n_folds=3,random_state=1)

scores = cross_validation.cross_val_score(sv,\

train[predictors],train["Survived"],\

cv=kf)

print(scores.mean())

准确度:0.815

04

特征重要程度展示

看下几个集成算法的特征重要程度,让我们图形化展示出来。

用到了,plotly包,大家自行下载安转(推荐conda install 方式)。

rfc_features = rfc.fit(train[predictors],train["Survived"]).feature_importances_

import plotly.offline as py

import plotly.graph_objs as go

import plotly.tools as tls

# Scatter plot

trace = go.Scatter(

y = rfc_features,

x = predictors,

mode='markers',

marker=dict(

sizemode = 'diameter',

sizeref = 1,

size = 25,

color = rfc_features,

colorscale='Portland',

showscale=True

),

text = predictors

)

data = [trace]

layout= go.Layout(

autosize= True,

title= 'Random Forest Feature Importance',

hovermode= 'closest',

yaxis=dict(

title= 'Feature Importance',

ticklen= 5,

gridwidth= 2

),

showlegend= False

)

fig = go.Figure(data=data, layout=layout)

py.plot(fig)

得到的特征重要程度散点图:

通过特征图可以看出几个比较重要的特征:Title,FamilySize,Sex, Age, Pclass ,这与预想的也基本差不太多,可以看到这些模型的最好预测准确度为:0.830 。

04

总结和展望

关于这个问题的求解算法,应该还可以再精进一步,时间关系,先总结到这里,这样完成了泰坦尼克号船员预测问题。 先对数据进行分析,特征工程,完成数据清洗,选择一个基础算法先测试,然后再尝试一些集成算法,最终经过交叉验证,得到的预测精度为:83% 。

以上算法部分,只能算是第一阶段,要想取得更好的预测精度,那一定得借助XGBoost,将以上多个集成算法组成Stacker,然后预测的结果综合起来作为XGBoost的特征输入,y值为训练集的Survived列的取值,完成这步训练后,再对测试集进行预测,效果会得到一定提高,关于这部分如何操作,请关注接下来的推送。

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

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171229G0O21800?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券