用Python构建和可视化决策树
文章插图
决策树决策树是当今最强大的监督学习方法的组成部分 。 决策树基本上是一个二叉树的流程图 , 其中每个节点根据某个特征变量将一组观测值拆分 。
决策树的目标是将数据分成多个组 , 这样一个组中的每个元素都属于同一个类别 。 决策树也可以用来近似连续的目标变量 。 在这种情况下 , 树将进行拆分 , 使每个组的均方误差最小 。
决策树的一个重要特性是它们很容易被解释 。 你根本不需要熟悉机器学习技术就可以理解决策树在做什么 。 决策树图很容易解释 。
利弊决策树方法的优点是:
- 决策树能够生成可理解的规则 。
- 决策树在不需要大量计算的情况下进行分类 。
- 决策树能够处理连续变量和分类变量 。
- 决策树提供了一个明确的指示 , 哪些字段是最重要的 。
- 决策树不太适合于目标是预测连续属性值的估计任务 。
- 决策树在类多、训练样本少的分类问题中容易出错 。
- 决策树的训练在计算上可能很昂贵 。 生成决策树的过程在计算上非常昂贵 。 在每个节点上 , 每个候选拆分字段都必须进行排序 , 才能找到其最佳拆分 。 在某些算法中 , 使用字段组合 , 必须搜索最佳组合权重 。 剪枝算法也可能是昂贵的 , 因为许多候选子树必须形成和比较 。
步骤1:导入包我们构建模型的主要软件包是pandas、scikit learn和NumPy 。 按照代码在python中导入所需的包 。
import pandas as pd # 数据处理import numpy as np # 使用数组import matplotlib.pyplot as plt # 可视化from matplotlib import rcParams # 图大小from termcolor import colored as cl # 文本自定义from sklearn.tree import DecisionTreeClassifier as dtc # 树算法from sklearn.model_selection import train_test_split # 拆分数据from sklearn.metrics import accuracy_score # 模型准确度from sklearn.tree import plot_tree # 树图rcParams['figure.figsize'] = (25, 20)
在导入构建我们的模型所需的所有包之后 , 是时候导入数据并对其进行一些EDA了 。步骤2:导入数据和EDA在这一步中 , 我们将使用python中提供的“Pandas”包来导入并在其上进行一些EDA 。 我们将建立我们的决策树模型 , 数据集是一个药物数据集 , 它是基于特定的标准给病人开的处方 。 让我们用python导入数据!
Python实现:
df = pd.read_csv('drug.csv')df.drop('Unnamed: 0', axis = 1, inplace = True)print(cl(df.head(), attrs = ['bold']))
输出:Age SexBP CholesterolNa_to_KDrug023FHIGHHIGH25.355drugY147MLOWHIGH13.093drugC247MLOWHIGH10.114drugC328FNORMALHIGH7.798drugX461FLOWHIGH18.043drugY
现在我们对数据集有了一个清晰的概念 。 导入数据后 , 让我们使用“info”函数获取有关数据的一些基本信息 。 此函数提供的信息包括条目数、索引号、列名、非空值计数、属性类型等 。Python实现:
df.info()
输出:RangeIndex: 200 entries, 0 to 199Data columns (total 6 columns): #ColumnNon-Null CountDtype----------------------------0Age200 non-nullint641Sex200 non-nullobject2BP200 non-nullobject3Cholesterol200 non-nullobject4Na_to_K200 non-nullfloat64 5Drug200 non-nullobject dtypes: float64(1), int64(1), object(4)memory usage: 9.5+ KB
步骤3:数据处理我们可以看到像Sex, BP和Cholesterol这样的属性在本质上是分类的和对象类型的 。 问题是 , scikit-learn中的决策树算法本质上不支持X变量(特征)是“对象”类型 。 因此 , 有必要将这些“object”值转换为“binary”值 。 让我们用python来实现Python实现:
for i in df.Sex.values:if i== 'M':df.Sex.replace(i, 0, inplace = True)else:df.Sex.replace(i, 1, inplace = True)for i in df.BP.values:if i == 'LOW':df.BP.replace(i, 0, inplace = True)elif i == 'NORMAL':df.BP.replace(i, 1, inplace = True)elif i == 'HIGH':df.BP.replace(i, 2, inplace = True)for i in df.Cholesterol.values:if i == 'LOW':df.Cholesterol.replace(i, 0, inplace = True)else:df.Cholesterol.replace(i, 1, inplace = True)print(cl(df, attrs = ['bold']))
输出:AgeSexBPCholesterolNa_to_KDrug02312125.355drugY14710113.093drugC24710110.114drugC3281117.798drugX46110118.043drugY...................1955610111.567drugC1961610112.006drugC197521119.894drugX1982311114.020drugX1994010111.349drugX[200 rows x 6 columns]
- 看不上|为什么还有用户看不上华为Mate40系列来看看内行人怎么说
- 采用|消息称一加9系列将推出三款新机,新增一加9E
- 会员|美容院使用会员管理软件给顾客更好的消费体验!
- 行业|现在行业内客服托管费用是怎么算的
- 闲鱼|电诉宝:“闲鱼”网络欺诈成用户投诉热点 Q3获“不建议下单”评级
- 美国|英国媒体惊叹:165个国家采用北斗将GPS替代,连美国也不例外?
- 桌面|日常使用的软件及网站分享 篇一:几个动态壁纸软件和静态壁纸网站:助你美化你的桌面
- 同轴心配合|用SolidWorks画一个直角传动,画四个零件就行
- 先别|用了周冬雨的照片,我会成为下一个被告?自媒体创作者先别自乱阵脚
- 速度|华为P50Pro或采用很吓人的拍照技术:液体镜头让对焦速度更快