当前位置: 首页 > java >正文

【Python机器学习(一)】NumPy/Pandas手搓决策树+使用Graphviz可视化(以西瓜书数据集为例)

下题来源于笔者学校的《模式识别与机器学习》课程的作业题,本文将通过使用NumPy处理数学运算,Pandas处理数据集,Graphviz实现决策树可视化等Python库来实现决策树算法及其格式化。

导入用到的Python库:

import numpy as np
import pandas as pd
from graphviz import Digraph

将数据集整理为DataFrame对象。数据集中除“好瓜”一栏表示类别外,其他栏均为属性和属性值:

data = pd.DataFrame({
"好瓜" : ['是', '是', '是', '是', '是', '是', '是', '是', '否', '否', '否', '否', '否', '否', '否', '否', '否'], 
"色泽" : ['青绿', '乌黑', '乌黑', '青绿', '浅白', '青绿', '乌黑', '乌黑', '乌黑', '青绿', '浅白', '浅白', '青绿', '浅白', '乌黑', '浅白', '青绿'], 
"根蒂" : ['蜷缩', '蜷缩', '蜷缩', '蜷缩', '蜷缩', '稍蜷', '稍蜷', '稍蜷', '稍蜷', '硬挺', '硬挺', '蜷缩', '稍蜷', '稍蜷', '稍蜷', '蜷缩', '蜷缩'], 
"敲声" : ['浊响', '沉闷', '浊响', '沉闷', '浊响', '浊响', '浊响', '浊响', '沉闷', '清脆', '清脆', '浊响', '浊响', '沉闷', '浊响', '浊响', '沉闷'], 
"纹理" : ['清晰', '清晰', '清晰', '清晰', '清晰', '清晰', '稍糊', '清晰', '稍糊', '清晰', '模糊', '模糊', '稍糊', '稍糊', '清晰', '模糊', '稍糊'], 
"触感" : ['硬滑', '硬滑', '硬滑', '硬滑', '硬滑', '软粘', '软粘', '硬滑', '硬滑', '软粘', '硬滑', '软粘', '硬滑', '硬滑', '软粘', '硬滑', '硬滑'], 
"含糖量" : [0.46, 0.376, 0.264, 0.318, 0.215, 0.237, 0.149, 0.211, 0.091, 0.267, 0.057, 0.099, 0.161, 0.198, 0.37, 0.042, 0.103]
})

创建节点类和边类:

class Node:def __init__(self, feature = None, cls = None, data = None):self.feature = feature #若为非叶节点,使用self.feature存储该节点的分类属性self.cls = cls #若为叶节点,使用self.cls存储该节点的分类结果self.data = data #储存分至该节点的样本class edge:def __init__(self, start = None, end = None):self.start = start #父节点self.end = end #子节点

使用全局变量列表和字典分别存储决策树的各节点和边,其中边的存储格式为edge_dict[边的属性值]=边 。

由于数据集中含有属性值为连续值的属性,需使用二分法来处理。使用全局变量best_mid_point 来存储最佳二分点:

node_list = []
edge_dict = {} #属性值作为有向边字典的索引
best_mid_point = 0

决策树学习基本算法如下图所示:

笔者使用信息增益作为划分标准,将其应用至决策树学习基本算法中,计算各属性的信息增益,取信息增益最大者为最优划分属性。

根据属性a对数据集D划分后的信息增益的定义如下:

Gain(D,a)=H(D)-H(D|a)

其中,H(D)表示经验熵:H(D)=-\sum^{|y|}_{k=1}\frac{|D_k|}{D}log_2\frac{D_k}{D}

表示

http://www.xdnf.cn/news/14386.html

相关文章:

  • 【深度剖析】领信卓越:福耀玻璃的数字化转型(上篇2:转型动机分析)
  • 嵌入式知识篇---三种坐标系
  • 揭开肾细胞的分子密码:当 METTL3 遇上 FOSL1【AbMole】
  • Android 与 ESP-01 WIFI模块通信
  • Tomcat 配置双击启动
  • 141. 环形链表
  • 概率期望DP
  • 【茶社茶楼专用软件】佳易王茶社茶楼计时计费会员管理软件介绍
  • 深度解析企业风控API技术实践:构建全方位企业风险画像系统
  • 【运维系列】【ubuntu22.04】安装Docker
  • 【性能优化】启用zram
  • 个人笔记-- TCL 替换
  • WebAssembly的本质与核心价值
  • 电磁场与电磁波篇---介质媒质导体
  • C++: 类 Class 的基础用法
  • 人工智能:神经网络原理、案例与 Python 代码
  • java 设计模式_行为型_19命令模式
  • 一个应用程序或移动网站项目提供最佳UI解决方案
  • python动态重叠爱心图
  • 【Linux】KVM简单介绍
  • WebSocket深度指南:从零基础到生产级应用
  • Linux下的MySQL从DDL到DQL的基础操作
  • Leetcode 刷题记录 15 —— 二分查找
  • Elastic Search 学习笔记
  • 强化学习-UCB示例
  • Python 模块
  • 鸿蒙Next仓颉语言开发实战教程:设置页面
  • 实验绘图参考-0615版(自用)
  • 力扣第 454 场周赛
  • 「AI产业」| 《德勤:AI案例精选》