使用Python实现ID3决策树中特征选择的先后顺序

简介: 使用Python实现ID3决策树中特征选择的先后顺序

一、实验目的

使用Python实现ID3决策树中特征选择的先后顺序。

二、实验原理

(1)信息熵

熵是对体系中混乱程度的度量。

熵越大则该体系越混乱。熵的计算公式如下所示:

l(xi)=-log2p(xi)

其中,xi表示第i个分类,p(xi)表示选择第i个分类的概率函数,其中 。

熵H(x)可表示为:


(2)条件熵


(3)信息增益


因此,决策树分类选特征应选信息增益最大的特征,也就是选择的特征能够使该系统从混乱到有序最快的特征。

三、Python包

(1)numpy


四、实验内容

(1)案例描述:通过头发和声音2个特征来判断学生的性别。使用Python实现求出其信息增益,并得出哪个特征优先被选择(注:数据处理使用程序计算)。

数据集如下:


注:数据集可直接用矩阵来描述:

[[‘长’, ‘粗’, ‘男’],

[‘短’, ‘粗’, ‘男’],

[‘短’, ‘粗’, ‘男’],

[‘长’, ‘细’, ‘女’],

[‘短’, ‘细’, ‘女’],

[‘短’, ‘粗’, ‘女’],

[‘长’, ‘粗’, ‘女’],

[‘长’, ‘粗’, ‘女’]]

代码:

import numpy as np
import math
# 求出总熵
def getData(pri_data):
    data = np.array(pri_data)
    boys = 0
    girls = 0
    for i in range(len(data)):
        if data[i][2] == '男':
            boys += 1
        else:
            girls += 1
    a = boys / len(data)
    total_shang = -(a) * math.log(a, 2) - (1 - a) * math.log((1 - a), 2)
    return total_shang
def empty1(pri_data):
    hair = []                       #['长', '短', '短', '长', '短', '短', '长', '长']
    voice = []                      #['粗', '粗', '粗', '细', '细', '粗', '粗', '粗']
    sex = []                        #['男', '男', '男', '女', '女', '女', '女', '女']
    for one in pri_data:
        hair.append(one[0])
        voice.append(one[1])
        sex.append(one[2])
    cu_voive = voice.count('粗')         #6
    thin_voice = voice.count('细')       #2
    # 一维列表合并成多维列表
    d = []
    for i in range(len(hair)):
        for j in range(len(voice)):
            if i == j:
                for k in range(len(sex)):
                    if j == k:
                        t = [hair[i], voice[j], sex[k]]
                        d.append(t)
    # print(d)
    a = d.count(['短', '粗', '男'])    #2
    b = d.count(['短', '粗', '女'])    #1
    c = d.count(['长', '粗', '男'])    #1
    e = d.count(['长', '粗', '女'])    #2
    f = d.count(['长', '细', '女'])    #1
    g = d.count(['短', '细', '女'])    #1
    #一维列表合并成二维列表
    z=list(zip(voice,sex))
    cu_woman =z.count(('粗','女'))
    cu_man = z.count(('粗','男'))
    num_v_h = (cu_woman + cu_man)
    return cu_voive, thin_voice, cu_woman, cu_man, num_v_h
def empty2(pri_data):
    hair = []  # ['长', '短', '短', '长', '短', '短', '长', '长']
    voice = []  # ['粗', '粗', '粗', '细', '细', '粗', '粗', '粗']
    sex = []  # ['男', '男', '男', '女', '女', '女', '女', '女']
    for one in pri_data:
        hair.append(one[0])
        voice.append(one[1])
        sex.append(one[2])
    # 一维列表合并成二维列表
    k = list(zip(hair, sex))
    long_man =k.count(('长','男'))
    long_woman = k.count(('长','女'))
    sum_hair1 = long_man + long_woman
    short_man = k.count(('短','男'))
    short_woman = k.count(('短','女'))
    sum_hair2 = short_man + short_woman
    sum_Hair = sum_hair1 + sum_hair2
    return long_man, long_woman, sum_hair1,sum_hair2,sum_Hair,short_man,short_woman
