机器学习——随机森林(Random Forest)

前面一节我们学习了一种简单高效的算法——决策树学习算法(Decision Tree ),下面来介绍一种基于决策树的集成学习算法——随机森林算法(Random Forest )。

一、随机森林的介绍

随机森林是一种基于集成学习(Ensemble Learning)的机器学习算法,属于 Bagging 类型的集成方法。它通过构建多个决策树(Decision Tree)并将它们的预测结果进行集成,从而提高模型的准确性和鲁棒性。随机森林广泛应用于分类、回归以及特征选择等任务。

1.核心思想

  • 通过构建多棵决策树,每棵树独立地对数据进行预测。
  • 最终的预测结果是所有树的预测结果的综合(分类任务使用投票,回归任务使用平均)。

2.随机森林的特点

随机性:
样本随机:每棵树通过 Bootstrap 采样(有放回抽样)从训练集中随机选择样本。
特征随机:在每棵树的节点分裂时,随机选择一部分特征进行分裂。

集成学习:
通过多棵树的集成,降低单棵决策树的过拟合风险,提高模型的泛化能力。

鲁棒性强:
对噪声数据和缺失数据具有较好的鲁棒性。

可解释性:
可以通过特征重要性(Feature Importance)评估每个特征对模型的贡献。

3. 随机森林的构建过程

Bootstrap 采样:
从训练集中随机抽取样本(有放回),生成多个子数据集。

构建决策树:
对每个子数据集,构建一棵决策树。
在树的每个节点分裂时,随机选择一部分特征进行分裂。

集成预测:
对于分类任务,采用 多数投票 的方式确定最终结果。
对于回归任务,采用 平均值 作为最终结果。

4. 随机森林的优缺点

优点:
(1)高准确性:
通过集成多棵树,减少了过拟合风险,提高了预测准确性。
(2)鲁棒性强:
对噪声数据和缺失数据不敏感。
(3)并行化:
每棵树的构建是独立的,可以并行化处理,适合大规模数据。
(4)特征重要性评估:
可以输出每个特征的重要性,帮助特征选择。

缺点:
(1)训练时间较长:
构建多棵树需要更多的计算资源。
(2)模型复杂度高:
随机森林的模型较大,存储和预测速度较慢。
(3)可解释性较差:
虽然比单个决策树更准确,但模型的可解释性较差。

二、.随机森林算法

将多个决策树结合在一起,每次数据集是随机有放回的选出,同时随机选出部分特征作为输入,所以该算法被称为随机森林算法。可以看到随机森林算法是以决策树为估计器的Bagging算法。

下图展示了随机森林算法的具体流程,其中结合器在分类问题中,选择多数分类结果作为最后的结果,在回归问题中,对多个回归结果取平均值作为最后的结果。

使用Bagging算法能降低过拟合的情况,从而带来了更好的性能。单个决策树对训练集的噪声非常敏感,但通过Bagging算法降低了训练出的多颗决策树之间关联性,有效缓解了上述问题。

在这里插入图片描述

三、随机森林的实现

1.导入库

import pandas as pd
import matplotlib.pyplot as plt
  • pandas:用于数据处理和分析。
  • matplotlib.pyplot:用于绘制图形,这里主要用于绘制散点图来直观展示数据之间的关系

2.描绘可视化混淆矩阵

def cm_plot(y,yp):
    from sklearn.metrics import confusion_matrix
    cm  = confusion_matrix(y,yp)
    plt.matshow(cm,cmap = plt.cm.Blues)
    plt.colorbar()
    for x in range(len(cm)):
        for y in range(len(cm)):
            plt.annotate(cm[x,y],xy = (y,x),horizontalalignment = 'center',
                         verticalalignment='center')
            plt.ylabel('True label')
            plt.xlabel('Predicted label')
    return plt

3.数据预处理

df = pd.read_csv("spambase.csv")

x = df.iloc[:,:-1]
y = df.iloc[:,-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)
  • 读取数据:使用pandas库读取 spambase.csv 文件。数据集在下方链接中。
  • x:删除最后一列
  • y:只保留最后一列
  • train_test_split:对数据集进行划分
  • 将数据划分为这四部分:
    x_train:训练集特征
    x_test:测试集特征
    y_train:训练集标签
    y_test:测试集标签

4.模型训练

from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier(n_estimators=100,max_depth=10)
rf = rf.fit(x_train,y_train)
  • 参数设置:创建一个实例rf,设置参数,决策树的数量为100、树的深度为10。
  • 模型训练:使用fit()函数训练随机森林模型。

5.绘制混淆矩阵并打印评分报告

from sklearn import metrics

# 在小训练集上评估模型
train_predicted = rf.predict(x_train)
print(metrics.classification_report(y_train, train_predicted,digits=9))
cm_plot(y_train, train_predicted).show()

# 在完整测试集上评估模型
train_predicted1 = rf.predict(x_test)
print(metrics.classification_report(y_test, train_predicted1))
cm_plot(y_test, train_predicted1).show()
  • 打印报告:打印分类报告(classification_report),包括精确度、召回率、F1分数等指标。
  • 绘制混淆矩阵:使用自定义的cm_plot函数绘制混淆矩阵,以可视化模型性能。
  • 模型打印报告如下:
    在这里插入图片描述

6.绘制特征排名

importances = rf.feature_importances_ #这个属性保存了模型中特征的重要性
im = pd.DataFrame(importances,columns=["importances"])
clos = df.columns
clos_1 = clos.values
clos_2 = clos_1.tolist()
clos = clos_2[0:-1]
im['clos'] = clos

im = im.sort_values(by=['importances'],ascending=False)[:10]

index = range(len(im))
plt.yticks(index,im.clos)
plt.barh(index,im['importances']) 
plt.show()
  • feature_importances_: 随机森林模型的属性,返回一个数组,表示每个特征的重要性(值越大,特征越重要)。
  • 处理特征名称:将特征名称与重要性值关联,并去掉目标变量。
  • im = im.sort_values(by=[‘importances’], ascending=False)[:10]:按特征重要性降序排序,并取前 10 个最重要的特征。
  • plt.barh(index,im[‘importances’]) :用于创建水平条形图

四、总结

随机森林通过构建多个决策树(Decision Tree)进行集成学习,减少了过拟合风险,提高了预测准确性。但是随机森林的模型较大,存储和预测速度较慢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值