Extra Trees(极端随机树,Extra Randomized Trees)

以下是关于 Extra Trees(极端随机树,Extra Randomized Trees)的详细介绍以及使用 Python 实现的示例代码:

概念

Extra Trees 是一种基于决策树的集成学习算法,属于随机森林算法的变体。它通过在构建决策树的过程中引入更多的随机性来降低模型的方差,提高模型的泛化能力,同时在一定程度上能加快训练速度。与普通随机森林不同的是,它在划分节点时,对于每个特征的划分阈值也是随机选取的,而不是像随机森林那样寻找最优的划分阈值。

原理

• 随机性体现:

• 在随机森林中,是从训练数据集的特征子集(通过随机选择一定数量的特征)中去寻找最佳的划分特征以及对应的最佳划分阈值来构建决策树节点。而 Extra Trees 在构建每棵决策树时,不仅随机选择特征子集,对于所选特征子集里的每个特征,其划分阈值也是随机产生的,然后从这些随机产生的划分方案中选择一个最优的(比如根据某种不纯度衡量指标,像基尼系数等)来进行节点划分。

• 这种额外的随机性使得每棵树之间的差异性更大,有助于提升集成模型整体的泛化能力。

• 集成学习方式: 构建多棵这样的决策树,对于新的数据样本进行预测时,通过综合多棵树的预测结果(比如分类任务中常用投票机制,回归任务中常用平均机制)来得到最终的预测值。

步骤

1. 确定参数: 包括决策树的数量(n_estimators)、每个决策树在划分节点时考虑的最大特征数量(max_features)等参数,这些参数可以根据数据集的大小、特征数量等情况来合理设定。

2. 数据采样与树构建:

• 对于每一棵要构建的决策树:

• 从训练数据集中有放回地随机采样(这一点和随机森林一样,采用自助采样法,Bootstrap 方式),得到一个子训练数据集。

• 从所有特征中随机选择一部分特征(数量由 max_features 决定),对于选出来的这些特征,分别随机生成划分阈值,然后基于这些随机生成的划分方案,根据不纯度衡量指标(如基尼系数用于分类任务)来确定最佳的特征及对应的划分阈值,进行节点划分,不断重复这个过程直到满足停止条件(比如树达到最大深度、节点样本数小于某个阈值等),构建出一棵完整的决策树。

3. 集成预测:

• 分类任务:对于新的输入样本,让每棵决策树进行分类预测,然后统计各分类结果出现的次数,选择出现次数最多的类别作为最终的预测类别(投票机制)。

• 回归任务:对于新的输入样本,每棵决策树输出一个预测值,然后对这些预测值求平均,得到最终的回归预测值。

分类

Extra Trees 本身主要用于两类任务:

• 分类问题:处理离散的类别标签预测,例如预测邮件是垃圾邮件(类别为“是”或“否”)、预测鸢尾花的种类等。

• 回归问题:处理连续数值的预测,比如预测房价、预测股票价格等。

用途

• 在数据挖掘领域: 可以分析大量的用户行为数据,进行用户分类(比如区分高消费用户、低消费用户等分类任务),或者预测用户的消费金额(回归任务)等,帮助企业制定营销策略。

• 在医疗领域: 根据患者的症状、检查指标等特征,预测疾病的类别(分类),或者预测病情的发展程度(回归)等,辅助医生进行诊断决策。

• 在工业生产中: 预测设备的故障时间(回归)、判断设备是否出现故障(分类)等,以便提前安排维修保养计划。

Python 代码详细实现(以分类任务为例,使用 sklearn 库)

以下示例代码使用著名的鸢尾花数据集来演示 Extra Trees 分类器的使用:

首先确保已经安装了 scikit-learn 库(如果没安装,可以通过 pip install scikit-learn 命令安装)。

from sklearn.datasets import load_iris
from sklearn.ensemble import ExtraTreesClassifier
from sklearn.model_selection import train_test_split
import numpy as np

# 1. 加载鸢尾花数据集
iris = load_iris()
X = iris.data  # 特征数据
y = iris.target  # 目标类别标签

