欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

决策树

程序员文章站 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’)

相关标签: 决策树