R语言机器学习笔记(六):mlr数据预处理

2020-07-15 00:00:00 数据 模型 方法 验证 预处理

作者:黄天元,复旦大学博士在读,热爱数据科学与开源工具(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()是利用caretcaret::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

相关文章