sklearn基础--『监督学习』之决策树分类

决策树分类 算法是一种监督学习算法,它的基本原理是将数据集通过一系列的问题进行拆分,这些问题被视为决策树的叶子节点和内部节点。

决策树的每个分支代表一个可能的决策结果,而每个叶子节点代表一个最终的分类结果。

决策树分类 算法的历史可以追溯到1980年代初,当时研究者开始探索用机器学习来解决分类问题。

在1981年,J.Ross Quinlan开发了ID3算法 ,该算法使用信息增益来选择决策树的最佳划分属性。

后来,在1986年,J.Ross Quinlan提出了C4.5算法 ,该算法引入了剪枝技术,以防止过拟合,该算法还引入了处理连续属性、缺失数据和多值属性等新特性。

在1998年,Jerome Friedman等人提出了CART算法Classification and Regression Trees),该算法采用了二叉树,使得决策树更加简洁和易于解释。

1. 算法概述

决策树 不仅可以用在分类问题 上,也可以用在回归问题 上。

关于决策树回归问题 上的应用,可以参考:sklearn基础--『监督学习』之决策树回归

回到决策树分类 算法上来,构建决策树的有三种算法:

1.1. ID3

ID3算法 的完整名称是Iterative Dichotomiser 3,即迭代二叉树3代。
ID3算法 的核心思想是以信息增益来度量属性的选择,选择分裂后信息增益最大的属性进行分裂。

对于任意样本数据 <math xmlns="http://www.w3.org/1998/Math/MathML"> x ( x 1 , x 2 , . . . , x n ) x(x_1,x_2,...,x_n) </math>x(x1,x2,...,xn),它的信息熵 定义为:
<math xmlns="http://www.w3.org/1998/Math/MathML"> e n t r o p y ( x ) = − ∑ i = 1 n p i log ⁡ 2 ( p i ) entropy(x) = -\sum_{i=1}^n p_i\log_2(p_i) </math>entropy(x)=−∑i=1npilog2(pi)

基于信息熵,信息增益 的公式为:
<math xmlns="http://www.w3.org/1998/Math/MathML"> I G ( T ) = e n t r o p y ( S ) − ∑ v a l u e ( T ) ∣ S x ∣ ∣ S ∣ e n t r o p y ( S x ) IG(T) = entropy(S) - \sum_{value(T)}\frac{|S_x|}{|S|}entropy(S_x) </math>IG(T)=entropy(S)−∑value(T)∣S∣∣Sx∣entropy(Sx)

其中:

  • <math xmlns="http://www.w3.org/1998/Math/MathML"> S S </math>S 表示全部样本的集合
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> ∣ S ∣ |S| </math>∣S∣ 表示 <math xmlns="http://www.w3.org/1998/Math/MathML"> S S </math>S中样本数量
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> T T </math>T 表示样本的某个特征
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> v a l u e ( T ) value(T) </math>value(T) 表示特征 <math xmlns="http://www.w3.org/1998/Math/MathML"> T T </math>T所有的取值集合
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> S x S_x </math>Sx 是 <math xmlns="http://www.w3.org/1998/Math/MathML"> S S </math>S中特征 <math xmlns="http://www.w3.org/1998/Math/MathML"> T T </math>T的值为 <math xmlns="http://www.w3.org/1998/Math/MathML"> x x </math>x的样本的集合
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> ∣ S x ∣ |S_x| </math>∣Sx∣ 表示 <math xmlns="http://www.w3.org/1998/Math/MathML"> S x S_x </math>Sx中样本数量

1.2. C4.5

C4.5算法 是以ID3算法 为基础的,它改为使用信息增益率 来作为决策树分裂的依据。

这样,就克服了ID3算法 中信息增益选择属性时偏向选择取值多的属性的不足。

C4.5算法 中引入了一个分裂信息(split information)的项来惩罚取值较多的特征:
<math xmlns="http://www.w3.org/1998/Math/MathML"> S I ( T ) = − ∑ v a l u e ( T ) ∣ S x ∣ ∣ S ∣ log ⁡ ∣ S x ∣ ∣ S ∣ SI(T) = - \sum_{value(T)}\frac{|S_x|}{|S|}\log\frac{|S_x|}{|S|} </math>SI(T)=−∑value(T)∣S∣∣Sx∣log∣S∣∣Sx∣

基于此,信息增益率 的公式为:
<math xmlns="http://www.w3.org/1998/Math/MathML"> g a i n R a t i o ( T ) = I G ( T ) S I ( T ) gainRatio(T)=\frac{IG(T)}{SI(T)} </math>gainRatio(T)=SI(T)IG(T)
<math xmlns="http://www.w3.org/1998/Math/MathML"> I G ( T ) IG(T) </math>IG(T)就是上一节ID3算法 中的信息增益公式。

1.3. CART

CART算法 全称是 classification and regression tree(分类与回归树)。

这个算法既可以用来分类,也可以用来回归,在回归问题上的介绍可以参考。

