二-----决策树的剪枝、连续值和缺省值处理、类别不平衡处理、多分类问题
1.决策树的剪枝
之所以会涉及到剪枝的问题是因为决策树很容易出现过拟合的现象,我对过拟合的理解是在训练集中训练样本的一些个性被当成了所有样本的共性进行了学习,导致模型泛化能力减弱。因此,为了减少过拟合的影响,可以通过去掉一些决策树分支(剪枝)的方式进行处理。
1.1 预剪枝
顾名思义,预剪枝的核心思想是在对每一个节点划分之前先进行计算,如果当前节点的划分并不能够带来模型泛化能力的提升就不再进行划分,对于未能够区分的样本种类(此时可能存在不同的样本类别同时存在于节点中),按照投票(少数服从多数)的原则进行判断。
简单一点的方法可以通过测试集判断划分过后的测试集准确度能否得到提升进行确定,如果准确率不提升变不再进行节点划分。
这样做的好处是在降低过拟合风险的同时减少了训练时间的开销,但是可能会出现欠拟合的风险:虽然一次划分可能会导致准确率的降低,但是再进行几次划分后,可能会使得准确率显著提升。
1.2 后剪枝
后剪枝的核心思想是让算法生成一个完全决策树,然后从最低层向上计算决定是否剪枝。
同样的,方法可以通过在测试集上的准确率进行判断,如果剪枝后准确率有所提升,则进行剪枝。
后剪枝的泛化能力往往高于预剪枝,但是时间花销相对较大。
1.3 总结
无论是预剪枝还是后剪枝都是为了减少决策树过拟合的情况,在实际运用中,我使用了python中的sklearn库中的函数。
函数中的max_depth参数可以控制树的最大深度,即最多产生几层节点
函数中的min_samples_split参数可以控制最小划分样本,即当节点样本数大于阈值时才进行下一步划分。
函数中min_samples_leaf参数可以控制最后的叶子中最小的样本数量,即最后的分类中的样本需要高于阈值
上述几个参数的设置均可以从控制过拟合的方面进行理解,通过控制树的层数、节点划分样本数量以及每一个分类的样本数可以在一定程度上减少对于样本个性的关注。具体设置需要根据实际情况进行设置
2. 连续值和缺省值处理
2.1 连续值的处理
决策树对于连续值的特征进行处理的方法主要是将连续性数值特征划分为不同的区间,从而变成离散的数值。C4.5中采用了二分法对连续值进行处理。
二分法的思想为:对于某个属性出现的连续值从小到大排列,取每两个点的中点进行划分(任取两点之间的任意一点不影响划分结果),选取其中信息增益最大的点作为最终划分节点的依据。
2.2 缺失值的处理
在实际中数据往往存在缺省值,而对于缺省值的处理方法多种多样,我了解的处理方法主要分为以下几个方面,具体如何处理需要根据实际问题进行分析
2.2.1 填充
如果缺省的属性是连续的数值,并且每个样本之间存在一定的关系(时间序列):可以通过上一个时间的数据或者上一个数据和下一个数据的平均值进行填充,这种做法可以保证时间序列的连续性。或者使用平均数、中位数等进行填充
如果缺省的属性是连续的数值并且和其他的特征具有一定的关系,可以通过其他属性近似推导出缺失数值。
如果缺省数据是离散属性,并且数量较多,可以选择将缺省的数据单独分为一类进行训练。
2.2.2 删除
如果包含缺省数据的样本点较少,可以直接删除缺失数据。如果大多数样本点均不包含此缺失数据,可以考虑放弃这一特征。
2.2.3 模型训练中对于缺测数据的处理
如果上述的方法都无法很好的使用,同样可以在训练模型的过程中对缺测数据进行处理。
其核心思想是:对于缺测的数据,分别用该属性的其他数值进行填充。并且给予每一个填充出来的样本不同的权重,权重根据每一个种类的样本数量进行计算(例如:样本颜色未知,已知的颜色分类有红、黄、蓝,三种分类样本数量分别为2、3、5,则填充出来的样本一共有三个,权重分别为2/10,3/10,5/10)。
这种思想能够在一定程度上忽略缺测数据并且合理利用已知数据,权重的存在是为了使划分后样本的重要性和划分前一致。
2.2.4 模型使用中对于缺测数据的处理
如果测试样本中同样存在缺测数据,可以根据上面相似的方法进行处理,给予样本不同的权重,最后再预测结束后取权重最高的类别作为最后的结果。
3.类别不平衡的处理
实际问题中,常常会存在类别不平衡的问题,如果不进行处理,会使得模型的效果受到极大的影响 (正负样本为1000:1时,全部预测为正样本时,模型准确率为99.99%,丧失了对负样本的预测能力,此时,正样本过拟合,负样本欠拟合)。
3.1 更换评价指标
通常,在训练中采用准确率作为模型好坏的评价指标,但是当样本类别不平衡的时候,可以考虑其他的指标,不同的指标反映了关注的不同重点,也反映了实际中不同问题的不同需求。
3.1.1 准确率、召回率、P-R曲线、F
混淆矩阵:反映预测结果和真实情况的矩阵

