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会有系统地,认真地推送:机器学习(包含深度学习,强化学习等)的理论,算法,实践,源码实现。期待您的参与!
领取专属 10元无门槛券
私享最新 技术干货