# 2. 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 3. 创建 ExtraTreesClassifier 模型实例,并设置参数
# n_estimators 表示树的数量,这里设置为100
# max_depth 表示每棵树的最大深度,设为 None 表示不限制深度,让树尽量生长
# max_features 表示划分节点时考虑的最大特征数量,这里设为 'sqrt',即特征数量的平方根
# random_state 是随机种子,保证每次运行结果可复现
model = ExtraTreesClassifier(n_estimators=100, max_depth=None, max_features='sqrt', random_state=42)

# 4. 使用训练数据拟合模型
model.fit(X_train, y_train)

# 5. 在测试集上进行预测
y_pred = model.predict(X_test)

# 6. 计算预测准确率
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y_test, y_pred)
print("预测准确率:", accuracy)
上述代码的详细解释如下:
  1. 加载鸢尾花数据集:
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data  
y = iris.target  

通过 load_iris 函数加载鸢尾花数据集,其中 X 变量存储特征数据(是一个二维数组,每行代表一个样本的特征向量),y 变量存储对应的目标类别标签(是一个一维数组,每个元素对应一个样本的类别)。

  1. 划分训练集和测试集:
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, random_state=42)

使用 train_test_split 函数将数据集划分为训练集和测试集,test_size=0.2 表示测试集占总数据集的比例为 20%,random_state=42 是为了设置随机种子,使得每次划分的结果能够重现(如果不设置,每次运行代码划分的结果会不一样)。

  1. 创建模型实例并设置参数:
from sklearn.ensemble import ExtraTreesClassifier
model = ExtraTreesClassifier(n_estimators=100, max_depth=None, max_features='sqrt', random_state=42)

从 sklearn.ensemble 模块中导入 ExtraTreesClassifier 类来创建 Extra Trees 分类器模型实例,这里设置了几个重要参数:

  • n_estimators=100:指定要 100 棵决策树来组成集成模型。
  • max_depth=None:每棵树的最大深度不做限制,让树可以自由生长,直到满足其他停止条件(比如节点样本数过少等)。
  • max_features=‘sqrt’:在划分每个节点时,考虑的最大特征数量为特征总数的平方根个,这是一种常见的选择方式,当然也可以选择其他值,比如 ‘log2’ 或者具体的整数等。
  • random_state=42:保证模型训练过程中的随机性是可重复的,便于对比不同情况下的实验结果。
  1. 拟合模型:
model.fit(X_train, y_train)

使用训练集数据(X_train 和 y_train)来训练模型,也就是构建那 100 棵决策树的过程,模型会根据训练数据学习特征和类别之间的关系。

  1. 进行预测:
y_pred = model.predict(X_test)

将测试集的特征数据(X_test)输入到已经训练好的模型中,模型会基于每棵决策树的预测结果通过投票机制得到最终的预测类别,存储在 y_pred 变量中,它是一个一维数组,对应测试集中每个样本的预测类别。

  1. 计算预测准确率:
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y_test, y_pred)
print("预测准确率:", accuracy)

从 sklearn.metrics 模块中导入 accuracy_score 函数,用来计算预测准确率。它对比真实的测试集类别标签(y_test)和预测得到的类别标签(y_pred),计算正确预测的样本数占总测试样本数的比例,并打印输出准确率结果,这样可以直观地评估模型在测试集上的表现好坏。

如果要将上述代码用于回归任务,只需要做以下几点改动:

  1. 加载合适的回归数据集(例如 sklearn.datasets 里的 load_boston 数据集等用于房价预测之类的回归场景),获取对应的特征 X 和目标数值 y。

  2. 将模型创建部分改为使用 sklearn.ensemble 里的 ExtraTreesRegressor 类来创建回归实例,并设置相应合适的参数(参数含义和分类器中的类似,只是应用场景变为回归)。

  3. 在评估指标方面,不再使用 accuracy_score,而是选择比如 mean_squared_error(均方误差)、r2_score(决定系数)等适合回归任务的评估指标来衡量模型在测试集上的预测性能。

希望以上内容对你理解 Extra Trees 以及其 Python 实现有所帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

请向我看齐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值