当前位置:数码通 > 趋势

Python手写决策树算法

来源于 数码通 2023-09-30 09:05

决策树是一种常用的机器学习算法,基于决策规则学习对样本数据进行分类或回归。 Python 提供了各种机器学习库,例如 Scikit-Learn,可以使用现成的决策树算法。不过,在了解决策树算法的基础上,手写一个决策树算法可以帮助我们更好地理解它的原理和实现细节。

1。决策树简介

决策树对数据集进行划分,建立一系列决策规则来预测新样本的类别或值。决策树的节点代表一个属性或特征,分支代表该属性对应的值,叶子节点代表最终的类别或值。决策树的建立过程可以概括为三个步骤:

1。特征选择:选择最优的属性或特征来划分数据集。

2。决策树生成:根据选定的属性和属性值划分数据集,递归构建子树,直到所有样本属于同一类别。

3。决策树剪枝:通过减小决策树的大小来提高模型的泛化能力。

2。功能选择

特征选择是决策树算法中的重要步骤。目的是选择最优的属性或特征来划分数据集。常用的特征选择方法有以下三种:

1。信息增益(ID3算法):选择划分后信息增益最大化的属性。

2。信息增益比(C4.5算法):根据信息增益,对属性值进行归一化,消除属性值较大时的偏好。

3。基尼指数(CART算法):选择划分后基尼指数最小的属性。

3。决策树生成

决策树的生成是对数据集进行划分并建立子树的过程。具体步骤如下:

1。如果数据集中的样本在当前属性上具有相同的值,则将样本所属的类别或值作为叶节点返回。

2。否则,选择最优的属性和属性值进行划分。

3。根据选定的属性和属性值划分数据集,并递归构建子树。

4。将子树连接到当前节点以形成决策树。

4。决策树剪枝

决策树剪枝是为了减小决策树的大小,提高模型的泛化能力。剪枝可分为预剪枝和后剪枝两种方法:

1。预剪枝:在决策树生成过程中,在选择属性和属性值进行划分之前,通过一些准则来决定是否划分,从而防止决策树过拟合。

2。后剪枝:决策树生成后,对决策树进行剪枝,用更通用的节点替换一些叶节点,以减小决策树的大小。

5。代码示例

以下是Python手写决策树算法的示例代码:

将 numpy 导入为 np

类决策树:
    def __init__(自身):
        self.树=无

    def 熵(自身,y):
        _, 计数 = np.unique(y, return_counts=True)
        概率 = 计数 / len(y)
        返回 -np.sum(概率 * np.log2(概率))

    def information_gain(self, X, y, feature_index, 阈值):
        left_mask = X[:, feature_index] <= 阈值
        右掩码 = ~左掩码
        左_y, 右_y = y[左掩码], y[右掩码]
        p_left = len(left_y) / len(y)
        p_右 = 1 - p_左
        info_gain = self.entropy(y) - p_left * self.entropy(left_y) - p_right * self.entropy(right_y)
        返回信息增益

    def find_best_split(自身, X, y):
        最佳信息增益 = 0
        最佳特征索引 = 0
        最佳阈值 = 0
        对于 range(X.shape[1]) 中的 feature_index:unique_values = np.unique(X[:, feature_index])
            对于 unique_values 中的阈值:
                info_gain = self.information_gain(X, y, 特征索引, 阈值)
                如果 info_gain > best_info_gain:
                    最佳信息增益 = 信息增益
                    最佳特征索引 = 特征索引
                    最佳阈值 = 阈值
        返回最佳特征索引、最佳阈值

    def split_data(self, X, y, feature_index, 阈值):
        left_mask = X[:, feature_index] <= 阈值
        右掩码 = ~左掩码
        left_X, right_X = X[左掩码], X[右掩码]
        左_y, 右_y = y[左掩码], y[右掩码]
        返回左X、右X、左Y、右Y

    def create_node(自身, X, y):
        class_counts = np.bincount(y)
        class_label = np.argmax(class_counts)
        返回 {'class_label': class_label, 'samples': len(y)}

    def recursive_build(自身, X, y):节点 = self.create_node(X, y)
        如果 len(np.unique(y)) == 1:
            返回节点
        feature_index, 阈值 = self.find_best_split(X, y)
        如果feature_index为None或threshold为None:
            返回节点
        left_X, right_X, left_y, right_y = self.split_data(X, y, 特征索引, 阈值)
        如果 len(left_y) == 0 或 len(right_y) == 0:
            返回节点
        节点['feature_index'] = feature_index
        节点['阈值'] = 阈值
        节点['left'] = self.recursive_build(left_X, left_y)
        节点['right'] = self.recursive_build(right_X, right_y)
        返回节点

    def fit(自身, X, y):
        self.tree = self.recursive_build(X, y)

    def Predict_one(自身, x, 节点):
        如果节点中有“class_label”:
            返回节点['class_label']
        feature_value = x[节点['feature_index']]
        如果 feature_value <= 节点['阈值']:返回 self.predict_one(x, 节点['左'])
        别的:
            返回 self.predict_one(x, 节点['right'])

    def 预测(自身,X):
        return np.array([self.predict_one(x, self.tree) for x in X])

上面的代码是一个简单的二分类决策树算法实现,它使用信息增益作为特征选择的标准。您可以使用该算法来解决分类问题。

总结:本文介绍了Python手写决策树算法的基本原理和实现方法,并提供了简单的代码示例。通过手写决策树算法,我们可以更好地理解决策树的工作原理,并可以根据实际需要进行相应的修改和扩展。希望这篇文章能够帮助您理解决策树算法!

登录后参与评论