一、数据质量问题
在数据建模过程中必须关注数据质量问题,例如数据缺失、数据异常、数据重复、数据覆盖率、数据时效性等。
解决这些问题的方法包括数据清洗、数据预处理、异常值检测、外部数据引入、剔除无效变量等等。
外部数据质量探索分析,包括数据分布、数据定义、数据尺度等与内部数据是否一致
一般接第三方数据,都会先启动数据测试,通过一定数量,且经过筛选的特定存量数据跟对方碰撞。测试对方数据的覆盖及缺失情况,这是基础的数据质量。接下来会测试对方数据对于风控的有效性,一般会通过一些常用指标看对自身客群的好坏区分度有多高。
模型设计需要的三大基础分析包括Vintage分析、逾期趋势分析、滚动率分析等,一般也在该阶段完
二、样本不平衡
样本数据不平衡是我们建模场景中经常遇到的问题,由于目标类别的分布占比差异较大,使得模型训练难以取得较好的拟合效果,甚至模型结果在实际应用中无效
解决方法:通过某种方法使得不同类别的样本对于模型学习中的Loss(或梯度)贡献是比较均衡的。以消除模型对不同类别的偏向性,学习到更为本质的特征
2.1 样本层面
2.1.1 欠采样、过采样
最直接的处理方式就是样本数量的调整了,常用的可以:
- 欠采样:减少多数类的数量(如随机欠采样、NearMiss、ENN)。
- 过采样:尽量多地增加少数类的的样本数量(如随机过采样、后续的数据增强方法),以达到类别间数目均衡。
- 还可结合两者做混合采样(如Smote+ENN)。
过采样后的数据由于反复出现了部分样本,模型会过度学习这些样本数据的信息,从而导致模型产生一定程度的过拟合;欠采样后的数据由于丢失部分样本数据,模型未能学习到所有样本的信息,使模型出现一定程度的欠拟合现象。此外,样本加权的方法虽然未变换样本数据量的多少,但给各类样本赋予合理的权重大小始终是一个难点,而在实际应用中一般是让各个目标分类间的加权损失值近似相等。
2.1.2 数据增强
数据增强(Data Augmentation)是在不实质性的增加数据的情况下,从原始数据加工出更多数据的表示,提高原数据的数量及质量,以接近于更多数据量产生的价值,从而提高模型的学习效果;
2.1.2.1基于样本变换的数据增强
- 单样本增强(主要用于图像):主要有几何操作、颜色变换、随机擦除、添加噪声等方法产生新的样本,可参见imgaug开源库。
- 多样本增强:是通过组合及转换多个样本,主要有Smote类(可见imbalanced-learn.org/stable/references/over_sampling.html)、SamplePairing、Mixup等方法在特征空间内构造已知样本的邻域值样本。
- 基于深度学习的数据增强:生成模型如变分自编码网络(Variational Auto-Encoding network, VAE)和生成对抗网络(Generative Adversarial Network, GAN),其生成样本的方法也可以用于数据增强。这种基于网络合成的方法相比于传统的数据增强技术虽然过程更加复杂, 但是生成的样本更加多样。
2.1.3 注意点
数据样本层面解决不均衡的方法,需要关注的是:
- 随机欠采样可能会导致丢弃含有重要信息的样本。在计算性能足够下,可以考虑数据的分布信息(通常是基于距离的邻域关系)的采样方法,如ENN、NearMiss等。
- 随机过采样或数据增强样本也有可能是强调(或引入)片面噪声,导致过拟合。也可能是引入信息量不大的样本。此时需要考虑的是调整采样方法,或者通过半监督算法(可借鉴Pu-Learning思路)选择增强数据的较优子集,以提高模型的泛化能力。
2.2 损失函数的层面
损失函数层面主流的方法也就是常用的代价敏感学习(cost-sensitive),为不同的分类错误给予不同惩罚力度(权重),在调节类别平衡的同时,也不会增加计算复杂度。
2.2.1 class weight
class_weight:用于标示分类模型中各种类型的权重,可以是一个字典或者’balanced’字符串,默认为不输入,也就是不考虑权重,即为None。如果选择输入的话,可以选择balanced让类库自己计算类型权重,或者自己输入各个类型的权重。举个例子,比如对于0,1的二元模型,我们可以定义class_weight={0:0.9,1:0.1},这样类型0的权重为90%,而类型1的权重为10%。如果class_weight选择balanced,那么类库会根据训练样本量来计算权重。某种类型样本量越多,则权重越低,样本量越少,则权重越高。当class_weight为balanced时,类权重计算方法如下:n_samples / (n_classes * np.bincount(y))。n_samples为样本数,n_classes为类别数量,np.bincount(y)会输出每个类的样本数,例如y=[1,0,0,1,1],则np.bincount(y)=[2,3]。
2.2.2 OHEM 和 Focal Loss
- OHEM(Online Hard Example Mining)算法的核心是选择一些hard examples(多样性和高损失的样本)作为训练的样本,针对性地改善模型学习效果。对于数据的类别不平衡问题,OHEM的针对性更强。
- Focal loss的核心思想是在交叉熵损失函数(CE)的基础上增加了类别的不同权重以及困难(高损失)样本的权重(如下公式),以改善模型学习效果。
2.3 模型层面
模型方面主要是选择一些对不均衡比较不敏感的模型:
对比逻辑回归模型(lr学习的是全量训练样本的最小损失,自然会比较偏向去减少多数类样本造成的损失),决策树在不平衡数据上面表现相对好一些,树模型是按照增益递归地划分数据(如下图),划分过程考虑的是局部的增益,全局样本是不均衡,局部空间就不一定,所以比较不敏感一些(但还是会有偏向性)
解决不均衡问题,更为优秀的是基于采样+集成树模型等方法,可以在类别不均衡数据上表现良好。
2.3.1 采集+集成学习
这类方法简单来说,通过重复组合少数类样本与抽样的同样数量的多数类样本,训练若干的分类器进行集成学习。
- BalanceCascade BalanceCascade基于Adaboost作为基分类器,核心思路是在每一轮训练时都使用多数类与少数类数量上相等的训练集,然后使用该分类器对全体多数类进行预测,通过控制分类阈值来控制FP(False Positive)率,将所有判断正确的类删除,然后进入下一轮迭代继续降低多数类数量。
- EasyEnsemble EasyEnsemble也是基于Adaboost作为基分类器,就是将多数类样本集随机分成 N 个子集,且每一个子集样本与少数类样本相同,然后分别将各个多数类样本子集与少数类样本进行组合,使用AdaBoost基分类模型进行训练,最后bagging集成各基分类器,得到最终模型。示例代码可见:www.kaggle.com/orange90/ensemble-test-credit-score-model-example
通常,在数据集噪声较小的情况下,可以用BalanceCascade,可以用较少的基分类器数量得到较好的表现(基于串行的集成学习方法,对噪声敏感容易过拟合)。噪声大的情况下,可以用EasyEnsemble,基于串行+并行的集成学习方法,bagging多个Adaboost过程可以抵消一些噪声影响。此外还有RUSB、SmoteBoost、balanced RF等其他集成方法可以自行了解。
2.3.2 异常检测
类别不平衡很极端的情况下(比如少数类只有几十个样本),将分类问题考虑成异常检测(anomaly detection)问题可能会更好。
异常检测是通过数据挖掘方法发现与数据集分布不一致的异常数据,也被称为离群点、异常值检测等等。无监督异常检测按其算法思想大致可分为几类:基于聚类的方法、基于统计的方法、基于深度的方法(孤立森林)、基于分类模型(one-class SVM)以及基于神经网络的方法(自编码器AE)等等。
2.4 决策及评估指标
对于分类常用的precision、recall、F1、混淆矩阵,样本不均衡的不同程度,都会明显改变这些指标的表现。
对于类别不均衡下模型的预测,我们可以做分类阈值移动,以调整模型对于不同类别偏好的情况(如模型偏好预测负样本,偏向0,对应的我们的分类阈值也往下调整),达到决策时类别平衡的目的。这里,通常可以通过P-R曲线,选择到较优表现的阈值。
对于类别不均衡下的模型评估,可以采用AUC、AUPRC(更优)评估模型表现。AUC的含义是ROC曲线的面积,其数值的物理意义是:随机给定一正一负两个样本,将正样本预测分值大于负样本的概率大小。AUC对样本的正负样本比例情况是不敏感,即使正例与负例的比例发生了很大变化,ROC曲线面积也不会产生大的变化。
总结
通过解决样本不均衡,可以减少模型学习样本比例的先验信息,以获得能学习到辨别好坏本质特征的模型。可以将不均衡解决方法归结为:通过某种方法使得不同类别的样本对于模型学习中的Loss(或梯度)贡献是比较均衡的。具体可以从数据样本、模型算法、目标函数、评估指标等方面进行优化,其中数据增强、代价敏感学习及采样+集成学习是比较常用的,效果也是比较明显的。其实,不均衡问题解决也是结合实际再做方法选择、组合及调整,在验证中调优的过程。
原文链接:https://blog.youkuaiyun.com/Angelina_Jolie/article/details/134004222
三、多重共线性
多重共线性是指线性回归模型中的解释变量之间由于存在精确相关关系或高度相关关系而使模型估计失真或难以估计准确。
3.1 产生原因
(1)经济变量相关的共同趋势
(2)滞后变量的引入
(3)样本资料的限制
(4)错误地使用虚拟变量。(比如,同时将男、女两个虚拟变量都放入模型,此时必定出现共线性,称为完全共线性)
3.2 判别标准
1)VIF——方差扩大因子
VIF值越大,多重共线性越严重。一般认为VIF大于10时(严格是5),代表模型存在严重的共线性问题。
2)相关分析
直接对自变量进行相关分析,查看相关系数和显著性也是一种判断方法。如果一个自变量和其他自变量之间的相关系数显著,则代表可能存在多重共线性问题。一般相关系数高于0.8,表明存在多重共线性;但相关系数低,并不能表示不存在多重共线性;
3)其他
发现系数估计值的符号不对
某些重要的解释变量 t 值(SPSS中T的数值对回归参数的显著性检验值)低,而R²不低
当一不太重要的解释变量被删除后,回归结果显著变化;
3.3 影响
- 回归模型缺乏稳定性。样本的微小扰动都可能带来参数很大的变化;
- 难以区分每个解释变量的单独影响;
- 参数的方差增大;
- 变量的显著性检验失去意义;
- 影响模型的泛化误差。
3.4 处理方法
3.4.1、手动移除出共线性的变量
先做下相关分析,如果发现某两个自变量X(解释变量)的相关系数值大于0.7,则移除掉一个自变量(解释变量),然后再做回归分析。此方法是最直接的方法,但有的时候我们不希望把某个自变量从模型中剔除,这样就要考虑使用其他方法。
3.4.2、逐步回归法
让系统自动进行自变量的选择剔除,使用逐步回归分析将共线性的自变量自动剔除出去。此种解决办法有个问题是,可能算法会剔除掉本不想剔除的自变量,如果有此类情况产生,此时最好是使用岭回归进行分析。
3.4.3、增加样本容量
增加样本容量是解释共线性问题的一种办法,但在实际操作中可能并不太适合,原因是样本量的收集需要成本时间等。
3.4.4、L1 和 L2 正则化
岭回归可以减小参数估计量的方差,是当前解决共线性问题最有效的解释办法。
3.4.5、其他方法:
对模型施加某些约束条件
将模型适当变形
差分法
时间序列数据、线性模型:将原模型变换为差分模型。
主成分分析(PCA),特征降维
简单相关系数检验法
特征合并或者特征组合,将相关变量线性组合在一起处理;
差分法,时间序列数据、线性模型:将原模型变换为差分模型
四、过拟合问题
产生原因
- 数据集样本数过少
- 算法模型为了更好的拟合样本集,使其模型的拟合能力超过远远超过了问题复杂度,也就是学习模型过于复杂。
- 样本中数据噪声干扰过大,大到模型过分记住了噪声特征,而忽略了真实的输入输出间的关系。
解决办法
-
1.(针对问题1)解决过拟合的根本方法是增加数据集的规模,理论上只要样本数足够多,即使模型足够复杂,有一定的噪声,模型也会收敛到一个比较好的结果。
实际中由于数据集采集成本过高,通常使用一些退而求其次的方法来制造数据集,比如在图像处理中,可以利用反转、平移、切割、调整光亮,使用不同滤波来扩充数据集。
而在模型的训练阶段,为了节省数据成本,我们会采取诸如留一法、交叉验证法、自助法等用于数据采样。 -
2.(针对问题2)对于模型过于复杂,我们可以做的事情很多。
2.1使模型本身简单化
对于线性回归我们可以降低多项式的次数,对于神经网络我们可以减少隐藏层层数,节点数等,对于决策树,我们可以进行剪枝操作等。
2.2 正则化
正则化是解决过拟合最常用的方法之一,最为常用的用为L1正则化与L2正则化。利用L1范数可以得到较为稀疏的解,利用L2范数正则化则可大大降低计算量,拥有计算方便的特性。
2.3 对于神经网络,我们可以采用增加Drop层(在每层中随机选取一些节点使其不工作),或是添加Batch Normalization来减轻过拟合现象。
2.4 进行特征选择与稀疏学习,常见的特征选择可分为分为1)过滤式,2)包裹式,3)嵌入式。稀疏表示可以使大多数问题变得线性可分,且稀疏样本可以给存储带来方便,稀疏表示可以通过字典学习等方式得到,它可以将样本转化为合适的稀疏表示,从而使学习任务得以简化,模型复杂度降低。 -
3.(针对问题三)在进行数据训练进行之前进行数据清洗,即在回归任务中删除异常的噪声点,在分类任务中将错误的label进行纠正。