随机森林分类模型 0基础小白也能懂(附代码)

随机森林分类模型

原文链接

啥是随机森林

随机森林是一种由决策树构成的(并行)集成算法,属于Bagging类型,通过组合多个弱分类器,最终结果通过投票或取均值,使得整体模型的结果具有较高的精确度和泛化性能,同时也有很好的稳定性,广泛应用在各种业务场景中。随机森林有如此优良的表现,主要归功于「随机」和「森林」,一个使它具有抗过拟合能力,一个使它更加精准。

前面有些乱七八糟的名词,后面来一一解释

集成算法

1)集成学习

对于训练数据集,我们训练一系列「个体学习器」,再通过「结合策略」将它们集成起来,形成一个更强的学习器,这就是「集成学习」在做的事情,内核思想类似「三个臭皮匠,顶个诸葛亮」。

2)个体学习器

个体学习器是相对于集成学习来说的,其实我们在之前了解到的很多模型,比如 C4.5 决策树算法、逻辑回归算法、朴素贝叶斯算法等,都是个体学习器。

Bagging

我们在这里讲到的随机森林是并行集成模型,而Bagging是并行式集成学习方法最著名的代表。

1)Bootstrap Sampling

要理解bagging,首先要了解自助采样法(Bootstrap Sampling):

搞得玄乎其玄,其实原理挺简单,前面文章也讲到过。

给定包含\(m\)个样本的数据集,我们先随机取出一个样本放入采样集中,再把该样本放回初始数据集,使得下次采样时该样本仍有可能被选中。

上述过程重复\(m\)轮,我们得到\(m\)个样本的采样集,初始训练集中有的样本在采样集中多次出现,有的则从未出现,约\(63.2\)的样本出现在采样集中,而未出现的约\(36.8\)的样本可用作验证集来对后续的泛化性能进行「包外估计」。

2)Bagging

Bagging是Bootstrap aggregating的缩写,是在Boostrap Sampling基础上构建的,,上述的采样过程我们可以重复\(T\)次,采样出\(T\)个含\(m\)个训练样本的采样集,然后基于每个采样集训练出一个基学习器,然后将这些基学习器进行结合。

在对预测输出进行结合时(也就是图中对学习器的结合),Bagging 通常对分类任务使用简单投票法(即选取票数最多的类别作为最终预测结果),对回归任务使用简单平均法(计算所有基学习器的预测结果的算术平均值),这就是Bagging 的基本流程。

随机森林算法

Random Forest(随机森林,简称RF)是一种基于树模型的Bagging的优化版本。核心思想依旧是Bagging,但是做了一些独特的改进——RF使用了CART决策树(CART详见基尼指数那块)作为基学习器。具体过程如下:

  • 输入为样本集\(D=\{(x_1,y_1),(x_2,y_2),...,(x_m,y_m)\}\),其中\(x_i\)是第\(i\)个样本的特征向量,每个样本有\(d\)个特征,\(y_i\)是对应的标签(分类任务中为类别标签,回归任务中为连续值)。

  • 对于\(t=1,2,...,T\):对训练集进行\(t\)次随机采样,共采集m次,得到包含m个样本的采样集\(D_T\),用此采样集训练第\(T\)个决策树模型\(G_T(x)\),在标准的决策树训练过程中,我们会在所有特征中选择一个最优特征来进行划分。但在训练随机森林决策树模型的节点的时候,要在节点上所有的样本特征中选择一部分样本特征,在这些随机选择的部分样本特征中选择一个最优的特征来做决策树的左右子树划分。

下面是对于同一份数据集(iris数据集),我们使用决策树和不同树棵树的随机森林做分类的结果,我们对其决策边界做了可视化。

可以很明显地看到,随着随机森林中决策树数量的增多,模型的泛化能力逐渐增强,决策边界越来越趋于平滑(受到噪声点的影响越来越小)。

(1)随机森林优点
对于高维(特征很多)稠密型的数据适用,不用降维,无需做特征选择。
构建随机森林模型的过程,亦可帮助判断特征的重要程度。
可以借助模型构建组合特征。
并行集成,有效控制过拟合。
工程实现并行简单,训练速度快。
对于不平衡的数据集友好,可以平衡误差。
对于特征确实鲁棒性强,可以维持不错的准确度。

(2)随机森林缺点
在噪声过大的分类和回归数据集上还是可能会过拟合。
相比单一决策树,因其随机性,模型解释会更复杂一些。

影响随机森林的参数与调优

1)核心影响参数

