决策树的简单实现与可视化
0.原理
略
1.数据
http://www.ai-xlab.com/my/course/135
1.课时1-课程资料AllElectronics.csv
是CSV文件,依据已有数据推断是否买电脑
数据属性:age,income,student,credit_rating
标签属性:Yes/No
共14笔数据
2.cart.csv已经处理好数据
2.需要的库
csv,sklearn,graphviz
其中graphviz需要独立安装并自行设置环境变量,否则报错:make sure the Graphviz executables are on your systems’ PATH
3.数据预处理
3.0.读取数据
读取CSV数据可用csv或者Pandas,csv为按行依次读取,且为列表类型
Padas为整体读取,dataframe类型
分别获取标签列表labellist和特征列表featurelist
import csv
from sklearn import tree
from sklearn.feature_extraction import DictVectorizer
from sklearn.preprocessing import LabelBinarizer
def read_csv(filename):# 获取csv数据with open(filename, 'r') as f:labellist = [] # 创建标签列表:是否买电脑featurelist = [] # 创建属性列表:age,student......f_reader = csv.reader(f)f_headers = next(f_reader) # 读取表头for row in f_reader:f_dict = {} # 创建字典,{age:senior,student:yes......}labellist.append(row[-1]) # 添加标签for i in range(1, 5):f_dict[f_headers[i]] = row[i] # 添加属性featurelist.append(f_dict)return featurelist, labellist
3.1数据处理
将所获得列表编码
1.特征数据编码sklearn 特征提取,dictvectorizer:将字典数据向量化编码,注意这里不能用pandas.get_dummies,TypeError: unhashable type: ‘dict’,即不能处理列表中的字典数据,但结果与get_dummies相同
2.标签数据编码:LabelBinarizer()
def process_f(featurelist, labellist):# 数据预处理(编码)# sklearn 特征提取,dictvectorizer:将字典数据向量化编码,注意这里不能用pandas.get_dummies,TypeError: unhashable type: 'dict',即不能处理列表中的字典数据# 处理featuredict_v = DictVectorizer()x_data = dict_v.fit_transform(featurelist).toarray() # 转化为array**# print(x_data)# [[0. 0. 1. 0. 1. 1. 0. 0. 1. 0.]# [0. 0. 1. 1. 0. 1. 0. 0. 1. 0.]# [1. 0. 0. 0. 1. 1. 0. 0. 1. 0.]......]# 处理label# y_data = []# for i in labellist:## if i == 'yes':# y_data.append(1)# else:# y_data.append(0)# 或者用sklearn中的LabelBinarizerlabel_binary = LabelBinarizer()y_data = label_binary.fit_transform(labellist)return x_data, y_data, dict_v, label_binary
4.建立决策树模型并验证
if __name__ == '__main__':filename = r'C:\Users\hp\Desktop\决策树\AllElectronics.csv'featurelist, labellist = read_csv(filename)x_data, y_data, dict_v, label_binary = process_f(featurelist, labellist)# 测试# 创建分类决策树完成分类model = tree.DecisionTreeClassifier(criterion='entropy') # criterion 选择划分节点的标准:默认gini指数(CART),还可entropy(C4.5)# 输入数据建立模型:model.fit(x_data, y_data) # 求得数据集的均值方差最大值最小值等false_count = 0for i in range(len(x_data)):x_test = x_data[i]predict = model.predict(x_test.reshape(1, -1)) # 由于预测时要传入二维数组,因此作转化print('predict:%s' % (predict))if predict != y_data[i]:false_count += 1print(false_count)# 可视化
可视化
import graphvizdot_data = tree.export_graphviz(model, feature_names=dict_v.get_feature_names(), class_names=label_binary.classes_)# dict_v.get_feature_names()获取特征名称(向量化之后),即逆向量化# label_binary.classes_获取分类标签名称graph = graphviz.Source(dot_data)graph.render('Decision_tree')
结果
同理可对数据2进行处理、可视化
不同的是由于数据均为数字,可以用 np.genfromtxt(filename, delimiter=’,’)进行读取:
data = np.genfromtxt(filename, delimiter=',')
x_data = data[1:, 1:-1] # 多维列表的访问,1:第一行到最后一行,第一列到倒数第二列
y_data = data[1:, -1]
# 创建决策树模型
model = tree.DecisionTreeClassifier() # 默认使用基尼指数计算
# 输入数据创建决策树
model.fit(x_data, y_data)
dot_data = tree.export_graphviz(model,feature_names=['house_yes', 'house_no', 'single', 'married', 'divorced', 'income'],class_names=['no', 'yes'])
graph=graphviz.Source(dot_data)
graph.render('cart')
以下为非线性二分类数据:LR-testSet2.txt
shape(x_data)=(118,2),shape(y_data)=(118,)
为了画等高线需要用pyplot.contourf(x,y,z)
但是x,y必须为meshgrid生成的网格矩阵
0.设置数据范围
x_min=x_data[:,0].min()-1#x_min,max,y_min,max是为了画等高线设置的数据范围,保证不出圈
x_max=x_data[:,0].max()+1
y_min=x_data[:,1].min()-1
y_max=x_data[:,1].max()+1
x_range=np.arange(x_min,x_max,0.2)
y_range=np.arange(y_min,y_max,0.2)
其中x_range:(196,),y_range(194,)
1.生成网格矩阵
xx,yy=np.meshgrid(x_range,y_range)#生成网格矩阵
xx:(194,196),yy:(194,196)
meshgird生成两个shape相同的矩阵:
2.预测
z=model.predict(np.c_[xx.ravel(),yy.ravel()])
#ravel()将xx,yy恢复成一维向量
np.c_()行连接
print(np.shape(xx.ravel())) # 38024=194*196,ravel()降维为列向量
print(np.shape(merged_x_data))#(38024, 2)
3.画图
z=z.reshape(xx.shape)# 改为194*196列,使得坐标对应上
cs=plt.contourf(xx,yy,z)
plt.scatter(x_data[:,0],x_data[:,1],c=y_data)
plt.show()
4.精度分析
精度分析使用sklearn.metrics.classification_report
1.训练集精度
z_train = model.predict(x_train) # print(len(z_train))#88
print(classification_report(z_train, y_train)) # 输出精度报告
# precision recall f1-score support
#
# 0.0 1.00 1.00 1.00 46
# 1.0 1.00 1.00 1.00 42
#
# accuracy 1.00 88
# macro avg 1.00 1.00 1.00 88
# weighted avg 1.00 1.00 1.00 88
2.测试集精度
# 利用测试数据作检验
z_test = model.predict(x_test) # print(len(z_test)) # 30
print(classification_report(z_test, y_test)) # 输出精度报告
# precision recall f1-score support
#
# 0.0 0.86 0.80 0.83 15
# 1.0 0.81 0.87 0.84 15
#
# accuracy 0.83 30
# macro avg 0.83 0.83 0.83 30
# weighted avg 0.83 0.83 0.83 30
可以发现训练精度很高:100%
测试精度降低——过拟合
看看决策树图形
可以看到分叉很多,造成过拟合(模型复杂)
因此可以通过剪枝解决过拟合问题:
model(max_depth:树的最大深度,min_samples_split:内部节点再划分所需最小样本数)
决策树的简单实现与可视化相关推荐
- 数据分享|PYTHON用决策树分类预测糖尿病和可视化实例
全文下载链接:http://tecdat.cn/?p=23848 在本文中,决策树是对例子进行分类的一种简单表示.它是一种有监督的机器学习技术,数据根据某个参数被连续分割.决策树分析可以帮助解决分类和 ...
- .mb是什么文件_神经网络长什么样不知道? 这有一份简单的 pytorch可视化技巧(1)
神经网络长什么样不知道?这有一份简单的 pytorch可视化技巧(1) 深度学习这几年伴随着硬件性能的进一步提升,人们开始着手于设计更深更复杂的神经网络,有时候我们在开源社区拿到网络模型的时候,做客可 ...
- Flash AS3.0实例教程:构建简单的声音可视化程序(波型图)
本例为Flash AS3.0实例教程,在教程中我们将学习运用SoundMixer.computeSpectrum() 方法来构建简单的声音可视化程序(即波形图),希望能给朋友们带来帮助~~ AS3.0 ...
- Unity 进阶 之 实现简单的音频可视化封装(包括音频和麦克风)
Unity 进阶 之 实现简单的音频可视化封装(包括音频和麦克 目录 Unity 进阶 之 实现简单的音频可视化封装(包括音频和麦克 一.简单介绍 二.实现原理 三.注意事项 四.效果预览 五.实现步 ...
- 新冠肺炎疫情数据爬取以及几种简单的地图可视化方法
众所周知,新冠肺炎疫情是一次很流行的全球性公共卫生事件.如今我国疫情已经好了许多,但世界各国的疫情依然严峻.特殊时期,正好尝试一下疫情网络数据的抓取,并用几种python库对数据进行简单的地图可视化( ...
- 【视觉高级篇】27 # 如何实现简单的3D可视化图表:GitHub贡献图表的3D可视化?
说明 [跟月影学可视化]学习笔记. 第一步:准备要展现的数据 可以使用这个生成数据:https://github.com/sallar/github-contributions-api 这里直接使用月 ...
- b站《双城之战》主题曲《孤勇者》视频评论爬取+简单数据分析+基本可视化(条形图,饼图,词云图)
双城之战更新啦!!!!!<孤勇者>也在b站上线了!!!! <孤勇者> 是真的好听!!!!没听的快给我去听:<双城之战>也是真的好看,没看到快给我去看!!!! 今天我 ...
- 决策树、随机森林结果可视化
决策树.随机森林结果可视化 决策树随机森林结果可视化 一 决策树可视化环境搭建 二 决策树可视化的三种方法 第一种 第二种 第三种 三 决策树可视化实例 四 随机森林可视化实例 五 决策树各特征权重可 ...
- c#split方法拆分为数据_Dexplot:基于pandas,比matplotlib更简单的数据可视化和数据分析工具...
Dexplot:建议准备学matplotlib和seaborn的数据可视化新手或者数据可视化爱好者食用 适用于长数据 比如网站用户留言的统计 特色是不用matplotlib 而用pandas导入数据( ...
- 禅道报表中关闭bug统计图_想要简单制作数据可视化分析报表?这个工具绝对好用...
说到分析报表,行外小白都会觉得很简单,不就是整理数据到表格吗?但对于从事相关职业的同行来说,肯定多多少少会被报表困扰过.特别是对于一些高级的Excel报表,可是它需要复杂的函数,使用编程代码处理,上手 ...
最新文章
- 如果某个字段值相同则触发器新增_Thrift IDL新增字段导致版本不一致引发的惨案...
- java系统界面找不到符号,找不到符号,java找不到符号
- mysqldump全量恢复_删库不跑路-详解MySQL数据恢复
- oracle 产看执行计划_ODBA 技能SPM计划
- python求散点曲线下方面积
- Navicat PatchNavicat
- 软件工程网络15个人阅读作业1
- 关于防止表单form重复提交的方式
- FileLocker
- 工作流管理系统开发之十 数据库连接及事务设定
- 软件设计---概要设计和详细设计
- python制作的简单程序_Python如何制作简易收银小程序
- wps word中如何快速到目录页面
- 按键精灵读取github page 网页,实现脚本远程控制功能
- MATLAB---制作动画并演示
- android ui设计最新字体,ui用什么字体_安卓ui设计用什么字体
- Adding items to hidden net GND
- (字符串操作)关于一个字符串加空格。
- 黑客劫持域名步骤大曝光
- 云服务器修改虚拟内存,云服务器可以设置虚拟内存
热门文章
- ip头ttl_TCP/IP协议详解内容总结,看完恍然大悟
- python接口测试覆盖率统计_pytest文档57-计算单元测试代码覆盖率(pytest-cov)
- python deepcopy函数_Python对象引用与可变性
- python赋值运算符_解释一下python中的赋值运算符
- linux sh脚本数组,Bash脚本编程之数组
- redis rua解决库存问题_技术架构师总结:Redis分布式锁的问题和解决
- 网上花店php语言添加信息,Laravel 添加多语言提示信息的方法
- Maven:Maven基础
- ajax显示dataframe,如何使用ajax在运行时显示shell脚本的输出
- 编译caffe错误查询