二分法处理连续值
在决策树算法中,处理连续特征通常采用二分法,将其转化为离散特征。此方法通过寻找最佳分割点,将连续特征划分为两个区间。
1. 原理
二分法的核心思想是将连续值特征转换为离散值,以便于决策树的构建。通过选择合适的分割点,将数据集划分为两个部分,从而减少不纯度(如信息增益或基尼指数)。
2. 实现步骤
(1)排序:将连续特征的所有样本值进行排序,获取唯一值的列表。
(2)生成候选分割点:在排序后的连续值中,每两个相邻值之间生成候选分割点。假设排序后的连续特征值为 x1,x2,…,xn,则候选分割点为
(3)计算每个候选分割点的不纯度:对每个候选分割点,计算该点划分后的加权不纯度。常用的不纯度指标包括信息增益和基尼指数。以信息增益为例,设候选分割点为 p,划分后得到的子集为 D1和 D2,则信息增益计算为:
其中,H(D)是数据集 D的熵,∣D1∣和∣D2∣分别是划分后两个子集的样本数量。
(4)选择最佳分割点:比较所有候选分割点的信息增益,选择信息增益最大的分割点作为最终分割点。
(5)更新特征:将连续特征按照最佳分割点划分为两个类别(如:x≤p和x>p),并使用离散化后的特征继续构建决策树。
简单部分实现
实现了信息增益的函数,其中包含对连续特征的处理
def info_gain(self, feature, y, entD, is_continuous=False):
'''
计算信息增益
------
:param feature: 当前特征(属性)下所有样本值
:param y: 对应标签值
:return: 当前特征的信息增益, list类型,若当前特征为离散值则只有一个元素为信息增益,若为连续值,则第一个元素为信息增益,第二个元素为切分点
'''
m = y.shape[0] #y的shape[0]是行数吧,也就是样本数
unique_value = pd.unique(feature) #属性a的av,例如:颜色有乌黑、青绿等
if is_continuous: #如果是连续值的话,需要进行二分(离散化),要根据最小信息熵找出最佳划分点
unique_value.sort() # 排序, 用于建立分割点
split_point_set = [(unique_value[i] + unique_value[i + 1]) / 2 for i in range(len(unique_value) - 1)] #在每两个值的区间取中点
min_ent = float('inf') # 挑选信息熵最小的分割点
min_ent_point = None
for split_point_ in split_point_set:
Dv1 = y[feature <= split_point_] #这是第一类的标签值
Dv2 = y[feature > split_point_] #这是第二类的标签值
feature_ent_ = Dv1.shape[0] / m * self.entroy(Dv1) + Dv2.shape[0] / m * self.entroy(Dv2) #套公式,信息增益公式负号后面的部分,越小越好
if feature_ent_ < min_ent:
min_ent = feature_ent_
min_ent_point = split_point_
gain = entD - min_ent #信息增益公式
return [gain, min_ent_point] #返回该特征(属性)的信息增益值以及连续值划分点(二分)
else: #该特征为离散值
feature_ent = 0 #信息增益公式负号后面的部分,越小越好
for value in unique_value: #遍历av
Dv = y[feature == value] # 当前特征中取值为 value 的样本,即书中的 D^{v}
feature_ent += Dv.shape[0] / m * self.entroy(Dv)
gain = entD - feature_ent # 信息增益公式
return [gain]