今天基于既往经验和近期所读书籍做一个简要总结,有关代码和此方面的新知识择期进行更新。
建模的过程看似简单,选择一个模型,套入数据,得到预测。但是要建好模,却并不那么简单。必须要在充分理解任务和数据的前提下,对数据进行相应的预处理和划分,进而构建模型、调整参数;这一过程可以是多个模型同步进行,然后通过效能评估,选择出最优模型的最优参数,最终完成建模。
以下分步骤进行阐述:一、理解数据;二、数据预处理和数据分割;三、模型建立、参数调整和评估; 四、模型选择
一、理解数据(又称探索性分析,Exploratory Data Analysis,EDA)
这个过程是建模的基石。充分理解数据,便于接下来对数据进行清洗和预处理,也有利于对模型的选择形成直觉。理解数据的方式包括统计描述、可视化。
-
1. 针对预测变量
- 连续型:有无缺失值,分布直方图,有无偏态,多个变量间的相关性
- 分类型:有无缺失值,分类统计的结果,如果是多分类则拟构建哑变量(下一步数据预处理)
-
2. 针对结果变量
- 连续型:分布情况
- 分类型:这是我们医学建模任务中最常见的类型。通过分类结果的统计摘要,可以判断分类结果是否为不平衡分布。不平衡分布,会导致建模效果差,特异度低。我们进行数据划分的时候,应该根据结果分类进行分层随机抽样;同时,应对结果变量不平衡的问题,还可以采用类别平衡算法,近期在处理lidan的建模任务时就通过类别平衡算法获得了极大的效能提升。
-
3. 预测变量和结果变量之间的相关性
- 结果分类,预测变量连续:差异性检验(t or 秩和)
- 结果分类,预测变量分类:列联表差异 or 关联性分析
- 结果连续,预测变量连续:散点图及相关性分析
- 结果连续,预测变量分类:差异性检验(t or 秩和)
二、数据预处理和数据划分
数据预处理就是基于第一步的数据理解,对数据进行增加 or 删减 or 变换. 预处理的方法不一而足,但最有效的方法,往往还是 “ 建立在建模者对问题的理解,而非任何数学方法上 ”
要额外说明的是,有的模型自带特征筛选的功能(如LASSO),
而模型内嵌的特征筛选,能够最大程度地适应模型需要(所谓需要,即在保有模型预测性能的前提下,尽可能减少特征)
不在此处讨论范围内
-
预测变量预处理
-
连续型:是数据预处理的主要阵地,包括:
-
单个变量:
-
处理缺失值
- 首先要去了解缺失值产生的原因。假设药物极其无效或有明显副作用,则病人很可能不来再来找医生,这种疗效评价缺失数据是和治疗方式显著有关的;这种缺失和结果变量间是有关的,称为“有信息量的缺失”
- 又例如一个男人的后代数目可能是缺失的,这种称为结构性缺失(我理解这类缺失是必然的、合理的存在)
- 缺失数据应该和删失数据相鉴别:删失数据是指生存数据这类既有时间长度,又有定性结果的数据,至随访终点仍未产生明确的定性结果:患者至今仍存活,客户至今未归还借阅的光盘等。在处理删失数据时,有时候会直接当做缺失数据处理,有时会以至今的数据为准(因为我们可以肯定这个时间至少持续了这么久),或者在[0,至今时间]这样一个区间随机选择一个数据作为观测值。
- 处理缺失数据的办法:1.直接删除,但对于小样本而言不可行;2. 一些基于树的模型能够处理有缺失值的数据 3. 缺失值插补:缺失值的插补,是利用完整数据和缺失数据的相关性,预测缺失的数据,进而填补空缺。因此,是建模之前的另一层建模,也因而具有不确定性。插补应该嵌入到重抽样过程中(如果我们做了重抽样)。
中心化(所有变量减去其均值)和标准化(每个变量除以自身标准差)、z-score同时进行了中心化和标准化。中心化和标准化能够提升某些模型(如PLS)的表现,但缺陷在于失去了观测值的可解释性
偏度变换:右偏是指相对分布右侧的大值而言,大量的样本落在分布左边(小值)。BOX-COX变换族以λ为变量,包含了平方变换、平方根变换、倒数变换等一系列变换算法;能够改善数据偏度的情况。
-
剔除方差为零或近似为零的变量。近零方差变量的判定准则:
不重复取值的数目与样本量比值低(<=10%)
最高频数和次高频数的比值高(>=20)
同时满足上述两条件,则建议删除该预测变量 -
检查并删除多重共线性变量中的一部分。检查共线性的方法包括:
- 相关性热图
- PCA:如果第1主成分占据了总方差的大部分,则说明至少有一组预测变量包括了相同的信息;如果前3个主成分对总方差贡献大,则说明有3组变量间有显著相关性。PCA载荷量可以用来理解每个主成分和哪些预测变量相关,从而梳理出这些关系。
- 删除共线性的方法:1. PCA后就自然删除了共线性 2. Caret提供了一种逐步删除共线性变量的算法(《应用预测建模》P35)
-
区间化预测变量(连续型变量转化为分类变量):例如我们通常将某个gene or gene signature的表达值以中位数作为cutoff分为high/low分组,就是一种区间化预测变量的思想。
优势:简单,有利于得到明确的判定法则
劣势:导致模型表现下降(显然是损失了预测变量的信息);假阳性率增高
-
-
多个变量:即对特征进行整体变换,应在完成单个数据的预处理(如偏度变换、中心化和标准化)后进行
-
处理离群值
通常离群值的处理应该是放在单个变量中的,例如画连续变量的箱线图可以看出离群值的分布情况。但究竟什么样的点属于离群值,其实并没有明确定义。
单纯的离群值删除是不可取的,除非是明显有数值错误的离群值(如为负数的血压测量值)否则常规情况下,无法判断离群值究竟是来自于真实数据的另一个域,因为目前样本量不够所造成(这种情况为主);还是真正的离群值。
《应用预测建模》书中(P25)所述,有的算法(树模型、SVM)对离群值是有抗性的,而离群值的处理算法是针对所有预测变量进行空间表示变换,其变换是将所有样本点映射到高维的、离球心距离相等的球面上。在做此操作前,应进行中心化和标准化,并且完成该操作后,不应该再进行数据的移除,否则会导致一系列问题-
降维数据变换:通常是所有原始变量的函数。为避免预测变量分布偏态或者标度不同的问题影响数据变换,应在这之前对有偏变量进行变换、以及变量的中心化和标准化。
如PCA等;使用PCA之前,应对有偏数据进行变换,然后进行中心化和标准化:
-
-
-
-
分类型:几乎不需要预处理,对于多分类变量,构建哑变量即可
-
结果变量预处理
对结果变量通常并不能使用任何的变换。当然,如果结果变量为NA,我们应该考虑将该样本删除;此外,就是关于分类结果变量分布不平衡的问题。首先,在划分数据集的时候,应按照结果变量的比例进行分层随机抽样;此外,如果结果极不平衡导致建模效能,可考虑采用各种采样方法(见参考文献),强行构造样本,使得样本结果分布均衡。
-
数据分割
数据分割可以是简单的随机抽样,将样本分为训练集和验证集;也可以是分层随机抽样,根据结果变量的比例来分割成训练集和验证集;但实际建模过程中,多使用重抽样技术来对样本进行反复分割和利用,这样既能够提高样本的利用率,还能够构建更为鲁棒的模型,提高模型的泛化能力。重抽样方法技术:
- K折交叉验证(含结果分层的K折交叉验证):可以重复K折交叉验证;留一交叉验证是K折交叉验证的特例
- 广义交叉验证(GCV)
- 留多交叉验证/蒙特卡罗交叉验证,又称重复训练/测试集划分
- Bootstrap方法:“632法” 是Bootstrap的改进版
三、模型建立、参数调整和评估 以及 四、模型选择
- 模型构建之前应该选择模型:选择几个较复杂的、通常预测准确率较高的模型;选择几个较为简单的、可解释度高的模型
-
- 多个模型同时构建,每个模型各自进行参数调整。调参的方法包括:
- 1)预先定义参数候选值集合,然后分别代入,选择最优模型值
- 2)遗传算法、单纯型搜索法
- 3)预先定义损失函数,然后让模型自动调参。深度学习通常这样做;但其实传统机器学习算法也可以。Cohen等(2005) 比较了SVM中搜索调优参数值的不同方式
- 对比各模型的准确度、复杂度、可解释度和运算效率;综合考量后确定最终模型