返回

用Python实现经典ID3决策树算法,探索决策树的魅力

人工智能

在机器学习领域,决策树算法因其简单易懂、易于实现和解释性强等特点而备受欢迎。它能够从数据中自动学习决策规则,并根据这些规则对新数据进行分类或预测。

在本文中,我们将从经典ID3决策树算法开始,带您一步步构建决策树模型。我们将讨论ID3算法的核心思想,包括信息增益、熵和决策树生成的过程。同时,我们还将使用Python代码演示ID3算法的具体实现。

接下来,我们将转向sklearn库中提供的决策树模型。sklearn是Python中一个强大的机器学习库,它提供了丰富的机器学习算法和工具。我们将使用sklearn的决策树模型实现决策树算法,并将其与我们自己的ID3算法进行比较。

最后,我们将探讨决策树算法在机器学习中的应用,包括分类和回归任务。我们将讨论决策树算法的优缺点,以及在哪些场景下决策树算法是最佳选择。

通过本文,您将对决策树算法有一个全面的了解,并能够使用Python语言实现决策树模型。您还将掌握决策树算法在机器学习中的应用,并能够将其应用于实际问题中。

ID3决策树算法

ID3决策树算法是一种经典的决策树算法,它由J. Ross Quinlan于1986年提出。ID3算法基于信息增益的思想,通过计算特征的信息增益来选择最优的决策属性,并以此递归地构建决策树。

信息增益 是度量一个特征对数据集分类效果的度量。信息增益越大,则该特征对数据集的分类效果越好。信息增益的计算公式如下:

信息增益(特征) = 熵(数据集) - 熵(特征, 数据集)

其中,熵(数据集)是数据集的熵,熵(特征, 数据集)是特征对数据集的熵。

是度量数据集混乱程度的度量。熵越大,则数据集越混乱。熵的计算公式如下:

熵(数据集) = -sum(p_i * log(p_i))

其中,p_i是数据集第i个类别的概率。

ID3算法的Python实现

下面是ID3算法的Python实现代码:

import numpy as np
import pandas as pd
from collections import Counter

class ID3DecisionTree:

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

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

    def predict(self, X):
        y_pred = []
        for x in X:
            y_pred.append(self._predict_instance(x, self.tree))
        return np.array(y_pred)

    def _build_tree(self, X, y):
        # 计算信息增益
        info_gains = self._calculate_info_gains(X, y)

        # 选择信息增益最大的特征
        best_feature = np.argmax(info_gains)

        # 构建决策树
        tree = {best_feature: {}}
        for value in np.unique(X[:, best_feature]):
            X_subset = X[X[:, best_feature] == value, :]
            y_subset = y[X[:, best_feature] == value]
            if len(np.unique(y_subset)) == 1:
                tree[best_feature][value] = y_subset[0]
            else:
                tree[best_feature][value] = self._build_tree(X_subset, y_subset)

        return tree

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

        # 计算每个特征的信息增益
        info_gains = np.zeros(X.shape[1])
        for feature in range(X.shape[1]):
            # 计算特征对数据集的熵
            entropy_feature = self._calculate_entropy(y, X[:, feature])

            # 计算信息增益
            info_gains[feature] = entropy - entropy_feature

        return info_gains

    def _calculate_entropy(self, y, feature=None):
        # 计算数据集的熵
        if feature is None:
            counts = Counter(y)
            probs = [count / len(y) for count in counts.values()]
            entropy = -sum(p * np.log2(p) for p in probs)
        # 计算特征对数据集的熵
        else:
            counts = Counter(zip(y, feature))
            probs = [count / len(y) for count in counts.values()]
            entropy = -sum(p * np.log2(p) for p in probs)

        return entropy

    def _predict_instance(self, x, tree):
        # 遍历决策树,找到相应的叶子节点
        while True:
            feature = list(tree.keys())[0]
            value = x[feature]
            tree = tree[feature][value]

            # 如果到达叶子节点,则返回预测值
            if isinstance(tree, str):
                return tree

            # 如果没有到达叶子节点,则继续遍历
            else:
                x = x[feature == value]

sklearn库的决策树模型

sklearn库提供了丰富的机器学习算法,包括决策树算法。sklearn的决策树模型使用ID3算法和CART算法构建决策树。CART算法是ID3算法的改进版本,它使用基尼不纯度作为决策属性选择标准。

from sklearn.tree import DecisionTreeClassifier

# 构建决策树模型
model = DecisionTreeClassifier()

# 训练模型
model.fit(X, y)

# 预测结果
y_pred = model.predict(X)

决策树算法的应用

决策树算法在机器学习中广泛应用于分类和回归任务。

在分类任务中,决策树算法可以根据特征的值对数据进行分类。例如,我们可以使用决策树算法对鸢尾花数据进行分类,将鸢尾花分为三种不同的类型。

# 鸢尾花数据
X = np.array([[5.0, 3.6, 1.3, 0.25],
              [5.9, 3.0, 4.2, 1.5],
              [6.7, 3.3, 5.7, 2.5],
              [7.7, 2.6, 6.9, 2.3],
              [4.9, 2.5, 4.5, 1.7],
              [5.7, 2.8, 4.1, 1.3],
              [6.5, 3.0, 5.8, 2.2],
              [7.7, 3.8, 6.7, 2.2],
              [5.1, 3.8, 1.6, 0.2],
              [5.9, 3.2, 4.8, 1.8]])

y = np.array([0, 0, 0, 0, 1, 1, 1, 1, 2, 2])

# 构建决策树模型
model = DecisionTreeClassifier()

# 训练模型
model.fit(X, y)

# 预测结果
y_pred = model.predict(X)

# 打印预测结果
print(y_pred)

在回归任务中,决策树算法可以根据特征的值预测连续值。例如,我们可以使用决策树算法预测房子的价格。

# 房屋数据
X = np.array([[150, 25],
              [200, 30],
              [250, 35],
              [300, 40],
              [350, 45]])

y = np.array([200, 300, 400, 500, 600])

# 构建决策树模型
model = DecisionTreeRegressor()

# 训练模型
model.fit(X, y)

# 预测结果
y_pred = model.predict(X)

# 打印预测结果
print(y_pred)

决策树算法的优缺点

决策树算法具有以下优点:

  • 简单易懂,易于实现和解释。
  • 能够自动学习