决策树(简单)+代码实现

决策树

  • 理解
  • 代码实现

理解

信息熵值决定是否作为节点,信息熵可以理解为信息作为区别的关键程度
很全面的决策树算法
由很多个决策树作为弱分类器,可以大幅提升准确率,比如随机森林

代码实现

先首先看下数据
自己随便敲的csv文件
这是个典型的 离散 判断是否 的二分类问题
决策树(简单)+代码实现_第1张图片

导入库

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是这样的
决策树(简单)+代码实现_第2张图片

标签处理

Ib = sklearn.preprocessing.LabelBinarizer()
d_y = Ib.fit_transform(labelList)
print(d_y)

输出
决策树(简单)+代码实现_第3张图片

前面都是特征读取和处理
现在才是用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")

结果
决策树(简单)+代码实现_第4张图片

你可能感兴趣的:(机器学习,决策树,sklearn,python)