数据结构与算法之决策树 基尼指数 CART 算法分裂标准 实践指南

数据结构与算法阿木 发布于 2025-07-12 10 次阅读


决策树:基尼指数(CART 算法分裂标准)实践指南

决策树是一种常用的机器学习算法,它通过一系列的规则对数据进行分类或回归。CART(Classification And Regression Tree)算法是决策树的一种,它使用基尼指数作为分裂标准。本文将围绕基尼指数在CART算法中的应用,提供实践指南,包括算法原理、实现步骤以及代码示例。

基尼指数简介

基尼指数是衡量数据集纯度的指标,它反映了数据集中各个类别的不纯度。基尼指数的值越低,表示数据集的纯度越高。在决策树中,我们希望找到最佳的分裂点,使得分裂后的子集基尼指数最小。

CART算法原理

CART算法通过递归的方式构建决策树,每次递归都会选择一个特征和对应的阈值,使得分裂后的子集基尼指数最小。以下是CART算法的步骤:

1. 选择数据集中的一个特征。

2. 对于该特征的所有可能取值,计算对应的基尼指数。

3. 选择基尼指数最小的取值作为分裂点。

4. 将数据集按照分裂点进行划分,形成两个子集。

5. 对两个子集重复步骤1-4,直到满足停止条件。

实现步骤

以下是使用Python实现CART算法的步骤:

1. 导入必要的库。

2. 创建数据集。

3. 定义计算基尼指数的函数。

4. 定义构建决策树的函数。

5. 使用决策树进行分类或回归。

代码示例

以下是一个简单的CART算法实现:

python

import numpy as np

计算基尼指数


def gini_index(data):


n = len(data)


labels, counts = np.unique(data, return_counts=True)


gini = 1.0


for label in labels:


p = counts[label] / n


gini -= p p


return gini

构建决策树


def build_tree(data, features, target):


n_samples, n_features = data.shape


n_labels = len(np.unique(target))



停止条件


if n_samples == 0:


return None


if n_labels == 1:


return target[0]



选择最佳特征和阈值


best_feature = None


best_threshold = None


min_gini = float('inf')


for feature in features:


thresholds = np.unique(data[:, feature])


for threshold in thresholds:


left_data = data[data[:, feature] <= threshold]


right_data = data[data[:, feature] > threshold]


left_gini = gini_index(left_data[:, target])


right_gini = gini_index(right_data[:, target])


gini = (len(left_data) left_gini + len(right_data) right_gini) / n_samples


if gini < min_gini:


min_gini = gini


best_feature = feature


best_threshold = threshold



构建子树


left_tree = build_tree(left_data, features, target)


right_tree = build_tree(right_data, features, target)



return {'feature': best_feature, 'threshold': best_threshold, 'left': left_tree, 'right': right_tree}

创建数据集


data = np.array([[1, 2], [1, 3], [2, 2], [2, 3], [3, 2], [3, 3]])


target = np.array([0, 0, 1, 1, 0, 1])

构建决策树


tree = build_tree(data, range(data.shape[1]), target)

打印决策树


def print_tree(tree, depth=0):


if tree is None:


return


if isinstance(tree, dict):


feature = tree['feature']


threshold = tree['threshold']


print(' ' depth + f"Feature {feature} <= {threshold}:")


print_tree(tree['left'], depth + 1)


print(' ' depth + f"Feature {feature} > {threshold}:")


print_tree(tree['right'], depth + 1)


else:


print(' ' depth + f"Label: {tree}")

print_tree(tree)


总结

本文介绍了CART算法及其分裂标准——基尼指数。通过代码示例,我们实现了CART算法的基本步骤。在实际应用中,CART算法可以用于分类和回归任务,具有较好的性能和可解释性。希望本文能帮助读者更好地理解和应用决策树算法。