利用决策树进行分类,使用了sklearn包。
相关文章:
数据挖掘 | [关联规则] 利用apyori库的关联规则python代码实现
数据挖掘 | [有监督学习——分类] 朴素贝叶斯及python代码实现——利用sklearn
数据挖掘 | [无监督学习——聚类] K-means聚类及python代码实现——利用sklearn
数据挖掘 | [无监督学习——聚类] 凝聚层次聚类及python代码实现——利用sklearn
决策树的定义
决策树,又称判定树,是一种类似于流程图的树结构,它提供了一种展示“在什么条件下得到什么值”这类规则的方法。决策树分类有以下几个环节:
- 构造决策树
- 对决策树剪枝
- 由决策树生成分类规则
决策树的组成
- 决策树的基本组成:决策节点、分支和叶。
- 树中每个内部节点表示一个属性上的测试,每个叶节点代表一个类。
- 树中最上面的节点称为根节点。
- 根据每个节点的分支可以分为二叉树和多叉树。
信息增益
- 在树的每个节点使用信息增益度量来选择测试属性。选择最大信息增益,目的是使得对结果划分中的样本分类所需的信息量最小,并确保能找到一颗简单(但不必是最简单)的树。
- 算法计算每个属性的信息增益。具有最高信息增益的属性选作为给定集合S的测试属性。根据这个测试属性,创建一个节点,并以该属性标记,对属性的每一个值创建分支,并以此划分样本。
python代码实现
import numpy as np # 快速操作结构数组的工具
import pandas as pd # 数据分析处理工具
from sklearn.preprocessing import LabelEncoder #将字符串转化为数字
from sklearn import tree #决策树
from sklearn.model_selection import train_test_split #训练集测试集分割函数
data_pd=pd.read_csv('csv数据路径',sep=',') #导入数据
#删除包含缺失值的个案
print("删除缺失值前个案数:",len(data_pd))
c=data_pd.columns.values.tolist() #获取df的列名
#此数据中缺失值被标记为“?”
for i in c:
data_pd=data_pd[~data_pd[i].isin(['?'])]
print("删除缺失值后个案数:",len(data_pd))
data_arr=np.array(data_pd) #将dataframe转换成array
#生成属性数据集和分类结果数据集
dataMat = np.mat(data_arr)
arrMat = dataMat[:,0:9] #此数据集前9个为属性,最后一个为分类结果
resultMat = dataMat[:,9]
# 以下代码参考了:https://blog.csdn.net/luanpeng825485697/article/details/78965390
# 构造数据集成pandas结构
attr_names = ['age','menopause','tumor-size','inv-nodes','node-caps',
'deg-malig','breast','breast-quad','irradiat'] #特征属性的名称
attr_pd = pd.DataFrame(data=arrMat,columns=attr_names) #每行为一个对象,每列为一种属性,最后一个为结果值
#print(attr_pd)
#将数据集中的字符串转化为代表类别的数字。因为sklearn的决策树只识别数字
le = LabelEncoder()
#为每一列序列化,就是将每种字符串转化为对应的数字。用数字代表类别
for col in attr_pd.columns:
attr_pd[col] = le.fit_transform(attr_pd[col])
#print(attr_pd)
attr_arr=np.array(attr_pd)
#此处数据类型的转换是为了最后结果输出的时候可以正常调用.sum()方法
#.A 将numpy中的matrix(矩阵)数据类型转换为numpy中的array(数组)数据类型
result_arr=resultMat.A
#将numpy中的array(数组)数据类型转换为list(列表类型)
result_list=[]
for i in result_arr:
for j in i:
result_list.append(j)
#拆分训练集和测试集
Xtrain,Xtest,Ytrain,Ytest=train_test_split(attr_arr,result_list,test_size=0.2,random_state=420)
#以下参考了:https://blog.csdn.net/huangguohui_123/article/details/105522595
# 构建决策树
clf = tree.DecisionTreeClassifier() #实例化
clf.fit(Xtrain,Ytrain) #训练
print(clf)
#返回预测的准确度
score=clf.score(Xtest,Ytest)
print("模型准确度:",score)
print("Number of mislabeled points out of a total %d points : %d"
% (Xtest.shape[0], (Ytest != predict).sum()))
#查看特征的重要性
print("特征重要程度:",[*zip(attr_name,clf.feature_importances_)])
#注意zip和range一样,是一个惰性对象,需要对其进行展开。
以下是代码输出结果:
删除缺失值前个案数: 286
删除缺失值后个案数: 277
DecisionTreeClassifier(class_weight=None, criterion='gini', 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')
模型准确度: 0.7857142857142857
Number of mislabeled points out of a total 56 points : 12
特征重要程度: [('age', 0.09983155188438614), ('menopause', 0.05669101355996463), ('tumor-size', 0.20406365768738527), ('inv-nodes', 0.08870095607496344), ('node-caps', 0.031877335517729935), ('deg-malig', 0.17925832427720864), ('breast', 0.10655742948173845), ('breast-quad', 0.16627088347611943), ('irradiat', 0.06674884804050393)]
决策树可视化
sklearn库似乎没有提供决策树绘制的方法,这里利用graphviz来绘制决策树。
#绘制决策树
import graphviz #决策树可视化
import matplotlib.pyplot as plt # 画图工具
#plt.rcParams['font.sans-serif']=['SimHei'] #python用来显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
dot_data=tree.export_graphviz(clf #已经建好的分类器
,out_file=None #是否生成文件
,feature_names=feature_name #特征的名称
,class_names=["'recurrence-events'\n","'no-recurrence-events'\n"] #标签的名称
,filled=True
,rounded=True
) #生成一个指导画图的dot文件
graph=graphviz.Source(dot_data) #根据dot文件生成树
graph.render('pdf保存路径', view=True)
下面是我绘制出的决策树(因为数据比较复杂,所以生成的树也非常复杂)。

本文介绍了决策树的基本知识,包括定义、组成和信息增益,并提供了使用sklearn库进行决策树分类的python代码实现,同时探讨了决策树的可视化方法。

4433

被折叠的 条评论
为什么被折叠?



