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:内部节点再划分所需最小样本数)

决策树的简单实现与可视化相关推荐

  1. 数据分享|PYTHON用决策树分类预测糖尿病和可视化实例

    全文下载链接:http://tecdat.cn/?p=23848 在本文中,决策树是对例子进行分类的一种简单表示.它是一种有监督的机器学习技术,数据根据某个参数被连续分割.决策树分析可以帮助解决分类和 ...

  2. .mb是什么文件_神经网络长什么样不知道? 这有一份简单的 pytorch可视化技巧(1)

    神经网络长什么样不知道?这有一份简单的 pytorch可视化技巧(1) 深度学习这几年伴随着硬件性能的进一步提升,人们开始着手于设计更深更复杂的神经网络,有时候我们在开源社区拿到网络模型的时候,做客可 ...

  3. Flash AS3.0实例教程:构建简单的声音可视化程序(波型图)

    本例为Flash AS3.0实例教程,在教程中我们将学习运用SoundMixer.computeSpectrum() 方法来构建简单的声音可视化程序(即波形图),希望能给朋友们带来帮助~~ AS3.0 ...

  4. Unity 进阶 之 实现简单的音频可视化封装(包括音频和麦克风)

    Unity 进阶 之 实现简单的音频可视化封装(包括音频和麦克 目录 Unity 进阶 之 实现简单的音频可视化封装(包括音频和麦克 一.简单介绍 二.实现原理 三.注意事项 四.效果预览 五.实现步 ...

  5. 新冠肺炎疫情数据爬取以及几种简单的地图可视化方法

    众所周知,新冠肺炎疫情是一次很流行的全球性公共卫生事件.如今我国疫情已经好了许多,但世界各国的疫情依然严峻.特殊时期,正好尝试一下疫情网络数据的抓取,并用几种python库对数据进行简单的地图可视化( ...

  6. 【视觉高级篇】27 # 如何实现简单的3D可视化图表:GitHub贡献图表的3D可视化?

    说明 [跟月影学可视化]学习笔记. 第一步:准备要展现的数据 可以使用这个生成数据:https://github.com/sallar/github-contributions-api 这里直接使用月 ...

  7. b站《双城之战》主题曲《孤勇者》视频评论爬取+简单数据分析+基本可视化(条形图,饼图,词云图)

    双城之战更新啦!!!!!<孤勇者>也在b站上线了!!!! <孤勇者> 是真的好听!!!!没听的快给我去听:<双城之战>也是真的好看,没看到快给我去看!!!! 今天我 ...

  8. 决策树、随机森林结果可视化

    决策树.随机森林结果可视化 决策树随机森林结果可视化 一 决策树可视化环境搭建 二 决策树可视化的三种方法 第一种 第二种 第三种 三 决策树可视化实例 四 随机森林可视化实例 五 决策树各特征权重可 ...

  9. c#split方法拆分为数据_Dexplot:基于pandas,比matplotlib更简单的数据可视化和数据分析工具...

    Dexplot:建议准备学matplotlib和seaborn的数据可视化新手或者数据可视化爱好者食用 适用于长数据 比如网站用户留言的统计 特色是不用matplotlib 而用pandas导入数据( ...

  10. 禅道报表中关闭bug统计图_想要简单制作数据可视化分析报表?这个工具绝对好用...

    说到分析报表,行外小白都会觉得很简单,不就是整理数据到表格吗?但对于从事相关职业的同行来说,肯定多多少少会被报表困扰过.特别是对于一些高级的Excel报表,可是它需要复杂的函数,使用编程代码处理,上手 ...

最新文章

  1. 如果某个字段值相同则触发器新增_Thrift IDL新增字段导致版本不一致引发的惨案...
  2. java系统界面找不到符号,找不到符号,java找不到符号
  3. mysqldump全量恢复_删库不跑路-详解MySQL数据恢复
  4. oracle 产看执行计划_ODBA 技能SPM计划
  5. python求散点曲线下方面积
  6. Navicat PatchNavicat
  7. 软件工程网络15个人阅读作业1
  8. 关于防止表单form重复提交的方式
  9. FileLocker
  10. 工作流管理系统开发之十 数据库连接及事务设定
  11. 软件设计---概要设计和详细设计
  12. python制作的简单程序_Python如何制作简易收银小程序
  13. wps word中如何快速到目录页面
  14. 按键精灵读取github page 网页,实现脚本远程控制功能
  15. MATLAB---制作动画并演示
  16. android ui设计最新字体,ui用什么字体_安卓ui设计用什么字体
  17. Adding items to hidden net GND
  18. (字符串操作)关于一个字符串加空格。
  19. 黑客劫持域名步骤大曝光
  20. 云服务器修改虚拟内存,云服务器可以设置虚拟内存

热门文章

  1. ip头ttl_TCP/IP协议详解内容总结,看完恍然大悟
  2. python接口测试覆盖率统计_pytest文档57-计算单元测试代码覆盖率(pytest-cov)
  3. python deepcopy函数_Python对象引用与可变性
  4. python赋值运算符_解释一下python中的赋值运算符
  5. linux sh脚本数组,Bash脚本编程之数组
  6. redis rua解决库存问题_技术架构师总结:Redis分布式锁的问题和解决
  7. 网上花店php语言添加信息,Laravel 添加多语言提示信息的方法
  8. Maven:Maven基础
  9. ajax显示dataframe,如何使用ajax在运行时显示shell脚本的输出
  10. 编译caffe错误查询