决策树算法– Python的基本实现

时间:2020-02-23 14:42:16  来源:igfitidea点击:

在本文中,我们将研究机器学习和人工智能领域中最有趣的概念之一-决策树。

机器学习是一个广阔的领域,其中包含许多算法,可以训练数据并预测模型的结果,从而提高业务标准和策略。

决策树根据预测和概率结果提供有关数据的见解。

所以,让我们开始吧!

什么是决策树?

"决策树"是一种机器学习算法,它利用决策模型并根据机会或者概率提供事件的结果/预测。

它是一种非参数和预测性算法,它基于对某些决策/规则的建模而得出结果,这些决策/规则是通过观察数据中的特征来构造的。

作为一种受监督的机器学习算法,决策树从历史数据中学习。
因此,该算法训练并基于该算法构建决策模型,然后预测结果。

决策树可以执行以下任务之一:

  • 根据记录所属类别的概率对记录进行"分类"。

  • 某个目标值的"估计"值。

我们将在接下来的部分中详细了解上述任务。

用编程的术语来说,决策树表示一种类似于流程图的结构,该结构根据概率条件传递结果。

决策树

  • 内部节点表示属性/变量上的条件。

  • 每个"分支"代表条件的"结果值"。

  • "叶子节点"提供有关在解析每个属性的所有条件之后要采取的"决策"的信息。

决策树使用诸如ID3,CART,C5.0等各种算法来识别要放置的最佳属性,作为表示最佳同类数据变量集的根节点值。

它从根节点和树的属性之间的比较开始。
比较值评估决策模型。
这一直持续到到达具有预测结果分类或者估计值的叶节点为止。

现在,让我们详细了解一下决策树的不同类型。

决策树的类型

决策树可预测以下类型的值:

  • 分类:预测分类数据变量的目标值的类别。
    例如,预测该属性给出的结果为是还是否。

  • 回归:预测数字/连续变量的目标变量的结果值。
    例如,在不久的将来预测自行车出租数。

决策树的假设

  • 在第一次迭代之前,即在定义决策模型之前,将整个训练数据集假定为根节点的值。

  • 数据值/属性是递归分布的。

  • 假定使用统计方法来最终确定将属性作为根/属性节点值放置的顺序。

使用Python实现决策树

了解了决策树的工作原理后,现在让我们在Python中实现相同的功能。

请访问以下链接以查找整个数据集。

Bike.csv

该数据集包含目标变量" cnt"。
这是一个回归问题,因为在这里我们必须根据某些条件来预测将在近期租用自行车的客户数量。

在下面的代码中,我们导入了必要的库,例如os,numpy,pandas,sklearn等。

import os
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split 
import numpy as np
from sklearn.tree import DecisionTreeRegressor

现在,我们定义了一个函数来判断决策树性能的错误值。

我们为该算法使用了" MAPE错误指标",因为这是回归评估问题。

def MAPE(Y_actual,Y_Predicted):
  Mape = np.mean(np.abs((Y_actual - Y_Predicted)/Y_actual))*100
  return Mape

领先一步,我们将数据集分为两个包含独立变量和因变量的数据集。
此外,我们使用" train_test_split()"函数将数据集分为训练和测试数据。

bike = pd.read_csv("Bike.csv")
X = bike.drop(['cnt'],axis=1) 
Y = bike['cnt']
# Splitting the dataset into 80% training data and 20% testing data.
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=.20, random_state=0)

现在是应用决策树算法的时候了。
我们使用了" DecisionTreeRegressor()"函数来构建和训练模型。

此外,我们使用predict()函数预测测试数据集中目标变量的值。

此后,我们计算MAPE值(误差值)并从100中减去它,以得到模型的准确性。

DT_model = DecisionTreeRegressor(max_depth=5).fit(X_train,Y_train)
DT_predict = DT_model.predict(X_test) #Predictions on Testing data
DT_MAPE = MAPE(Y_test,DT_predict)
Accuracy_DT = 100 - DT_MAPE
print("MAPE: ",DT_MAPE)
print('Accuracy of Decision Tree model: {:0.2f}%.'.format(Accuracy_DT))
print("Predicted values:\n",DT_predict)

输出:

MAPE:  18.076637888252062
Accuracy of Decision Tree model: 81.92%.
Predicted values:
[3488.27906977 4623.46721311 2424.         4623.46721311 4883.19047619
 6795.11       7686.75       1728.12121212 2602.66666667 2755.17391304
 4623.46721311 4623.46721311 1728.12121212 6795.11       5971.14285714
 1249.52       4623.46721311 6795.11       3488.27906977 5971.14285714
 3811.63636364 2424.         1249.52       6795.11       6795.11
 3936.34375    3978.5        1728.12121212 6795.11       1728.12121212
 3488.27906977 6795.11       6795.11       5971.14285714 1728.12121212
 4623.46721311 1249.52       3936.34375    3219.58333333 7686.75
 4623.46721311 2679.5        6795.11       2755.17391304 6060.78571429
 6795.11       4623.46721311 6795.11       6795.11       4623.46721311
 4883.19047619 4623.46721311 2602.66666667 4623.46721311 7686.75
 6795.11       7099.5        1728.12121212 6795.11       1249.52
 4623.46721311 6795.11       4623.46721311 1728.12121212 4883.19047619
 4623.46721311 6795.11       6795.11       4623.46721311 1728.12121212
 4623.46721311 4623.46721311 1178.5        6795.11       4623.46721311
 6795.11       6795.11       1728.12121212 3488.27906977 6795.11
 5971.14285714 6060.78571429 4623.46721311 3936.34375    1249.52
 1728.12121212 4676.33333333 3936.34375    4623.46721311 6795.11
 4623.46721311 4623.46721311 6795.11       5971.14285714 4883.19047619
 4883.19047619 3488.27906977 6795.11       6795.11       6795.11
 3811.63636364 6795.11       6795.11       6060.78571429 4623.46721311
 1728.12121212 4623.46721311 6795.11       6795.11       4623.46721311
 1728.12121212 6795.11       1728.12121212 3219.58333333 1728.12121212
 6795.11       1249.52       6795.11       2755.17391304 1728.12121212
 6795.11       5971.14285714 1728.12121212 4623.46721311 4623.46721311
 4676.33333333 6795.11       3936.34375    4883.19047619 3978.5
 4623.46721311 4623.46721311 3488.27906977 6795.11       6795.11
 3488.27906977 4623.46721311 3936.34375    2600.         3488.27906977
 2755.17391304 6795.11       4883.19047619 3488.27906977]

决策树的优势

  • 决策树在"探索性数据分析和数据的预测分析"中很有用,并有助于找到变量之间的关系。

  • 它隐式地"选择最佳变量"来构建模型。

  • 决策树几乎不受异常值的影响。

  • 此外,它是一种非参数方法,即由于分类器的内存分布或者结构,它不会保持任何更改。

决策树的局限性

  • 决策树可能会导致"数据过度拟合",即它可能会创建复杂的树结构。

  • 如果数据不平衡,则决策树可能会创建有偏倚的树。