SharEDITor

机器学习教程 十九-看数据科学家是如何找回丢失的数据的(一)

大数据 机器学习教程 发表于 2016-09-03 17:11:59 阅读1846次


在做特征工程过程中,经常遇到某些样本缺失了某个特征的值,影响我们的机器学习过程,如果是较小的样本集数据科学家可不会直接舍弃这些样本,而是利用有效的手段把丢失的数据找回来,他们是怎么找回的呢?我接下来的几篇文章会通过实例讲几种缺失值补全的方法

请尊重原创,转载请注明来源网站www.shareditor.com以及原始链接地址

补全数据的纯手工方案

我们以泰坦尼克号数据集为例(不了解这个数据集请见《十八-R语言特征工程实战》)。

先重温一下这个数据集里面都有哪些字段:

PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked

分别表示:

样本编号、是否得救、乘客级别、姓名、性别、年龄、船上的兄弟姐妹数、船上的父母子女数、船票编号、票价、客舱编号、登船港口。

我们检查一下Embarked这个字段哪些乘客是缺失的:

> full$PassengerId[full$Embarked == '']
[1] 62  830

看来在这1309位乘客中PassengerId 为62和830的乘客缺失了Embarked字段值,那么我们如何来补全这个数据呢?我们分析一下哪个字段可能和Embarked(登船港口)的值有关,我们猜测票价有可能和Embarked有关,但是不同级别的票价一定又是不一样的,那么我们可以看一下不同级别票价的统计规律,庆幸的是Embarked只有三个取值:C Q S分别表示C = Cherbourg; Q = Queenstown; S = Southampton

我们先来看一下62  830的票价和乘客级别是多少:

> full[c(62, 830), 'Fare']
[1] 80 80
> full[c(62, 830), 'Pclass']
[1] 1 1

等级都是1级,票价都是80

现在我们再看下这三个港口对应不同级别的乘客平均票价是多少,在此之前我们先排除掉62  830这两位乘客的数据:

> library("dplyr")
> embark_fare <- full %>% filter(PassengerId != 62 & PassengerId != 830)

下面我们利用强大的ggplot2画出盒图(boxplot),首先说一下什么是盒图,盒图由五个数值点组成:最小值(min),下四分位数(Q1),中位数(median),上四分位数(Q3),最大值(max)。也可以往盒图里面加入平均值(mean)。下四分位数、中位数、上四分位数组成一个“带有隔间的盒子”。上四分位数到最大值之间建立一条延伸线,这个延伸线成为“胡须(whisker)”。盒图用来反映离散数据的分布情况。

下面我们画出不同Embarked、不同等级乘客对应的Fare的盒图

> library("ggplot2")
> library('ggthemes')
> ggplot(embark_fare, aes(x = Embarked, y = Fare, fill = factor(Pclass))) +geom_boxplot()+geom_hline(aes(yintercept=80),colour='red', linetype='dashed', lwd=2)+theme_few()

讲解一下这个命令,geom_boxplot表示画盒图,geom_hline表示沿着横轴方向画线,如果想沿着纵轴那么就用geom_vline,lwd表示线宽

为了能找到和62, 830两位乘客相似的情况,单独把Fare为80的位置画出了一条横线,用来参照。我们发现Pclass=1的乘客Fare均值最接近80的是C港口,因此我们把这两位乘客的Embarked就赋值为C:

> full$Embarked[c(62, 830)] <- 'C'

当然我们还可以画这样一张图来看待这个事情:

> ggplot(full[full$Pclass == '1' & full$Embarked == 'C', ],
+ aes(x = Fare)) +
+ geom_density(fill = '#99d6ff', alpha=0.4) +
+ geom_vline(aes(xintercept=median(Fare, na.rm=T)),
+ colour='red', linetype='dashed', lwd=1) +
+ geom_vline(aes(xintercept=80),colour='green',linetype='dashed', lwd=1) +
+ theme_few()

讲解一下:这里选择Pclass==1,Embarked == 'C'的数据,画出了概率密度曲线,同时把Fare的均值画了一条红色的竖线,也在Fare=80的位置画了一条绿色的竖线作为参照,可以直观看出均值和80很接近

本文部分内容参考:https://www.kaggle.com/mrisdal/titanic/exploring-survival-on-the-titanic/comments