Jason Brownlee作者冯羽、杨学俊校对黄继彦编辑陈超翻译

指南:不平衡分类的成本敏感决策树(附代码&链接)

本文介绍了不平衡分类中的成本敏感决策树算法。

决策树算法对平衡分类是有效的,但在不平衡数据集上却表现不佳。

决策树分裂点是为了能够在最小混淆的情况下将所有实例分成两组。当两个组别分别都由其中一个类别的实例占主导,那么用于选择分裂点设置的标准即为合理,而事实上,少数类中的实例将会被忽略。 

通过修改评估分裂点的标准并将每一类别的重要性均纳入考虑,即可解决这一问题,通常指的是加权的分裂点或者加权的决策树。

在本指南中,你将看到的是不平衡分类的加权决策树。

在学习完本指南之后,你将会了解:

  • 标准决策树算法是怎样不支持不平衡分类的。

  • 当选择分裂点时,决策树算法如何通过类权值对模型误差进行加权。

  • 如何配置决策树算法中类的权值以及如何对不同的类权值配置进行网格化搜索。

SMOTE算法,单类别分类,成本敏感学习,阈值移动,以及更多其他内容,请检索我的新书,内含30个逐步教程以及完整的Python源代码。

新书链接:
https://machinelearningmastery.com/cost-sensitive-decision-trees-for-imbalanced-classification/

好的,我们开始。

如何对不平衡分类执行加权决策树
Photo by Bonnie Moreland, some rights reserved.

指南概观

本指南分为四部分,他们分别是:

一、不平衡分类数据

二、不平衡分类决策树

三、Scikit-Learn中使用加权决策树

四、加权决策树的网格化搜索

一、不平衡分类数据

在开始深入到不平衡分类的决策修正之前,我们先定义一个不平衡数据集。

我们可以使用 make_classification()函数来定义一个合成的不平衡两类别分类数据集。我们将生成10000个实例,其中少数类和多数类的比例为1:100。

make_classification()函数:
https://machinelearningmastery.com/cost-sensitive-decision-trees-for-imbalanced-classification/

一旦生成之后,我们可以总结类的分布来验证生成数据集是我们所期望的。

最后,我们可以创造一个实例的散点图并依据类标签进行着色,来帮助我们理解该数据集中实例分类所面临的挑战。

将这些代码整合在一起,生成合成数据集和绘制实例的完整示例。

运行这个示例将会先创造一个数据集,然后汇总类的分布。

我们可以看到这个数据集接近1:100的类的分布,有比10000个稍微少一些的实例在多数类当中,100个实例在少数类中。

Counter({0: 9900, 1: 100})

接下来,是数据集的散点图,该图展示了大量多数类(蓝色)的实例和少量少数类(橙色)的实例,其中有少许类的值重叠。

1:100类别不平衡性的两分类数据集散点图接下来,我们可以在此数据集上拟合一个标准决策树模型。决策树可以使用scikit-learn工具包中的决策树分类器生成。

决策树分类器:

https://machinelearningmastery.com/cost-sensitive-decision-trees-for-imbalanced-classification/

我们将使用重复交叉验证来评估此模型,共需三次重复的10层交叉验证。模型的性能将通过曲线下ROC面积(ROC AUC)在所有重复次以及全部层的均值获得。

10层交叉验证
https://machinelearningmastery.com/k-fold-cross-validation/

在不平衡分类问题上定义和评估一个标准决策树模型的完整实例如下。

决策树对二分类任务的有效模型,虽然他们本身对不平衡分类问题并不高效。

运行该实例可评估标准决策树模型在不平衡数据集上的表现,并报告ROC AUC。

你的特定的结果可能会根据学习算法的固有随机性而变化。试着多运行几次。 

我们可以看到这个模型能够实现ROC AUC大于0.5,并实现均值得分为0.746。

Mean ROC AUC: 0.746

这为任何标准决策树算法的改进提供了比较的基线。 

二、不平衡分类决策树

决策树算法也被叫做分类和回归树(CART),包括生成树以及从训练集中分类实例。

分类和回归树
https://machinelearningmastery.com/classification-and-regression-trees-for-machine-learning/

