返回
把数据喂给决策树,自己跑出答案的决策树算法,Python手把手实现
人工智能
2023-11-17 07:30:16
决策树算法:机器学习中的分类利器
目录
- 决策树算法简介
- 决策树算法的原理
- 决策树算法的实现
- 决策树算法的优缺点
- 常见问题解答
决策树算法简介
决策树算法是一种机器学习分类算法,它通过根据数据的特征将数据划分为子集来预测数据的类别。这种算法简单易懂,不需要大量的训练数据,因此非常适合用于解决小型数据集的问题。
决策树算法的原理
决策树算法的工作原理基于信息增益。信息增益是指在一个数据集 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)
决策树算法的优缺点
优点:
- 简单易懂:决策树算法很容易理解,即使是非专业人士也可以很容易地理解决策树算法的工作原理。
- 不需要大量的数据:决策树算法不需要大量的