机器学习算法原理实现——决策树里根据信息增益选择特征
先说熵的定义:
再看信息增益
信息增益是一种用于特征选择的指标,用于衡量特征对于数据集分类的贡献程度。它基于信息熵的概念,通过比较特征划分前后的信息熵差异来评估特征的重要性。信息熵是衡量数据集纯度的指标,表示数据集中的不确定性或混乱程度。信息熵越高,数据集的不确定性越大。
上述例子计算错误,gpt识数出错,更正后的:
好了给出计算信息增益选择特征的python代码:
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | # 导入numpy库 from collections import Counter import numpy as np # 导入对数计算模块log from math import log # 定义信息熵计算函数 def entropy(ele): ''' 输入: ele:包含类别取值的列表 输出:信息熵值 ''' # 计算列表中取值的概率分布 counter = Counter(ele) probs = [counter[i] / len (ele) for i in counter.keys()] # 计算信息熵 entropy = - sum ([prob * log(prob, 2 ) for prob in probs]) return entropy # 定义基尼指数计算函数 def gini(nums): ''' 输入: nums:包含类别取值的列表 输出:基尼指数值 ''' # 获取列表类别的概率分布 probs = [nums.count(i) / len (nums) for i in set (nums)] # 计算基尼指数 gini = sum ([p * ( 1 - p) for p in probs]) return gini def information_gain(data, labels, feature): # 计算数据集的经验熵 total_entropy = entropy(labels) # 根据特征划分数据集 feature_values = np.unique(data[:, feature]) subsets = [data[data[:, feature] = = value] for value in feature_values] """ # 计算天气特征的经验条件熵 # 其中subset1~subset3为根据天气特征三个取值划分之后的子集 # entropy_DA = len(subset1)/len(df)*entropy(subset1['play'].tolist()) + \ # len(subset2)/len(df)*entropy(subset2['play'].tolist()) + \ # len(subset3)/len(df)*entropy(subset3['play'].tolist()) """ # 计算特征的经验条件熵 conditional_entropy = 0 for subset in subsets: subset_labels = subset[:, - 1 ] subset_entropy = entropy(subset_labels) subset_weight = len (subset_labels) / len (labels) conditional_entropy + = subset_weight * subset_entropy # 计算信息增益 information_gain = total_entropy - conditional_entropy return information_gain # 示例数据 data = np.array([[ 1 , 'Sunny' , 'Hot' , 'High' , 'Weak' , 'No' ], [ 2 , 'Sunny' , 'Hot' , 'High' , 'Strong' , 'No' ], [ 3 , 'Overcast' , 'Hot' , 'High' , 'Weak' , 'Yes' ], [ 4 , 'Rain' , 'Mild' , 'High' , 'Weak' , 'Yes' ], [ 5 , 'Rain' , 'Cool' , 'Normal' , 'Weak' , 'Yes' ], [ 6 , 'Rain' , 'Cool' , 'Normal' , 'Strong' , 'No' ], [ 7 , 'Overcast' , 'Cool' , 'Normal' , 'Strong' , 'Yes' ], [ 8 , 'Sunny' , 'Mild' , 'High' , 'Weak' , 'No' ], [ 9 , 'Sunny' , 'Cool' , 'Normal' , 'Weak' , 'Yes' ], [ 10 , 'Rain' , 'Mild' , 'Normal' , 'Weak' , 'Yes' ], [ 11 , 'Sunny' , 'Mild' , 'Normal' , 'Strong' , 'Yes' ], [ 12 , 'Overcast' , 'Mild' , 'High' , 'Strong' , 'Yes' ], [ 13 , 'Overcast' , 'Hot' , 'Normal' , 'Weak' , 'Yes' ], [ 14 , 'Rain' , 'Mild' , 'High' , 'Strong' , 'No' ]]) labels = data[:, - 1 ] # 计算天气特征的信息增益 feature_index = 1 info_gain = information_gain(data, labels, feature_index) print ( "天气特征对于数据集分类的信息增益为:" , info_gain) |
gpt给的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | def entropy(data): _, counts = np.unique(data, return_counts = True ) probabilities = counts / counts. sum () ent = - np. sum (probabilities * np.log2(probabilities)) return ent original_entropy = entropy(students[:, - 1 ]) def conditional_entropy(data, column_idx): unique_values, counts = np.unique(data[:, column_idx], return_counts = True ) weighted_entropy = 0 for value, count in zip (unique_values, counts): subset = data[data[:, column_idx] = = value] weighted_entropy + = count / data.shape[ 0 ] * entropy(subset[:, - 1 ]) return weighted_entropy def info_gain(data, column_idx): return original_entropy - conditional_entropy(data, column_idx) gain_for_glasses = info_gain(students, 0 ) print ( "信息增益(眼镜特征):" , gain_for_glasses) |
输出:
Python编程实现统计机器学习决策树算法之增益计算
决策树是一种经典的分类与回归方法。决策树学习主要包括三个步骤:特征选择、决策树生成和决策树剪枝。在ID3决策树生成算法中,通过计算包含最高信息增益的属性作为划分标准。
现在需要通过ID3决策树算法,判断客户是否优质,假设数据集有5个特征,分别为:是否有房,是否有贷款,是否有稳定工作,是否结婚,是否高收入人群,请根据上述信息计算出增益最大的特征,返回其特征索引及对应的信息增益。
解答要求
时间限制: C/C++ 1000ms, 其他语言:2000ms
内存限制: C/C++ 256MB, 其他语言:512MB
输入
第一行,输入一个正整数n,表示样本条数,n < 10000。
接下来输入n行整数数组,一个数组表示样本的5个特征及标签,数组最后一个整数表示样本标签,特征及标签值均用0/1表示。
输出
根据给定训练集,计算得到信息增益最大的特征索引及对应的信息增益。
特征索引从0开始,信息增益四舍五入保留2位小数。
样例1
复制输入:
6
1 1 0 1 1 0
1 0 0 1 1 1
0 1 0 0 1 1
0 1 0 1 0 0
0 1 0 0 0 0
0 0 0 1 0 0
复制输出:
4 0.46
解释:
5个特征信息增益依次为[0.04, 0.04, 0.0, 0.04, 0.46],故第5个特征划分时信息增益最大,返回特征索引4。
样例2
复制输入:
4
1 1 0 1 0 1
0 1 0 1 1 0
0 1 0 0 0 0
0 0 0 1 0 0
复制输出:
0 0.81
解释:
5个特征信息增益依次为[0.81, 0.12, 0.0, 0.12, 0.12],故第1个特征划分时信息增益最大,返回特征索引0。
代码如下:
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 31 32 33 34 35 | import numpy as np def entropy(labels): val_set, counts = np.unique(labels, return_counts = True ) prob = counts / np. sum (counts) return - np. sum (prob * np.log2(prob)) def conditional_entropy(data, col_idx): val_set = np.unique(data[:, col_idx]) ent = 0 for val in val_set: subset = data[data[:, col_idx] = = val] subset_labels = subset[:, - 1 ] subset_entropy = entropy(subset_labels) subset_weight = len (subset_labels) / len (data.shape) ent + = subset_weight * subset_entropy return ent # 主程序 n = int ( input ().strip()) data = [ list ( map ( int , input ().strip().split())) for _ in range (n)] data = np.array(data) feature_cnt = data.shape[ 1 ] - 1 max_gain = float ( '-inf' ) feature_choice = - 1 ent1 = entropy(data[:, - 1 ]) for i in range (feature_cnt): ent2 = conditional_entropy(data, i) gain_ent = round (ent1 - ent2, 2 ) if gain_ent > max_gain: max_gain = gain_ent feature_choice = i print (max_gain, feature_choice) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
2022-09-10 metersploit msf 常用命令
2022-09-10 windows 7 iso下载地址
2020-09-10 小样本学习文献
2019-09-10 联邦学习
2019-09-10 数据库索引数据结构总结——ART树就是前缀树