前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《Kaggle项目实战》 泰坦尼克:从R开始数据挖掘(二)

《Kaggle项目实战》 泰坦尼克:从R开始数据挖掘(二)

作者头像
小莹莹
发布2018-04-23 14:14:35
1.2K0
发布2018-04-23 14:14:35
举报

第二部分:使用分类变量预测存活结果

《Kaggle项目实战》 泰坦尼克:从R开始数据挖掘(一)中,我们介绍了R中有关导入数据的知识。我们仅用目标变量作为预测变量,现在试着用数据集中的其他变量来更有效的预测结果吧。

这场灾难中,“妇女和儿童优先”是为人熟知的,所以我们首先看看性别变量和年龄变量,观察一下它们能够导致生存结果的不同。我们首先看一下乘客的性别。将数据载入R后,看一下这个变量的摘要:

代码语言:javascript
复制
> summary(train$Sex)
代码语言:javascript
复制
female   male
代码语言:javascript
复制
   314    577

船上的大部分乘客是男性(male)。让我们再次使用列联表命令,查看存活结果与性别变量的交叉比例。

代码语言:javascript
复制
> prop.table(table(train$Sex, train$Survived))
代码语言:javascript
复制
                  0          1
代码语言:javascript
复制
  female 0.090909090.26150393
代码语言:javascript
复制
  male   0.525252530.12233446

现在结果还不是特别清楚。默认情况下,比率表命令将交叉表中的每一项除以乘客总数作为结果。我们想看到的是每项数据在该行中的比例,即每种性别的存活比例。因此,我们需要在命令中指定返回第1维度的比例。第1维度代表行。(第2维度代表列)

代码语言:javascript
复制
> prop.table(table(train$Sex, train$Survived),1)
代码语言:javascript
复制
                 0         1
代码语言:javascript
复制
  female 0.25796180.7420382
代码语言:javascript
复制
  male   0.81109190.1889081

好啦,现在好多啦。我们看到大部分女性存活了下来,同时只有很少的男性存活。在上一次预测中,我们认为全体乘客都丧生了,现在,根据比率表来更改我们的预测吧!让我们使用更多的R语法来更新旧的预测:

代码语言:javascript
复制
> test$Survived <-0
代码语言:javascript
复制
> test$Survived[test$Sex =='female'] <-1

这里,我们使用新的预测列取代了原来的预测“everyone dies”。我们使用0填充了原来的列,当然,这其实并没改变列里的内容。然后,我们将变量“Sex”的值为“female”的项对应的存活预测值设置为1。

我们使用了两个新的R语法符号,“==”和“[]”。方括号用于创建数据框的子集,在这里,双等号的意思不是赋值,而是一个布尔测试,用于查看双等号两端的内容是否相等。

现在,我们向Kaggle发送一个新提交,看看我们的排名是否有所提高!

太棒了!我们的排名上升到了961名!现在让我们分析一下age变量:

代码语言:javascript
复制
> summary(train$Age)
代码语言:javascript
复制
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's
代码语言:javascript
复制
   0.42   20.12   28.00   29.70   38.00   80.00     177

在数据分析中,数据缺失是十分常见的。造成这种情况的实际原因有很多,这个现象有时很难避免。我们可以用年龄的均值来填补这些缺失值。

我们之前制作的几张表所针对的变量都是分类变量,即变量中仅包含特定的几个值。现在我们分析的是一个连续变量,由于每个年龄对应的乘客只有一两个,因此不能为它制作比率表。因此,让我们创建一个新变量“Child”,来代表乘客是否低于18岁。

代码语言:javascript
复制
> train$Child <-0
代码语言:javascript
复制
> train$Child[train$Age <18] <-1

就像创建预测列那样,我们首先在数据框中创建了一个新列,来指示乘客是否是儿童。然后将年龄变量低于18岁的乘客在该列中的值置换为1。为了做到这一点,我们使用了小于号,这是另一个布尔检验,类似于我们在上一组代码中的双等号。如果你在预览窗口浏览训练集,你会看到那些年龄缺失的乘客对应的“Child”值为0。这符合我们的期望,因为我们打算用年龄平均值填充缺失值,而年龄平均值大于18,因此他们不是儿童。

现在,我们要创建一个包含性别和年龄的表,以查看不同子集中的存活比例。麻烦的是prop.table命令不能完成这个任务,所以我们要用一个新的R命令,aggregate。首先,让我们看一下不同子集中存活者的数量。

代码语言:javascript
复制
> aggregate(Survived ~ Child + Sex, data=train, FUN=sum)
代码语言:javascript
复制
  Child    Sex Survived
代码语言:javascript
复制
1     0 female      195
代码语言:javascript
复制
2     1 female       38
代码语言:javascript
复制
3     0   male       86
代码语言:javascript
复制
4     1   male       23

