返回

把数据喂给决策树,自己跑出答案的决策树算法,Python手把手实现

人工智能

决策树算法:机器学习中的分类利器

目录

  • 决策树算法简介
  • 决策树算法的原理
  • 决策树算法的实现
  • 决策树算法的优缺点
  • 常见问题解答

决策树算法简介

决策树算法是一种机器学习分类算法,它通过根据数据的特征将数据划分为子集来预测数据的类别。这种算法简单易懂,不需要大量的训练数据,因此非常适合用于解决小型数据集的问题。

决策树算法的原理

决策树算法的工作原理基于信息增益。信息增益是指在一个数据集 D 中,对于一个特征 A,计算出该特征对数据集 D 的信息增益。信息增益越大,说明该特征对数据集 D 的分类能力越强。

信息增益的计算公式如下:

信息增益(A) = 熵(D) - 熵(D|A)

其中,熵(D) 表示数据集 D 的熵,熵(D|A) 表示数据集 D 在特征 A 上的条件熵。

熵的计算公式如下:

熵(D) = -Σ(p(i)*log(p(i)))

其中,p(i) 表示数据集 D 中第 i 类实例的比例。

条件熵的计算公式如下:

(D|A) = Σ(p(Ai)*熵(Di))

其中,p(Ai) 表示数据集 D 中具有特征 A 的第 i 个取值的数据的比例,Di 表示数据集 D 中具有特征 A 的第 i 个取值的数据集。

决策树算法的实现

决策树算法可以用 Python 轻松实现。以下是一个用 Python 实现的决策树算法的代码示例:

import numpy as np
import pandas as pd

class DecisionTree:
    def __init__(self):
        self.root = None

    def fit(self, X, y):
        self.root = self._build_tree(X, y)

    def predict(self, X):
        return np.array([self._predict_instance(instance) for instance in X])

    def _build_tree(self, X, y):
        # 如果数据集中只剩下一种类型的实例,则返回一个叶节点
        if np.all(y == y[0]):
            return TreeNode(y[0])

        # 计算每个特征的信息增益
        information_gains = self._calculate_information_gains(X, y)

        # 选择信息增益最大的特征
        best_feature_index = np.argmax(information_gains)
        best_feature = X[:, best_feature_index]

        # 根据选择的特征将数据集划分为子集
        subsets = self._split_dataset(X, best_feature)

        # 递归地为每个子集构建子树
        children = [self._build_tree(subset[0], subset[1]) for subset in subsets]

        # 返回一个包含最佳特征和子树的内部节点
        return TreeNode(best_feature, children)

    def _calculate_information_gains(self, X, y):
        # 计算数据集的熵
        entropy_of_dataset = self._calculate_entropy(y)

        # 计算每个特征的信息增益
        information_gains = []
        for feature in X.T:
            # 计算特征的条件熵
            conditional_entropy = self._calculate_conditional_entropy(feature, y)

            # 计算信息增益
            information_gain = entropy_of_dataset - conditional_entropy
            information_gains.append(information_gain)

        return np.array(information_gains)

    def _calculate_entropy(self, y):
        # 计算每个类的概率
        class_probabilities = np.bincount(y) / len(y)

        # 计算熵
        entropy = -np.sum(class_probabilities * np.log2(class_probabilities))

        return entropy

    def _calculate_conditional_entropy(self, feature, y):
        # 计算每个特征值的概率
        feature_value_probabilities = np.bincount(feature) / len(feature)

        # 计算每个特征值的条件熵
        conditional_entropy = 0
        for feature_value_probability in feature_value_probabilities:
            # 计算具有该特征值的实例的子集
            subset = y[feature == feature_value]

            # 计算子集的熵
            subset_entropy = self._calculate_entropy(subset)

            # 计算条件熵
            conditional_entropy += feature_value_probability * subset_entropy

        return conditional_entropy

    def _split_dataset(self, X, feature):
        # 创建一个列表来存储子集
        subsets = []

        # 遍历每个特征值
        for feature_value in np.unique(feature):
            # 计算具有该特征值的实例的子集
            subset = X[feature == feature_value]

            # 计算子集的标签
            y_subset = y[feature == feature_value]

            # 将子集添加到列表中
            subsets.append((subset, y_subset))

        return subsets

    def _predict_instance(self, instance):
        # 从根节点开始遍历决策树
        node = self.root

        # 遍历决策树,直到达到叶节点
        while not isinstance(node, TreeNode):
            # 选择下一个子树
            node = node.children[instance[node.feature_index]]

        # 返回叶节点的标签
        return node.label

class TreeNode:
    def __init__(self, label, children=None):
        self.label = label
        self.children = children

# 使用决策树算法对鸢尾花数据集进行分类
iris_data = pd.read_csv('iris.csv')
X = iris_data[['sepal_length', 'sepal_width', 'petal_length', 'petal_width']].values
y = iris_data['class'].values

# 创建一个决策树对象
decision_tree = DecisionTree()

# 训练决策树
decision_tree.fit(X, y)

# 对测试数据集进行预测
X_test = pd.read_csv('iris_test.csv')[['sepal_length', 'sepal_width', 'petal_length', 'petal_width']].values
y_test = pd.read_csv('iris_test.csv')['class'].values
y_pred = decision_tree.predict(X_test)

# 计算准确率
accuracy = np.mean(y_pred == y_test)

# 打印准确率
print('准确率:', accuracy)

决策树算法的优缺点

优点:

  • 简单易懂:决策树算法很容易理解,即使是非专业人士也可以很容易地理解决策树算法的工作原理。
  • 不需要大量的数据:决策树算法不需要大量的