树可用于分离训练集,实例可以经由树的决策点到达叶节点并且被附上类标签。

树可以通过使用数据集中变量的值来分离训练集从而得到建构。在每一个点上,数据的分离以最贪心的方式使得最纯净的(最少混合的)实例组被选出来。

在这里,纯度意味着实例得到纯净地分离,由只包含0和只包含1的实例组成的类是最纯净的,50-50混合的类是最不纯的。常见的纯度通常由基尼不纯度来计算,虽然也可以通过信息熵(entropy)来计算。

信息熵
https://machinelearningmastery.com/information-gain-and-mutual-information/

纯度测量包括计算一个给定类的实例被误分类的可能性。计算这些概率包括将每个组中每个类的实例数求和。

分离标准可以被更新,不仅是为了考虑分离的纯度,也是为了对每个类的重要性进行加权。

“我们导入成本敏感决策树的目的是为了修正与某一实例误分类的损失成比例的权重……”

-《一种导入损失敏感决策树的实例加权方法》,2002

https://machinelearningmastery.com/cost-sensitive-decision-trees-for-imbalanced-classification/

这可以通过加权和代替每一组别的实例数实现,这里系数被用于加权和。

更大的权重被分配给更重要的类,更小的权重则赋给不那么重要的类。 

  • 权重对节点纯度不那么重要,影响更低。

  • 权重对节点纯度更重要,影响更高。 

权重可被分配给多数类,能够提升(降低)节点的纯度分数,否则这个节点

可能会看起来排序不那么好。这可能会使得更多来自多数类的实例被分到少数类里,并更好地适应少数类里的实例。

“更高的权值被分配给来自更高误分类成本的类当中的实例。”

-《从不平衡数据集中学习》,2018,第71页

https://machinelearningmastery.com/cost-sensitive-decision-trees-for-imbalanced-classification/

正因为如此,对决策树算法的这一修正被称为加权决策树,一个加权类的决策树,或者是成本敏感决策树。

分离点计算的修正是最常见的,虽然还有很多修正决策树建构算法以更好地适应类的不平衡的研究。

三、Scikit-Learn中使用加权决策树

Scikit-Learn Python 机器学习工具包提供了支持类加权的决策树算法的实现方法。

决策树算法提供了可被指定为模型参数的class_weight参数。class_weight是一个定义每个类标签(例如,0和1)和应用到拟合模型时,决策树中分离组纯度计算权值的字典。 

例如,一个对每个0和1类的1比1的权重可以作如下定义:

类权值可有多种定义方式,例如:

  • 领域专长:通过与学科专家交谈确定;

  • 调参:通过例如网格化搜索的参数搜索确定;

  • 启发式:使用一般最佳实践确定。

使用类加权最好的实践是使用与训练集中的类分布的倒数。

例如,测试集类分布为少数类:多数类1:100的比例。该比例的倒数是1个多数类和100个少数类。例如:

我们也可以使用分数定义同样的比例,并获得相同的结果。例如:

启发式可以通过直接设置class_weight为'balanced'。例如:

我们可以通过使用在之前的部分定义的评估程序来对类加权的决策树算法进行评估。

我们期待类加权决策树的版本比没有类加权的标准决策树算法表现得更好。

完整的实例如下:

运行这一实例可以准备好合成的不平衡分类数据集,然后使用重复交叉验证评估类加权版的决策树算法。

你的结果可能会受到算法随机性的影响,尝试多运行几次。 

ROC AUC的均值得分被报告,得到比未加权版本的决策树算法更好的得分:0.759比0.746。

Mean ROC AUC: 0.759

四、加权决策树的网格化搜索

使用训练集的倒数比的类加权是启发式的一种。

使用不同的类加权可能得到更好的表现,这也过分依赖于评估模型性能度量的选择。 

在这一部分,我们将为加权决策树进行一系列不同类权重的网格化搜索并探索可得到最佳ROC AUC的结果。

我们将尝试下述对0类和1类的权重

  • 类0:100,类1:1;

  • 类0:10,类1:1;

  • 类0:1,类1:1;

  • 类0:1,类1:100。

