二分法处理连续值
在决策树算法中,处理连续特征通常采用二分法,将其转化为离散特征。此方法通过寻找最佳分割点,将连续特征划分为两个区间。
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]![[Linux#67][IP] 报头详解 | 网络划分 | CIDR无类别 | DHCP动态分配 | NAT转发 | 路由器](https://img-blog.csdnimg.cn/img_convert/32eb110884f0d038d790c84104eb0ffe.jpeg)




![[枚举坤坤]二进制枚举基础](https://i-blog.csdnimg.cn/direct/e3b056fea3ad4a4aa7ec6bef68c4565a.jpeg)













