首页
登录 | 注册

决策树基本流程及其实现

决策树也称作判定树,是一类常见的的机器学习方法。周志华老师在其书《机器学习》中,以二分类任务为例给我们讲解了决策树的基本流程。
我们希望从给定的训练集学的一个模型,此模型可以对新的示例进行分类,这个把样本分类的任务,可看作对“当前样本属于正常吗”这个问题的“决策”或“判定”过程。
决策树是基于树结构来进行决策的,这也是人类在面临决策问题时一种很自然的处理机制。
举一个例子,如果我们要对“这是好瓜吗?”这样的问题进行决策时,我们通常会进行一系列的判断或“子决策”:先要看看“它是什么颜色?”,如果是:”青绿色”,再看“他的根蒂是什么形态?”如果是“蜷缩”在判断“它敲起来是什么的声音?”最后,我们得出最终的决策:这是个好瓜
决策过程如下图
决策树基本流程及其实现

决策过程的最终结论对应了我们所希望的判定结果,例如是不是好瓜。在决策过程中提出的每个判定问题都是对某个属性的“测试”,例如“色泽=?”“根蒂=?”;每个测试的结果或者是导出最终结论,或是导出进一步的判定问题,其考虑范围是在上次决策结果的限定范围之内,例如若是在“色泽=青绿”之后再判断“根蒂=?”,则仅在考虑青绿色瓜的根蒂。

一棵决策树包含一个根节点、若干个内部结点和若干个叶结点,根节点包含了样本全集,其中叶节点对应于决策结果(根蒂蜷缩,敲声浊响),其他每个结点对应于一个属性测试(例如 根蒂=?),每个结点包含的样本集合根据属性测试的结果被划分到子节点中,根节点包含了样本全集。从根节点到每个叶节点的路径对应了一个判定测试序列。
决策树学习的目的是为了产生一颗泛化能力强,吃力未见示例能力强的决策树,基本流程如下

决策树基本流程及其实现

决策树的生成是一个递归过程,有三种情形会导致递归返回:
(1)当前结点包含的样本全属于同一类别,无需划分
(2)当前属性为空或者是所有样本在所有属性上取值相同,无需划分,在这种情况下,我们把当前结点标记为叶结点,并将其类别设定为该结点所含样本最多的类别
(3)当前结点包含的样本集为空,不能划分,同样把当前结点标记为叶结点

#导入需要用到的python 库
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd 
#导入数据集
dataset = pd.read_csv('Social_Network_Ads.csv')
X = dataset.iloc[:,[2,3]].values
y = dataset.iloc[:,4].values
#将数据集拆分为训练集合测试集
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.25,random_state = 0)
#特征缩放
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
#对测试集进行决策树分类拟合
from sklearn.tree import DecisionTreeClassifier
classifier = DecisionTreeClassifier(criterion='entropy',random_state=0)
classifier.fit(X_train,y_train)
#预测测试集结果
y_pred = classifier.predict(X_test)
#制作混淆矩阵
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
#将训练结果可视化
from matplotlib.colors import ListedColormap
X_set, y_set = X_train, y_train
X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),
                     np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))
plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
             alpha = 0.75, cmap = ListedColormap(('red', 'green')))
plt.xlim(X1.min(), X1.max())
plt.ylim(X2.min(), X2.max())
for i, j in enumerate(np.unique(y_set)):
    plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
                c = ListedColormap(('red', 'green'))(i), label = j)
plt.title('Decision Tree Classification (Training set)')
plt.xlabel('Age')
plt.ylabel('Estimated Salary')
plt.legend()
plt.show()

决策树基本流程及其实现

#将测试结果可视化
from matplotlib.colors import ListedColormap
X_set, y_set = X_test, y_test
X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),
                     np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))
plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
             alpha = 0.75, cmap = ListedColormap(('red', 'green')))
plt.xlim(X1.min(), X1.max())
plt.ylim(X2.min(), X2.max())
for i, j in enumerate(np.unique(y_set)):
    plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
                c = ListedColormap(('red', 'green'))(i), label = j)
plt.title('Decision Tree Classification (Test set)')
plt.xlabel('Age')
plt.ylabel('Estimated Salary')
plt.legend()
plt.show()

决策树基本流程及其实现



2020 jeepxie.net webmaster#jeepxie.net
10 q. 0.010 s.
京ICP备10005923号