决策树(3)-sklearn实现及可视化画图

仍然使用之前得数据
在这里插入图片描述

from sklearn.feature_extraction import DictVectorizer
from sklearn import tree
from sklearn import preprocessing
import csv
import numpy as np

源代码:

read=csv.reader(open('data1.csv','r'))

报错:

'gbk' codec can't decode byte 0x94 in position 8: illegal multibyte sequence

修改:

read=csv.reader(open('data1.csv','r',encoding='utf-8'))

出现问题:

'\ufeff天气', '温度', '湿度', '风]

当我们读取的文件或者写入文件时有时候会出现"\ufeff"非法字符,这个时候需要改变编码方式‘UTF-8‘为‘UTF-8-sig‘

#读入数据
read=csv.reader(open('/root/jupyter_projects/data/data1.csv','r',encoding='utf-8-sig'))#不加编码方式会报错
#获取第一行数据
headers=read.__next__()
print(headers)

#定义两个列表
featureList=[]
labelList=[]

for row in read:
    labelList.append(row[-1])
    rowDict={}
    for i in range(0,len(row)-1):
        rowDict[headers[i]]=row[i]
        #建立一个数据字典
    #把字典存入列表
    featureList.append(rowDict)
print(featureList)
['天气', '温度', '湿度', '风速', '活动']
[{'天气': '晴', '温度': '炎热', '湿度': '高', '风速': '弱'}, {'天气': '晴', '温度': '炎热', '湿度': '高', '风速': '强'}, {'天气': '晴', '温度': '适中', '湿度': '高', '风速': '弱'}, {'天气': '晴', '温度': '寒冷', '湿度': '正常', '风速': '弱'}, {'天气': '晴', '温度': '适中', '湿度': '正常', '风速': '强'}, {'天气': '阴', '温度': '炎热', '湿度': '高', '风速': '弱'}, {'天气': '阴', '温度': '寒冷', '湿度': '正常', '风速': '强'}, {'天气': '阴', '温度': '适中', '湿度': '高', '风速': '强'}, {'天气': '阴', '温度': '炎热', '湿度': '正常', '风速': '弱'}, {'天气': '雨', '温度': '寒冷', '湿度': '正常', '风速': '强'}, {'天气': '雨', '温度': '适中', '湿度': '高', '风速': '强'}, {'天气': '雨', '温度': '适中', '湿度': '高', '风速': '弱'}, {'天气': '雨', '温度': '寒冷', '湿度': '正常', '风速': '弱'}, {'天气': '雨', '温度': '适中', '湿度': '正常', '风速': '弱'}]
#把数据转换成01表示
vec=DictVectorizer()
x_data=vec.fit_transform(featureList).toarray()
print(x_data)
print(vec.get_feature_names_out())
#10列即时把每个特征的每个取值都作为一列
[[1. 0. 0. 0. 1. 0. 0. 1. 1. 0.]
 [1. 0. 0. 0. 1. 0. 0. 1. 0. 1.]
 [1. 0. 0. 0. 0. 1. 0. 1. 1. 0.]
 [1. 0. 0. 1. 0. 0. 1. 0. 1. 0.]
 [1. 0. 0. 0. 0. 1. 1. 0. 0. 1.]
 [0. 1. 0. 0. 1. 0. 0. 1. 1. 0.]
 [0. 1. 0. 1. 0. 0. 1. 0. 0. 1.]
 [0. 1. 0. 0. 0. 1. 0. 1. 0. 1.]
 [0. 1. 0. 0. 1. 0. 1. 0. 1. 0.]
 [0. 0. 1. 1. 0. 0. 1. 0. 0. 1.]
 [0. 0. 1. 0. 0. 1. 0. 1. 0. 1.]
 [0. 0. 1. 0. 0. 1. 0. 1. 1. 0.]
 [0. 0. 1. 1. 0. 0. 1. 0. 1. 0.]
 [0. 0. 1. 0. 0. 1. 1. 0. 1. 0.]]
['天气=晴' '天气=阴' '天气=雨' '温度=寒冷' '温度=炎热' '温度=适中' '湿度=正常' '湿度=高' '风速=弱' '风速=强']
lb=preprocessing.LabelBinarizer()
y_data=lb.fit_transform(labelList)
print(y_data)
[[0]
 [0]
 [0]
 [1]
 [1]
 [1]
 [1]
 [1]
 [1]
 [0]
 [0]
 [1]
 [1]
 [1]]
model=tree.DecisionTreeClassifier(criterion='entropy')
model.fit(x_data,y_data)#训练模型

对应该函数得参数可以看这篇博客:scikit-learn决策树算法类库使用小结

DecisionTreeClassifier(criterion='entropy')
x_test=np.array([1,0,0,0,0,1,0,1,0,1])
predict=model.predict(x_test.reshape(1,-1))
print(predict)#做预测
[0]

安装决策树画图工具
①安装grahpviz包

[root@iZbp173czfyjpvvdm6k4amZ data] pip3.8 install graphviz

②安装graphvia工具(linux)
到官网找到对应系统版本下载 http://www.graphviz.org/download/
下面是Linux下的直接用yum安装

[root@iZbp173czfyjpvvdm6k4amZ data]# yum install graphviz
Invalid configuration value: failovermethod=priority in /etc/yum.repos.d/CentOS-epel.repo; Configuration: OptionBinding with id "failovermethod" does not exist
Repository epel is listed more than once in the configuration
Last metadata expiration check: 3:05:35 ago on Tue 18 Jan 2022 08:42:01 AM CST.
Package graphviz-2.40.1-43.el8.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!

windows需要将 graphviz 安装目录下的 bin 文件夹路径添加到环境变量中

import graphviz
dot_data=tree.export_graphviz(model,
                            out_file=None,
                            feature_names=vec.get_feature_names_out(),
                            class_names=lb.classes_,
                            filled=True,
                            rounded=True,
                            special_characters=True)
graph=graphviz.Source(dot_data)
graph.render('computer')
'computer.pdf'
graph#画图

在这里插入图片描述

画出的决策树看起来与我们自己构造出来的决策树不太一样,这里只有2各分支,其实决策树算法慢慢发展,决策树一般都做成了二叉树,每个节点只有两个分支,左边全部都默认为true,右边为false
那么这个决策树是怎么看的呢?
首先来看最上边的那个结点,第一行是判断条件,即天气=阴 是否小于0.5,根据上面可以知道,天气=阴的时候为1,所以是false,直接看右边。第二行为信息熵。第三行是所有样本最终结果的各个取值值得实例个数,即活动取消和进行得个数,第4行时说如果没有下面得结点得话就跟随实列数目最多得那个类别。接下来看第二行得,由于天气=阴为1,为假来到右边,所有当天气=阴时活动都会进行下去。当天气=晴或者雨时,为真来到左边。继续按第一行得结点得判断方法进行判断。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值