基于决策树算法对泰坦尼克号数据的预测

2020-10-09 10:24袁馨段华琼
电脑知识与技术 2020年22期
关键词:大数据预测

袁馨 段华琼

摘要:随着互联网的兴起,二十一世纪已经是一个信息时代,也可以称为大数据时代,数据早已渗透到当今的每一个行业,成为重要的生产因素。大数据技术应用的领域越来越多,帮助企业不断地发展新业务,创造新的运营模式,例如电子商务,物流配送等。该文详细阐述了一个基于决策树算法的数据分析挖掘过程,以泰坦尼克号数据为例,通过对数据的分析与挖掘来实现预测功能。

关键词:决策树算法;大数据;预测

中图分类号:TP311 文献标识码:A

文章编号:1009-3044(2020)22-0185-02

开放科学(资源服务)标识码(OSID):

大数据的出现,涌现出许多新的分析与挖掘算法,统称为大数据技术。越来越多的企业运用大数据技术对数据进行深层次的分析,从而决定企业的运营模式。例如超市的捆绑销售,流失客户的风险预测等。本文主要通过各类属性的提取、处理,探究影响泰坦尼克号乘客存活率的因素,最后对测试集的数据做存活率预测。

1 决策树算法简介

1.1算法思想

决策树算法属于机器学习的一种,是一种基本的分类与回归方法,本文主要讨论分类的决策树。该算法能从给定的无序训练样本中,提炼出像树一样的分类模型。树中的每个非叶子节点记录了使用哪个特征来进行类别判断,每个叶子节点则代表了最后判断的类别。从根节点开始,数据在信息增益最大的特征上产生分裂,在迭代过程中,分裂过程在每个子节点重复进行,直到所有的叶子为纯性,即每一个节点的数据属于同一类。这也是做预测的方法,通过对特征的提取,建立模型,然后对测试的数据做分类。决策树可以分成三个算法:ID3算法、C4.5算法和CART算法。这三个算法都比较常见,在选择属性的时候采用不同的方式来判断。

1.2算法特点

相对于其他机器学习算法来说,决策树算法相对简单,计算复杂度不高,且易于理解和实现。人们在学习和使用的过程中,不需要了解太多的背景知识。它能直接体现数据的特点,生成的树通过解释后都能很好地理解它的含义。对于决策树的数据准备,也相对简单,它能够同时处理数据型和常规性的属性值,对数据中间值的缺失不太敏感,可以处理不相关特征数据的特点。

13决策树算法的预测步骤

①收集数据:收集数据可以采用很多方法,无论是自己收集,还是使用网上现成的数据集,这都是需要准备的基础步骤之—一。

②分析数据:一个数据集会有很多属性,对于预测的内容来说,并不是所有列的值都跟预测内容有关,所以对于每一列数据需要逐个去分析它与预测内容的关系,在后续的属性提取时,仅仅提取与预测内容有关联性的列。

③处理数据:提取数据之后,需要对数据进行一个预处理,看数据是否有缺失值或异常值,是否需要删除某些数据。然后还需要对每一列属性值的类型进行分析判断,如果存在数据类型不合适的情况,就需要对属性值类型进行转换。对提取的数据进行清洗后,后续才能直接在算法中使用。这一过程虽然是对数据的处理,但也是非常重要的一步。

④训练算法:这个过程包括决策树模型的构建,然后使用训练数据对该决策树模型进行训练,得出一个准确率。

⑤测试算法:光有训练数据的准确率不能说明该模型是否好,还需要测试集的准确率来判断,当错误率达到可以接受的范围,那么这个模型就可以投入使用了。

⑥预测:用模型对测试数据做一个预测,输出最后的预测结果。

2 泰坦尼克号数据集简介

1912年4月15日,泰坦尼克号在首次航行的过程中,撞上了冰山然后轮船沉没,2224名乘客和工作人员中有1502人死亡。死亡原因之一是没有足够的救生艇给乘客和工作人员。对于幸存下来的人,有一部分是因为运气,但还有一些人的存活概率本身就比其他人更大,比如妇女、儿童和上层人士。通过对这些数据进行分析与挖掘,找出影响存活率的因素。

泰坦尼克号数据集分为两部分:测试数据和训练数据。训练数据样本总数目是891,测试数据样本总数目是418。两部分数据的属性列一样,一共11个属性,具体包括:Passengerld(乘客Id);Survived(存活率:0代表N死亡,1代表存活);Pclass:(社会地位:1最高,3最低);Name(乘客姓名);Sex(性别);Age(年龄);SibSp(堂/兄妹个数);Parch(父母孩子个数);Ticket(船票信息);Fare(票价);Cabin(船舱);Embarked(登船港口:C=Cherbourg, Q=Queenstown, S=Southampton)

3 数据分析与挖掘

3.1数据分析

a.从训练数据中提取Pclass和Survived这两列数据,然后用groupby对Pclass做分组,计算每组平均值并排序,最后得出的结论是地位越高的人存活率越高,说明Pclass跟存活率有关联性,后续需要提取这个属性,主要代码如下:

