微信登录

决策树 - 算法实现 - 决策树的代码实现

决策树 - 算法实现 - 决策树的代码实现

一、引言

决策树是一种常用的机器学习算法,它可以用于分类和回归任务。决策树的核心思想是通过对数据集的特征进行划分,构建一个树形结构,从而实现对样本的分类或预测。本文将详细介绍决策树的代码实现过程,帮助读者深入理解和掌握这一重要算法。

二、决策树的基本原理

决策树由节点和边组成。节点分为内部节点和叶节点,内部节点表示一个特征上的测试,边表示测试输出,叶节点表示类别或值。决策树的构建过程就是不断选择最优特征进行划分,直到满足停止条件。常用的划分准则有信息增益、信息增益比、基尼指数等。

信息增益

信息增益是基于信息熵的概念。信息熵是衡量数据不确定性的指标,信息增益表示划分前后信息熵的减少量。信息增益越大,说明该特征对分类的贡献越大。信息熵的计算公式为:
[H(D) = -\sum{k = 1}^{K}p{k}\log{2}p{k}]
其中,$D$ 是数据集,$K$ 是类别数,$p_{k}$ 是第 $k$ 类样本在数据集中所占的比例。

信息增益的计算公式为:
[g(D, A) = H(D) - H(D|A)]
其中,$A$ 是特征,$H(D|A)$ 是在特征 $A$ 给定的条件下数据集 $D$ 的条件熵。

三、代码实现步骤

1. 导入必要的库

  1. import numpy as np
  2. import pandas as pd

2. 计算信息熵

  1. def entropy(y):
  2. classes, counts = np.unique(y, return_counts=True)
  3. probabilities = counts / len(y)
  4. entropy_value = -np.sum(probabilities * np.log2(probabilities))
  5. return entropy_value

3. 划分数据集

  1. def split_dataset(X, y, feature_index, value):
  2. left_X = X[X[:, feature_index] == value]
  3. left_y = y[X[:, feature_index] == value]
  4. right_X = X[X[:, feature_index]!= value]
  5. right_y = y[X[:, feature_index]!= value]
  6. return left_X, left_y, right_X, right_y

4. 计算信息增益

  1. def information_gain(X, y, feature_index):
  2. parent_entropy = entropy(y)
  3. total_samples = len(y)
  4. unique_values = np.unique(X[:, feature_index])
  5. weighted_entropy = 0
  6. for value in unique_values:
  7. left_X, left_y, right_X, right_y = split_dataset(X, y, feature_index, value)
  8. prob = len(left_y) / total_samples
  9. weighted_entropy += prob * entropy(left_y) + (1 - prob) * entropy(right_y)
  10. return parent_entropy - weighted_entropy

5. 选择最优特征

  1. def best_feature(X, y):
  2. num_features = X.shape[1]
  3. best_info_gain = 0
  4. best_feature_index = -1
  5. for i in range(num_features):
  6. info_gain = information_gain(X, y, i)
  7. if info_gain > best_info_gain:
  8. best_info_gain = info_gain
  9. best_feature_index = i
  10. return best_feature_index

6. 创建决策树

  1. def create_tree(X, y, feature_names):
  2. if len(np.unique(y)) == 1:
  3. return np.unique(y)[0]
  4. if X.shape[1] == 0:
  5. return np.bincount(y).argmax()
  6. best_feature_index = best_feature(X, y)
  7. best_feature_name = feature_names[best_feature_index]
  8. tree = {best_feature_name: {}}
  9. unique_values = np.unique(X[:, best_feature_index])
  10. new_feature_names = feature_names.copy()
  11. new_feature_names.remove(best_feature_name)
  12. for value in unique_values:
  13. left_X, left_y, right_X, right_y = split_dataset(X, y, best_feature_index, value)
  14. subtree = create_tree(left_X, left_y, new_feature_names)
  15. tree[best_feature_name][value] = subtree
  16. return tree

7. 使用示例

  1. # 示例数据集
  2. data = {
  3. 'Outlook': ['Sunny', 'Sunny', 'Overcast', 'Rain', 'Rain', 'Rain', 'Overcast', 'Sunny', 'Sunny', 'Rain', 'Sunny', 'Overcast', 'Overcast', 'Rain'],
  4. 'Temperature': ['Hot', 'Hot', 'Hot', 'Mild', 'Cool', 'Cool', 'Cool', 'Mild', 'Cool', 'Mild', 'Mild', 'Mild', 'Hot', 'Mild'],
  5. 'Humidity': ['High', 'High', 'High', 'High', 'Normal', 'Normal', 'Normal', 'High', 'Normal', 'Normal', 'Normal', 'High', 'Normal', 'High'],
  6. 'Wind': ['Weak', 'Strong', 'Weak', 'Weak', 'Weak', 'Strong', 'Strong', 'Weak', 'Weak', 'Weak', 'Strong', 'Strong', 'Weak', 'Strong'],
  7. 'Play': [0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0]
  8. }
  9. df = pd.DataFrame(data)
  10. X = df.iloc[:, :-1].values
  11. y = df.iloc[:, -1].values
  12. feature_names = df.columns[:-1].tolist()
  13. # 创建决策树
  14. tree = create_tree(X, y, feature_names)
  15. print(tree)

四、代码解释

  1. entropy 函数:计算数据集的信息熵。
  2. split_dataset 函数:根据指定特征和特征值划分数据集。
  3. information_gain 函数:计算指定特征的信息增益。
  4. best_feature 函数:选择信息增益最大的特征。
  5. create_tree 函数:递归构建决策树。

五、总结

本文通过详细的代码实现,介绍了决策树的构建过程。决策树是一种直观、易于理解的机器学习算法,适用于多种类型的数据。通过信息增益等划分准则,可以有效地选择最优特征,构建出高效的决策树模型。

函数名 功能
entropy 计算信息熵
split_dataset 划分数据集
information_gain 计算信息增益
best_feature 选择最优特征
create_tree 创建决策树

通过上述代码和解释,读者可以更好地理解决策树的工作原理,并能够根据实际需求进行修改和扩展。

决策树 - 算法实现 - 决策树的代码实现