查看原文
其他

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

2017-12-29 alg-flody 算法channel


01

回顾

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

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

  1. 数据的Nan值问题

  2. 特征选取问题

  3. 新的特征创建

  4. 数据清洗问题

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

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



关于这部分的介绍,请参考:


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


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




02

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

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


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


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


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



from sklearn.linear_model import LinearRegression

from sklearn.cross_validation import KFold


#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<=0.5] = 0

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

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.1 RandomForestClassifier


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.2 AdaBoostClassifier



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.3 GradientBoostingClassifier


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[predictor 49 31014 49 15232 0 0 4998 0 0:00:06 0:00:03 0:00:03 5037s],train["Survived"],\

                                         cv=kf)

print(scores.mean())



准确度:0.830


3.4 SVC


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


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

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