原文地址:https://www.kaggle.com/startupsci/titanic-data-science-solutions/notebook
我已经发布了一个新的Python库Speedml,把在文章中用到的技术打包成一个直观、强大和有效的API
Speedml帮助我仅用几次迭代就在kaggle的排行榜中从80%以下跳到前20%。
还有就是Speedml仅仅用少近70%的代码就能做到这样。
工作流程
在Data Science Solution这本书中将竞赛解决方案流程分解为七个步骤:
1.定义问题或者难题。
2.获取训练集和测试集。
3.讨论、预处理和清洗数据。
4.分析、定义模式和清洗数据。
5.模型、预测与解决问题。
6.可视化、报告和展示问题解决步骤和最终解决方案。
7.提供或者提交结果。
工作流程指示了每一个步骤和其他步骤的顺序,但在很多情况下不是固定的:
A.我们可能需要结合多个工作步骤。我们可能需要用可视化方式来分析数据。
B.早于指示来实施一个步骤。我们可能在分析数据之前和之后就要讨论数据。
C.在工作流程中多次实施一个步骤。可视化步骤可能需要使用多次。
D.彻底的舍弃一个策略。我们可能不需要为竞赛提供数据集的结果或者状态。
问题定义
竞赛举办方如Kaggle在提供数据集用于训练科学模型和测试模型结果时已经定义了要解决的难题或者提出的问题。Tantic Survival竞赛已经定义了这些问题或者难题。
从泰坦尼克事故的存活或者没有存活乘客这个训练集中,我们要根据模型来预测出测试集中所包含的这些乘客中是否存活的信息。
我们也可能想要深入理解问题的关键因素。这些描述值得更加关注:
在1912年4月15日,泰坦尼克号在撞击冰山后沉没,在2224位乘客中有1502位乘客死亡,存活率仅为32%;
沉船事故导致如此多人死去的原因之一是没有足够的救生艇给乘客和水手;
尽管在沉船事故中存活下来有运气的成分,但一些人好像比另外的人更可能存活下来,比如女人、小孩和上层阶级;
工作目标
数据科学解决方案流程一般分为七个主要目标:
分类:我们可能需要为我们的示例分类。我们可能也需要知道不同解决方案和不同类别之间的影响与相关性;
关联:处理问题的依据是根据训练集中可获得的特征。数据集包含的特征对我们的解决方案作用显著吗?通过统计显示,特征和解决方案是否有关联?当特征值改变时解决方案的状态是否也改变,或者相反?这些都能通过已给出的数据集中数字和分类特征来验证。我们也可能想要解决像接下来目标的存活与否和工作步骤的其他特征之间的关联。关联确定的特征可能有助于创造、计算或者校正特征。
转换:对于建立模型这一步,需要先预处理数据。由于模型算法的选择,可能需要将特征转化为等价的数值。比如将类别值转化为数值等。
填充:数据预处理可能也需要我们去预估特征中任何缺失值。当没有缺失值时模型算法可能运行起来效果最佳。
校正:我们可能需要分析给定数据集的误差和可能不准确的特征值并且尝试去校正这些值或者丢弃掉数据中包含的这些错误。
新建:基于现有的特征或者一系列特征值,我们可以创建一个新的特征,比如关联、转化或者计算目标的新的特征值。
图示:如何去选择正确的可视化图表并且图示取决于原始的数据和解决问题的目标。
获取数据
Python Pandas库能帮助我们导入数据集,我们开始通过Pandas DataFrames获取数据集,我们也可以将两个数据集结合在一起去执行一些运算操作。
通过描述数据来分析
在我们的项目早期,Pandas也可以帮助描述这些数据集来回答如下的问题:
在数据集中可以获得哪些特征?
特征可通过列向量名称获取,具体含义可参考kaggle竞赛数据说明。
# preview the data
train_df.head();
train_df.tail()
train_df.info()
train_df.describe()
train_df.describe(include=['O'])
哪些特征已经分类?
示例中有些值被分为相似的例子。分类特征的值是文本描述类、连续还是离散的?在其他事情中这能帮助我们选择合适的图表来可视化。
哪些特征已经是数字化的?
哪些特征值是数字?这些值从示例变到例子,数字特征值是离散的、连续的还是时序的?除了别的之外,这能帮助我们选择合适的图表来可视化。
哪些特征是混合的数据类型?
有些特征值是数值和字母数据,这些都显示了和目标的相关性。
(票价是一个混合数据)
哪些特征可能包含错误?
这在大型数据集中寻找很困难,但通过观察更少的数据集中少量数据可能会让我们发现哪些数据是需要校正的。
(姓名数据可能包含错误,因为有些姓名包含主题、使用圆括号、用缩写等等。)
哪些数据包含空格、空值等?
这些数据需要校正.
Carbin > Age > Embarked 特征在训练数据集中包含的一系列空值。
Carbin > Age 在测试集中不匹配。
变量特征的数据类型是什么?
转换目标可以帮助我们:七个特征值是整型或者浮点型,六个在测试集中。
五个特征值是字符型。
在示例中数字特征值可以得出哪些结论?
如何表现可以帮助我们得到训练数据集的最主要问题的见解。
如:训练集中共有891人,占泰坦尼克号乘客总人数40%;
幸存者的用0或者1进行特征分类;
大约38%的人数存活,存活率约为32%;
大部分乘客(75%以上)旅行都没有父母或孩子陪伴;
接近30%乘客都有兄弟姐妹或配偶在国外;
船票价格展示了极少的人(<1%)超过512美元;
年龄在65-80岁的乘客非常少;
分类特征展示出哪些信息?
数据集中的名字都是独一无二的;
性别变量中两种可能的值其中男性占65%(男性比例最高,高达577人,总数891人)
座位值在示例中有几种不同值,可能有好几个乘客分享一个单间;
Embarked有三个可能得值,S目的地取得人数最多,644人;
船票特征值中重复率高达22%;
基于数据分析的假设
到目前为止我们已经基于数据分析进行了一些假设。我们可能需要在行动之前验证这些假设。
关联性:
我们希望知道这些幸存者的每一个特征是如何关联的。我们希望在项目的早期做这些并且将这些快速关联性匹配到接下来项目模型的关联性之中。
完整性:
1.我们可能希望计算幸存者和年龄的关联性
2.我们可能希望计算目的地特征和幸存者或者其他重要特征的关联性
校正:
1.船票特征值可能需要被舍弃因为在我们的分析中发现它具有极高的重复性并且这些重复性让船票和幸存者间的关联性不大。
2.座位特征值可能需要被舍弃因为在训练集和测试集中它具有极高的不完整性或者包含了许多空值。
3.训练集中乘客编号可能需要忽略因它对于幸存者没有太大意义。
4.名字特征值不标准,可能不能直接起作用,因此需要调整。
创建:
1.我们可能需要创建一个新的特征值命名为家庭,这是基于Parch和SibSp得到船上所有家庭成员。
2.我们可能想要去工程化名字特征使其包含额外的主题最为新的特征值。
3.我们可能想要创建一个新的特征作年龄段区分。这会让连续的数字特征转化为顺序的分类特征。
4.我们也可能想要创建一个Fare范围特征来帮助我们分析。
分类:
我们也可能需要基于前期对问题的描述来提出我们的假设:
1.女人(性别为女性)更可能存活。
2.小孩更可能存活。
3.上层人士更可能存活。
展开特征进行分析
为了确认我们的观察与假设,我们可以单独展开特征值快速分析特征的关联性。我们仅可以在没有空值的特征值中进行这一步。这也只能在Sex,Pclass,SibSp,Parch中使用。
Pclass:我们可以明显的看到P=1和幸存者的相关性(>0.5)。我们可以将这个特征加入我们的模型。
Sex:我们确认了女性的极高存活率这个观察结果。
SibSp and Parch:这些组合特征值和幸存者相关性为零,可能最好从单独的值来得到特征关系。
可视化数据分析
现在我们可以通过可视化数据分析来确认我们的假设。
关联数字特征值
让我们开始了解数字特征值和我们目标的关联性。
直方图可以非常有效的分析这些连续的数据变量,比如对年龄进行分段排序。直方图可以通过定义bins或者每个区间来直观展示数据。这将帮助我们了解这些数据间的相关性。
观察
婴儿有较高存活率
年龄最大的乘客存活
年龄在15-25之间没有存活
大多数乘客年龄在15-35之间
决定
这些数据分析确认了我们的假设并且为下一步工作打下基础。
我们可以确定将年龄作为我们模型的训练变量之一。
为年龄特征值的完整性填补空值
我们可以给年龄区间分组
关联数字和序列特征值
我们可以结合大量的特征值用单个图表来显示相关性。可以用数字和已经数字化过的分类特征值来完成。
观察
Pclass=3人数最多,然而大多数都没有存活。这确认了我们的分类设想 #2
在Pclass=2和Pclass=3的婴儿乘客大多数存活。更进一步验证了我们的分类设想 #2
大多数Pclass=1的乘客存活。确认了我们的分类猜想 #3
Pclass变量在年龄区间的存活乘客分布
结论
确认Pclass作为模型训练输入
关联分类特征
现在我们可以将分类特征与我们的方案目标相关联
观察
女性乘客相比男性存活率更大。确认分类 #1
除Embarked=C中男性比女性存活率更高,其他都是女性比男性存活率高。这可以将客舱等级和目的地关联并转化为客场等级与存活率的关系,不需要直接关联目的地与存活率关系。
在P=3的客舱中男性有更高的存活率相比于P=2去往C和Q港口来说。 #2
对于P=3的男性乘客来说存活率出现变化。 关联#1
结论
在模型训练中加入性别特征。
在模型训练中填补和加入登船港口特征。
关联分类和数字特征值
我们可能也想关联明确特征值(非数字值)和数字特征值。我们可以确定关联登陆港口城市,性别,票价和幸存者的关系。
观察
支付更高的票价的乘客更可能存活。确认我们的设想并创建#4票价区间。
登陆港口城市和存活率也有关系。确认关联#1和完整性#2
结论
确认票价特征区间
清洗数据
我们已经得到了一些假设和结论作为我们数据解决方案的准备。到目前为止我们还没有改动过单个特征和数值。现在让我们通过校正、创建和完善目标来验证我们的假设从而得出我们的结论。
特征降维来校正
这是一个好的开始。用特征降维我们可以得到更少的数据,从而加速我们的分析和运算。
基于我们的假设和推断,我们想要去给“客舱号”和“船票”特征降维。
标注出哪些操作需要我们同时在训练集和测试集使用以使其保持一致。
从现存的数据中创建一个新的特征值
在清洗‘姓名’和‘乘客’特征值之前,我们可以“名字”特征值中抽取主题工程化并且检测主题和存活率的相关性。
在接下来的代码中我们用正则化表达式抽取‘名字’的主题特征。模式为(\w+\.) 匹配首个单词并以小数点结束。并以expand=False标志位返回数据框。
观察
当我们绘制主题,年龄和幸存人数时,我们应该注意到:
大多数主题的年龄分组区间十分准确。例如:Master的平均年龄是5岁
幸存者的年龄区间变化明显。
明确的主题大多幸存
结论
我们可以创建一个新的主题特征来进行模型训练
我们可以用跟普遍的名字或者分类比如Rare来代替
我们可以将分类主题转化为连续的数字类型。
现在我们可以方便的给‘名字’特征降维。我们也不需要训练集中的乘客序号了。
对分类特征的转化
现在我们可以将包含字符串的分类特征转化为数值类型。这在大部分模型算法中都是必须的。这样做也可以帮助我们得到完整的目标特征值。
让我们从转换‘性别’特征为新的特征命名为‘性别状态’,其中1代表女性,0代表男性。
填补连续的数字特征值
现在我们可以预估和填补特征值中的缺失值和空值。我们首先来完成‘年龄’特征值。
我们用三种方法来填补连续数字特征值:
1.一种简单的方式是生成平均值和标准差之间的随机数
2.猜测缺失值更准确地方式是利用其它数值的相关性。在这个例子中我们可以获得年龄、性别和客舱等级的相关性。猜测年龄可以用年龄与客舱等级和性别特征的联合中值。比如,P=1和G=0,P=1和G=1的年龄中值等。
3.结合1,2两种方式,根据中值来答题猜值,用均值和标准差之间的随机数,基于客舱和性别的联合值。
方法1和3将为模型引入随机噪声,对于大数据可能更有效。在此我们将更愿意用第二种方法。
让我们基于客舱等级和性别联合分布来预处理空值。
现在我们根据性别和客舱等级的六个联合分布来计算预测值。
让我们创建年龄区间来观察和幸存者的关联。
让我们用区间值来代替年龄数值。
结合已有的数据特征来创建一个新特征值
我们可以创建一个新的特征值‘家庭人数’来结合家庭兄弟姐妹和父母子女人数,这可以让我们去掉数据集中两个变量。
我们可以创建另一个特征‘单身狗’.
我们可以用‘单身狗’特征来替代‘亲友’和‘家庭人口’特征。
我们也可以创建一个人工特征来联合‘客舱等级’和‘年龄’。
填充类别特征
‘登陆港口城市’特征有‘S,Q,C’三个值。我们的训练集中缺失了两个值。我们可以根据出现的大部分值来填补它们。
将类别特征转化为数值
现在我们可以将填补后的‘登陆港口城市’特征用新创建的数字式港口特征来替代。
快速填充和转化数字特征
我们现在可以用特征中出现频率最高的值来填补训练集中缺失的‘船票’特征值。我们仅仅用一行代码就能搞定。
注意我们没有创建一个新的过渡特征或者进一步的分析来猜测缺失值的关联性而是仅仅用单个值来代替。这样填充的目的是为了让模型算法达到运算时没有空值的期望需要。
我们可能也想要让‘船票’特征值仅显示小数点后两位特征值。
将‘船票’特征值转化为连续‘船票区间’值。
模型,预测和解决
现在我们已经准备好去训练模型和预测结果。这里有60多种预测模型算法来选择。我们必须了解问题的类型和结果需求来缩小范围选择一些我们为我们估值的模型。我们的问题是分类和回归的问题。我们想要去定义输出和其他变量或者特征的关系。我们特展示了一系列基于给定训练集的监督学习来训练我们的模型。通过分类和回归两种监督学习模型叠加,我们可以缩小对模型范围的选择。其中包括:
逻辑回归;
KNN 或者 K-Nearest Neighbors
支持向量机
Naive Bayes classifier
决策树
随机森林
Perceptron
神经网络
RVM
逻辑回归在工作流程的早期是非常有用的模型。逻辑回归用逻辑函数的累计逻辑分布来测量一种特征与另外一个或者多个特征变量的可能相关性。
注意根据我们训练集生成的模型置信区间。
我们能利用逻辑回归来验证我们为特征创建和填补目标的假设和结论。这可以通过计算结论函数中的特征系数来完成。
正系数增加了对数响应(也增加了可能性)。并且负系数降低了对数响应(降低了可能性)。
‘性别’是最高正系数,意味着‘性别’特征值增加,存活可能性增加最大。
对于‘客舱等级’的增加,存活可能性降低最多。
‘年龄与客舱等级乘积’作为第二大的存活负相关特征,对于模型来说是一个不错的人工特征;
‘主题’是第二高的正相关特征值。
接下来我们用支持向量机来建模,支持向量机是一种监督学习模型用于对数据进行分类和回归的分析。定义一系列训练样本,每一个都有一个或者多个分类,支持向量机训练算法建立一个模型来对新的测试样本来分类,将它转换成非概率的二分类线性回归问题。
注意模型生成的可信度比逻辑回归模型更高。
模型分析
我们现在可以将所有模型的结果进行排名并选择最好的一个。其中决策时和随机森林的分值相同,我们选择随机森林来校正决策树过拟合问题。
提交模型
我们提交给kaggle的结果在整个竞赛队伍中排名3883/6082.这个结果在比赛进行中可直观看到。这个结果仅仅展示提交数据集的一部分。我们的第一次尝试还不算太差。欢迎给我提供任何有助于排名提升的建议。
总结:
1.介绍工作流程(7个步骤)
2.问题定义
通过给定的数据中特征值与幸存者关系,预测新数据中的幸存者。
3.数据处理方式
A.分类(样本分类,不同类别与结果相关性)
B.关联(哪些数据与结果关联大)
C.转换(类别型数据转换为数值型)
D.填充(null,丢失值)
E.校正(错误值,异常值)
F.创建(转化原有特征,合成新的特征值)
G.图示(图表展示,可视化)
4.获取数据
5.分析数据(各类数据值和数据类型)
6.数据假设
7.特征展开分析(深入分析)
8.数据可视化分析(可视化验证)
9.数据规整(类型数据转化为数值型或者合并、创建新数据)
10.建模预测
11.结果排序
12.结果提交