决策树简单介绍

前言

为完成每日一更的习惯,今天就从与我们专业比较相关的一些基础的机器学习基本方法说起,从目前我现在看的文献来看,用于我们专业的分类算法也就常用的那么几种,随机森林,决策树,SVM等等,今天也是从常用数据挖掘算法总结及python实现这一书中学习了决策树部分内容,可以说第一天是收获满满

1决策树简介

分类决策树模型是一种描述对实例进行的形结构。由点和有向边组成,节点有两种类型,内部节点与叶节点,内部节点表示特征或属性,叶节点表示一个类

1.1决策树结构

在这里插入图片描述

1.2决策树原理

这里不过多讲数学原理,以及数学公示的推导,讲的比较白话文一点呢就是根据已有的数据指标计算每个自变量的统计特征,根据统计特征划分若干的条件来进行决策树的结构构建,这些统计特征就包括熵,条件熵,信息增益等等

2代码实例

2.1数据集

data.txt
1.5 50 thin
1.5 60 fat
1.6 40 thin
1.6 60 fat
1.7 60 thin
1.7 80 fat
1.8 60 thin
1.8 90 fat
1.9 70 thin
1.9 80 fat
样本数据的第一、二列可视为自变量为身高体重,来衡量一个人是fat还是thin

2.2python代码

# -*- coding: utf-8 -*-
import numpy as np
from sklearn import tree
from sklearn.metrics import precision_recall_curve
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split
#from sklearn.cross_validation import train_test_split
#因为python的cross——validation的模块,全部重构在model_selection下
data=[]
labels=[]
with open(r'C:\Users\asus\Desktop\data.txt') as ifile:
    for line in ifile:
        tokens=line.strip().split(' ')
        data.append([float(tk) for tk in tokens[:-1]])
        labels.append(tokens[-1])
        #将其中每行的数值型属性加入到列表中
        #将最后的分类结果加入到labels列表中
x=np.array(data)
labels=np.array(labels)
y=np.zeros(labels.shape)
#将标签转化为0,1变量
y[labels=='fat']=1
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2)
#生成训练集以及交叉验证集,test_size是交叉验证点百分比

#基于信息熵作为划分类别标准对决策树进行训练

clf=tree.DecisionTreeClassifier(criterion='entropy')
print(clf)
#DecisionTreeClassifier(class_weight=None, criterion='entropy', max_depth=None,
#                       max_features=None, max_leaf_nodes=None,
#                       min_impurity_decrease=0.0, min_impurity_split=None,
#                       min_samples_leaf=1, min_samples_split=2,
#                       min_weight_fraction_leaf=0.0, presort=False,
#                       random_state=None, splitter='best')
clf.fit(x_train,y_train)
with open(r'C:\Users\asus\Desktop\tree.dot','w') as f:
    f=tree.export_graphviz(clf,out_file=f)
#这里由于tree。dot文件没有安装graphviz是打不开的,因此这里直接
#引入pydotplus库将其转换为pdf
import pydotplus
dot_data = tree.export_graphviz(clf, out_file=None)
graph = pydotplus.graph_from_dot_data(dot_data)
graph.write_pdf(r'C:\Users\asus\Desktop\tree.pdf')
    #系数反映每个特征的影响力。越大表示该特征在分类中起到的作用越大
print(clf.feature_importances_)
answer=clf.predict(x_train)
print(x_train)
print(answer)
print(y_train)
print(np.mean(answer==y_train))
precision, recall, thresholds = precision_recall_curve(y_train,clf.predict(x_train))
#计算准确率,召回率以及用于计算二者的阈值
#准确率与召回率 #准确率:某个类别在测试结果中被正确测试的比率 
#召回率:某个类别在真实结果中被正确预测的比率 
#假设测试结果如下
#测试结果:array([ 0., 1., 0., 1., 0., 1., 0., 1., 0., 0.]) 
#真实结果:array([ 0., 1., 0., 1., 0., 1., 0., 1., 0., 1.]) 
#分为thin的准确率为0.83。是因为分类器分出了6个thin,其中正确的有5个,因此分为thin的准确率为5/6=0.83。 
#分为thin的召回率为1.00。是因为数据集中共有5个thin,而分类器把他们都分对了(虽然把一个fat分成了thin!),召回率5/5=1。 
#分为fat的准确率为1.00。不再赘述。 #分为fat的召回率为0.80。是因为数据集中共有5个fat,而分类器只分出了4个(把一个fat分成了thin!),召回率4/5=0.80。 
#本例中,目标是尽可能保证找出来的胖子是真胖子(准确率),还是保证尽可能找到更多的胖子(召回率)。
answer_proba = clf.predict_proba(x)
#  predict_proba返回的是一个 n 行 k 列的数组,
# 第 i 行 第 j 列上的数值是模型预测 第 i 个预测样本为某个标签的概率,
#并且每一行的概率和为1。
#这里就存在一个问题,我怎样知道我的第j列对于于thin与fat属性呢
#这里将用到clf.classes_对象返回对应的属性索引

