分类算法 - 决策树


决策树简介

一般来说,决策树分析是一种可以应用于许多领域的预测建模工具。决策树可以通过算法方法构建,该算法可以根据不同的条件以不同的方式分割数据集。决策压力是监督算法类别中最强大的算法。

它们可用于分类和回归任务。树的两个主要实体是决策节点,数据在其中分割并离开,我们在其中得到结果。下面给出了用于预测一个人是否健康的二叉树示例,提供了年龄、饮食习惯和运动习惯等各种信息 -

人

在上面的决策树中,问题是决策节点,最终结果是叶子。我们有以下两种类型的决策树 -

  • 分类决策树- 在这种决策树中,决策变量是分类的。上述决策树是分类决策树的一个例​​子。

  • 回归决策树- 在这种决策树中,决策变量是连续的。

实施决策树算法

基尼指数

它是成本函数的名称,用于评估数据集中的二元分割,并与分类目标变量“成功”或“失败”一起使用。

基尼指数越高,同质性越高。完美的基尼指数值为 0,最差的基尼指数值为 0.5(对于 2 类问题)。分割的基尼指数可以通过以下步骤计算 -

  • 首先,使用公式 p^2+q^2 计算子节点的基尼指数,即成功概率和失败概率的平方和。

  • 接下来,使用该分割的每个节点的加权基尼分数计算分割的基尼指数。

分类和回归树(CART)算法使用基尼方法来生成二元分割。

分裂创造

分割基本上包括数据集中的属性和值。我们可以借助以下三个部分在数据集中创建分割 -

  • 第 1 部分:计算基尼系数- 我们刚刚在上一节中讨论了这部分。

  • 第 2 部分:拆分数据集- 它可以定义为将数据集分成两个具有属性索引和该属性拆分值的行列表。从数据集中得到左右两组后,我们可以使用第一部分计算的基尼分数来计算分割值。分割值将决定属性将驻留在哪个组中。

  • 第 3 部分:评估所有分割- 找到基尼分数和分割数据集之后的下一部分是评估所有分割。为此,首先,我们必须检查与每个属性关联的每个值作为候选分割。然后我们需要通过评估分割成本来找到最佳的分割方案。最佳分割将用作决策树中的节点。

造一棵树

我们知道,树有根节点和终端节点。创建根节点后,我们可以通过以下两部分来构建树 -

Part1:终端节点创建

在创建决策树的终端节点时,重要的一点是决定何时停止生长树或创建更多终端节点。可以通过使用两个标准来完成,即最大树深度和最小节点记录,如下所示 -

  • 最大树深度- 顾名思义,这是根节点之后树中节点的最大数量。一旦树达到最大深度,即一旦树获得最大数量的终端节点,我们必须停止添加终端节点。

  • 最小节点记录- 它可以定义为给定节点负责的训练模式的最小数量。一旦树达到这些最小节点记录或低于此最小值,我们必须停止添加终端节点。

终端节点用于做出最终预测。

第 2 部分:递归分裂

正如我们了解何时创建终端节点一样,现在我们可以开始构建树了。递归分裂是一种构建树的方法。在此方法中,一旦创建了节点,我们就可以通过一次又一次调用相同的函数,在通过分割数据集生成的每组数据上递归地创建子节点(添加到现有节点的节点)。

预言

建立决策树后,我们需要对其进行预测。基本上,预测涉及使用专门提供的数据行来导航决策树。

我们可以借助递归函数进行预测,如上所述。使用左节点或右子节点再次调用相同的预测例程。

假设

以下是我们在创建决策树时做出的一些假设 -

  • 在准备决策树时,训练集作为根节点。

  • 决策树分类器更喜欢分类特征值。如果您想使用连续值,则必须在模型构建之前将它们离散化。

  • 根据属性的值,记录被递归分布。

  • 将使用统计方法将属性放置在任何节点位置,即根节点或内部节点。

Python 中的实现

例子

在下面的示例中,我们将在皮马印第安糖尿病上实施决策树分类器 -

首先,从导入必要的 python 包开始 -

import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split

接下来,从其网页链接下载 iris 数据集,如下所示 -

col_names = ['pregnant', 'glucose', 'bp', 'skin', 'insulin', 'bmi', 'pedigree', 'age', 'label']
pima = pd.read_csv(r"C:\pima-indians-diabetes.csv", header=None, names=col_names)
pima.head()
      pregnant    glucose  bp    skin  insulin  bmi   pedigree    age   label
0       6         148      72    35     0       33.6    0.627     50      1
1       1         85       66    29     0       26.6    0.351     31      0
2       8         183      64     0     0       23.3    0.672     32      1
3       1         89       66    23     94      28.1    0.167     21      0
4       0         137      40    35     168     43.1    2.288     33      1

现在,将数据集分为特征和目标变量,如下所示 -

feature_cols = ['pregnant', 'insulin', 'bmi', 'age','glucose','bp','pedigree']
X = pima[feature_cols] # Features
y = pima.label # Target variable

接下来,我们将数据分为训练集和测试集。以下代码将数据集分为 70% 的训练数据和 30% 的测试数据 -

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)

接下来,在 sklearn 的 DecisionTreeClassifier 类的帮助下训练模型,如下所示 -

clf = DecisionTreeClassifier()
clf = clf.fit(X_train,y_train)

最后我们需要做出预测。可以借助以下脚本来完成 -

y_pred = clf.predict(X_test)

接下来,我们可以获得准确度得分、混淆矩阵和分类报告,如下所示 -

from sklearn.metrics import classification_report, confusion_matrix, accuracy_score
result = confusion_matrix(y_test, y_pred)
print("Confusion Matrix:")
print(result)
result1 = classification_report(y_test, y_pred)
print("Classification Report:",)
print (result1)
result2 = accuracy_score(y_test,y_pred)
print("Accuracy:",result2)

输出

Confusion Matrix:
[[116 30]
[ 46 39]]
Classification Report:
            precision   recall   f1-score    support
      0       0.72      0.79       0.75     146
      1       0.57      0.46       0.51     85
micro avg     0.67      0.67       0.67     231
macro avg     0.64      0.63       0.63     231
weighted avg  0.66      0.67       0.66     231

Accuracy: 0.670995670995671   

可视化决策树

上述决策树可以借助以下代码可视化 -

from sklearn.tree import export_graphviz
from sklearn.externals.six import StringIO
from IPython.display import Image
import pydotplus

dot_data = StringIO()
export_graphviz(clf, out_file=dot_data,
      filled=True, rounded=True,
      special_characters=True,feature_names = feature_cols,class_names=['0','1'])
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
graph.write_png('Pima_diabetes_Tree.png')
Image(graph.create_png())
盒子