CART算法 是根据基尼系数(Gini)来划分特征的,每次选择基尼系数最小的特征作为最优切分点。

其中基尼系数的计算方法: <math xmlns="http://www.w3.org/1998/Math/MathML"> g i n i ( p ) = ∑ i = 1 n p i ( 1 − p i ) = 1 − ∑ i = 1 n p i 2 gini(p) = \sum_{i=1}^n p_i(1-p_i)=1-\sum_{i=1}^n p_i^2 </math>gini(p)=∑i=1npi(1−pi)=1−∑i=1npi2

2. 创建样本数据

scikit-learn中的样本生成器make_classification来生成分类用的样本数据。

python 复制代码
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification

# 分类数据的样本生成器
X, y= make_classification(n_samples=1000, n_classes=4, n_clusters_per_class=1, n_informative=6)
plt.scatter(X[:, 0], X[:, 1], marker="o", c=y, s=25)

plt.show()

关于样本生成器 的详细内容,请参考:sklearn基础--『数据加载』之样本生成器

3. 模型训练

首先,分割训练集测试集

python 复制代码
from sklearn.model_selection import train_test_split

# 分割训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

这次按照8:2的比例来划分训练集和测试集。

然后用不同的算法来训练决策树模型:

python 复制代码
from sklearn.tree import DecisionTreeClassifier

reg_names = [
    "ID3算法",
    "C4.5算法",
    "CART算法",
]

# 定义
regs = [
    DecisionTreeClassifier(criterion="entropy"),
    DecisionTreeClassifier(criterion="log_loss"),
    DecisionTreeClassifier(criterion="gini"),
]

# 训练模型
for reg in regs:
    reg.fit(X_train, y_train)

# 在测试集上进行预测
y_preds = []
for reg in regs:
    y_pred = reg.predict(X_test)
    y_preds.append(y_pred)

for i in range(len(y_preds)):
    correct_pred = np.sum(y_preds[i] == y_test)
    print("【{}】 预测正确率:{:.2f}%".format(reg_names[i], correct_pred / len(y_pred) * 100))

# 运行结果
【ID3算法】 预测正确率:71.50%
【C4.5算法】 预测正确率:72.50%
【CART算法】 预测正确率:75.00%

算法的正确率 差别不是特别大。

感兴趣的朋友,可以尝试调整样本生成器部分,生成一些特征较多的数据来看看算法之间的性能差别。

4. 总结

决策树分类 算法广泛应用于图像识别、文本分类、语音识别、信用评分、疾病诊断等众多领域。

例如,在电商平台上,可以通过决策树分类算法对用户的行为数据进行挖掘和分析,实现对用户的精准推荐;

在医疗领域,可以通过对医学数据的分析,辅助医生进行疾病诊断和治疗方案制定。

决策树分类 算法的优势有:

  1. 易于理解和解释,直观地展示出分类的过程
  2. 对于数据集可以进行并行处理,提高了算法的效率
  3. 对于缺失数据和非数值属性有很好的处理能力
  4. 可以处理多分类问题

决策树分类 算法也存在一些劣势

  1. 可能存在过拟合,需要使用剪枝技术来控制
  2. 可能存在偏向性,需要使用加权投票来处理
  3. 对于连续属性和多值属性处理起来比较复杂,需要额外的处理方法
  4. 大规模数据集处理起来比较耗时,需要优化算法或者使用分布式计算等方法
相关推荐
ComputerInBook1 小时前
代数基本概念理解——特征向量和特征值
人工智能·算法·机器学习·线性变换·特征值·特征向量
JoannaJuanCV3 小时前
自动驾驶—CARLA仿真(5)Actors与Blueprints
人工智能·机器学习·自动驾驶
背心2块钱包邮3 小时前
第9节——部分分式积分(Partial Fraction Decomposition)
人工智能·python·算法·机器学习·matplotlib
serve the people3 小时前
如何区分什么场景下用机器学习,什么场景下用深度学习
人工智能·深度学习·机器学习
csdn_aspnet3 小时前
如何用爬虫、机器学习识别方式屏蔽恶意广告
人工智能·爬虫·机器学习
JoannaJuanCV4 小时前
自动驾驶—CARLA仿真(0)报错记录
人工智能·机器学习·自动驾驶
小白狮ww4 小时前
Matlab 教程:基于 RFUAV 系统使用 Matlab 处理无人机信号
开发语言·人工智能·深度学习·机器学习·matlab·无人机·rfuav
无心水4 小时前
【神经风格迁移:深度实战】7、高级调参实战指南:从调参盲盒到科学优化方法论
人工智能·深度学习·神经网络·机器学习·vgg·神经风格迁移·vgg19
鲨莎分不晴5 小时前
强化学习第四课 —— 深度强化学习:Policy Gradient 入门
人工智能·学习·机器学习
IT·小灰灰6 小时前
AI学会理解物理法则:OpenAI Sora 2如何重塑视频生成新范式
人工智能·python·深度学习·机器学习·数据挖掘·音视频