前面一节我们学习了一种简单高效的算法——决策树学习算法(Decision Tree ),下面来介绍一种基于决策树的集成学习算法——随机森林算法(Random Forest )。
随机森林是一种基于集成学习(Ensemble Learning)的机器学习算法,属于 Bagging 类型的集成方法。它通过构建多个决策树(Decision Tree)并将它们的预测结果进行集成,从而提高模型的准确性和鲁棒性。随机森林广泛应用于分类、回归以及特征选择等任务。
随机性:
样本随机:每棵树通过 Bootstrap 采样(有放回抽样)从训练集中随机选择样本。
特征随机:在每棵树的节点分裂时,随机选择一部分特征进行分裂。
集成学习:
通过多棵树的集成,降低单棵决策树的过拟合风险,提高模型的泛化能力。
鲁棒性强:
对噪声数据和缺失数据具有较好的鲁棒性。
可解释性:
可以通过特征重要性(Feature Importance)评估每个特征对模型的贡献。
Bootstrap 采样:
从训练集中随机抽取样本(有放回),生成多个子数据集。
构建决策树:
对每个子数据集,构建一棵决策树。
在树的每个节点分裂时,随机选择一部分特征进行分裂。
集成预测:
对于分类任务,采用 多数投票 的方式确定最终结果。
对于回归任务,采用 平均值 作为最终结果。
优点:
(1)高准确性:
通过集成多棵树,减少了过拟合风险,提高了预测准确性。
(2)鲁棒性强:
对噪声数据和缺失数据不敏感。
(3)并行化:
每棵树的构建是独立的,可以并行化处理,适合大规模数据。
(4)特征重要性评估:
可以输出每个特征的重要性,帮助特征选择。
缺点:
(1)训练时间较长:
构建多棵树需要更多的计算资源。
(2)模型复杂度高:
随机森林的模型较大,存储和预测速度较慢。
(3)可解释性较差:
虽然比单个决策树更准确,但模型的可解释性较差。
将多个决策树结合在一起,每次数据集是随机有放回的选出,同时随机选出部分特征作为输入,所以该算法被称为随机森林算法。可以看到随机森林算法是以决策树为估计器的Bagging算法。
下图展示了随机森林算法的具体流程,其中结合器在分类问题中,选择多数分类结果作为最后的结果,在回归问题中,对多个回归结果取平均值作为最后的结果。
使用Bagging算法能降低过拟合的情况,从而带来了更好的性能。单个决策树对训练集的噪声非常敏感,但通过Bagging算法降低了训练出的多颗决策树之间关联性,有效缓解了上述问题。
import pandas as pd
import matplotlib.pyplot as plt
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
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)
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators=100,max_depth=10)
rf = rf.fit(x_train,y_train)
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()
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()
随机森林通过构建多个决策树(Decision Tree)进行集成学习,减少了过拟合风险,提高了预测准确性。但是随机森林的模型较大,存储和预测速度较慢。