决策树

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’)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值