📅  最后修改于: 2023-12-03 15:26:08.182000             🧑  作者: Mango
决策树是一种基于树结构的分类模型,能够自动构建决策规则,广泛应用于数据挖掘、机器学习和人工智能等领域。此外,决策树还可以用于特征选择、数据预处理、异常检测和目标检测等任务。
决策树归纳算法是构建决策树的过程,它利用属性选择指标将数据集分成不同的类别,最终形成树结构。常用的决策树归纳算法包括ID3、C4.5和CART等。
ID3算法是最早出现的决策树归纳算法之一,其核心思想是基于信息增益选择属性。该算法从树的根节点开始,依次将样本集分成不同的子集,直到所有叶子节点都为同一个类别。步骤如下:
C4.5算法是对ID3算法的改进,它使用信息增益率代替信息增益来选择属性。该算法在分裂属性时还考虑了属性取值的数目,避免了对具有大量取值的属性的过度依赖。步骤如下:
CART算法是Classification And Regression Tree的缩写,可以用于分类和回归两种任务。该算法采用基尼指数来选择属性,最终生成二叉树。步骤如下:
以下是使用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
方法用于计算信息熵。