# 用声音作为优先选择特征求信息增益
def xxx1(cu_voice,thin_voice,cu_woman,cu_man,num_v_h):
    voice_num=cu_voice+thin_voice
    A = -cu_voive/voice_num * (cu_woman/num_v_h) * np.log2(cu_woman/num_v_h) - \
        cu_voive/voice_num * (cu_man/num_v_h) * np.log2(cu_man/num_v_h)
    sum_v = getData(pri_data) - A
    return sum_v
# 用头发作为优先选择特征求信息增益
def xxx2(long_man, long_woman, sum_hair,sum_hair2,sum_Hair,short_man,short_woman):
    B = -sum_hair/sum_Hair* (long_man/sum_hair) * np.log2(long_man/sum_hair) - \
        sum_hair/sum_Hair * (long_woman/sum_hair) * np.log2(long_woman/sum_hair) - sum_hair2/sum_Hair * (short_man/sum_hair2) * np.log2(short_man/sum_hair2)\
        - sum_hair2/sum_Hair* (short_woman/sum_hair2) * np.log2(short_woman/sum_hair2)
    sum_h = getData(pri_data) - B
    return sum_h
if __name__ == "__main__":
    pri_data = [['长', '粗', '男'], ['短', '粗', '男'], ['短', '粗', '男'],
                ['长', '细', '女'], ['短', '细', '女'], ['短', '粗', '女'],
                ['长', '粗', '女'], ['长', '粗', '女']]
    total_shang=getData(pri_data)
    cu_voive, thin_voice, cu_woman, cu_man, num_v_h=empty1(pri_data)
    sum1 = xxx1(cu_voive, thin_voice, cu_woman, cu_man, num_v_h)
    print('用声音作为优先选择特征求信息增益:',sum1)
    long_man, long_woman, sum_hair1, sum_hair2, sum_Hair, short_man, short_woman=empty2(pri_data)
    sum2 = xxx2(long_man, long_woman, sum_hair1, sum_hair2, sum_Hair, short_man, short_woman)
    print('用头发作为优先选择特征求信息增益:',sum2)
    if sum1 > sum2:
        print("用声音作为优先选择特征求信息增益大")
    else:
        print("用头发作为优先选择特征求信息增益大")

截图;

image.png

四、实验内容

(1)案例描述:通过天气、温度、湿度、是否有风4个特征来决策是否打球。使用Python实现求出其信息增益,并得出哪个特征优先被选择(注:数据处理使用程序计算,数据见data.xls)。 数据集如下:

image.png

import xlrd
import numpy as np
workbook=xlrd.open_workbook("data.xls")
sheet=workbook.sheet_by_name("Sheet1")
row_count=sheet.nrows
col_count=sheet.ncols
data_list=[]
for i in range(1,row_count):
    data_list.append(sheet.row_values(i))
play_golf_number=0
no_play_golf_number=0
total_count=0
for i in data_list:
    if i[col_count-1]=="Yes":
        play_golf_number+=1
    else:
        no_play_golf_number+=1
    total_count+=1
a=play_golf_number/total_count
#求出总熵
total_shang=-(a)*np.log2(a)-(1-a)*np.log2(1-a)
print(total_shang)
#求出各分熵,开始判别第一特征
#1.根据天气
b=(5/14)*((-2/5)*np.log2(2/5)-(3/5)*np.log2(3/5))+(5/14)*((-2/5)*np.log2(2/5)-(3/5)*np.log2(3/5))
#2.根据温度
c=(4/14)*((-1/2)*np.log2(1/2)-(1/2)*np.log2(1/2))+(4/14)*((-3/4)*np.log2(3/4)-(1/4)*np.log2(1/4))+(6/14)*((-2/3)*np.log2(2/3)-(1/3)*np.log2(1/3))
#3.根据湿度
d=(7/14)*((-3/7)*np.log2(3/7)-(4/7)*np.log2(4/7))+(7/14)*((-6/7)*np.log2(6/7)-(1/7)*np.log2(1/7))
#4.根据风力
e=(8/14)*((-6/8)*np.log2(6/8)-(2/8)*np.log2(2/8))+(6/14)*((-1/2)*np.log2(1/2)-(1/2)*np.log2(1/2))
y1=1-b
y2=1-c
y3=1-d
y4=1-e
shang_list1=[y1, y2, y3, y4]
first_feature=min(shang_list1)
if y1==first_feature:
    print("天气是第一特征")
