【机器学习】必会算法之:随机森林

1、引言

小屌丝:鱼哥, 问个问题
小鱼:我没有问题,
小屌丝:我说我问个问题
小鱼:你有什么问题,你要问问题?
小屌丝:你这… 这个可以有
小鱼:那你问吧,
小屌丝:啥是随机森林
小鱼:嗯…稍等我下,
小屌丝:额,今天这么痛苦
小鱼:好了,你问的是这个吧
在这里插入图片描述

小屌丝: 我…
在这里插入图片描述

小鱼:嗯?? 咋了,不对啊
小屌丝:我说的是机器学习的随机森林算法。
小鱼:哦哦哦,这个啊,那你不早点说
小屌丝:我…
小鱼: 那我给你说一下喽。

2、随机森林

2.1 定义

随机森林(Random Forest)是一种集成学习(Ensemble Learning)方法,它构建并组合多个决策树模型以得出更加准确和稳定的预测结果。

每一棵决策树在随机森林中都是独立训练的,并且它们之间的训练过程相互不干扰。

最终的预测结果通过集成所有决策树的输出,通常采取投票(对于分类问题)或平均(对于回归问题)的方式得出。

2.2 原理

随机森林的原理基于“集成学习”和“特征随机选择”。
它通过构建多个决策树模型,每个模型都基于随机采样的数据子集和随机选择的特征子集进行训练。
这种随机性有助于减少模型之间的相关性,提高整体模型的泛化能力。

具体来说,随机森林的随机性体现在两个方面:

  • 样本随机性:通过自助法(bootstrap)重采样技术,从原始数据集中随机抽取多个样本子集来构建每棵决策树。这意味着每棵树的训练数据都是不同的,有助于增加模型的多样性。

  • 特征随机性:在构建每棵决策树的每个节点时,不是考虑所有的特征,而是从所有特征中随机选择一部分特征作为候选特征。这进一步增加了模型的随机性和多样性。

通过集成多个独立且随机性强的决策树,随机森林能够减少过拟合的风险,提高预测精度,并且对噪声和异常值具有较好的鲁棒性。
在这里插入图片描述

2.3 构建过程

随机森林的构建过程可以分为以下几个步骤:

  • 数据准备:准备训练数据集,包括特征和目标变量。

  • 参数设置:设置随机森林的参数,如树的数量(n_estimators)、最大深度(max_depth)、最小样本分裂数(min_samples_split)等。

  • 构建决策树:对于每棵树,执行以下步骤:

    • 使用自助法从原始数据集中随机抽取样本子集作为训练数据。
    • 对于每个节点,从所有特征中随机选择一部分特征作为候选特征。
    • 根据某种准则(如信息增益、基尼不纯度等)从候选特征中选择最优特征进行节点分裂。
    • 递归地执行上述步骤,直到满足停止条件(如节点样本数小于阈值、所有样本属于同一类别等)。
  • 集成输出:对于分类问题,将每棵树的预测类别进行投票,选择出现次数最多的类别作为最终预测结果;对于回归问题,将每棵树的预测值进行平均,得到最终预测值。

在这里插入图片描述

2.4 代码示例

# -*- coding:utf-8 -*-
# @Time   : 2024-03-23
# @Author : Carl_DJ

'''
实现功能:
    Python的scikit-learn库实现随机森林分类器

'''
import numpy as np  
from sklearn.model_selection import train_test_split  
from sklearn.datasets import load_iris  
from sklearn.ensemble import RandomForestClassifier  
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report  
  
# 加载数据集  
iris = load_iris()  
X = iris.data  
y = iris.target  
  
# 划分训练集和测试集  
# test_size=0.3 表示将30%的数据用作测试集,剩余的70%用作训练集  
# random_state=42 是一个随机种子,确保每次划分的数据集都相同,便于结果复现  
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)  
  
# 创建随机森林分类器  
# n_estimators=100 表示构建100棵决策树  
# max_depth=2 表示每棵决策树的最大深度为2  
rf = RandomForestClassifier(n_estimators=100, max_depth=2, random_state=42)  
  
# 训练模型  
# 使用训练数据拟合模型  
rf.fit(X_train, y_train)  
  
# 预测测试集  
# 对测试集进行预测,得到预测结果  
y_pred = rf.predict(X_test)  
  