print(train_df[[7 Pclass,Survived,】】.groupby([,Pclass'D.mean0Vsort_values(by='Survived 7))

b.从训练数据中提取Sex和Survived這两列数据,然后用groupby对Pclass分组,计算每组平均值并排序,最后得出的结论是女性的存活率更高,所以后续也需要提取Sex属性,主要代码如下:

print(train_df[[7 Sex, 'Survived,】].groupby(L'Sex'D. meanOVsort_values(by=Survived 7))

c.从训练数据中提取SibSp,parch和survived,根据SibSp,parch来分组,求均值,排序,方法与上面的属性相同,最后得出的结论是这两个属性的存活率差别不大,说明这两个属性对存活率影响不大,后续过程中放弃这两个属性的提取。

d.从训练数据中提age和Survived这两列数据,使用Facet-Grid对这两个属性做可视化,参数为训练数据集和Survived列,然后通过调用FacetGrid.map0函数将绘图函数应用于每个子集。最后得出的结论是婴儿存活率较高,年龄在15-25岁之间的人大部分都死亡了,说明年龄对存活率的影响较大,后续也需要提取age属性,主要代码如下:

1= sns.FacetGrid(train_df,col= 'Survived 7)

print(l.map(plt.hist,7 Age 7 ,bins=20》

e.提取Embarked、Sex和Pclass,观察它们与存活率的关系,最后得出的结论是Embarked=C的男性存活率更高,后续也需要提取Embarked属性,主要代码如下:

grid. map(sns. pointplot,,Pclass,,,Survived',,Sex', palette='deep,Yhue_order=[”female”,”male”】)

f.提取Fare和Survive,最后得出的结论是票价高的成员的生存率更高,后续也需要提取Fare属性,主要代码如下:

s. FacetGrid(train_df, row= 'Fare 7, col= 'Survived 7, size=2.0, as-pect=1.6)

把所有的属性列一一提取出来,观察它们与存活率是否有关联,通过上文中对每一属性的具体分析,选出影响存活率的5个属性,分别是:Pclass,Sex,age,Fare,Embarked。

3.2 处理数据

选择好需要提取的属性后,查看对应的数据时发现有的数据有缺失或空值的情况,还发现有些属性的数据是字符的形式,所以需要先对这些数据作处理后才可以应用。

对于不需要的属性,直接使drop删除,参数axis=1表示删除该列。因为该数据集分成训练集和测试集,所以分开删除,不需要的属性列有Cabin,Ticket,Sibsp,Parch,Name,Passen-gerID。删除Ticket的代码如下,其余属性的删除及代码方法与Ticket相同。

train_df= train_df.drop([,Ticket,,7 Cabin 7】,axis=l)

test_df= test_df.drop([,Ticket',7Cabin,],axis=l)

性别属性的数据使用英文male/female表示男女,所以需要转换Sex为数字类型,将female替换为1,male替换为0。将测试集和训练集合并在一起,只需要做一次替换即可,主要代码如下:

Data_total= [train_df,test_dfl

for dataset in Data_total:

dataset[,Sex 7】=dataset[,Sex7].map({,female':1,,male 7:0】).as—type(int)

age属性的数据存在缺失值,选择它的中位数df.median0进行填充。

Embarke属性也存在缺失值,采用众数进行填充,先用mode把众数提取出来,存放在EA变量中,然后再进行填充。并且由于它的数据类型为字符,用map把它转化为对应的数字,主要代码如下:

EA=train_df.Embarked.dropnaO.mode0[0]

for dataset in Data_total: dataset[,Embarked,】=datasetrEm_barked'].fillna(EA)= dataset[,Embarked'].map({7S7:0,7C 7:1,7Q:2D.astype(int)

Fare属性也存在缺失值,直接用fllna进行填充,参数为test_dfT,Fare,l.median0。还需要转换Fare为数值类型。由于Fare的数据值有很多种,如果对每一种进行单独转化,这样工作量会很大,所以采用分段的方式来处理数据,主要代码如下:

for dataset in Data_total:

dataset.loc [dataset[7 Fare】<=8,Fare']=0

dataset. loc[(dataset[7 Fare 7] >8)&(dataset[Fare】<=15),'Fare,]=1

dataset.loc[(dataset[,Fare 7】>15)&(dataset【,Fare']<=31),'Fare']=2

dataset.loc[dataset[Fare】>31,Fare']=3

dataset[7 Fare 7】_dataset[,Fare,].astype(int)

3.3 训练测试算法

當数据属性分析处理完毕之后,数据部分就告一段落,接下来是决策树算法处理。首先引入决策树模型,这里的参数没有具体指明,然后利用cross_vaLscore对它做一个交叉验证,cv=10,最后打印出训练准确率和测试准确率均为0.88左右。这个数字在可接受范围之类,所以这个模型可以直接使用,部分代码如下:

models=[(7 DecisionTree 7 ,DecisionTreeClassifier 0)]

for clf_name,clf in models:

rfc_s=cross_val_score(clf,X,y,cv=10)

猜你喜欢
大数据预测
无可预测
选修2-2期中考试预测卷(A卷)
选修2-2期中考试预测卷(B卷)
选修2—2期中考试预测卷(A卷)
不可预测
大数据环境下基于移动客户端的传统媒体转型思路