机器学习入门(四):决策树算法详解,代码实现及决策边界绘制

决策树算法:


这里主要讲的是决策树分类,该算法主要从以下三个方面入手:

  • 特征选择
  • 决策树生成
  • 剪枝

特征选择

特征选择就是通过比较属性,决定是否根据该属性分支:
在这里插入图片描述
有些属性对于判断结果影响不大,这样的属性就尽量不使用,而如何决定哪些属性合适,就有以下几种常见算法:

  • 信息增益(Information Gain)
  • 信息增益率(Information Gain Ratio)
  • 基尼系数(Gini Index)
举例说明

这里主要以信息增益为例。

理论基础:

信息增益公式:
在这里插入图片描述
公式看不懂没关系,会计算使用就行。要使用信息增益,首先要了解熵,熵是表示一种不确定性,熵 (entropy) 的计算:
在这里插入图片描述
通过计算熵,从而获得信息增益(Information Gain),可判断是否通过某个属性划分子树。熵越大,数据集的纯度(purity)越小。

实际例子计算

首先还是从实际数据举例:
在这里插入图片描述
所有数据的entropy:
在这里插入图片描述
在这里插入图片描述
接下来使用第一个属性outlook作为分割数据的标准:
在这里插入图片描述
outlook有三种结果sunny,overcast,rainy,则需要计算他们各自的熵:
在这里插入图片描述
计算之后H(S | outlook) = 0.693bits,
信息增益G(S | outlook) = H(S) - H(S | outlook) =0.940 - 0.693 = 0.247bits
同理计算其他几个属性,使用信息增益最大的作为划分标准。
信息增益对可取值数目较多的属性有所偏好,为了避免这种偏好,则有了信息增益率:
在这里插入图片描述
除此之外,还有基尼系数,它通过基尼值产生:
基尼值:
在这里插入图片描述
基尼系数:
在这里插入图片描述

决策树生成

这里直接用代码演示,特征选择方式按照信息增益,即选择entropy

代码模拟:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
np.random.seed(42)

#导入数据,划分训练测试集
from sklearn.datasets import load_iris
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
iris.data, iris.target, stratify=iris.target, random_state=42)

#导入模型,判断标准为entropy熵
from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier(criterion='entropy', random_state=42)

#训练,查看性能
tree.fit(X_train, y_train)
print("Accuracy on train set{:.3f}".format(tree.score(X_train, y_train)))
print("Accuracy on test set{:.3f}".format(tree.score(X_test, y_test))) 

#可视化
from sklearn.tree import plot_tree
plot_tree(tree,filled=True)
plt.show()
树的生成图

在这里插入图片描述

决策边界绘制

由于是在二维平面上绘图,所以这里只取iris数据的前两列,对X进行一下处理,同时也会导致决策树分类器性能的改变:
绘图函数

def plot_boundary(clf, axes):
    x1= np.linspace(axes[0], axes[1], 100)
    x2= np.linspace(axes[0], axes[1], 100)
    xx, yy = np.meshgrid(x1, x2)
    x_new = np.c_[xx.ravel(), yy.ravel()]
    y_pred = clf.predict(x_new).reshape(xx.shape)
    plt.contourf(xx, yy, y_pred, alpha = 0.4, cmap=plt.cm.brg)
    

只选择前两列:

X_train, X_test, y_train, y_test = train_test_split(
iris.data[:,:2], iris.target, stratify=iris.target, random_state=42)

然后还是通过训练获得一个分类器tree:

plot_decision_boundary(tree, axes=[4, 8, 1.5, 5])
p1 = plt.scatter(X[y==0,0], X[y==0, 1], color='blue')
p2 = plt.scatter(X[y==1,0], X[y==1, 1], color='green')
p3 = plt.scatter(X[y==2,0], X[y==2, 1], color='red')
#设置注释
plt.legend([p1, p2, p3], iris['target_names'], loc='upper right')
plt.show()

绘图如下:
在这里插入图片描述
发现这个模型在训练集上效果很好,但测试集的效果差了一点。

剪枝

剪枝是防止过拟合的重要手段。这里使用一下预剪枝pre-prune来提高性能。剪枝本身分为预剪枝和后剪枝,预剪枝提前判断,可以避免生成整颗树,训练时间较短,但预剪枝可能会导致决策树过早的停止分裂,从而欠拟合。后剪枝相对训练时间较长,因为要生成整颗树,再自底向上地决定哪些地方需要剪枝。

预剪枝

这里将树的最大深度max_depth 限定,实现预剪枝效果。

tree = DecisionTreeClassifier(criterion='entropy', max_depth=4, random_state=42) 
tree.fit(X_train, y_train)

print("Accuracy on training set: {:.3f}".format(tree.score(X_train, y_train))) 
print("Accuracy on test set: {:.3f}".format(tree.score(X_test, y_test)))

plot_tree(tree,filled=True)
plt.show()

结果如下:
在这里插入图片描述
在训练集上效果变好了,说明这个剪枝操作很ok。
预剪枝的决策边界:
在这里插入图片描述

参考文献

[1] 机器学习(周志华 著)

  • 4
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
决策树算法是一种广泛应用于分类和回归的机器学习算法,它基于树形结构对样本进行分类或预测。决策树算法的主要思想是通过一系列的判断来对样本进行分类或预测。在决策树中,每个节点表示一个属性或特征,每个分支代表该属性或特征的一个取值,而每个叶子节点代表一个分类或预测结果。 决策树算法的训练过程主要包括以下步骤: 1. 特征选择:根据某种指标(如信息增益或基尼系数)选择最优的特征作为当前节点的分裂属性。 2. 决策树生成:根据选择的特征将数据集分成若干个子集,并递归地生成决策树。 3. 剪枝:通过剪枝操作来提高决策树的泛化性能。 决策树算法的优点包括易于理解和解释、计算复杂度较低、对缺失值不敏感等。但是,决策树算法也存在一些缺点,如容易出现过拟合、对离散数据敏感等。 下面是一个决策树算法的案例:假设我们要根据一个人的年龄、性别、教育程度和职业预测其收入水平(高于或低于50K)。首先,我们需要将这些特征进行编码,将其转换为数值型数据。然后,我们可以使用决策树算法对这些数据进行训练,并生成一个决策树模型。最后,我们可以使用该模型对新的数据进行分类或预测。例如,根据一个人的年龄、性别、教育程度和职业,我们可以使用决策树模型预测该人的收入水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值