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. 大规模数据集处理起来比较耗时,需要优化算法或者使用分布式计算等方法
相关推荐
Coovally AI模型快速验证4 小时前
MMYOLO:打破单一模式限制,多模态目标检测的革命性突破!
人工智能·算法·yolo·目标检测·机器学习·计算机视觉·目标跟踪
orion-orion5 小时前
贝叶斯机器学习:高斯分布及其共轭先验
机器学习·统计学习
余炜yw7 小时前
深入探讨激活函数在神经网络中的应用
人工智能·深度学习·机器学习
赛丽曼8 小时前
机器学习-分类算法评估标准
人工智能·机器学习·分类
yuanbenshidiaos9 小时前
【大数据】机器学习----------计算机学习理论
大数据·学习·机器学习
汤姆和佩琦10 小时前
2025-1-20-sklearn学习(42) 使用scikit-learn计算 钿车罗帕,相逢处,自有暗尘随马。
人工智能·python·学习·机器学习·scikit-learn·sklearn
热爱编程的OP11 小时前
机器学习 vs 深度学习
人工智能·深度学习·机器学习
清图12 小时前
Python 预训练:打通视觉与大语言模型应用壁垒——Python预训练视觉和大语言模型
人工智能·python·深度学习·机器学习·计算机视觉·自然语言处理·ai作画
好评笔记16 小时前
AIGC视频扩散模型新星:Video 版本的SD模型
论文阅读·深度学习·机器学习·计算机视觉·面试·aigc·transformer
liruiqiang0516 小时前
机器学习-线性回归(简单回归、多元回归)
人工智能·机器学习