1

数据挖掘



首先,我们来了解一下什么是数据挖掘?数据挖掘(分析)的具体步骤是什么?


数据挖掘是数据库中知识发现(knowledge discovery in database,KDD)一个不可缺少的一部分,知识发现就是将未加工的数据转换为有用信息的整个过程。在这个数据爆炸的时代,数据来源早已不限于数据库,音频、视频、图片、文本等等很多非结构化的数据都可以用于知识发现。


实战演练(1)Titanic生存预测_java

图片来源:https://github.com/EpistasisLab/tpot


数据挖掘的主要流程包括:


  • 明确目的:数据挖掘的任务主要分为两大类:预测和描述。【预测】是根据其他属性的值,预测特定的属性值。【描述】是导出概括数据中的潜在联系的模式(如相关、趋势、聚类、轨迹、异常等)。有了方向之后,便可以开始着手准备数据了。


  • 数据处理:数据预处理是数据挖掘过程必须经历的一步,它的主要目的是将原始的未加工数据(来源于已有资料、问卷调查、网站爬虫等等)转化称为适合数据分析和挖掘的形式,涉及到多源数据的融合、数据的清洗以及特征的选择等等。


  • 数学建模:利用各种机器学习的算法(eg 决策树、贝叶斯分类、SVD、DL等等)进行有用信息的挖掘和抽取。根据测试如交叉验证等测试结果,进行参数调优,并且评估各个模型,最终选择最合适的模型。没有绝对的算法优劣,也没有绝对高性能算法,只有在特定的场景、数据和特征下更合适的机器学习算法。


  • 模型评估:根据模型结果,结合数据挖掘的目的,验证模型的有效性。如果结果不理想,则返回重新调整模型。实践是检验真理的唯一标准。


参考书籍:Pang-Ning Tan《数据挖掘导论》 --人民邮电出版社

2

实战演练—Titanic生存预测


kaggle是一个非常适合初学者去实操实战技能的一个网站。关于kaggle更多了解:

导读:http://www.360doc.com/content/18/0106/16/44422250_719580875.shtml;

入门:https://www.cnblogs.com/limitlessun/p/8489749.html。


kaggle很友好的推荐了三个小白上手的经典练习项目:


实战演练(1)Titanic生存预测_java_02


今天,我们以Titanic生存预测为例,带大家体验一下数据挖掘的魅力!


相信大家对《Titanic》这部电影都耳熟能详了。1912年4月15日,拥有着“永不沉没”美誉的泰坦尼克号在其处女航期间与一座冰山相撞,2224名乘客和机组人员中有1502人丧生,存活率仅32%。尽管在该沉船事件中的幸存者具有一定的运气因素,但是数据表明某些群体比其他群体的存活率更高,比如妇女、儿童和高等舱位的乘客。 


所以,针对这个问题,我们借助已有数据(也就是训练集数据)建立了一个预测模型,对没有存活率标签的测试集数据做一个简单的生存预测。这是一个简单的二元分类预测模型,即预测的结果是0(死亡)或1(生存)。更多信息:https://www.kaggle.com/c/titanic。


针对这个项目,我们可分为以下几个步骤进行分析:


  • 数据准备:下载训练集与测试集数据并将二者合并,合并的原因是对两个数据集做相同的数据预处理。


  • 数据认识:这一步骤非常重要,我们首先要对数据有大概的了解,然后分析数据各属性(或多个属性)与获救情况之间的联系。这有助于使我们对问题的理解更加深刻。因篇幅所限,我们以其中两个特征为例,研究其与获救情况之间的联系,以及对获救情况的联合影响。


  • 数据预处理:数据中会出现一些缺失值,计算机不能识别的信息,以及对预测结果意义不大的信息。本例中的数据预处理包含了为许多kaggler津津乐道的特征工程,通过对比kaggle中的kernel可以发现,不同的人对于数据的处理方式不同,预测准确率的决胜点就在于特征工程。


  • 数学建模:选取了其中模型进行比较分析。


01

数据准备