if y2 == first_feature:
    print("温度是第一特征")
if y3==first_feature:
    print("湿度是第一特征")
if y4==first_feature:
    print("风力是第一特征")
#开始判别第二特征
#1.根据天气
f=(5/14)*((-2/5)*np.log2(2/5)-(3/5)*np.log2(3/5))+(5/14)*((-2/5)*np.log2(2/5)-(3/5)*np.log2(3/5))
#2.根据湿度
g=(7/14)*((-3/7)*np.log2(3/7)-(4/7)*np.log2(4/7))+(7/14)*((-6/7)*np.log2(6/7)-(1/7)*np.log2(1/7))
#3.根据风力
h=(8/14)*((-6/8)*np.log2(6/8)-(2/8)*np.log2(2/8))+(6/14)*((-1/2)*np.log2(1/2)-(1/2)*np.log2(1/2))
y5=1-f
y6=1-g
y7=1-h
shang_list2=[y5,y6,y7]
second_feature=min(shang_list2)
if y5==second_feature:
    print("天气是第二特征")
if y6==second_feature:
    print("湿度是第二特征")
if y7==second_feature:
    print("风力是第二特征")
#开始判别第三特征
#1.根据天气
i=(3/11)*((-1/3)*np.log2(1/3)-(2/3)*np.log2(2/3))+(4/11)*((-1/2)*np.log2(1/2)-(1/2)*np.log2(1/2))
#2.根据湿度
j=(6/11)*((-1/2)*np.log2(1/2)-(1/2)*np.log2(1/2))+(5/11)*((-4/5)*np.log2(4/5)-(1/5)*np.log2(1/5))
y8=1-i
y9=1-j
shang_list3=[y8,y9]
third_feature=min(shang_list3)
if y8==third_feature:
    print("天气是第三特征")
if y9==third_feature:
    print("湿度是第三特征")
