Kaggle学习之Machine Learning from Disaster(1)
来源:互联网 发布:绿岸网络2017 编辑:程序博客网 时间:2024/06/08 14:25
一、背景介绍
Jack and Rose唯美的爱情故事很壮观却很悲凉~
大船船体进水后,是否获救的乘客是随机的还是具有某些规律的呢?
是否可以根据乘客的基本信息和存活信息来预测其他人的存活信息呢?
So,这是一个二分类问题。常见的二分类算法有:线性/逻辑回归、SVM、决策树、随机森林、boost算法等。
二、数据预处理
数据下载地址如下:
https://www.kaggle.com/c/titanic/data
其中train.csv用来训练模型,text.csv经过模型提交结果。先用Excel打开看一下基本特征:
我们可以看到:
·PassengerId 乘客ID·Pclass 乘客等级(1/2/3等舱位)·Name 乘客姓名·Sex 乘客性别·Age 乘客年龄·SibSp 堂兄弟/妹个数·Parch 父母与小孩个数·Ticket 船票信息·Fare 票价·Cabin 客舱·Embarked 登船港口
利用Pandas导入CSV,代码如下:
import pandas as pd titanic=pd.read_csv("D://titanic/train.csv")
导入数据后,我们先看一下数据整体情况:
print (titanic.describe())
得到:
我们可以看到:
1、整个数据有891条,其中Age缺失比较严重,考虑到Age可能是一个很重要的特征(“老人和小孩先走!”),而算法输入的是矩阵,这里需要对Age缺失的部分进行处理(这里直接使用均值填充缺失行的Age)。
titanic["Age"]=titanic["Age"].fillna(titanic["Age"]).median()
再看一下整体数据情况,同样describe,
空缺的Age已经填充好了。
2、SEX、Embarked是str类型,需要转化为int型或float型。
print (titanic["Sex"].unique())titanic.loc[titanic["Sex"]=="male","Sex"]=0titanic.loc[titanic["Sex"]=="female","Sex"]=1print (titanic["Embarked"].unique())titanic["Embarked"]=titanic["Embarked"].fillna('S')titanic.loc[titanic["Embarked"]=="S","Embarked"]=0titanic.loc[titanic["Embarked"]=="C","Embarked"]=1titanic.loc[titanic["Embarked"]=="Q","Embarked"]=2
首先使用print (titanic[“Sex”].unique())看一下sex、Embarked有哪些类型,然后loc替换;在print (titanic[“Embarked”].unique())时,发现有空缺值,直接用S填充,然后再loc完成数据类型替换。
三、算法模型
前期我们使用“Pclass”,”Sex”,”Age”,”SibSp”,”Parch”,”Fare”,”Embarked”七个特征预测乘客是否获救。基础数据基本处理好了。
3.1 线性回归模型
from sklearn.linear_model import LinearRegression from sklearn.cross_validation import KFoldpredictors=["Pclass","Sex","Age","SibSp","Parch","Fare","Embarked"]alg=LinearRegression()predictors=["Pclass","Sex","Age","SibSp","Parch","Fare","Embarked"]alg=LinearRegression()kf=KFold(titanic.shape[0],n_folds=3,random_state=1) #n_folds做三次交叉验证predictions=[]for train,test in kf: train_predictors=(titanic[predictors].iloc[train,:]) #把训练数据特征拿出来 train_target=titanic["Survived"].iloc[train] #把真实数据特征拿出来 alg.fit(train_predictors,train_target) #fit应用alg模型 test_predictions=alg.predict(titanic[predictors].iloc[test,:]) predictions.append(test_predictions)
解释:cross_validation将train集训练三份,对着三份数据做交叉验证,再平均。
经过线性模型后已经得到了预测的结果,线性回归的到的是0-1的连续变量,如何转换为一个类型的值呢,这里我们认为如果该值小于0.5,认为是0类别,如果是大于0.5,认为是1类别。有了类别,现在我们来看一下算法效果:
predictions=np.concatenate(predictions,axis=0)predictions[predictions>.5]=1predictions[predictions<=.5]=0accuracy=sum(predictions[predictions==titanic["Survived"]])/len(predictions)print (accuracy)
运行后结果为:0.26。嗯,线性回归效果很差(囧),我们接下来看一下逻辑回归。
3.2 逻辑回归模型
代码如下:
from sklearn import cross_validationfrom sklearn.linear_model import LogisticRegressionalg=LogisticRegression(random_state=1)scores=cross_validation.cross_val_score(alg,titanic[predictors],titanic["Survived"],cv=3)print(scores.mean())
运行后结果为:0.79。嗯,逻辑回归效果比线性回归效果好多了。接下来我们看一下较高级的算法。
3.3 随机森林算法(RF算法)
随机森林是用随机的方式建立一个森林,森林里面有很多的决策树组成,随机森林的每一棵决策树之间是没有关联的。在得到森林之后,当有一个新的输 入样本进入的时候,就让森林中的每一棵决策树分别进行一下判断,看看这个样本应该属于哪一类(对于分类算法),然后看看哪一类被选择最多,就预测这个样本 为那一类。(参见http://blog.csdn.net/SoaringLee_fighting/article/details/52641935)
随机森林算法:
(1)取样是随机的,有放回取样;
(2)选择特征也是随机选择,比如说上面选择的7个特征作为选择的输入,随机森林也可以随机选择特征;
(3)构造多棵决策树,进行投票然后选择平均值;
(4)防止过拟合,又是集成方式。
代码如下:
#随机森林模型from sklearn.ensemble import RandomForestClassifierpredictors=["Pclass","Sex","Age","SibSp","Parch","Fare","Embarked"]alg=RandomForestClassifier(random_state=1,n_estimators=10,min_samples_split=2,min_samples_leaf=1) #n_estimators-数的数量,min_samples_split-节点分裂最小条件,min_samples_leaf叶子节点最小个数)kf=KFold(titanic.shape[0],n_folds=3,random_state=1)scores=cross_validation.cross_val_score(alg,titanic[predictors],titanic["Survived"],cv=kf)print(scores.mean())
运行后结果为结果为0.78。运行结果为啥比逻辑回归还要低呢?说好的高级呢。不急,我们修改一下模型的参数,设置:
_estimators=50,min_samples_split=4,min_samples_leaf=2
运行后结果为0.81,效果还可以。
四、总结
我们在算法输入时只用到了7个特征,比如Name等未做处理,因此改进算法有下面几种方案:
(1)除了train给出的特征值外,我们自己构造特征值(特征工程)
(2)构造好特征工程后,通过给不用特征加干扰项,ERROR结果反馈不同特征对结果的影响程度
(3)LR、RF也好,算法单一容易过拟合,通过算法融合,将几个弱分类器结果投票,可能会提高分类的准确性。
以上见Kaggle学习之Machine Learning from Disaster(2)。
本文主要参考视频:网易云课堂-Python机器学习Kaggle案例。
- Kaggle学习之Machine Learning from Disaster(1)
- Kaggle学习之Machine Learning from Disaster(2) -SVM
- Kaggle之Titanic: Machine Learning from Disaster
- 【机器学习】Kaggle-Titanic:Machine Learning from Disaster
- kaggle competition 之 Titanic: Machine Learning from Disaster
- 【Kaggle练习赛】之Titanic: Machine Learning from Disaster
- Kaggle比赛经验总结之Titanic: Machine Learning from Disaster
- Kaggle比赛之Titanic Machine Learning from Disaster
- Titanic: Machine Learning from Disaster(Kaggle 数据挖掘竞赛)
- Kaggle Titanic: Machine Learning from Disaster
- Kaggle | Titanic: Machine Learning from Disaster
- kaggle: Titanic: Machine Learning from Disaster
- 机器学习一小步:Kaggle上的练习Titanic: Machine Learning from Disaster(一)
- 机器学习一小步:Kaggle上的练习Titanic: Machine Learning from Disaster(二)
- Kaggle Titanic: Machine Learning from Disaster 一种思路
- kaggle竞赛——Titanic:Machine Learning from Disaster
- kaggle入门竞赛--Titanic:Machine Learning from Disaster
- kaggle Code : Titanic: Machine Learning from Disaster 分类
- bzoj 5043: 密码破译
- Prime Ring Problem
- smoj2017(树链剖分+线段树/LCT)
- 计蒜客 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 M. Frequent Subsets Problem (位压缩)
- memset的一个错误用法
- Kaggle学习之Machine Learning from Disaster(1)
- git
- c++ 虚函数
- 每天一篇Makefile(一)
- 安装WIN10 准备就绪半小时
- 每日掌握一个Linux命令 之 检测系统资源化 vmstat
- 第三周第一节课(第二章--线性表)
- 李超线段树 [Heoi2013]Segment
- 虚拟内存和物理内存