理解
由信息熵值决定是否作为节点,信息熵可以理解为信息作为区别的关键程度
很全面的决策树算法
由很多个决策树作为弱分类器,可以大幅提升准确率,比如随机森林
代码实现
先首先看下数据
自己随便敲的csv文件
这是个典型的 离散 判断是否 的二分类问题
导入库
import csv
import sklearn
from sklearn.feature_extraction import DictVectorizer
from sklearn.preprocessing import LabelBinarizer
from sklearn import tree # sklearn 中的tree库
导入文件
allDate = open(r'C:\Users\19436\AppData\Roaming\JetBrains\PyCharm2021.1\scratches\学生数据.csv', 'rt')
reader = csv.reader(allDate) # csv模块的文件读法(按行)
headers = next(reader) ##
预定义两个 特征列表 和 标签列表
featureList = []
labelList = []
循环读(一行一行读)
for row in reader:
# print(row)
labelList.append(row[len(row) - 1]) # 在这一行中 # len(row)是这一行的列数
rowDict = {}
for i in range(1, len(row) - 1): # 从RID列读到class_student列
rowDict [headers[i]] = row[i] # 便捷的用法,rowDict字典赋值#######
# print(rowDict)
# print(rowDict)
featureList.append(rowDict) # 加进feature列表里
开始用sklearn的库
vec= sklearn.feature_extraction.DictVectorizer() # 特征提取的字典向量化
d_x=vec.fit_transform(featureList) .toarray() # 要fit一下 # toarray()转化成数组*(必须)
print(d_x)
这是用了one-hot编码
(有3个决定值,就是0,0,1或者0,1,0或者1,0,0)
d_x是这样的
标签处理
Ib = sklearn.preprocessing.LabelBinarizer()
d_y = Ib.fit_transform(labelList)
print(d_y)
输出
前面都是特征读取和处理
现在才是用sklearn里的tree来构建决策树
clf = sklearn.tree.DecisionTreeClassifier(criterion='entropy') # 评判标注准是entropy(信息熵)
clf = clf.fit(d_x,d_y) # 完后要fit一下
# print('clf:'+ str(clf))
可视化一下
用的Graphviz
环境没配好
先import 下 os
import os
os.environ["PATH"] += os.pathsep + 'D:/Graphviz可视化/Graphviz/bin'
可视化
# 可视化
dot_data = tree.export_graphviz(clf,
feature_names=vec.get_feature_names(),
filled=True, rounded=True,
special_characters=True,
out_file=None)
graph = pydotplus.graph_from_dot_data(dot_data)
graph.write_pdf("film.pdf")
结果