print("天气是第四特征")
目录
相关文章
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
47 4
|
2月前
|
存储 大数据 索引
解锁Python隐藏技能:构建高效后缀树Suffix Tree,处理大数据游刃有余!
通过构建高效的后缀树,Python程序在处理大规模字符串数据时能够游刃有余,显著提升性能和效率。无论是学术研究还是工业应用,Suffix Tree都是不可或缺的强大工具。
44 6
|
2月前
|
大数据 UED 开发者
实战演练:利用Python的Trie树优化搜索算法,性能飙升不是梦!
在数据密集型应用中,高效搜索算法至关重要。Trie树(前缀树/字典树)通过优化字符串处理和搜索效率成为理想选择。本文通过Python实战演示Trie树构建与应用,显著提升搜索性能。Trie树利用公共前缀减少查询时间,支持快速插入、删除和搜索。以下为简单示例代码,展示如何构建及使用Trie树进行搜索与前缀匹配,适用于自动补全、拼写检查等场景,助力提升应用性能与用户体验。
50 2
|
2月前
|
存储 算法 数据挖掘
高效文本处理新纪元:Python后缀树Suffix Tree,让数据分析更智能!
在大数据时代,高效处理和分析文本信息成为关键挑战。后缀树作为一种高性能的数据结构,通过压缩存储字符串的所有后缀,实现了高效的字符串搜索、最长公共前缀查询等功能,成为文本处理的强大工具。本文探讨Python中后缀树的应用,展示其在文本搜索、重复内容检测、最长公共子串查找、文本压缩及智能推荐系统的潜力,引领数据分析迈入新纪元。虽然Python标准库未直接提供后缀树,但通过第三方库或自定义实现,可轻松利用其强大功能。掌握后缀树,即掌握开启文本数据宝藏的钥匙。
51 5
|
2月前
|
存储 开发者 Python
从理论到实践:Python中Trie树与Suffix Tree的完美结合,开启编程新篇章!
在编程领域,高效的数据结构对于解决问题至关重要。本文通过一个案例分析,介绍如何在Python中结合使用Trie树(前缀树)和Suffix Tree(后缀树)。案例聚焦于开发具备高效拼写检查和文本相似度检测功能的文本编辑器。首先,通过构建Trie树快速检查单词是否存在;接着,利用Suffix Tree检测文本相似度。尽管Python标准库未直接提供Suffix Tree,但可通过第三方库或自定义实现。本文展示了高级数据结构在实际应用中的强大功能,并强调了理论与实践相结合的重要性。
39 1
|
2月前
|
存储 算法 Python
逆袭之路:掌握Python字典树Trie与后缀树,成为技术圈的耀眼新星!
在编程的征途上,每个人都渴望成为那个能够独当一面、解决复杂问题的技术高手。而掌握高级数据结构,如字典树(Trie)与后缀树(Suffix Tree),无疑是你逆袭路上的重要一步。这些数据结构不仅能够提升你的编码技能,还能让你在解决特定问题时游刃有余,从而在技术圈中脱颖而出,成为那颗耀眼的新星。
31 1
|
2月前
|
存储 算法 搜索推荐
Python进阶必备:字典树Trie与后缀树Suffix Array,效率提升的神器!
在Python编程中,掌握高效的数据结构对于提升程序性能至关重要。本文将深入探讨两种强大的字符串处理数据结构——字典树(Trie)与后缀数组(Suffix Array)。字典树,又称前缀树,适用于自动补全和拼写检查等功能。例如,在文本编辑器中实现自动补全时,字典树能够即时提供单词补全选项。后缀数组则用于存储字符串的所有后缀并按字典序排序,结合最长公共前缀(LCP)数组,可以高效解决许多字符串问题,如查找最长重复子串等。通过实际案例,我们将展示这两种数据结构的强大功能,帮助你在Python编程中更进一步。
52 2
|
2月前
|
存储 算法 索引
从菜鸟到大神:一文带你彻底搞懂Python中的后缀树Suffix Tree奥秘!
在Python编程中,后缀树是一种高效的数据结构,特别适用于处理复杂的字符串问题,如搜索、最长公共前缀查询及最长重复子串查找等。本文通过问答形式介绍后缀树的基本概念、重要性及其实现方法。后缀树能显著提高字符串处理效率,将传统方法的时间复杂度从O(nm)降至接近O(m)。尽管其构建过程较复杂,但通过手动编写代码或使用第三方库,我们可以在Python中实现这一强大工具。后缀树的应用广泛,涵盖字符串搜索、压缩、生物信息学等多个领域,学习它不仅能帮助解决实际问题,更能提升算法思维和数据结构设计能力。
67 1
|
2月前
|
机器学习/深度学习 算法 数据挖掘
决策树算法大揭秘:Python让你秒懂分支逻辑,精准分类不再难
【9月更文挑战第12天】决策树算法作为机器学习领域的一颗明珠,凭借其直观易懂和强大的解释能力,在分类与回归任务中表现出色。相比传统统计方法,决策树通过简单的分支逻辑实现了数据的精准分类。本文将借助Python和scikit-learn库,以鸢尾花数据集为例,展示如何使用决策树进行分类,并探讨其优势与局限。通过构建一系列条件判断,决策树不仅模拟了人类决策过程,还确保了结果的可追溯性和可解释性。无论您是新手还是专家,都能轻松上手,享受机器学习的乐趣。
47 9
|
2月前
|
机器学习/深度学习 算法 Python
从菜鸟到大师:一棵决策树如何引领你的Python机器学习之旅
【9月更文挑战第9天】在数据科学领域,机器学习如同璀璨明珠,吸引无数探索者。尤其对于新手而言,纷繁复杂的算法常让人感到迷茫。本文将以决策树为切入点,带您从Python机器学习的新手逐步成长为高手。决策树以其直观易懂的特点成为入门利器。通过构建决策树分类器并应用到鸢尾花数据集上,我们展示了其基本用法及效果。掌握决策树后,还需深入理解其工作原理,调整参数,并探索集成学习方法,最终将所学应用于实际问题解决中,不断提升技能。愿这棵智慧之树助您成为独当一面的大师。
44 3
下一篇
无影云桌面