首先导入所需要的数据包以及数据集:


实战演练(1)Titanic生存预测_java_03


02

数据认识


【数据初识】


查看数据类型信息,对数据的情况有个大概的了解


实战演练(1)Titanic生存预测_java_04


可以看到训练集中共有十二项特征分别是:

PassengerID(ID);

Survived(存活与否);

Pclass(客舱等级,1/2/3等);

Name(姓名);

Sex(性别);

Age(年龄);

SibSp(旁系亲属人数);

Parch(直系亲属人数);

Ticket(船票信息);

Fare(票价);

Cabin(客舱编号);

Embarked(上船港口编号)。


下一步查看数据的整体信息:


实战演练(1)Titanic生存预测_java_05


实战演练(1)Titanic生存预测_java_06



实战演练(1)Titanic生存预测_java_07


实战演练(1)Titanic生存预测_java_08


根据以上信息,我们可以得出:总共人数是泰坦尼克号船上的乘客总数2224人,实际的训练集数据为891人测试集数据为418人;训练数据中,Cabin缺失值比较多,其次是Age,Embarked。测试集数据中,Cabin的缺失值最多,其次是Age,Fare。


此外,对数据进行描述性分析(只有数值型的数据才可以得到描述性信息),并观察mean字段的数据,可以发现:约39%的人最后获救了,2/3等舱的人数比1等舱要多,平均乘客年龄大概是29.7岁(计算这个时候没有计算无记录的年龄信息)等等。


密密麻麻的数字看得人头疼。下面我们运用绘图工具对乘客各属性进行可视化分析。


实战演练(1)Titanic生存预测_java_09


实战演练(1)Titanic生存预测_java_10


【数据分析】


仅对数据做初步了解,依旧无法提供给我们明确的想法和清晰的思路。接下来我们进一步深入,看看每个或多个属性与最后的Survived之间存在怎样的联系,并利用图表对数据进行可视化分析。


因篇幅所限,这里我们以乘客性别与舱位等级为例,去研究这两个属性与被获救情况之间的联系。在做可视化分析之前,我们首先进行猜想:按常理来说,“Lady First”,因此女性获救的概率应该比男性要大;头等舱位的乘客地位高贵,因此,头等舱乘客获救的概率应该比三等舱乘客要大。


实战演练(1)Titanic生存预测_java_11


实战演练(1)Titanic生存预测_java_12


实战演练(1)Titanic生存预测_java_13实战演练(1)Titanic生存预测_java_14


根据这些,基本上可以坚定我们的猜想,说明舱位等级和性别是两个非常重要的因素。同时读者也可以做出一些猜想:如小孩与老人获救的概率应该比青年和中年要多;获救情况和登船港口是不是有关系呢?是不是登船港口不同,人的出身地位不同?等等。然后对数据进行分析验证自己的猜想。


更详尽的数据分析请戳:

https://www.kaggle.com/startupsci/titanic-data-science-solutions/log


03

数据预处理


经过上一步骤,我们已经对大体数据有了一定的概念,对感兴趣的属性也有个大概的了解。下一步对这些数据进行处理,为机器学习建模做准备。


