📜  数据挖掘-决策树归纳(1)

📅  最后修改于: 2023-12-03 15:26:08.182000             🧑  作者: Mango

数据挖掘-决策树归纳

简介

决策树是一种基于树结构的分类模型,能够自动构建决策规则,广泛应用于数据挖掘、机器学习和人工智能等领域。此外,决策树还可以用于特征选择、数据预处理、异常检测和目标检测等任务。

决策树归纳算法

决策树归纳算法是构建决策树的过程,它利用属性选择指标将数据集分成不同的类别,最终形成树结构。常用的决策树归纳算法包括ID3、C4.5和CART等。

ID3算法

ID3算法是最早出现的决策树归纳算法之一,其核心思想是基于信息增益选择属性。该算法从树的根节点开始,依次将样本集分成不同的子集,直到所有叶子节点都为同一个类别。步骤如下:

  1. 计算所有属性的信息增益;
  2. 选择信息增益最大的属性作为节点的决策属性;
  3. 根据选定的属性将数据集分成不同的子集;
  4. 对每个子集递归调用步骤1~3,直到所有叶子节点都为同一个类别。
C4.5算法

C4.5算法是对ID3算法的改进,它使用信息增益率代替信息增益来选择属性。该算法在分裂属性时还考虑了属性取值的数目,避免了对具有大量取值的属性的过度依赖。步骤如下:

  1. 计算所有属性的信息增益率;
  2. 选择信息增益率最大的属性作为节点的决策属性;
  3. 根据选定的属性将数据集分成不同的子集;
  4. 对每个子集递归调用步骤1~3,直到所有叶子节点都为同一个类别。
CART算法

CART算法是Classification And Regression Tree的缩写,可以用于分类和回归两种任务。该算法采用基尼指数来选择属性,最终生成二叉树。步骤如下:

  1. 计算所有属性的基尼指数;
  2. 选择基尼指数最小的属性作为节点的决策属性;
  3. 根据选定的属性将数据集分成不同的子集;
  4. 对每个子集递归调用步骤1~3,直到所有叶子节点都为同一个类别或达到预定的深度。
代码实现

以下是使用Python实现ID3算法构建决策树的示例代码:

import numpy as np

class ID3DecisionTree:
    def __init__(self):
        self.tree = {}

    def fit(self, X, y, features):
        self.tree = self.build_tree(X, y, features)

    def predict(self, X):
        y_pred = []
        for sample in X:
            y_pred.append(self.traverse_tree(sample, self.tree))
        return y_pred

    def build_tree(self, X, y, features):
        if len(set(y)) == 1:
            return y[0]
        if len(features) == 0:
            return np.bincount(y).argmax()
        split_attr, split_value = self.choose_split(X, y, features)
        tree = {split_attr: {}}
        mask = X[:, split_attr] == split_value
        sub_tree = self.build_tree(X[mask], y[mask], features - {split_attr})
        tree[split_attr][split_value] = sub_tree
        sub_tree = self.build_tree(X[~mask], y[~mask], features - {split_attr})
        tree[split_attr][-split_value] = sub_tree
        return tree

    def choose_split(self, X, y, features):
        best_attr, best_value, best_score = None, None, -1
        for attr in features:
            values = set(X[:, attr])
            for value in values:
                mask = X[:, attr] == value
                score = self.calc_entropy(y[mask]) * sum(mask)
                score += self.calc_entropy(y[~mask]) * sum(~mask)
                if score > best_score:
                    best_score = score
                    best_attr, best_value = attr, value
        return best_attr, best_value

    def traverse_tree(self, sample, tree):
        if type(tree) != dict:
            return tree
        attr = list(tree.keys())[0]
        value = sample[attr]
        sub_tree = tree[attr][value] if value in tree[attr] else tree[attr][-value]
        return self.traverse_tree(sample, sub_tree)

    def calc_entropy(self, y):
        p = np.bincount(y) / len(y)
        p = p[p > 0]
        return -np.sum(p * np.log2(p))

其中,构造函数__init__初始化决策树;fit方法用于训练模型;predict方法用于预测新样本的类别;build_tree方法是决策树构造函数,该方法通过递归地选择属性和属性取值来构建决策树;choose_split方法用于选择属性和属性取值;traverse_tree方法用于遍历决策树并返回预测结果;calc_entropy方法用于计算信息熵。