决策树
程序员文章站
2022-05-21 23:30:31
...
def get_max_entropy(file_name,decide_name):
df = pd.read_csv(file_name)
df2 = df.loc[:,[‘Outlook’,‘Windy’]]
# print(df2)
c_play = df[decide_name] #选出列头为Play的一列
c_play_group = c_play.value_counts() #打印出来的结果是yes:9,no:5
# print(c_play_group)
all_record = df2.shape[0] #shape是筛选出行和列,选出行作为总数
# print(all_record)
#目标列的熵值
target_entropy = 0
play_names = c_play_group.index.values #把c_play_group中的yes和no拿出来
# print(play_names)
for s_flag in play_names:
# print(s_flag)
p_flag = c_play_group[s_flag] / all_record #这个是yes和no分别所占的概率
target_entropy += (-p_flag*np.log2(p_flag)) #这是yes和no所占的熵
#每一列基于目标列的熵值
all_train_name = df2.columns.values #这一列拿出来的是['Outlook','Windy']
results = {}
for c_name in all_train_name:
r_group = df.loc[:,[c_name,decide_name]].groupby([c_name,decide_name]).size()
#拿出来预测和目标的所对应条件下的数值
c_flags = df[c_name].unique()#获取每一列标签的不重复数值,如Outlook中会获取到sunny,overcast,rainy
every_flag_count = df[c_name].value_counts() #获取每列标签的不重复值中对应的个数,如Outlook中获取到sunny 5,rainy 5,overcast 4,
r_group_dict = r_group.to_dict() #例如:{('overcast','yes'):4,('rainy','no'):2}
print(r_group_dict)
c_entropy = 0
for c_flag in c_flags: #遍历测试列的情况值,Outlook中的sunny,overcast,rainy,
c_flag_entropy = 0 #标签的熵值设置为0
for s_flag in play_names: #遍历目标列的情况值,如Play中的yes和no
one_flag_count = r_group_dict.get((c_flag,s_flag)) #得到r_group_dict中的数值,用get防止字典中有空
print(one_flag_count)
if one_flag_count is None: #如果字典取出的值为空直接跳出循环
continue
p_flag = one_flag_count/every_flag_count[c_flag] #求出该标签下的熵值,如sunny,overcast,rainy中no和yes所占的比例
c_flag_entropy += (-p_flag*np.log2(p_flag)) #算出测试标签的熵
c_entropy += c_flag_entropy * (every_flag_count[c_flag])/all_record #每个标签的熵乘以标签所占的比例加和就等于测试熵
# print(c_name,c_entropy)
results[c_name] =c_entropy #放入字典方便统计
return min(results,key=lambda x:results[x])
get_max_entropy(‘dtree.csv’,‘Play’)
上一篇: 从拾ACM——poj1002解题报告
下一篇: 决策树算法实现