• 第四章-决策树


     代码如下:

    1. import numpy as np
    2. import pandas as pd
    3. data=pd.read_excel("西瓜数据集.xlsx")
    4. D=data
    5. A=D.columns[1:-1]#列标签作为属性集,除去编号,和好瓜(它们不是特征)
    6. class TreeNode:
    7. def __init__(self):
    8. self.mark=None#如果mark=-1 则该节点是叶子节点,否则是分支决策节点
    9. self.decision=None#如果是叶子节点,则是类别(好瓜:是or否),如果是分支决策节点,则是划分的属性
    10. self.chids={}#用字典存储分支的孩子{属性值:分支节点}
    11. def Max_class(D):#取D数据集中类别的最多的那个类
    12. max_class=D["好瓜"].iloc[0]
    13. max_value=0
    14. for i in set(D["好瓜"]):#{否,是}
    15. count=np.sum(D["好瓜"]==i)#统计类别个数
    16. if max_value
    17. max_value=count
    18. max_class=i
    19. return max_class#返回最多的那个类名称
    20. def Ent(D):#数据集的熵,当前样本的纯度
    21. ent_d=0
    22. for i in set(D["好瓜"]):#{是,否}
    23. class_num=np.sum(D["好瓜"]==i)#统计某类样本的个数
    24. pk=class_num/D.shape[0]#计算该类在数据集中的占比
    25. ent_d+=pk*np.log2(pk)#计算某类的熵,并累加
    26. return -1*ent_d#返回最终的数据集熵值
    27. def Gain(D,a):
    28. dv_ent_sum=0
    29. for v in set(D[a]):
    30. site=np.where(D[a]==v)#得到符合条件样本的下标
    31. Dv=D.iloc[site]#通过iloc函数取出对应下标的样本,组成子集Dv
    32. Dv_div_D=Dv.shape[0]/D.shape[0]#计算|Dv|/|D|的值
    33. ent_dv=Ent(Dv)#得到某个属性取值Dv子集的信息熵
    34. dv_ent_sum+=Dv_div_D*ent_dv#得到a属性总的信息熵
    35. return Ent(D)-dv_ent_sum
    36. def AttChoice(D,A):#获得信息增益最大的那个属性
    37. max_gain_a=A[0]#假定好的是第0个属性
    38. max_gain=0#假定信息增益取值为0
    39. for a in A:#循环找到最大信息增益的属性
    40. print(a,"的信息增益为:",Gain(D,a))
    41. if max_gain
    42. max_gain=Gain(D,a)
    43. max_gain_a=a
    44. print("当前选择的最优属性决策是:",max_gain_a)
    45. return max_gain_a#返回信息增益最大的属性
    46. def TreeGenerate(D, A, node):
    47. if len(set(D['好瓜'])) == 1: # 如果类别集合长度==1则说明只有一类
    48. print(D)
    49. print("样本集合已经非常纯了,全是同类样本!选择最多那个类即可!")
    50. node.mark = -1 # 标记为-1 ,是叶子节点
    51. node.decision = Max_class(D) # 把数据集中最多的那个类作为分类结果
    52. if node.decision == "是":
    53. print("是【好瓜】")
    54. else:
    55. print("是【坏瓜】")
    56. print("==========返回了===========")
    57. return
    58. if len(A) == 0 or np.sum(D[A].values[:] == D[A].values[0]) == D[A].shape[0] * D[A].shape[1]:
    59. print("没有可以选择的属性来作为决策,需要立即得到分类结果,或者样本的属性取值都一样,无需分类,选择最多的那个类即可!")
    60. node.mark = -1 # 标记为-1 ,是叶子节点
    61. node.decision = Max_class(D) # 把数据集中最多的那个类作为分类结果
    62. if node.decision == "是":
    63. print("是【好瓜】")
    64. else:
    65. print("是【坏瓜】")
    66. print("==========返回了===========")
    67. return
    68. good_a = AttChoice(D, A) # 从A中选择最优划分属性good_a
    69. for a_v in set(D[good_a]):
    70. print("当前选择的分支属性是:", a_v)
    71. node_c = TreeNode() # 生成分支节点
    72. node.chids[a_v] = node_c # 链接分支
    73. Dv = D.iloc[np.where(D[good_a] == a_v)] # 得到属性good_a 取值为a_v的样本集
    74. if Dv.shape[0] == 0: # 判断Dv是否为空
    75. print("当前分支的样本数是0,无法分类,直接选择样本集最多的类作为分类结果。")
    76. node_c.mark = -1 # 标记为叶子节点
    77. node_c.decision = Max_class(D)
    78. print("==========返回了===========")
    79. return
    80. else:
    81. node.mark = 1 # 不是分类节点(叶子节点),赋值为非-1的值即可
    82. node.decision = good_a # node节点为分支决策节点,节点的值为最优划分属性即可
    83. TreeGenerate(Dv, np.delete(A, np.where(A == good_a)), node_c) # 递归,下一层,同样是决策树,只是数据集更小,属性越少
    84. node = TreeNode()
    85. Root = node
    86. TreeGenerate(D,A,node)
    87. print("測試一下")
    88. for i in range(0,data.shape[0]-1):
    89. test_sample=D.iloc[i]
    90. print("=============START==================")
    91. print("类别应该是:",test_sample["好瓜"])
    92. root=Root
    93. while(root.mark!=-1):#如果不是叶子节点(需要我们对属性进行决策)
    94. a_v=test_sample[root.decision]#利用决策树的decision来获取要决策的属性
    95. root=root.chids[a_v]
    96. #mark==-1的时候结束,说明可以输出最终的分类了
    97. print("分类结果:",root.decision)
    98. print("==============END===================")

    数据集数据如下:

  • 相关阅读:
    Mac系统在idea中安装tomcat报错 error=13, Permission denied和error =1 Operation not...解决办法
    WPF布局控件之StackPanel布局
    zabbix的自动发现和自动注册
    JAVA中的进制与位运算
    python+django高校教室资源预约管理系统lqg8u
    计算机毕业设计python基于django租房系统-房屋租赁系统
    【POJ No. 1195】 矩形区域查询 Mobile phones
    spark shuffle写操作——UnsafeShuffleWriter
    深度学习7 Transformer系列实例分割Mask2Former
    appscan的两种手动探索扫描方式
  • 原文地址:https://blog.csdn.net/qq_27047075/article/details/139468421