数据预处理之数据抽样

数据抽样

在数据建模阶段,一般需要将样本分为3部分:训练集、验证集、测试集。训练集用来估计模型,验证集用来确定网络结构或者控制模型复杂度的参数,测试集检验最终选择模型的性能如何。一般划分为70%、15%、15%。当数据量较小时,留少部分作为测试集,把其余N个样本采用K折交叉验证法。即将样本打乱,均匀分K份,轮流选择K-1份,剩余的做验证,计算预测误差平方和,最后对K次的误差平方和在做平均。
1、类失衡处理方法SMOTE

hyper <-read.csv('http://archive.ics.uci.edu/ml/machine-learning-databases/thyroid-disease/hypothyroid.data',
                 header=F)
names <- read.csv('http://archive.ics.uci.edu/ml/machine-learning-databases/thyroid-disease/hypothyroid.names', 
                  header=F, sep='\t')[[1]]
head(names)
names <- gsub(pattern = ":|[.]","",names) #删除冒号、句号
colnames(hyper)<-names  #列重命名
colnames(hyper)[1] <- "target"
hyper$target <- ifelse(hyper$target=="negative",0,1)  #因子替换为数值
table(hyper$target)    #分类统计
prop.table(table(hyper$target))  #分类比例,说明1明显较少
hyper$target <- as.factor(hyper$target)
library("DMwR")
hyper_new <- SMOTE(target ~ .,hyper,perc.over = 100,perc.under = 200)
#perc.over 决定对少数派(假设为a)增加多少的参数百分比,这里相当于增加1倍(b=a+a*100%,新增a)
#perc.under 决定对多数类采样的比例参数,基准为新增少数派(a*100%),这里相当于抽新增少数派的2倍(c=a*100%*200%)
table(hyper_new$target)

2、随机抽样sample

index <- sample(nrow(user),10000)
user_sample <- user[index,]
prop.table(table(user$是否付费))
prop.table(table(user_sample$是否付费))
ratio <- sum(user$是否付费==0)/nrow(user)
d <- 1:nrow(user)
index1 <- sample(d[user$是否付费==0],10000*ratio)
index2 <- sample(d[user$是否付费==1],10000*(1-ratio))
user_sam1 <- user[c(index1,index2),]
prop.table(table(user_sam1$是否付费))  与原比例一致

3、数据等比抽样,createDataPartition

library("caret")
index <- createDataPartition(iris$Species,p=0.1,list = F)
sample<-iris[index,]
prop.table(table(iris$Species))

4、交叉验证的抽样

#构造6组数据
n = nrow(user)
d <- 1:nrow(user)
d2 <- rep(1:6,ceiling(n/6))
d2 <- sample(d2,n)
for(i in 1:6){
  m<-d[d2==i]
  train1 <- user[-m,]
  test1 <- user[m,]
}

另外集成函数createFolds(y,k=10,list=TRUE,returnTrain=FASLE)可以等比例达到效果,
createMultiFolds(y,k=10,times=5)

数据清洗

1、缺失值

palyer <- read.csv("玩家玩牌数据.csv",na.strings = "NA")
table(complete.cases(palyer))
library("mice")
md.pattern(palyer)

在这里插入图片描述

library("VIM")
aggr(palyer,prop = FALSE,numbers = TRUE)

在这里插入图片描述

player1 <- na.omit(palyer)
index1 <- is.na(palyer$玩牌局数)
a <- palyer[,"玩牌局数"]
palyer[index1,"玩牌局数"] <- ceiling(mean(palyer$玩牌局数,na.rm=T))

猜你喜欢

转载自blog.csdn.net/u010380670/article/details/84841677
今日推荐