一、简介
1.定义
随机森林(Random Forest)是一种集成学习方法,它通过构建多个决策树并将它们的预测结果进行汇总来提高预测的准确性。随机森林由Leo Breiman在2001年提出,它结合了“bagging”和“随机特征选择”的思想,以构建出具有强大预测能力的模型。
2.基本原理
- Bagging(Bootstrap Aggregating):随机森林使用bootstrap抽样从原始数据集中随机抽取多个样本集,每个样本集的大小与原始数据集相同,但允许重复抽样。这样,每个决策树都是基于不同的样本集构建的,从而增加了模型的多样性。
- 随机特征选择:在构建每棵决策树时,不是使用所有的特征,而是随机选择一部分特征(通常是总特征数的一个子集)来进行分裂。这个步骤进一步增加了模型的多样性,因为不同的树可能会基于不同的特征集进行分裂。
- 决策树构建:对于每个bootstrap样本集,使用随机选择的特征集来构建一棵决策树。在构建过程中,通常不进行剪枝操作,因为随机森林通过集成多棵树来减少过拟合的风险。
- 集成预测:对于分类问题,随机森林通过多数投票的方式来决定最终的分类结果;对于回归问题,则通过计算所有树的预测结果的平均值来得到最终的预测值。
3.优缺点
优点:
- 高准确率:由于集成了多棵决策树,随机森林通常比单棵决策树具有更高的预测准确率。
- 鲁棒性:随机森林对噪声和异常值具有较好的容忍度,不易受到它们的影响。
- 易于使用:随机森林的参数相对较少,且通常不需要复杂的调参过程。
- 能够评估特征的重要性:随机森林可以计算每个特征对模型预测结果的贡献度,从而帮助理解数据。
缺点: - 过拟合:虽然随机森林通过集成多棵树来减少过拟合的风险,但如果树的数量过多或每棵树过于复杂,仍然有可能发生过拟合。
- 计算成本:构建随机森林需要训练多棵决策树,因此计算成本相对较高,特别是在数据集较大或特征较多的情况下。
- 解释性:虽然随机森林可以评估特征的重要性,但其决策过程相对复杂,不如单棵决策树那样直观易懂。
4.应用场景
随机森林广泛应用于各种领域,包括分类、回归、特征选择、异常检测等。在机器学习竞赛和实际应用中,随机森林因其良好的性能和易用性而备受青睐。
二、代码运用
随机森林是一种强大且灵活的机器学习算法,适用于许多不同的预测任务。这里我们通过对垃圾信息进行分类来测试并解释随机森林的用法。
1.数据预处理
import pandas as pd
# 读取数据
data = pd.read_csv('spambase.csv')
# 变量与标签分类
x = data.iloc[:, :-1]
y = data.iloc[:, -1]
from sklearn.model_selection import train_test_split
xtrain, xtest, ytrain, ytest = train_test_split(x, y, test_size=0.2, random_state=0)
- 数据读取:使用pandas库的read_csv函数读取名为spambase.csv的CSV文件,并将其存储在data变量中。
- 变量与标签分类:使用iloc方法将数据集分为特征(x)和标签(y)。特征是所有列(除了最后一列),而标签是最后一列(假设最后一列是分类标签,即是否为垃圾邮件)。
- 数据划分:使用train_test_split函数将数据集划分为训练集和测试集,测试集大小为20%,随机种子设置为0以确保结果的可重复性。
2.模型训练
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(
n_estimators=100,
max_features=0.8, # 80%的特征
random_state=0
)
rf.fit(xtrain, ytrain)
- 参数设置:创建一个实例rf,设置参数,决策树的数量为100、每个决策树使用的特征比例为80%,随机种子为0。
- 模型训练:使用训练集训练随机森林模型。
3.模型评估
from sklearn import metrics
train_predicted = rf.predict(xtrain)
score = rf.score(xtrain, ytrain)
print(metrics.classification_report(ytrain, train_predicted))
print(score)
test_predicted = rf.predict(xtest)
score = rf.score(xtest, ytest)
print(metrics.classification_report(ytest, test_predicted))
print(score)
- 绘制混淆矩阵:使用训练集与测试集进行预测,并计算准确率和混淆矩阵,以评估模型在训练集上的性能。
4.绘制特征排名
import matplotlib.pyplot as plt
from pylab import mpl
importances = rf.feature_importances_ # 这个属性保存子模型特征的重要性
im = pd.DataFrame(importances, columns=["importances"])
clos = data.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]
mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']
mpl.rcParams['axes.unicode_minus'] = False
index = range(len(im))
plt.yticks(index, im.clos) # 用于设置或获取y轴的标签和维度位置
plt.barh(index, im['importances']) # 创建水平条形图
plt.show()
- 特征排名:获取随机森林模型中特征的重要性,并将其与原始特征名称结合,存储在im中。对im按特征重要性进行降序排序,并选取前10个最重要的特征。
- 条形图绘制:使用matplotlib库绘制一个水平条形图,展示这些特征的重要性。通过设置字体和y轴标签,确保图表的可读性。
三、总结
在评估使用随机森林模型的性能时,需要综合考虑多种评估方法和指标,以全面、客观地评估模型的性能。同时,还需要注意数据集的代表性和多样性,以避免过拟合或欠拟合等问题的发生。此外,对于不同的应用场景和数据集,可能需要选择不同的评估指标和参数设置来优化模型的性能。