2026/7/14 23:29:41

决策树与随机森林中的基尼系数

决策树与随机森林中的基尼系数 1 文章背景在学习随机森林时经常会遇到一个概念基尼系数或者更准确地说是基尼不纯度。随机森林本质上由多棵决策树组成而决策树在划分节点时需要判断某个划分方式是否能让数据变得更“纯”。基尼不纯度就是衡量节点纯度的一种常见指标。本文主要整理基尼不纯度的基本含义、计算公式、简单示例以及如何使用 Python 自己实现基尼不纯度计算。2 基尼不纯度的含义基尼不纯度用于衡量一个数据集合中类别混杂的程度。如果一个节点中的样本全部属于同一类别那么这个节点非常纯基尼不纯度为0。如果一个节点中不同类别样本混合得比较均匀那么这个节点越不纯基尼不纯度也越大。简单理解① 基尼不纯度越小节点越纯。② 基尼不纯度越大节点越混杂。③ 决策树划分节点时会倾向于选择能够降低不纯度的划分方式。因此在决策树和随机森林的分类任务中基尼不纯度常用于选择特征划分点。3 计算公式假设某个节点中共有CCC个类别第iii个类别所占比例为pip_ipi​则该节点的基尼不纯度可以写为Gini1−∑i1Cpi2 Gini1-\sum_{i1}^{C}p_i^2Gini1−i1∑C​pi2​也可以写成等价形式Gini∑i1Cpi(1−pi) Gini\sum_{i1}^{C}p_i(1-p_i)Ginii1∑C​pi​(1−pi​)其中①CCC表示类别数量。②pip_ipi​表示第iii个类别在当前节点中的样本比例。对于二分类问题如果正类比例为ppp负类比例为1−p1-p1−p则Gini1−p2−(1−p)2 Gini1-p^2-(1-p)^2Gini1−p2−(1−p)2当p0p0p0或p1p1p1时说明节点中只有一个类别此时Gini0Gini0Gini0。当p0.5p0.5p0.5时两类样本数量相同此时二分类节点的基尼不纯度最大为0.5。4 简单示例假设某个节点中共有10个样本其中① 类别0有6个样本。② 类别1有4个样本。则两个类别的比例分别为p06100.6 p_0\frac{6}{10}0.6p0​106​0.6p14100.4 p_1\frac{4}{10}0.4p1​104​0.4代入公式Gini1−(0.620.42) Gini1-(0.6^20.4^2)Gini1−(0.620.42)计算可得Gini1−(0.360.16)0.48 Gini1-(0.360.16)0.48Gini1−(0.360.16)0.48因此该节点的基尼不纯度为0.48。5 划分后的加权基尼不纯度决策树在选择划分方式时不只看某个单独节点的基尼不纯度还要看划分后左右子节点的加权基尼不纯度。假设一个节点被划分为左子节点和右子节点则划分后的基尼不纯度可以写为GinisplitNlNGinilNrNGinir Gini_{split}\frac{N_l}{N}Gini_l\frac{N_r}{N}Gini_rGinisplit​NNl​​Ginil​NNr​​Ginir​其中①NNN表示划分前节点的样本总数。②NlN_lNl​表示左子节点样本数。③NrN_rNr​表示右子节点样本数。④GinilGini_lGinil​表示左子节点的基尼不纯度。⑤GinirGini_rGinir​表示右子节点的基尼不纯度。如果某个划分方式能让GinisplitGini_{split}Ginisplit​更小说明划分后节点整体更纯该划分方式通常更好。6 Python 实现基尼不纯度scikit-learn中的决策树和随机森林可以使用criteriongini指定基尼不纯度作为划分标准。但是sklearn.metrics中并没有通用的gini_score()函数用于直接计算分类标签的基尼不纯度。如果只是学习基尼不纯度的计算过程可以自己实现一个函数。importnumpyasnpdefgini_impurity(y):ynp.asarray(y)ify.size0:return0.0_,countsnp.unique(y,return_countsTrue)probabilitiescounts/y.sizereturn1-np.sum(probabilities**2)y[0,1,0,1,0,0,1,1,1,0]ginigini_impurity(y)print(基尼不纯度,gini)这段代码中①np.unique(y, return_countsTrue)用于统计每个类别的样本数量。②counts / y.size用于计算每个类别的样本比例。③1 - np.sum(probabilities ** 2)对应基尼不纯度公式。7 Python 实现划分后的加权基尼如果要计算某次划分后的加权基尼不纯度可以继续封装importnumpyasnpdefgini_impurity(y):ynp.asarray(y)ify.size0:return0.0_,countsnp.unique(y,return_countsTrue)probabilitiescounts/y.sizereturn1-np.sum(probabilities**2)defweighted_gini(groups):total_countsum(len(group)forgroupingroups)iftotal_count0:return0.0gini0.0forgroupingroups:weightlen(group)/total_count giniweight*gini_impurity(group)returngini left_node[0,0,0,1]right_node[1,1,1,0,1,0]split_giniweighted_gini([left_node,right_node])print(划分后的加权基尼不纯度,split_gini)这个函数可以用于理解决策树为什么会选择某个特征和某个划分点。8 在随机森林中的作用随机森林由多棵决策树组成。对于分类任务每棵决策树都需要在节点处选择合适的划分方式。如果随机森林中的决策树使用criteriongini那么每棵树在划分节点时都会尝试选择能够降低基尼不纯度的划分方式。示例fromsklearn.ensembleimportRandomForestClassifier rfRandomForestClassifier(n_estimators100,criteriongini,random_state42)其中criteriongini表示使用基尼不纯度作为节点划分标准。9 小结基尼不纯度是决策树和随机森林分类任务中的重要概念。它用于衡量节点中类别的混杂程度值越小表示节点越纯。理解基尼不纯度后可以更容易理解决策树为什么要不断划分节点也能更清楚随机森林中每棵树的基本训练逻辑。