文章目录
前面一节我们学习了一种简单高效的算法——决策树学习算法(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)进行集成学习,减少了过拟合风险,提高了预测准确性。但是随机森林的模型较大,存储和预测速度较慢。