从机器学习的门缝开始窥了那一眼
一.计算香农熵
构建决策树涉及选择数据集的什么特征对数据集划分分支
我们一般选择信息增益最高的特征来划分数据集,而信息增益是信息变化前后
的变化强度,我们使用香农熵来度量它
信息增益 = 划分前的香农熵 - 划分后的香农熵 来选择最优特征
信息度量的公式:
香农熵的定义公式:
from math import log
def calculate_shannon_entropy(data_set):
"""
计算给定数据集的香农熵---度量数据集的无序程度
:param data_set: 输入数据集,数据集的最后一项字段必须是分类标签
:return:
"""
# 获取数据长度
num_entries = len(data_set)
# 定义分类字典
label_counts = {
}
# feat_vector:特征向量,一个样本
# feature:特征
# 从数据集中取出样本向量
for feat_vector in data_set:
# 获取当前样本数据的分类标签
current_label = feat_vector[-1]
if current_label not in label_counts.keys():
# 把第一次出现的标签添加到标签字典中
label_counts[current_label] = 0
# 当前标签的技术加1
label_counts[current_label] += 1
# 定义香农熵
shannon_entropy = 0.0
for key in label_counts:
# 当前分类出现的 概率=当前分类的样本数 / 样本总数
prob = float(label_counts[key]) / num_entries
# 使用香农熵公式计算(即信息的期望值)
shannon_entropy -= prob * log(prob, 2)
# shannon_entropy += -prob * log(prob, 2)
return shannon_entropy
熵越高,混合的数据越多(分类越多),即信息的不确定越高,信息度越复杂
得到熵之后,就可以按照获取最大信息增益的方法划分数据集
二.按照指定特征划分数据集
def split_data_set(data_set, axis, value):
"""
按照指定特征值抽取数据集
两步:
1.遍历出符合要求的样本---axis特征的value符合指定要求的value
2.过滤掉用于划分的轴axis的列(即去掉了axis的列)
3.返回抽取出来的数据集
:param data_set: 待划分的数据集
:param axis: 划分数据集的特征---比如选取特征对应的索引
:param value: 特征的返回值---用于抽取指定特征,与此返回值相同的样本
:return:
"""
# 定义抽取样本的数据集---保护数据源不被破坏
ret_data_set = []
for feat_vector in data_set:
# 遍历样本,判断每个样本在本次划分数据集中
# 指定的特征axis的value是否符合要求的value
# 符合要求即抽走
if feat_vector[axis] == valu