在《Kaggle项目实战》 泰坦尼克:从R开始数据挖掘(一)中,我们介绍了R中有关导入数据的知识。我们仅用目标变量作为预测变量,现在试着用数据集中的其他变量来更有效的预测结果吧。
这场灾难中,“妇女和儿童优先”是为人熟知的,所以我们首先看看性别变量和年龄变量,观察一下它们能够导致生存结果的不同。我们首先看一下乘客的性别。将数据载入R后,看一下这个变量的摘要:
> summary(train$Sex)
female male
314 577
船上的大部分乘客是男性(male)。让我们再次使用列联表命令,查看存活结果与性别变量的交叉比例。
> prop.table(table(train$Sex, train$Survived))
0 1
female 0.090909090.26150393
male 0.525252530.12233446
现在结果还不是特别清楚。默认情况下,比率表命令将交叉表中的每一项除以乘客总数作为结果。我们想看到的是每项数据在该行中的比例,即每种性别的存活比例。因此,我们需要在命令中指定返回第1维度的比例。第1维度代表行。(第2维度代表列)
> prop.table(table(train$Sex, train$Survived),1)
0 1
female 0.25796180.7420382
male 0.81109190.1889081
好啦,现在好多啦。我们看到大部分女性存活了下来,同时只有很少的男性存活。在上一次预测中,我们认为全体乘客都丧生了,现在,根据比率表来更改我们的预测吧!让我们使用更多的R语法来更新旧的预测:
> test$Survived <-0
> test$Survived[test$Sex =='female'] <-1
这里,我们使用新的预测列取代了原来的预测“everyone dies”。我们使用0填充了原来的列,当然,这其实并没改变列里的内容。然后,我们将变量“Sex”的值为“female”的项对应的存活预测值设置为1。
我们使用了两个新的R语法符号,“==”和“[]”。方括号用于创建数据框的子集,在这里,双等号的意思不是赋值,而是一个布尔测试,用于查看双等号两端的内容是否相等。
现在,我们向Kaggle发送一个新提交,看看我们的排名是否有所提高!
太棒了!我们的排名上升到了961名!现在让我们分析一下age变量:
> summary(train$Age)
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
0.42 20.12 28.00 29.70 38.00 80.00 177
在数据分析中,数据缺失是十分常见的。造成这种情况的实际原因有很多,这个现象有时很难避免。我们可以用年龄的均值来填补这些缺失值。
我们之前制作的几张表所针对的变量都是分类变量,即变量中仅包含特定的几个值。现在我们分析的是一个连续变量,由于每个年龄对应的乘客只有一两个,因此不能为它制作比率表。因此,让我们创建一个新变量“Child”,来代表乘客是否低于18岁。
> train$Child <-0
> train$Child[train$Age <18] <-1
就像创建预测列那样,我们首先在数据框中创建了一个新列,来指示乘客是否是儿童。然后将年龄变量低于18岁的乘客在该列中的值置换为1。为了做到这一点,我们使用了小于号,这是另一个布尔检验,类似于我们在上一组代码中的双等号。如果你在预览窗口浏览训练集,你会看到那些年龄缺失的乘客对应的“Child”值为0。这符合我们的期望,因为我们打算用年龄平均值填充缺失值,而年龄平均值大于18,因此他们不是儿童。
现在,我们要创建一个包含性别和年龄的表,以查看不同子集中的存活比例。麻烦的是prop.table命令不能完成这个任务,所以我们要用一个新的R命令,aggregate。首先,让我们看一下不同子集中存活者的数量。
> aggregate(Survived ~ Child + Sex, data=train, FUN=sum)
Child Sex Survived
1 0 female 195
2 1 female 38
3 0 male 86
4 1 male 23
aggregate命令接受一个公式作为参数,公式中,波浪符号的左端为目标变量,右端为需要拆分子集的变量。参数data说明公式中的变量存在于哪个数据框中。最后一个参数说明需要在拆分子集后的数据上应用什么函数。上方的命令根据性别和年龄划分了不同的子集,并在每个子集上应用了求和函数。由于我们的目标变量使用1表示存活,0表示死亡,因此求和的结果就是存活者的个数。但我们不知道每个子集中的人数总和,因此让我们来看看吧:
> aggregate(Survived ~ Child + Sex, data=train, FUN=length)
Child Sex Survived
1 0 female 259
2 1 female 55
3 0 male 519
4 1 male 58
这段代码简单地查看了一下每个子集中Survived变量的长度,这个结果与每个子集中0和1的个数均无关。现在我们有了每个子集中的乘客总数,我们想知道每个子集的存活比例,说实话,这有些困难。我们需要创建一个函数,将子集向量作为输入,并对它应用sum函数和length函数,然后运用除法求出存活比例。以下是代码:
> aggregate(Survived ~ Child + Sex, data=train, FUN=function(x) {sum(x)/length(x)})
Child Sex Survived
1 0 female 0.7528958
2 1 female 0.6909091
3 0 male 0.1657033
4 1 male 0.3965517
好吧,以上结果表明女乘客很可能存活下来,男乘客则很可能死亡,无论这些乘客是否为儿童。我们没发现什么能改善预测结果的东西。让我们再看一下其他的变量,看看能不能找到一有用的东西。这些变量包括乘客的舱位,以及他们的船票类型等。
分类变量的值最好不要超过三个,票价又是一个连续变量,我们需要将它离散成能够列表的分类变量。让我们将票价分成低于10美元、介于10美元和20美元之间、介于20美元和30美元、高于30美元等,并将它们存储在新变量中:
> train$Fare2 <-'30+'
> train$Fare2[train$Fare <30& train$Fare >=20] <-'20-30'
> train$Fare2[train$Fare <20& train$Fare >=10] <-'10-20'
> train$Fare2[train$Fare <10] <-'<10'
现在让我们运行一个更长的aggregate函数,来看看能不能找的一些有用的信息:
> aggregate(Survived ~ Fare2 + Pclass + Sex, data=train, FUN=function(x) {sum(x)/length(x)})
Fare2 Pclass Sex Survived
1 20-30 1 female 0.8333333
2 30+ 1 female 0.9772727
3 10-20 2 female 0.9142857
4 20-30 2 female 0.9000000
5 30+ 2 female 1.0000000
6 <10 3 female 0.5937500
7 10-20 3 female 0.5813953
8 20-30 3 female 0.3333333**
9 30+ 3 female 0.1250000**
10 <10 1 male 0.0000000
1120-30 1 male 0.4000000
12 30+ 1 male 0.3837209
13 <10 2 male 0.0000000
1410-20 2 male 0.1587302
1520-30 2 male 0.1600000
16 30+ 2 male 0.2142857
17 <10 3 male 0.1115385
1810-20 3 male 0.2368421
1920-30 3 male 0.1250000
20 30+ 3 male 0.2400000
大多数的男乘客都不能存活,无论他们的舱位或票价如何。我们注意到住在三号舱、票价超过20美金的女乘客也没能乘上救生艇。我已经用星号标出了这两种情况,但R并不知道你在找什么,因此这些星号并不会出现在控制台中。
很难理解为何票价昂贵且住在三号舱的乘客没能获救。是由于这些昂贵的客舱位于冰山撞击点的附近吗?还是由于它们距离救生楼梯比较远?无论背后的原因为何,我们现在要根据这些信息修正我们的预测结果。
> test$Survived <-0
> test$Survived[test$Sex =='female'] <-1
> test$Survived[test$Sex =='female'& test$Pclass ==3& test$Fare >=20] <-0
上面的大多数代码应该是你所熟悉的。唯一的例外是多个布尔测试之间的连接符号。对于复杂的布尔判断,你可以用表示“和”的逻辑运算符&、表示“或”的逻辑运算符“|”来连接。
好啦,让我们创建输出文件,看一看我们有没有改善预测结果。
太棒了,我们又进步了!我们只提高了1.5%的准确率,但在排行榜上前进了数百名!不过我们做了很多的工作,创建了更多的子集,在更深的层次上探索了数据集,这占用了很多时间。
未完待续…
原文连接:
http://trevorstephens.com/kaggle-titanic-tutorial/getting-started-with-r/
PPV课翻译小组原创作品,严禁转载
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有