决策树

首先看类型 —— 是喜欢喜剧还是科幻?如果选喜剧,再看评分 —— 高于 8 分吗?如果评分够高,再看演员 —— 有没有你喜欢的明星?最后根据这些 “条件判断”,你终于定下了一部电影。

决策树算法做的事情,和这个过程几乎一模一样。它就像一个 “提问专家”,会根据数据里的特征(比如电影的类型、评分、演员)不断提出 “是 / 否” 或 “大于 / 小于” 的问题,把数据分到不同的小群体里,直到每个小群体的答案足够明确(比如 “这部电影值得看” 或 “不值得看”)。

比如用决策树预测 “一个人是否会购买某款手机”,它可能会先问 “月收入是否超过 1 万?”,收入高的群体再问 “年龄是否小于 30 岁?”,年轻群体再问 “是否用过该品牌?”…… 最后每个分支的终点,就是它给出的预测结果。

模拟人类的决策过程—— 通过一系列 “是 / 否” 的判断,逐步缩小范围,最终得到结论。

优点

  • 理解简单
  • 可视化

缺点

  • 不能很好创建推广数据的过于复杂的树
  • 过拟合

改进

  • 剪枝cart算法
  • 随机森林

原理#

要决定特征的先后顺序

信息论与信息熵

详见信息论相关知识:

香农定理:消除随机不确定的东西

信息的衡量➡️信息量➡️信息熵

信息熵定义#

  • H的专业术语称之为信息熵,单位比特

log下的b定义如下:

对数底数 b 决定了信息熵的计量单位,不同取值对应不同 “信息度量体系”:

当 (b = 2) 时:信息熵的单位是 “比特(bit)” ,这是计算机科学、通信领域最常用的设定。 它的直观含义是:用二进制(0/1)编码随机事件所需的 “最小位数”。比如抛硬币(概率 (P=0.5) ),(_2 0.5 = -1),单个结果的信息量是 (0.5×1 = 0.5) 比特(两个结果总熵为 1 比特 ),对应 “用 1 位二进制就能编码硬币的正反”。

当 (b = e) 时:信息熵的单位是 “纳特(nat)” ,e 是自然对数的底(约 2.71828 )。 这一设定更贴近 “连续概率分布” 的数学分析(比如概率论中分析连续随机变量的熵 ),在理论推导(如信息论证明、熵的数学性质研究 )中常用,本质是用自然对数简化微积分运算。

当 (b = 10) 时:信息熵的单位是 “哈特(hart)” ,工程领域偶尔会用,但远不如比特、纳特普及。

决策树划分依据——信息增益#

对于训练数据集 D 和特征 A,特征 A 对数据集 D 的信息增益 (g(D,A)),本质是数据集原始不确定性引入特征 A 后剩余不确定性的差值 。具体通过以下两个关键熵指标计算:

  • 信息熵 :衡量数据集 D 本身的混乱程度(不确定性),反映数据分类结果的无序性。
  • 信息条件熵 :在已知特征 A 取值的条件下,数据集 D 剩余的混乱程度(不确定性)。

信息增益的计算公式为:

选择对信息增益贡献最大的项优先判断

信息熵的计算

条件熵的计算:

表示属于某个类别的样本数

决策树划分依据——其他#

  • ID3
    • 信息增益 最大的准则
  • C4.5
    • 信息增益比 最大的准则
  • CART
    • 分类树:基尼系数 最小的准则
    • 优势:划分更加细致

决策树的API#

  • class sklearn.tree.DecisionTreeClassifier(criterion='gini',max_depth=None,random_state=None)
    • 决策树分类器
    • criterion:默认是gini,也可选择信息增益的熵entropy
    • max_depth:树的深度大小
    • random_state:随机数种子

代码案例#

可以可视化决策树 网站

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from sklearn.tree import DecisionTreeClassifier, export_graphviz
def decision_iris():
"""
用决策树对鸢尾花进行分类
:return:
"""
# 1)获取数据集
iris = load_iris()

# 2)划分数据集
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)

# 3)决策树预估器
estimator = DecisionTreeClassifier(criterion="entropy")
estimator.fit(x_train, y_train)

# 4)模型评估
# 方法1:直接比对真实值和预测值
y_predict = estimator.predict(x_test)
print("y_predict:\n", y_predict)
print("直接比对真实值和预测值:\n", y_test == y_predict)

# 方法2:计算准确率
score = estimator.score(x_test, y_test)
print("准确率为:\n", score)

# 可视化决策树
export_graphviz(estimator, out_file="iris_tree.dot", feature_names=iris.feature_names)

return None