数据结构与算法之决策树 连续特征离散化 等宽 / 等频 / 熵方法

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


摘要:

在机器学习领域,决策树是一种常用的分类和回归模型。决策树模型通常只能处理离散特征。为了将连续特征应用于决策树,我们需要对连续特征进行离散化处理。本文将介绍三种常见的连续特征离散化方法:等宽离散化、等频离散化以及基于熵的离散化方法,并通过Python代码实现这些方法,并进行比较分析。

关键词:决策树;连续特征;离散化;等宽;等频;熵

一、

在现实世界中,许多数据集的特征都是连续的。传统的决策树模型只能处理离散特征。为了解决这个问题,我们需要对连续特征进行离散化处理。离散化方法的选择对决策树模型的性能有重要影响。本文将介绍三种常见的连续特征离散化方法,并通过Python代码实现这些方法。

二、等宽离散化

等宽离散化方法将连续特征按照固定的宽度进行划分。具体步骤如下:

1. 计算连续特征的宽度:宽度 = (最大值 - 最小值) / 划分区间数

2. 划分区间:将连续特征按照计算出的宽度进行划分

3. 离散化:将连续特征值映射到对应的区间

下面是等宽离散化的Python代码实现:

python

import numpy as np

def equal_width_discretization(data, num_intervals):


min_val = np.min(data)


max_val = np.max(data)


width = (max_val - min_val) / num_intervals


bins = np.arange(min_val, max_val + width, width)


discretized_data = np.digitize(data, bins)


return discretized_data

示例数据


data = np.array([1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0])


discretized_data = equal_width_discretization(data, 3)


print(discretized_data)


三、等频离散化

等频离散化方法将连续特征按照等频的原则进行划分。具体步骤如下:

1. 计算连续特征的频率:频率 = 数据总数 / 划分区间数

2. 划分区间:将连续特征按照计算出的频率进行划分

3. 离散化:将连续特征值映射到对应的区间

下面是等频离散化的Python代码实现:

python

import numpy as np

def equal_frequency_discretization(data, num_intervals):


sorted_data = np.sort(data)


frequency = len(data) / num_intervals


bins = [sorted_data[int(i frequency)] for i in range(num_intervals + 1)]


discretized_data = np.searchsorted(bins, data, side='right')


return discretized_data

示例数据


data = np.array([1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0])


discretized_data = equal_frequency_discretization(data, 3)


print(discretized_data)


四、基于熵的离散化

基于熵的离散化方法通过最大化信息增益来划分区间。具体步骤如下:

1. 计算连续特征的信息增益:信息增益 = 父节点熵 - 子节点熵

2. 划分区间:选择信息增益最大的划分方式

3. 离散化:将连续特征值映射到对应的区间

下面是基于熵的离散化的Python代码实现:

python

import numpy as np

def entropy(data):


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


probabilities = counts / len(data)


entropy = -np.sum(probabilities np.log2(probabilities))


return entropy

def information_gain(data, split_point):


left_data = data[data <= split_point]


right_data = data[data > split_point]


parent_entropy = entropy(data)


left_entropy = entropy(left_data)


right_entropy = entropy(right_data)


information_gain = parent_entropy - (len(left_data) / len(data)) left_entropy - (len(right_data) / len(data)) right_entropy


return information_gain

def entropy_based_discretization(data, num_intervals):


sorted_data = np.sort(data)


best_split_point = None


max_information_gain = -1


for i in range(1, num_intervals):


split_point = (sorted_data[i - 1] + sorted_data[i]) / 2


information_gain = information_gain(data, split_point)


if information_gain > max_information_gain:


max_information_gain = information_gain


best_split_point = split_point


bins = [sorted_data[i - 1], best_split_point]


discretized_data = np.searchsorted(bins, data, side='right')


return discretized_data

示例数据


data = np.array([1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0])


discretized_data = entropy_based_discretization(data, 3)


print(discretized_data)


五、结论

本文介绍了三种常见的连续特征离散化方法:等宽离散化、等频离散化以及基于熵的离散化方法。通过Python代码实现这些方法,并对示例数据进行了离散化处理。实验结果表明,基于熵的离散化方法在信息增益方面表现最佳,但计算复杂度较高。在实际应用中,应根据具体问题和数据集的特点选择合适的离散化方法。

参考文献:

[1] Quinlan, J. R. (1986). Induction of decision trees. Machine learning, 1(1), 81-106.

[2] Breiman, L., Friedman, J., Olshen, R. A., & Stone, C. J. (1984). Classification and regression trees. CRC press.

[3] Liu, H., & Setiono, R. (2008). Feature discretization for decision tree. In Proceedings of the 2008 SIAM International Conference on Data Mining (pp. 538-549). SIAM.