kaggle上的Titanic数据集据说是学习机器学习必然要做的一道练习题,所以注册了kaggle的账号,然后下载了Titanic的训练数据和测试数据。在注册时注意需要科技爬梯出去才能通过邮箱验证,不然你是注册不了的。网址是:Titanic: Machine Learning from Disasterwww.kaggle.com
一、数据导入与预处理
import pandas as pd
from sklearn.model_selection import cross_val_score
from sklearn import tree
df=pd.read_csv('D:\\dataset\\Titanic-train.csv')
print(df.head())
print(df.info())
数据对应的意思分别是这样的,除了Survived(0表示死亡,1表示幸存):PassengerId :乘客ID
Pclass :乘客等级(1/2/3等舱位)
Name : 乘客姓名
Sex : 性别
Age : 年龄
SibSp : 堂兄弟/妹个数
Parch : 父母与小孩个数
Ticket : 船票信息
Fare =:票价
Cabin : 客舱
Embarked : 登船港口
可以看到总共有891条数据,另外注意年龄和客舱数据有缺失,客舱数据缺失尤其严重。只有204个数据。
由于从df.head()中也可以看到客舱数据是类似于C85,C123等数据,这个数据本身对预测船上的人是否可以逃生应该是有帮助的,比如这个客舱位置是否靠近逃生通道,与撞击冰山的位置的远近等等,但由于没有相关的领域知识,而且数据缺失严重,考虑不把这个数据作为特征。年龄数据可以补充缺失值,一般可以用平均值来进行填充,我们先看一下有年龄数据的这些人的年龄平均值是多少。
print(df.Age.mean()) #结果显示为29.699,我又试了下median,结果为28,相差不多,所以考虑就将平均数作为填充值。
df.Age.fillna(df.Age.mean(),inplace=True)
#data.fillna会返回新的对象,如果在原有列上把空值进行填充,需要添加参数inplace=True
二、特征选择
基本的数据处理完毕后,就进入到特征选择环节了,这一块的话主要是会基于domain knowledge去选择一些特征,对于能否最后幸存,像姓名之类的一般无关。总体考虑下来像年龄,性别决定了个人的体力好坏,客舱级别也是一定的逃生的参考因素,以及是否有兄弟小孩也很有可能影响一个人是否能幸存,故而选取Pclass,Sex,Age,SibSp,Parch五个特征。当然这一块就如前所说通过领域知识和背景知识还可以创造出更多的特征,但这里也不是很熟练该如何创造特征,所以就先使用这五个特征。其中Sex给的是male和female由于是分类变量,算法识别不了字符串,还需要处理,将其变为0,1这样的数值,可以利用sklearn中的preprocessing
from sklearn.preprocessing import LabelEncoder
le=LabelEncoder()
le.fit(df['Sex'])
#用离散值转化标签值
df['Sex']=le.transform(df['Sex'])
print(df.Sex)
0 1
1 0
2 0
3 0
4 1
5 1
6 1
7 1
....
可以看到都转化为0和1的标签了,其中男性是1,女性是0
三、建模预测
这五个特征很多都是分类变量,觉得用决策树来做可解释性会更好,所以就用决策树模型去做,最后产出决策树的图,便于使用者理解。
features=['Pclass','Sex','Age','SibSp','Parch']
X=df[features]
y=df['Survived']
dt=tree.DecisionTreeClassifier()
score=cross_val_score(dt,X,y,cv=5,scoring='accuracy')
import numpy as np
print(np.mean(score))
0.80365740391
准确度还算可以,我们将模型训练一下后将决策树可视化出来。
四、决策树可视化
接下来将决策树模型fit到原始的训练集上,并将训练出来的决策树算法给可视化出来,这样有助于我们的理解。
dt.fit(X,y)
from sklearn.tree import export_graphviz #通过graphviz绘制决策树
with open('D:/dataset/Titanic.dot','w')as f:
f=export_graphviz(dt,feature_names=['Pclass','Sex','Age','SibSp','Parch'],out_file=f)
#export_graphviz第一个参数填入决策树的模型,feature_names填入参与的特征名,out_file即指定输出文件
这时候运行完后就能产生一个.dot文件,这个我们打不开,需要去网上下载graphviz后安装,安装完后打开将其bin目录添加到电脑的环境变量中,如我是放在D:\Graphviz2.38\bin下的
则需要将这个目录放到环境变量中的Path下,然后点击确定,随后通过cmd命令进入到这个dot文件所在的目录下后通过 dot -Tpng 文件名 -o 输出文件名的形式进行转化,当然也可以dot -Tpdf的形式,运行后我们就会在目录下看到Titanic.png了
可以看到这个决策树还是比较复杂的,如何解读这样一张图呢,我放大了看一下根节点部分的决策树:
可以看到根节点判断的条件是sex,sex<0.5为true,则因为sex只有0和1,分别代表female和male,就是true则为女性,false为男性。这时还可以看到gini值,由于前面对决策树分类器没有设置任何参数,默认sklearn中的决策树是用CART算法。(除了CART算法,还有ID3,和C4.5算法),关于三种算法的优劣如下:
基于我目前的理解,总体而言CART算法是比较占优的,特征选择上利用gini系数,而不是用信息增益,这个在计算上会有所简化,出结果会更快。
简单来说基尼系数代表了模型的不纯度,基尼系数越小,则不纯度越低,特征越好。
最后Value中的两个数字左边代表在这些样本中的死亡数,右边的是幸存数。根据这一点结合上面的决策树就可以看到,首先利用性别,划分了女性314(根据Values得知其中81死,233幸存),男性577人(根据Value得知468死,109生),基本上Titanic上的男性在面对生离死别时还是很考虑到女性的~
五、预测测试集并上传打分
kaggle上还可以下载test集,我们把train集得到的结果进行预测,然后根据kaggle的格式要求进行上传,kaggle给了样例的上传要求,仅有两列,一列为PassengerId,一列为Survived,我们也根据这样去生成符合标准的CSV文件。
test=pd.read_csv('D:\\dataset\\Titanic-test.csv')
test.Age.fillna(test.Age.mean(),inplace=True)
from sklearn.preprocessing import LabelEncoder
le=LabelEncoder()
le.fit(test['Sex'])
#用离散值转化标签值
test['Sex']=le.transform(test['Sex'])
X_test=test[features]
result=dt.predict(X_test)
test.insert(1,'Survived',result)
final=test.iloc[:,0:2]
final.to_csv('D:/dataset/final.csv',index=False)
这时候得到这样两列数据
将其上传到kaggle,会进行评分计算,虽然在训练集中取得80%的准确率,但上传后显示在测试集中正确率在70%左右,后续还需努力学习改进!但anyway也算是第一次完整做了一个kaggle案例并上传测算。