aggregate命令接受一个公式作为参数,公式中,波浪符号的左端为目标变量,右端为需要拆分子集的变量。参数data说明公式中的变量存在于哪个数据框中。最后一个参数说明需要在拆分子集后的数据上应用什么函数。上方的命令根据性别和年龄划分了不同的子集,并在每个子集上应用了求和函数。由于我们的目标变量使用1表示存活,0表示死亡,因此求和的结果就是存活者的个数。但我们不知道每个子集中的人数总和,因此让我们来看看吧:

代码语言:javascript
复制
> aggregate(Survived ~ Child + Sex, data=train, FUN=length)
代码语言:javascript
复制
  Child    Sex Survived
代码语言:javascript
复制
1     0 female      259
代码语言:javascript
复制
2     1 female       55
代码语言:javascript
复制
3     0   male      519
代码语言:javascript
复制
4     1   male       58

这段代码简单地查看了一下每个子集中Survived变量的长度,这个结果与每个子集中0和1的个数均无关。现在我们有了每个子集中的乘客总数,我们想知道每个子集的存活比例,说实话,这有些困难。我们需要创建一个函数,将子集向量作为输入,并对它应用sum函数和length函数,然后运用除法求出存活比例。以下是代码:

代码语言:javascript
复制
> aggregate(Survived ~ Child + Sex, data=train, FUN=function(x) {sum(x)/length(x)})
代码语言:javascript
复制
  Child    Sex  Survived
代码语言:javascript
复制
1     0 female 0.7528958
代码语言:javascript
复制
2     1 female 0.6909091
代码语言:javascript
复制
3     0   male 0.1657033
代码语言:javascript
复制
4     1   male 0.3965517

好吧,以上结果表明女乘客很可能存活下来,男乘客则很可能死亡,无论这些乘客是否为儿童。我们没发现什么能改善预测结果的东西。让我们再看一下其他的变量,看看能不能找到一有用的东西。这些变量包括乘客的舱位,以及他们的船票类型等。

分类变量的值最好不要超过三个,票价又是一个连续变量,我们需要将它离散成能够列表的分类变量。让我们将票价分成低于10美元、介于10美元和20美元之间、介于20美元和30美元、高于30美元等,并将它们存储在新变量中:

代码语言:javascript
复制
> train$Fare2 <-'30+'
代码语言:javascript
复制
> train$Fare2[train$Fare <30& train$Fare >=20] <-'20-30'
代码语言:javascript
复制
> train$Fare2[train$Fare <20& train$Fare >=10] <-'10-20'
代码语言:javascript
复制
> train$Fare2[train$Fare <10] <-'<10'

现在让我们运行一个更长的aggregate函数,来看看能不能找的一些有用的信息:

代码语言:javascript
复制
> aggregate(Survived ~ Fare2 + Pclass + Sex, data=train, FUN=function(x) {sum(x)/length(x)})
代码语言:javascript
复制
   Fare2 Pclass    Sex  Survived
代码语言:javascript
复制
1  20-30      1 female 0.8333333
代码语言:javascript
复制
2    30+      1 female 0.9772727
代码语言:javascript
复制
3  10-20      2 female 0.9142857
代码语言:javascript
复制
4  20-30      2 female 0.9000000
代码语言:javascript
复制
5    30+      2 female 1.0000000
代码语言:javascript
复制
6    <10      3 female 0.5937500
代码语言:javascript
复制
7  10-20      3 female 0.5813953
代码语言:javascript
复制
8  20-30      3 female 0.3333333**
代码语言:javascript
复制
9    30+      3 female 0.1250000**
代码语言:javascript
复制
10   <10      1   male 0.0000000
代码语言:javascript
复制
1120-30      1   male 0.4000000
代码语言:javascript
复制
12   30+      1   male 0.3837209
代码语言:javascript
复制
13   <10      2   male 0.0000000
代码语言:javascript
复制
1410-20      2   male 0.1587302
代码语言:javascript
复制
1520-30      2   male 0.1600000
代码语言:javascript
复制
16   30+      2   male 0.2142857
代码语言:javascript
复制
17   <10      3   male 0.1115385
代码语言:javascript
复制
1810-20      3   male 0.2368421
代码语言:javascript
复制
1920-30      3   male 0.1250000
代码语言:javascript
复制
20   30+      3   male 0.2400000

大多数的男乘客都不能存活,无论他们的舱位或票价如何。我们注意到住在三号舱、票价超过20美金的女乘客也没能乘上救生艇。我已经用星号标出了这两种情况,但R并不知道你在找什么,因此这些星号并不会出现在控制台中。

很难理解为何票价昂贵且住在三号舱的乘客没能获救。是由于这些昂贵的客舱位于冰山撞击点的附近吗?还是由于它们距离救生楼梯比较远?无论背后的原因为何,我们现在要根据这些信息修正我们的预测结果。

代码语言:javascript
复制
> test$Survived <-0
代码语言:javascript
复制
> test$Survived[test$Sex =='female'] <-1
代码语言:javascript
复制
> 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课翻译小组原创作品,严禁转载

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-12-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PPV课数据科学社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第二部分:使用分类变量预测存活结果
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档