(了解更多数据预处理知识,戳:https://scikit-learn.org/stable/modules/preprocessing.html#preprocessing)。


首先,我们将本例中的十二个属性一一做如下分析(训练集与测试集作相同处理):


  • PassengerID(ID):作为序号可直接删除。


  • Survived(存活与否):作为标签无需处理。


  • Pclass(客舱等级,1/2/3等):重要属性(乘客所在的客舱等级越高幸存率越高)。本身就是数值型数据,无需处理。


  • Name(姓名):姓名中含有该乘客的称呼,通过分析可以发现不同称呼的乘客幸存率不同,从姓名中提取乘客的称呼,新增Title特征,归纳为六类其存活率如下所示:


实战演练(1)Titanic生存预测_java_15


然后将其转化为计算机可识别的数值型数据:


实战演练(1)Titanic生存预测_java_16


  • Sex(性别):重要属性,女性的存活率远远高于男性。并将其转化为计算机可识别的数值型数据:


实战演练(1)Titanic生存预测_java_17


  • Age(年龄):Age缺失量为263,缺失量较大,应对该属性进行缺失值处理。遇到缺值的情况,常见的处理方式有以下几种:


  1. 如果缺值的样本占总数比例极高,可直接舍弃。若作为特征加入的话,反倒带入噪音noise,影响最后的结果。

  2. 如果缺值的样本适中,而且该属性是非连续值特征属性(比如说类目属性),那就将NaN作为一个新类别,加到类别特征中。

  3. 如果缺值的样本适中,而且该属性是连续值特征属性,可以考虑给定一个step(比如age每隔2/3岁为一个步长),将其离散化,之后把NaN作为一个type加到类目中。

  4. 如果缺失值个数不多时,(简单方法)可直接根据均值和标准差产生随机数进行补充。

  5. 如果缺失值个数不多时,(复杂方法)如本例:用上述Sex, Title, Pclass三个特征构建随机森林模型,填充年龄缺失值。


实战演练(1)Titanic生存预测_java_18


并将连续值特征属性的Age离散化,步长为16.


实战演练(1)Titanic生存预测_java_19


  • SibSp(旁系亲属人数)和Parch(直系亲属人数):可以将这两个属性合二为一,组合成为FamilySize属性。与之对应,再创建一个IsAlone属性,若FamilySize为1,则IsAlone=1,否则=0.


实战演练(1)Titanic生存预测_java_20


  • Ticket(船票信息)和Cabin(客舱编号):不重要的属性,可删


实战演练(1)Titanic生存预测_java_21


  • Fare(票价):Fare在训练集中有一个缺失值,我们首先用中位数进行缺失值填充。接下来与Age属性相似,将连续值特征属性的Fare离散化,步长为7.91.


实战演练(1)Titanic生存预测_java_22


  • Embarked(上船港口编号)。Embarked在训练集中有两个缺失值,与Fare类似,首先用众数进行缺失值填补,然后将Embarked转化为计算机可识别的数值型数据:


实战演练(1)Titanic生存预测_java_23


至此,我们已经将所有的属性一一作了处理(有加有减)。除此之外,我们还可以发掘属性与属性之间的乘除对结果的影响(特征工程),例如,我们可以人为创造一个变量Age*Class将Pclass与Age相结合。这时,属性对结果的影响就不再是单纯地线性影响了,如果选择的好,效果会大大提升。


实战演练(1)Titanic生存预测_java_24


经过数据预处理,我们已经得到了清清爽爽的数据啦!接下来就是利用各种机器学习的算法进行参数调优,并且评估各个模型,最终选择最合适的模型。


04

数学建模


在进行数学建模之前,我们首先对数据集作如下操作:

X_train为除去训练集中Survived的所有特征,这也就是用于建设各种模型的因子,Y_train为训练集中的Survived,也即是目的特征,借助X_train与Y_train,我们建立相关模型。X_test为除去PassengerId后的其他特征,通过X_train与Y_train建立的模型,我们就可以根据X_test预测出测试集的生存率。


实战演练(1)Titanic生存预测_java_25


我们选取了九种模型对结果进行预测,分别是:

Logistic Regression、

KNN、

Support Vector Machines、

Naive Bayes classifier、

Decision Tree、

Random Forrest、

Perceptron、

Artificial neural network、

Relevance Vector Machine。


(老薛说,真正的程序员都是自己写代码的,作为一个业余的程序媛,我们调用sk-learn的包\捂脸跑)。


调用包的话语句就非常简单了,以Logistic Regression为例,预测准确率为80.25.


实战演练(1)Titanic生存预测_java_26


其中,各属性对最终结果的贡献率分别为:


实战演练(1)Titanic生存预测_java_27


最后,我们对所运用的模型进行一个评估,选择准确率最高的模型作为最终答案。


实战演练(1)Titanic生存预测_java_28


可以看到:Decision Tree和Random Forrest的预测率最高为86.76%。