《呆板学习》第四章信息熵 信息增益率决定树怎么写

[复制链接]
发表于 2025-11-23 22:04:27 | 显示全部楼层 |阅读模式
信息熵

信息熵是信息论中用来度量信息含量不确定性的一种指标。简单来说,熵越大,体现信息的不确定性越高,信息量越大;熵越小,体现信息的不确定性越低,信息量越小。
以是,信息熵是大好还是小好,取决于详细的应用场景和需求:

  • 数据压缩和编码:在数据压缩和编码范畴,我们通常盼望信息熵尽大概小,由于这体现数据中的冗余信息少,更容易被压缩。
  • 通讯:在通讯范畴,如果信号中的熵太大,大概意味着传输过程中容易堕落,因此须要更多的资源来举行错误改正。而在某些安全通讯的场所,高熵大概是渴望的,由于它可以提供更高的保密性。
  • 暗码学:在暗码学中,高熵是一个好事故,由于它使得暗码更难以被猜测和破解。
  • 决媾和猜测:在决定支持和猜测模子中,如果输入数据的熵很高,大概意味着数据包罗了大量有效的信息,这对于创建有效的模子是有利的。
  • 信息检索:在信息检索范畴,盼望检索效果具有低熵,即效果尽大概相干和会集,而不是分散和不相干。
因此,信息熵的巨细没有绝对的优劣之分,须要根据详细的应用目的和配景来评估。
信息增益率
 


决定树怎么写

好抽象的过程 

编写一个天生决定树的算法代码可以从实现一个简单的决定树学习算法开始,好比ID3(Iterative Dichotomiser 3)算法。以下是一个利用Python实现的简化版ID3算法的例子。这个例子假设你已经有了数据集,而且数据集是适实用来构建决定树的,即全部特性都是离散的。
python
复制
  1. import numpy as np
  2. from collections import Counter
  3. # 计算信息熵
  4. def entropy(subset):
  5.     # 计算标签的频率
  6.     label_counts = Counter(subset[:, -1])
  7.     # 计算熵
  8.     entropy_value = -sum((count / len(subset)) * np.log2(count / len(subset)) for count in label_counts.values())
  9.     return entropy_value
  10. # 计算信息增益
  11. def information_gain(data, feature_index):
  12.     # 计算整个数据集的熵
  13.     total_entropy = entropy(data)
  14.     # 特征的唯一值及其出现次数
  15.     feature_values, counts = np.unique(data[:, feature_index], return_counts=True)
  16.     # 计算特征的加权熵
  17.     weighted_entropy = sum((count / len(data)) * entropy(data[data[:, feature_index] == value]) for value, count in zip(feature_values, counts))
  18.     # 计算信息增益
  19.     gain = total_entropy - weighted_entropy
  20.     return gain
  21. # 递归构建决策树
  22. def build_tree(data, features):
  23.     # 所有样本的标签
  24.     labels = data[:, -1]
  25.     # 如果所有标签相同,返回该标签
  26.     if len(set(labels)) == 1:
  27.         return labels[0]
  28.     # 如果没有特征可以分割,返回最频繁的标签
  29.     if len(features) == 0:
  30.         return Counter(labels).most_common(1)[0][0]
  31.     # 选择具有最高信息增益的特征
  32.     best_feature_index = np.argmax([information_gain(data, feature_index) for feature_index in features])
  33.     # 创建子节点
  34.     tree = {features[best_feature_index]: {}}
  35.     # 移除已选择的特征
  36.     remaining_features = [feature for feature in features if feature != features[best_feature_index]]
  37.     # 对于特征的每个唯一值,递归构建子树
  38.     for value in np.unique(data[:, best_feature_index]):
  39.         sub_data = data[data[:, best_feature_index] == value]
  40.         subtree = build_tree(sub_data, remaining_features)
  41.         tree[features[best_feature_index]][value] = subtree
  42.     return tree
  43. # 示例数据集
  44. # 特征:是否晴天、温度、湿度、风况;标签:是否去玩
  45. data = np.array([
  46.     ['Sunny', 'Hot', 'High', 'Weak', 'No'],
  47.     ['Sunny', 'Hot', 'High', 'Strong', 'No'],
  48.     ['Overcast', 'Hot', 'High', 'Weak', 'Yes'],
  49.     ['Rain', 'Mild', 'High', 'Weak', 'Yes'],
  50.     ['Rain', 'Cool', 'Normal', 'Weak', 'Yes'],
  51.     ['Rain', 'Cool', 'Normal', 'Strong', 'No'],
  52.     ['Overcast', 'Cool', 'Normal', 'Strong', 'Yes'],
  53.     ['Sunny', 'Mild', 'High', 'Weak', 'No'],
  54.     ['Sunny', 'Cool', 'Normal', 'Weak', 'Yes'],
  55.     ['Rain', 'Mild', 'Normal', 'Weak', 'Yes'],
  56.     ['Sunny', 'Mild', 'Normal', 'Strong', 'Yes'],
  57.     ['Overcast', 'Mild', 'High', 'Strong', 'Yes'],
  58.     ['Overcast', 'Hot', 'Normal', 'Weak', 'Yes'],
  59.     ['Rain', 'Mild', 'High', 'Strong', 'No'],
  60. ])
  61. # 特征名称
  62. features = ['Outlook', 'Temperature', 'Humidity', 'Wind']
  63. # 构建决策树
  64. decision_tree = build_tree(data, features)
  65. # 打印决策树
  66. print(decision_tree)
