R语言机器学习笔记(六):mlr数据预处理
作者:黄天元,复旦大学博士在读,热爱数据科学与开源工具(R),致力于利用数据科学迅速积累行业经验优势和科学知识发现,涉猎内容包括但不限于信息计量、机器学习、数据可视化、应用统计建模、知识图谱等,著有《R语言高效数据处理指南》(《R语言数据高效处理指南》(黄天元)【摘要 书评 试读】- 京东图书)。知乎专栏:R语言数据挖掘。邮箱:huang.tian-yuan@qq.com.欢迎合作交流。
前文提要:
HopeR:R语言机器学习笔记(一):mlr总纲
HopeR:R语言机器学习笔记(二):mlr任务定义
HopeR:R语言机器学习笔记(三):mlr学习器定义
HopeR:R语言机器学习笔记(四):mlr模型训练
HopeR:R语言机器学习笔记(五):mlr模型预测
数据预处理的手段非常多,包括缺失值处理、离群值去除、合并少数类等等。在mlr中,有一下一系列函数可以来做数据预处理:
-
capLargeValues()
:转换大/无限数值。 -
createDummyFeatures()
:为因子特征生成虚拟变量。 -
dropFeatures()
:删除选定的特征。 -
joinClassLevels()
:仅用于分类,将已有的类合并为新的更大的一类。 -
mergeSmallFactorLevels()
:合并出现次数较少的因子。 -
normalizeFeatures()
:通过不同的方法对特征进行归一化,例如标准化或缩放到一定范围。 -
removeConstantFeatures()
:删除常数特征。 -
subsetTask()
:从中任务中获取部分自己,如特定观测或特征。
预处理的方法与学习器的构建可以放在一起。这是因为不同的学习器(模型)往往需要不同的预处理方法。此外,这也能够有效避免不当的处理。这里我们要区分数据依赖的预处理和数据独立的预处理。距离说明,如果在没有划分训练集与验证集之前,我们就对特征的均值来插补其缺失,那么就会导致信息泄露,让后续的验证可能会出现过拟合。但是,如果我们随便选择一个常数来插入,则不会出现这种问题。
mlr中有两个主要的预处理函数:
-
makePreprocWrapperCaret()
是利用caret
的caret::preProcess()
函数来对原始数据进行一系列的预处理。 -
makePreprocWrapper()
通过定义在训练之前和预测之前要采取的操作,可以编写自己的自定义预处理方法。
由于预处理与学习器放在一起,那么就会在任务Task不变的前提下,每个预处理都是针对单个数据集的(如训练集和验证集,不会针对整体来做。如利用训练集的均值插入训练集,利用验证集的均值插入验证集),而且预处理的参数可以与模型的超参数一起进行调整(如插补方法的不同于模型超参数的交互)。
下面我们不妨先用makePreprocWrapperCaret()做示范,利用官网的例子进行解释。用一个二分类的例子,用QDA模型(二次判别分析,全称Quadratic Discriminant Analysis)做分类,并使用PCA作为预处理,让所有轴能够解释至少90%的变异性。
sonar.task
## Supervised task: Sonar-example
## Type: classif
## Target: Class
## Observations: 208
## Features:
## numerics factors ordered functionals
## 60 0 0 0
## Missings: FALSE
## Has weights: FALSE
## Has blocking: FALSE
## Has coordinates: FALSE
## Classes: 2
## M R
## 111 97
## Positive class: M
lrn = makePreprocWrapperCaret("classif.qda", ppc.pca = TRUE, ppc.thresh = 0.9)
lrn
## Learner classif.qda.preproc from package MASS
## Type: classif
## Name: ; Short name:
## Class: PreprocWrapperCaret
## Properties: twoclass,multiclass,numerics,factors,prob
## Predict-Type: response
## Hyperparameters: ppc.BoxCox=FALSE,ppc.YeoJohnson=FALSE,ppc.expoTrans=FALSE,ppc.center=TRUE,ppc.scale=TRUE,ppc.range=FALSE,ppc.knnImpute=FALSE,ppc.bagImpute=FALSE,ppc.medianImpute=FALSE,ppc.pca=TRUE,ppc.ica=FALSE,ppc.spatialSign=FALSE,ppc.corr=FALSE,ppc.zv=FALSE,ppc.nzv=FALSE,ppc.thresh=0.9,ppc.na.remove=TRUE,ppc.k=5,ppc.fudge=0.2,ppc.numUnique=3,ppc.cutoff=0.9,ppc.freqCut=19,ppc.uniqueCut=10
相关文章