import pandas as pd
pd.DataFrame(answer_proba,columns=clf.classes_)
#   0.0  1.0
#0  1.0  0.0
#1  0.0  1.0
#2  1.0  0.0
#3  0.0  1.0
#4  1.0  0.0
#5  0.0  1.0
#6  1.0  0.0
#7  0.0  1.0
#8  1.0  0.0
#9  0.0  1.0

answer1= clf.predict_proba(x)[:,1]

print(classification_report(y, answer1, target_names = ['thin', 'fat']))
#classification_report
#classification_report(y_true, y_pred, target_names=target_names)
#y_true:1维数组,或标签指示器数组/稀疏矩阵,目标值。 
#y_pred:1维数组,或标签指示器数组/稀疏矩阵,分类器返回的估计值。 
#labels:array,shape = [n_labels],报表中包含的标签索引的可选列表。 
#target_names:字符串列表,与标签匹配的可选显示名称(相同顺序)。 
#sample_weight:类似于shape = [n_samples]的数组,可选项,样本权重。 
#digits:int,输出浮点值的位数.

其中classification_report是输出的最终分类评价的报告
在这里插入图片描述
其中,左边第一列—分类的标签名,support列—每个标签的出现次数,precision—各个类别的精确度,recall—召回率,
f1-score—F1值,avg / total行(最后一行)----各列的的加权平均值均值
(support列为权值).
F1值:(综合评价指标)精确率和召回率的调和均值(harmonic mean),或加权平均值,也称为F-measure或F-score。F-measure 平衡了精确率和召回率。当F-measure较高的时候,说明模型效果比较好。(精确率和召回率都越高越好,但在一些极端情况下,两者是矛盾的)计算公式如下:
F-measure = 2 * Precision * Recall / (Precision + Recall)
本代码中大部分来自于书中,但由于python版本的更新等原因潘老师又对原来书中代码进行了部分更改,加上了其他注释使得更加容易读懂
其中代码主要用sklearn的机器学习库 以及常用的数据分析numpy,pandas库,由于要将决策树的最终结果进行可视化,dot文件要在graphviz文件中进行转化,后面会参考链接来对各个步骤做出解释
此次代码决策树的结果是:

最上面的参与决策的标签是x1,x0分别代表的是体重身高
entropy是基于ID3算法的信息增益
samples是这个决策下的样本总数目
values是一个pairs:表示的是最终胖与瘦的数目

3总结

本次决策树的学习收益匪浅,从电子版的书中与参考的一些博客之中也学习到了不少东西,也是相当于对sklearn有了基础的了解,可以看出python的库函数都有比较“调包”的特点,但是要在了解原理的基础上来进行每个参数的传入传出,在附录我会放入参考链接以及电子版的资源仅供参考。

4参考链接

常用数据挖掘方法及python实现-决策树


GraphViz安装与配置指南

https://blog.csdn.net/chai_zheng/article/details/78226194
https://blog.csdn.net/lilyouyanglove/article/details/79518600
https://graphviz.gitlab.io/_pages/Download/Download_windows.html

Python决策树可视化:GraphViz’s executables not found的解决方法

https://blog.csdn.net/qq_40304090/article/details/88594813

sklearn决策树可视化

http://ywtail.github.io/2017/06/08/sklearn%E5%86%B3%E7%AD%96%E6%A0%91%E5%8F%AF%E8%A7%86%E5%8C%96/

sklearn中lr模型—评价指标函数/评价报告classification_report,含义及应用代码示例

https://blog.csdn.net/jianjiaoxiaolu/article/details/82937673

classification_report解释

https://blog.csdn.net/genghaihua/article/details/81155200

机器学习classification_report方法及precision精确率和recall召回率 说明

https://www.cnblogs.com/178mz/p/8558435.html

How to find the corresponding class in clf.predict_proba()

https://stackoverrun.com/cn/q/4586155

sklearn中的predict_proba方法的返回值的意义

http://sofasofa.io/forum_main_post.php?postid=1000600

sklearn.metrics.precision_recall_curve

https://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_recall_curve.html

sklearn: model_selection

https://blog.csdn.net/qq_39037910/article/details/73333206

python文件读写,以后就用with open语句

https://www.cnblogs.com/ymjyqsx/p/6554817.html

发布了3 篇原创文章 · 获赞 5 · 访问量 862

猜你喜欢

转载自blog.csdn.net/qq_44589327/article/details/105330534
今日推荐