(1)生成单颗决策树时的特征数 max_features
增加 max_features 一般能提高单个决策树模型的性能,但降低了树和树之间的差异性,且可能降低算法的速度。
太小的 max_features 会影响单颗树的性能,进而影响整体的集成效果。
需要适当地平衡和选择最佳的 max_features。

(2)决策树的棵数 n_estimators
较多的子树可以让模型有更好的稳定性和泛化能力,但同时让模型的学习速度变慢。
我们会在计算资源能支撑的情况下,选择稍大的子树棵树。

(3)树深 max_depth
太大的树深,因为每颗子树都过度学习,可能会有过拟合问题。
如果模型样本量多特征多,我们会限制最大树深,提高模型的泛化能力。

2)参数调优

(1)RF划分时考虑的最大特征数 max_features
总数的百分比,常见的选择区间是\([0.5,0.9]\)
(2)决策树的棵树 n_estimators
可能会设置为\(>50\)的取值,可根据计算资源调整。
(3)决策树最大深度 max_depth
常见的选择在\(4 到 12\)之间。
(4)内部节点再划分所需最小样本数 min_samples_split
如果样本量不大,不需要调整这个值。
如果样本量数量级非常大,我们可能会设置这个值为\(16,32,64\)等。
(5)叶子节点最少样本数 min_samples_leaf
为了提高泛化能力,我们可能会设置这个值大于1。

代码实现

sklearn实在是太方便了......

# 导入必要的库
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

# 1. 加载数据集
# 这里使用了Iris数据集作为示例,可以换成你自己的数据集
# Iris数据集包含了150个样本,分为3类(每类50个样本)
# 每个样本有4个特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度
data = load_iris()
X = data.data  # 特征矩阵,包含150个样本,每个样本有4个特征
y = data.target  # 目标变量,表示每个样本的类别(0, 1, 2)

# 2. 划分训练集和测试集
# 将数据集按7:3的比例划分为训练集和测试集
# X_train, y_train是训练集的特征矩阵和目标变量
# X_test, y_test是测试集的特征矩阵和目标变量
# random_state=42确保每次运行代码时划分结果相同
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 3. 创建随机森林分类器模型
# RandomForestClassifier是一个集成学习模型,通过构建多棵决策树来进行分类
# n_estimators=100表示森林中包含100棵树
# max_depth=None表示每棵树的最大深度没有限制,树会尽可能地生长
# min_samples_split=2表示每个节点至少包含2个样本时才会继续分裂
# random_state=42用于控制随机性,使结果可复现
rf_classifier = RandomForestClassifier(n_estimators=100,  # 树的数量
                                       max_depth=None,      # 树的最大深度
                                       min_samples_split=2, # 节点再划分所需的最小样本数
                                       random_state=42)     # 随机种子

# 4. 训练模型
# 使用训练集的数据来训练随机森林模型
# 模型会学习特征与目标变量之间的关系
rf_classifier.fit(X_train, y_train)

# 5. 进行预测
# 使用测试集的数据进行预测,得到每个样本的预测类别
y_pred = rf_classifier.predict(X_test)

# 6. 模型评估
# 计算准确率(accuracy),表示模型预测正确的样本所占的比例
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")  # 输出准确率,保留两位小数

# 打印分类报告
# classification_report包含精确率(precision)、召回率(recall)、F1-score和支持度(support)
# 精确率:预测为正类的样本中实际为正类的比例
# 召回率:实际为正类的样本中预测为正类的比例
# F1-score:精确率和召回率的调和平均数
# 支持度:每个类别在测试集中样本的数量
print("Classification Report:")
print(classification_report(y_test, y_pred))

# 显示混淆矩阵
# confusion_matrix显示的是分类模型的实际标签与预测标签的对比
# 行表示实际标签,列表示预测标签
# 对角线元素表示正确分类的样本数,非对角线元素表示错误分类的样本数
print("Confusion Matrix:")
print(confusion_matrix(y_test, y_pred))

结果如下

Accuracy: 1.00
Classification Report:
              precision    recall  f1-score   support

           0       1.00      1.00      1.00        19
           1       1.00      1.00      1.00        13
           2       1.00      1.00      1.00        13

    accuracy                           1.00        45
   macro avg       1.00      1.00      1.00        45
weighted avg       1.00      1.00      1.00        45

Confusion Matrix:
[[19  0  0]
 [ 0 13  0]
 [ 0  0 13]]
posted @ 2024-09-03 19:13  Mephostopheles  阅读(26)  评论(0编辑  收藏  举报