召回率R(真正例率)定义为 \frac{TP}{TP+FN} ,表示在全体正例中预测正确的比例
准确率和召回率可以从不同的方面评价模型的好坏,准确率关注判断结果正确的比率,召回率关注能否判断出所有样本中的正样本,两者往往不可兼得。因此为了平衡准确率和召回率,引入P-R曲线和F1分数
P-R曲线:将预测的结果进行根据正例的可能性(1到-1)进行排序,从左至右对每个样本点作为正例进行预测,依次计算当前准确率和召回率,并以召回率和准确率作为横纵坐标做图。(在第一个点时,此时为正样本的概率最大(假定的确为正样本),作为正例预测,此时准确率为1,召回率为1/样本数,…,在最后一个点时,把所有样本都视为正样本,此时准确率为所有样本中正样本所占比例,召回率为1。)
计算P-R曲线包围的面积可以得到一种衡量方式,计算P=R时候的平衡点,可以得到另外一种衡量方式。平衡点越大,表明模型效果越好。P-R曲线反映了模型兼顾准确率和召回率的能力。
F值: \frac{\left( 1+\beta ^{2} \right)\times R\times P}{ \left( \beta ^{2}\times P \right)+ R} ,衡量了准确率和召回率的相对重要程度,默认 \beta >0 ,当 \beta >1 时,表明准确率更重要,反之,召回率更重要
3.1.2 ROC和AUC
和召回率(真正例率)相对,定义假正例率: FPR = \frac{FP}{TN+FP}
ROC曲线:和P-R相似,按照预测的结果进行根据正例的可能性(1到-1)进行排序,从左至右选取每一个样本点之前的样本作为正样本预测,之后的样本作为负样本预测,得到横坐标为假正例率,纵坐标为真正例率的曲线,称为ROC曲线,曲线包围的面积称为AUC。AUC越大,表明模型结果越好。AUC反映了排序结果的好坏,当随机挑选一个正样本以及负样本,AUC表示模型将这个正样本排在负样本前面的概率。
3.2 重新采样
当样本数量不均衡的时候,可以人为改变样本结构使得样本均匀。
3.2.1 过采样
当负样本数量过于少的时候,可以考虑过采样(增加负样本数量)
比如可以选择对于负样本反复采样(复制多次),使得类别平衡。但是,由于对负样本的反复采样并没有包含更多的负样本信息,可能会导致模型对负样本的过拟合。
此外,可以根据两个负样本之间的距离,人工生成新的负样本,增加负样本的数量。 但是,这样的做法不能够保证生成的负样本的准确性。
3.2.2 欠采样
当负样本数量比较多但相比于正样本较少的时候,可以选择对正样本进行欠采样(如果负样本本身数量较少欠采样会导致训练数据过少,模型欠拟合)
最简单的方法是从正样本中随机选取一些样本,和负样本构成新的样本集,消除类别不平衡的问题。
此外,可以同过在正样本上K-means聚类的方式,得到新的样本。
3.3 更改权重
对于样本数量少的负样本,赋予更高的权重,即对于负样本的错分会受到更大的惩罚。使得模型更加倾向于正确识别负样本
3.4 多模型融合
将正样本随机分成多份,分别和负样本组成新的数据集进行训练,最后再将多个模型的结果进行投票打分,得到最后的结果。这种做法的好处是不会丢失数据,但是可能会花费更多的时间。
4.多分类问题
在实际问题中,往往存在多分类的问题,,即最后的类别数大于两个。对于多分类问题的解决方法有如下几种:
4.1 一对一
一对一的主要思路是把所有的类别两两配对进行训练(训练样本为该两个类别的样本),对于n个类别一共可以得到 \frac{n\times \left( n-1 \right) }{2} 个分类器,使用时将样本放到所有的分类器中进行训练,最后的结果为所有分类器结果中最多的类别。
4.2 一对多
一对多的主要思路是把所有的类别分别和其余的类别组合进行训练(训练样本为全体样本,判断样本是否属于这个类别),对于n个类别一共可以得到n个分类器,使用时将样本放到所有分类器中进行训练,若结果只有一个为正,则认为样本属于该类别,否则,选取置信度比较高的分类器的结果。
和一对一相比,一对多训练的分类器较少,训练使用的样本较多。
4.3 多对多(纠错输入码)
多对多是把若干个类别作为正类,其余的作为反类,通过纠错输入码的思想进行类别划分。
首先,对于n个类别进行M次不同的划分,选取不同的正反类,得到M个训练集,得到M个分类器。然后,对于测试样本进行判断,得到M维的编码,计算和各个类别编码的距离,最后的结果为距离最短的类别,距离的定义可以通过欧氏距离等。
例如:一共有5个类别(ABCDE),M进行了3次划分。(例子不合理)
第一次划分为ABC为正,DE为负
第二次划分BD为正,ACE为负
第三次划分AD为正,BCE为负
则A类的编码为101,B类编码为110,C类编码为100,D类编码为011,E类编码为000
测试编码为000则认为测试样本属于E类
可以看出,如果适当的划分M使得不同类别之间的距离尽量远的话,模型就有一定的纠错能力,但是增加划分的次数会增加需要训练的分类器,并且设计划分的方法也需要优化。同时,根据实际问题的不同,如何选择上述的参数,也需要考虑。(比如有3个种类,特征的取值为1,1.2,100,那么,取值为1和1.2类别可以很容易和取值为100的类别区分开,但是1和1.2类别相互的划分就比较困难)
5. 总结
感觉写了好久,又重新梳理了一边原来学习的东西
发现了自己对于有些知识点还不是特别熟悉
由于实际接触的项目较少,可能不能够和实际运用相联系起来
这是需要提高的地方
接下来总结加强版决策树, GBDT、随机森林等
加油~