这些可被定义为GridSearchCV类的网格化搜索参数如下:

GridSearchCV类:
https://machinelearningmastery.com/cost-sensitive-decision-trees-for-imbalanced-classification/

我们可以使用重复交叉验证对这些参数进行网格化搜索,并使用ROC AUC估计模型的表现:

...
# define evaluation procedure
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
# define grid searchgrid = GridSearchCV(estimator=model, param_
grid=param_grid, n_jobs=-1, cv=cv, scoring='roc_auc')

一旦执行后,我们可以总结最佳配置,以及所有的结果如下:‍

...
# report the best configuration
print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))
# report all configurations
means = grid_result.cv_results_['mean_test_score']
stds = grid_result.cv_results_['std_test_score']
params = grid_result.cv_results_['params']
for mean, stdev, param in zip(means, stds, params):    
    print("%f (%f) with: %r" % (mean, stdev, param))

以下实例为不平衡数据集上的决策树算法,对五种不同的类权重进行网格化搜索。

我们可能会期待启发式类权重是最好的配置。

# grid search class weights with decision tree for imbalance classification
from numpy import mean
from sklearn.datasets import make_classification
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.tree import DecisionTreeClassifier
# generate dataset
X, y = make_classification(n_samples=10000, n_features=2, n_redundant=0,  
  n_clusters_per_class=1, weights=[0.99], flip_y=0, random_state=3)
# define model
model = DecisionTreeClassifier()
# define grid
balance = [{0:100,1:1}, {0:10,1:1}, {0:1,1:1}, {0:1,1:10}, {0:1,1:100}]
param_grid = dict(class_weight=balance)
# define evaluation procedure
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
# define grid search
grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=-1, cv=cv, scoring='roc_auc')
# execute the grid search
grid_result = grid.fit(X, y)
# report the best configuration
print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))
# report all configurations
means = grid_result.cv_results_['mean_test_score']
stds = grid_result.cv_results_['std_test_score']
params = grid_result.cv_results_['params']
for mean, stdev, param in zip(means, stds, params):    
    print("%f (%f) with: %r" % (mean, stdev, param))

运行该实例使用重复k层交叉验证来评估每一个类权重,并报告最佳配置以及相关的平均ROC AUC得分。

你的结果可能会随着学习算法的随机性而变化,尝试多运行几次。

在这种情况下,我们可以看到1:100的多数:少数类比加权可以实现最佳的均值ROC得分。这与一般启发式的配置相匹配。

探索更严格的类权值来看其对ROC AUC均值得分的影响可能会很有趣。

Best: 0.752643 using {'class_weight': {0: 1, 1: 100}}
0.737306 (0.080007) with: {'class_weight': {0: 100, 1: 1}}
0.747306 (0.075298) with: {'class_weight': {0: 10, 1: 1}}
0.740606 (0.074948) with: {'class_weight': {0: 1, 1: 1}}
0.747407 (0.068104) with: {'class_weight': {0: 1, 1: 10}}
0.752643 (0.073195) with: {'class_weight': {0: 1, 1: 100}}

更多阅读

如果你想更深入了解,本部分提供了更多相关资源。

  • 论文
  • 《一种导入成本敏感决策树的实例加权方法》,2002.
    https://machinelearningmastery.com/cost-sensitive-decision-trees-for-imbalanced-classification/
  • 书籍
  • 《从不平衡数据中学习》,2018
    https://amzn.to/307Xlva
  • 《不平衡学习:基础,算法和应用》,2013
    https://amzn.to/32K9K6d
  • API
  • sklearn.utils.class_weight.compute_class_weight API:
    https://scikit-learn.org/stable/modules/generated/sklearn.utils.class_weight.compute_class_weight.html
  • sklearn.tree.DecisionTreeClassifier API:
    https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html
  • sklearn.model_selection.GridSearchCV API:
    https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html

总结

在本指南中,你探索了不平衡分类的加权决策树。特别地,你学到了:

  • 标准决策树算法怎样不支持不平衡分类;

  • 当选择分裂点时,决策树算法如何通过类权值对模型误差进行加权;

  • 如何配置决策树算法中类的权值以及如何对不同的类权值配置进行网格化搜索。