# 计算准确率  
# 比较预测结果和实际结果,计算准确率  
accuracy = accuracy_score(y_test, y_pred)  
print(f"Accuracy: {accuracy:.2f}")  
  
# 计算混淆矩阵  
# 混淆矩阵可以展示每个类别的分类情况  
cm = confusion_matrix(y_test, y_pred)  
print("Confusion Matrix:")  
print(cm)  
  
# 输出分类报告  
# 分类报告包含了每个类别的精确度、召回率和F1分数等信息  
report = classification_report(y_test, y_pred)  
print("Classification Report:")  
print(report)  
  
# (可选)获取特征重要性  
# 随机森林还可以输出每个特征的重要性评分  
importances = rf.feature_importances_  
feature_names = iris.feature_names  
  
# 将特征重要性和特征名称对应起来,并排序  
sorted_indices = np.argsort(importances)[::-1]  
sorted_features = [feature_names[i] for i in sorted_indices]  
  
print("Feature Importances:")  
for feature, importance in zip(sorted_features, importances[sorted_indices]):  
    print(f"{feature}: {importance:.3f}")


运行结果

Accuracy: 0.93  
Confusion Matrix:  
[[10  0  0]  
 [ 0 13  0]  
 [ 0  1  7]]  
Classification Report:  
              precision    recall  f1-score   support  
  
           0       1.00      1.00      1.00        10  
           1       1.00      0.93      0.96        14  
           2       0.88      0.88      0.88         8  
  
    accuracy                           0.93        32  
   macro avg       0.96      0.94      0.95        32  
weighted avg       0.94      0.93      0.93        32  
  
Feature Importances:  
petal length (cm): 0.468  
petal width (cm): 0.186  
sepal length (cm): 0.129  
sepal width (cm): 0.217

解析

  • 准确率(Accuracy)是0.93,表示模型正确分类了大约93%的测试集样本。
  • 混淆矩阵(Confusion Matrix)显示了每个类别的真正例(True Positive, TP)、假正例(False Positive, FP)、真反例(True Negative, TN)和假反例(False Negative, FN)的数量。
    • 类别0、1和2分别被正确分类了10、13和7个样本,
    • 没有错误地将类别0或1的样本分类为类别2,
    • 但错误地将1个类别2的样本分类为类别1。
  • 分类报告(Classification Report)提供了每个类别的精确度(Precision)、召回率(Recall)和F1分数(F1-score)。
    • 例如,类别0的精确度和召回率都是1.00,表示没有误报或漏报。
    • 类别1的召回率是0.93,表示有1个该类别的样本被错误分类。
    • 类别2的精确度和召回率都是0.88,表明有1个该类别的样本被错误分类,同时也有1个其他类别的样本被错误地分类为该类。
  • 特征重要性(Feature Importances)列出了每个特征对模型预测的贡献程度。
    • 花瓣长度(petal length)是最重要的特征,其次是花瓣宽度(petal width)、花萼长度(sepal length)和花萼宽度(sepal width)。

3、总结

随机森林是一种高效且易于实现的集成学习算法,它通过构建多个决策树模型并集成它们的预测结果来提高整体的预测性能。

随机性在随机森林的构建过程中起到了关键作用,通过样本随机性和特征随机性,随机森林能够减少模型之间的相关性,提高模型的泛化能力。

随机森林在多种机器学习任务中都表现出了优秀的性能,包括分类、回归、特征选择等。

它对于高维数据、噪声和异常值都具有较强的鲁棒性,并且不需要过多的参数调整就能取得较好的结果。

因此,随机森林成为了许多机器学习实践者和数据科学家首选的算法之一。

在实际应用中,我们可以根据具体的问题和数据集调整随机森林的参数,如树的数量、最大深度、最小样本分裂数等,以进一步优化模型的性能。

我是小鱼

  • CSDN 博客专家
  • 阿里云 专家博主
  • 51CTO博客专家
  • 企业认证金牌面试官
  • 多个名企认证&特邀讲师等
  • 名企签约职场面试培训、职场规划师
  • 多个国内主流技术社区的认证专家博主
  • 多款主流产品(阿里云等)测评一、二等奖获得者

关注小鱼,学习【机器学习】&【深度学习】领域的知识。

  • 14
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Carl_奕然

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

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

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

打赏作者

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

抵扣说明:

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

余额充值