复制代码
请留意,上述代码是一个非常简化的决定树实现,它没有处理处罚一连特性、缺失值、剪枝等标题。在实际应用中,通常会利用更复杂的算法和库,如scikit-learn中的DecisionTreeClassifier。这个例子仅用于展示根本的决定树构建流程。在实际利用中,你大概须要根据详细的数据和需求来调解和优化代码。
修改后
效果

IndexError Traceback (most recent call last) Cell In[1], line 70 67 features = [‘Outlook’, ‘Temperature’, ‘Humidity’, ‘Wind’] 69 # 构建决定树 —> 70 decision_tree = build_tree(data, features) 72 # 打印决定树 73 decision_tree
Cell In[1], line 35, in build_tree(data, features) 33 return Counter(labels).most_common(1)[0][0] 34 # 选择具有最高信息增益的特性 —> 35 best_feature_index = np.argmax([information_gain(data, feature_index) for feature_index in features]) 36 # 创建子节点 37 tree = {features[best_feature_index]: {}}
Cell In[1], line 35, in (.0) 33 return Counter(labels).most_common(1)[0][0] 34 # 选择具有最高信息增益的特性 —> 35 best_feature_index = np.argmax([information_gain(data, feature_index) for feature_index in features]) 36 # 创建子节点 37 tree = {features[best_feature_index]: {}}
Cell In[1], line 17, in information_gain(data, feature_index) 15 total_entropy = entropy(data) 16 # 特性的唯一值及其出现次数 —> 17 feature_values, counts = np.unique(data[:, feature_index], return_counts=True) 18 # 盘算特性的加权熵 19 weighted_entropy = sum((count / len(data)) * entropy(data[data[:, feature_index] == value]) for value, count in zip(feature_values, counts))
IndexError: only integers, slices (, ellipsis (...), numpy.newaxis (None) and integer or boolean arrays are valid indices
代码实行时发生了一个错误。这个错误是由于在实验利用特性名称作为索引来访问数据时,数据集实际上是以数字索引来访问的。为了办理这个标题,我们须要将特性名称映射到相应的数字索引。我将修正这个标题并重新实行代码。
 代码天生:已完成
效果
{‘Outlook’: {‘Overcast’: ‘Yes’, ‘Rain’: {‘Wind’: {‘Strong’: ‘No’, ‘Weak’: ‘Yes’}}, ‘Sunny’: {‘Humidity’: {‘High’: ‘No’, ‘Normal’: ‘Yes’}}}}

引用
这是根据提供的数据集构建的决定树的效果:
复制
  1. {
  2.     'Outlook': {
  3.         'Overcast': 'Yes',
  4.         'Rain': {
  5.             'Wind': {
  6.                 'Strong': 'No',
  7.                 'Weak': 'Yes'
  8.             }
  9.         },
  10.         'Sunny': {
  11.             'Humidity': {
  12.                 'High': 'No',
  13.                 'Normal': 'Yes'
  14.             }
  15.         }
  16.     }
  17. }
复制代码
这个决定树的结构表明:


  • 如果气候是阴天(Overcast),那么决定是去玩(Yes)。
  • 如果气候是雨天(Rain),那么决定取决于风况(Wind):

    • 如果风大(Strong),那么决定是不去玩(No)。
    • 如果风小(Weak),那么决定是去玩(Yes)。

  • 如果气候是好天(Sunny),那么决定取决于湿度(Humidity):

    • 如果湿度高(High),那么决定是不去玩(No)。
    • 如果湿度正常(Normal),那么决定是去玩(Yes)。



代码赏鉴


很好的参考:决定树原理及手写代码明白_手写决定树推理代码-CSDN博客
難しい*…長い⁂…まだ冬休み**……
新术语

np.bincount

np.bincount 是 NumPy 库中的一个函数,用于盘算非负整数的直方图。详细来说,它返回一个数组,此中数组的索引体现输入数组中的值,而对应的元素值体现输入数组中每个值的出现次数。
以下是 np.bincount 的根本用法:

  1. import numpy as np
  2. x = np.array([0, 1, 1, 3, 2, 1, 7])
  3. result = np.bincount(x)
  4. print(result)
复制代码
这段代码会输出 [1 3 1 1 0 0 0 1],这体现:


  • 数字 0 在数组 x 中出现了 1 次,
  • 数字 1 在数组 x 中出现了 3 次,
  • 数字 2 在数组 x 中出现了 1 次,
  • 数字 3 在数组 x 中出现了 1 次,
  • 数字 4、5、6 在数组 x 中没有出现(因此计数为 0),
  • 数字 7 在数组 x 中出现了 1 次。
np.bincount 的几个紧张参数包罗:


  • x:输入的一维非负整数数组。
  • weights(可选):与 x 雷同长度的权重数组,用于给 x 中的每个值指定权重。
  • minlength(可选):输出数组的长度。如果 x 中有比 minlength-1 大的值,那么效果数组在这个索引位置及其之后的值将为 0。
这个函数在处理处罚数据,尤其是须要统计整数出现频率时非常有效。比方,在图像处理处罚中,可以用 np.bincount 来盘算图像中每个灰度值的出现次数。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表