R语言-数据预处理

##### 5.2 数据预处理 #####
#数据分割、缺失值处理、剔除近零方差变量、剔除高度线性相关变量、数据标准化
### 载入数据和相应包 ###
# 清空工作目录
rm(list = ls())
# 加载机器学习包
# install.packages(caret)
library(caret)
##1.读入数据
# 加载数据
dat = read.csv('相亲数据2.csv', fileEncoding = "UTF-8")
dim(dat)
head(dat)
##2.分割训练集和测试集
#(1)留出法
#将样本分为两个互斥的子集,80%为训练集,剩下20%为测试集
createDatePartition()
#保证训练集和测试集中Y的比例是一致的
#按照Y进行分层抽样
## 按照因变量进行分层抽样 ##
# 数据划分为训练集和测试集
# 设置随机种子
set.seed(1234)
# 将数据集的80%划分为训练集,20%划分为测试集
trainIndex = createDataPartition(dat$决定, p = .8, 
                                 list = FALSE, 
                                 times = 1)
# createDataPartition会自动从y的各个level随机取出等比例的数据来,组成训练集,可理解为分层抽样;
datTrain = dat[trainIndex, ]
# 训练集
datTest = dat[-trainIndex, ]
# 测试集
#(2)交叉验证法
#将原始数据分成K组(一般是均分)
#每次训练将其中一组作为测试集,另外K-1组作为训练集
set.seed(1234)
index = createFolds(dat$决定, k = 3, list = FALSE, returnTrain = TRUE)
index 
##   [1] 2 3 2 1 1 1 1 3 2 1 3 3 2 3 2
testIndex = which(index == 1)
datTraincv = dat[-testIndex, ]
# 训练集
datTestcv = dat[testIndex, ]
# 测试集
#(3)Bootstrap法
#Bootstrap抽样
#从给定训练集中有放回的均匀抽样
createResample()#times参数用于设定生成几份随机样本
set.seed(1234)
createResample(dat$决定, times = 3, list = F)
#(4)分割时间序列
createTimesSlices()
#initialWindow参数表示第一个训练集中的样本数
#horizon参数表示每个测试集中的样本数
#fixedWindow参数表示每个训练集中的样本数是否相同
# 加载数据
growdata = read.csv('水哥成长日记.csv', fileEncoding = "UTF-8")
head(growdata)
(timeSlices = createTimeSlices(1:nrow(growdata), 
                               initialWindow = 5, horizon = 2, fixedWindow = TRUE))
# 5表示初始的window,2表示测试集是训练集后的2位;fixedwindow表示都是训练集宽度一致,如果想递每次都从第一个样本开始,那么就得设置为FALSE,默认为TRUE。
##3.处理缺失值
preProcess()#该函数提供了三种缺失值填补的方法,即K近邻方法、Bagging树集成方法和中位数法
# 需要注意的是,采用K近邻方法时,会对原始数据进行标准化,如果需要返回原始值,还需将标准化公式倒推回来;
# 使用Bagging树集成方法,理论上对缺失值的填补更权威,但其效率比较低;
# 使用中位数方法,速度非常快,但填补的准确率有待验证。
# 如果你想使用多重插补法,不妨也可以试试mice包,其操作原理是基于MC(蒙特卡洛模拟法)。
# preProcess can be used to impute data sets based only on information in the training #set,注意只能用训练集信息。
#(1) 中位数法 ##
#用训练集的中位数代替缺失值
imputation_k = preProcess(datTrain,method = 'medianImpute')
datTrain1 = predict(imputation_k, datTrain)
(datTest1 = predict(imputation_k, datTest))
median(datTrain$智力, na.rm = T)
# 显然中位数这个填补方法不太合理,除非样本取值比较均匀;注意这里用的也是训练集的中位数
#(2) K近邻方法 ##
#对于需要插值的记录,基于欧氏距离计算k个和它最近的观测,
#然后利用k个近邻的数据来填补缺失值
imputation_k = preProcess(datTrain, method = 'knnImpute')
##  Warning in preProcess.default(datTrain, method = "knnImpute"): These
##  variables have zero variances: 是否喜欢矮矬穷, 对方是否喜欢矮矬穷
datTrain1 = predict(imputation_k, datTrain)
datTest1 = predict(imputation_k, datTest)
datTrain$智力 = datTrain1$智力 * sd(datTrain$智力, na.rm = T) + mean(datTrain$智力, na.rm = T)
datTest$智力 = datTest1$智力 * sd(datTrain$智力, na.rm = T) + mean(datTrain$智力, na.rm = T)
datTest
# 注意,这里自动用的是训练集的mean和sd对测试集进行标准化
#所以最后得到的数据是标准化之后的
#如果想看原始值,那么还需要将其去标准化倒推回去
##4.处理0方差变量(删除近零方差)
nearZeroVar()#找出近零方差的变量
dim(datTrain)
(nzv = nearZeroVar(datTrain))
datTrain = datTrain[, -nzv]
##5.删除共线性变量
findCorrelation()#自动找到高度共线性的变量,并给出建议剔除的变量
#数据中不能有缺失值
#只能包含数值型变量
# 数据中不能有NA
datTrain1 = datTrain[, -c(1, 6)]
(descrCor = cor(datTrain1))
highlyCorDescr = findCorrelation(descrCor, cutoff = .75, names = F, verbose = T)
highlyCorDescr
filteredTrain = datTrain1[, -highlyCorDescr]
# input只能是numeric型的dataframe或者matrix,且无缺失值(在此之前必须处理缺失值)
##6.标准化
preProcValues = preProcess(datTrain, method = c("center", "scale"))
trainTransformed = predict(preProcValues, datTrain)
testTransformed = predict(preProcValues, datTest)
# 利用训练集的均值和方差对测试集进行标准化
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值