原文标题:
Cost-Sensitive Decision Trees for Imbalanced Classification
原文链接:
https://machinelearningmastery.com/cost-sensitive-decision-trees-for-imbalanced-classification
THU数据派
THU数据派

THU数据派"基于清华,放眼世界",以扎实的理工功底闯荡“数据江湖”。发布全球大数据资讯,定期组织线下活动,分享前沿产业动态。了解清华大数据,敬请关注姐妹号“数据派THU”。

工程决策树
2
相关数据
权重技术

线性模型中特征的系数,或深度网络中的边。训练线性模型的目标是确定每个特征的理想权重。如果权重为 0,则相应的特征对模型来说没有任何贡献。

机器学习技术

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

分类数据技术

一种特征,拥有一组离散的可能值。以某个名为 house style 的分类特征为例,该特征拥有一组离散的可能值(共三个),即 Tudor, ranch, colonial。通过将 house style 表示成分类数据,相应模型可以学习 Tudor、ranch 和 colonial 分别对房价的影响。 有时,离散集中的值是互斥的,只能将其中一个值应用于指定样本。例如,car maker 分类特征可能只允许一个样本有一个值 (Toyota)。在其他情况下,则可以应用多个值。一辆车可能会被喷涂多种不同的颜色,因此,car color 分类特征可能会允许单个样本具有多个值(例如 red 和 white)。

超参数技术

在机器学习中,超参数是在学习过程开始之前设置其值的参数。 相反,其他参数的值是通过训练得出的。 不同的模型训练算法需要不同的超参数,一些简单的算法(如普通最小二乘回归)不需要。 给定这些超参数,训练算法从数据中学习参数。相同种类的机器学习模型可能需要不同的超参数来适应不同的数据模式,并且必须对其进行调整以便模型能够最优地解决机器学习问题。 在实际应用中一般需要对超参数进行优化,以找到一个超参数元组(tuple),由这些超参数元组形成一个最优化模型,该模型可以将在给定的独立数据上预定义的损失函数最小化。

分类和回归树技术

CART是在给定输入随机变量X条件下输出随机变量Y的条件概率分布的学习方法。CART假设决策树是二叉树,内部结点特征的取值为“是”和“否”,左分支是取值为“是”的分支,右分支是取值为“否”的分支。这样的决策树等价于递归地二分每个特征,将输入空间即特征空间划分为有限个单元,并在这些单元上确定预测的概率分布,也就是在输入给定的条件下输出的条件概率分布。

信息熵技术

在信息论中,熵是接收的每条消息中包含的信息的平均量,又被称为信息熵、信源熵、平均自信息量。这里,“消息”代表来自分布或数据流中的事件、样本或特征。熵的单位通常为比特,但也用Sh、nat、Hart计量,取决于定义用到对数的底。

生成树技术

在图论的数学领域中,如果连通图 G的一个子图是一棵包含G 的所有顶点的树,则该子图称为G的生成树(SpanningTree)。生成树是连通图的包含图中的所有顶点的极小连通子图。图的生成树不惟一。从不同的顶点出发进行遍历,可以得到不同的生成树。

分类问题技术

分类问题是数据挖掘处理的一个重要组成部分,在机器学习领域,分类问题通常被认为属于监督式学习(supervised learning),也就是说,分类问题的目标是根据已知样本的某些特征,判断一个新的样本属于哪种已知的样本类。根据类别的数量还可以进一步将分类问题划分为二元分类(binary classification)和多元分类(multiclass classification)。

交叉验证技术

交叉验证,有时亦称循环估计, 是一种统计学上将数据样本切割成较小子集的实用方法。于是可以先在一个子集上做分析, 而其它子集则用来做后续对此分析的确认及验证。 一开始的子集被称为训练集。而其它的子集则被称为验证集或测试集。交叉验证的目标是定义一个数据集到“测试”的模型在训练阶段,以便减少像过拟合的问题,得到该模型将如何衍生到一个独立的数据集的提示。

暂无评论
暂无评论~