用Python构建和可视化决策树


用Python构建和可视化决策树文章插图
决策树决策树是当今最强大的监督学习方法的组成部分 。 决策树基本上是一个二叉树的流程图 , 其中每个节点根据某个特征变量将一组观测值拆分 。
决策树的目标是将数据分成多个组 , 这样一个组中的每个元素都属于同一个类别 。 决策树也可以用来近似连续的目标变量 。 在这种情况下 , 树将进行拆分 , 使每个组的均方误差最小 。
决策树的一个重要特性是它们很容易被解释 。 你根本不需要熟悉机器学习技术就可以理解决策树在做什么 。 决策树图很容易解释 。
利弊决策树方法的优点是:

  • 决策树能够生成可理解的规则 。
  • 决策树在不需要大量计算的情况下进行分类 。
  • 决策树能够处理连续变量和分类变量 。
  • 决策树提供了一个明确的指示 , 哪些字段是最重要的 。
决策树方法的缺点是:
  • 决策树不太适合于目标是预测连续属性值的估计任务 。
  • 决策树在类多、训练样本少的分类问题中容易出错 。
  • 决策树的训练在计算上可能很昂贵 。 生成决策树的过程在计算上非常昂贵 。 在每个节点上 , 每个候选拆分字段都必须进行排序 , 才能找到其最佳拆分 。 在某些算法中 , 使用字段组合 , 必须搜索最佳组合权重 。 剪枝算法也可能是昂贵的 , 因为许多候选子树必须形成和比较 。
Python决策树Python是一种通用编程语言 , 它为数据科学家提供了强大的机器学习包和工具 。 在本文中 , 我们将使用python最著名的机器学习包scikit-learn来构建决策树模型 。 我们将使用scikit learn提供的“DecisionTreeClassifier”算法创建模型 , 然后使用“plot_tree”函数可视化模型 。
步骤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]