训练一个机器学习模型,其实大量的时间是花在资料的预处理和探索性资料分析上。尤其是实际中遇到的data都不会太干净,所以花较长的时间来做数据的预处理是很有必要的。

首先来建立一个简单的数据集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
library(mice)
name = c("Andy","Helly","Ann","Ketay","Wang","Liu")
country = c("UK","US","US","US","CH","CH")
gender = c("male","female",NA,"female","male",NA)
age = c(22,19,26,31,45,32)
income = c(12,NA,55,77,32,NA)

data = data.frame(name,country,gender,age,income)
data
# name country gender age income
# 1 Andy UK male 22 12
# 2 Helly US female 19 NA
# 3 Ann US <NA> 26 55
# 4 Ketay US female 31 77
# 5 Wang CH male 45 32
# 6 Liu CH <NA> 32 NA

查找NA

  • 存在NA的rows

    1
    2
    complete.cases(data) # 当一笔资料是完整的,回传TRUE;当一笔资料有遗漏值,回传FALSE
    #[1] TRUE FALSE FALSE TRUE TRUE FALSE
  • 查找缺失值的位置

    1
    which(is.na(data))  #返回缺失值的位置
  • 计算数据集中有缺失的资料笔数所占比例

    1
    2
    3
    loss = sum(is.na(data)) #计算资料集中的缺失值总数
    have = sum(complete.cases(data)) #统计资料集中完整样本的个数
    ratio = loss/(loss+have) #计算缺失值资料的比重

填补NA

  1. na.omit() 可以删除所有含有缺失资料的row

    1
    2
    3
    4
    5
    6
    data1 = na.omit(data)
    data1
    # name country gender age income
    # 1 Andy UK male 22 12
    # 4 Ketay US female 31 77
    # 5 Wang CH male 45 32
  2. 最高频率来填补缺失值.尝试找到这些缺失值最可能的值。

    对于变数分布近似正态分布时可以选用平均值;偏态分布一般采用中位数代表资料中心趋势的指标。

1
2
3
4
5
6
7
8
9
10
11
12
# mean_income = mean(data$income)
data2 = data
#一些函式计算时拥有na.rm=TRUE,可以在计算以前移除缺失值并使用剩余值进行计算
data2[is.na(data2$income),"income"] = mean(data2$income,na.rm = T) #用平均数补充income的缺失值
data2
# name country gender age income
# 1 Andy UK male 22 12
# 2 Helly US female 19 44
# 3 Ann US <NA> 26 55
# 4 Ketay US female 31 77
# 5 Wang CH male 45 32
# 6 Liu CH <NA> 32 44
  1. 函式centralImputation()可以用资料的中心趋势值来填补资料集的所有缺失值

    1
    2
    data3 = data
    data3$income <- centralImputation(data3$income)
  2. 通过变数的相关关系填补缺失值

    1
    2
    3
    4
    5
    6
    7
    8
    #函式cor()的功能是产生变数之间的相关值矩阵,引数use = "complete.obs"可以忽略含有NA的记录
    cor(data[,c("age","income")],use = "complete.obs") # =cor(data[,4:5],use = "complete.obs")
    # age income
    # age 1.00000000 0.07670152
    # income 0.07670152 1.00000000
    lm(age~income,data = data)
    #函式lm()可以用来获取线性模型
    #可以使用上述线性关系计算变数的缺失值
  3. 用K-Nearest Neighbours填补遗漏值

    1
    2
    require(DMwR)
    imputeData <- knnImputation(data)