上海网站设计优刻,亚马逊网站网址,网站外链建设到底该怎么做,白云怎样优化网站建设文章目录 什么是随机森林#xff1f;随机森林的原理随机森林的优缺点优点缺点 随机森林模型API主要参数 实例实例步骤导入数据处理数据#xff0c;切分数据构建模型训练模型测试数据并输出分类报告和混淆矩阵画出模型的前十重要性的特征 扩展 什么是随机森林#xff1f;
-随… 文章目录 什么是随机森林随机森林的原理随机森林的优缺点优点缺点 随机森林模型API主要参数 实例实例步骤导入数据处理数据切分数据构建模型训练模型测试数据并输出分类报告和混淆矩阵画出模型的前十重要性的特征 扩展 什么是随机森林
-随机森林Random Forest是一种集成学习算法它通过构建多个决策树并将这些决策树的结果进行综合比如投票或者求平均来做出最终的预测。这些决策树是在训练过程中通过对训练数据集进行有放回抽样Bootstrap Sampling构建的。 如对决策树不了解可看《机器学习》——决策树 随机森林的原理
1、数据抽样 采用自助采样法Bootstrap Sampling。例如假设有一个包含 n 个样本的原始训练数据集 D每次从 D 中有放回地抽取 n 个样本生成一个新的训练数据集 D_i 用于训练一棵决策树。由于是有放回抽样所以 D_i 中会有一些样本被多次抽取也会有一些样本没有被抽到。那些没有被抽到的样本就可以作为测试集称为袋外数据Out - Of - Bag简称 OOB来评估这棵决策树的性能。 2、特征选择 在构建每棵决策树的节点时并不是使用所有的特征来寻找最佳划分。而是从全部特征中随机选择一个子集假设特征总数为 m通常选择 m 的平方根个特征然后在这个子集中寻找最佳划分特征。这样做的目的是为了降低决策树之间的相关性使得每棵决策树都具有一定的独立性从而提高整个模型的泛化能力。 3、决策树构建与集成 利用抽样得到的数据和选定的特征子集构建一棵决策树。这个过程和普通决策树的构建过程类似通过选择最佳的划分特征不断地将数据集划分成更小的子集直到满足停止条件如叶子节点中的样本数小于某个阈值或者树的深度达到了设定的最大值等当构建了多个假设为 k 个这样的决策树后对于一个新的输入样本将其输入到这 k 棵决策树中每棵决策树都会输出一个预测结果。如果是分类问题通常采用投票的方式多数表决来确定最终的类别如果是回归问题则对这 k 个结果求平均值作为最终的预测值。
随机森林的优缺点
优点
准确性高 由于它是集成了多个决策树的结果通过综合多个 “弱学习器” 的预测可以有效地减少模型的方差从而提高预测的准确性。例如在一个复杂的疾病诊断分类问题中随机森林可以比单一的决策树更准确地判断患者是否患病。 能够处理高维数据 可以处理大量的特征。通过随机选择特征子集的方式它可以筛选出对预测有重要贡献的特征而不会因为特征过多而出现过拟合现象。比如在基因数据分析中可能有成千上万个基因特征随机森林可以有效地从中挖掘出与疾病相关的关键基因特征组合。 抗过拟合能力强 一方面是因为有放回抽样使得每棵决策树的数据都有一定的差异另一方面是随机选择特征子集也降低了决策树之间的相关性。这两个因素使得模型不容易对训练数据过度拟合从而在面对新的数据时也能有较好的表现。 可以评估特征重要性 能够计算每个特征在模型中的重要性程度。例如在预测房屋价格的模型中可以通过随机森林来确定房屋面积、房龄、周边配套设施等各个因素对价格影响的重要性排序。
缺点
计算成本高 由于需要构建多个决策树当数据量非常大或者特征非常多时训练时间会比较长。例如在处理大规模的图像数据或者海量的文本数据时构建随机森林可能需要大量的计算资源和时间。 模型解释性相对较差 虽然可以评估特征重要性但是相对于简单的决策树来说随机森林是一个由多个决策树组成的黑盒模型。要理解它具体是如何做出预测的比较困难尤其是当决策树数量较多时。 对噪声数据敏感 如果训练数据中存在大量的噪声错误的标注或者异常值那么随机森林可能会受到影响因为它会学习到这些噪声信息并反映在决策树的构建中。
随机森林模型
API 主要参数
n_estimators 含义森林中树的数量。取值范围默认为 100通常可以尝试不同的值如 10、50、200 等。影响增加树的数量一般会提高模型的性能但同时也会增加计算成本和训练时间。当树的数量达到一定程度后模型性能的提升会逐渐变缓。示例如果将n_estimators设置为 50模型会构建 50 棵决策树用于分类。 criterion 含义衡量分裂质量的标准。取值范围可以是 “gini”基尼不纯度或者 “entropy”信息熵。影响“gini” 倾向于在节点内保持类别分布的均匀性“entropy” 更关注信息增益对于类别不平衡的数据可能更敏感。示例在一个二分类问题中如果使用 “entropy” 作为criterion模型在构建决策树时会更注重找到能够最大程度减少不确定性即信息熵的分裂特征。 max_depth 含义树的最大深度。取值范围默认值为None表示树会一直生长直到每个叶子节点都是纯的只包含一个类别或者包含的样本数小于min_samples_split。也可以设置为整数如 5、10 等。影响限制树的深度可以防止过拟合但如果设置得过小可能会导致欠拟合。示例如果max_depth设置为 3那么决策树的最大深度就是 3 层从根节点开始最多向下延伸 3 层。 min_samples_split 含义拆分内部节点非叶子节点所需的最小样本数。取值范围可以是整数如 2或者浮点数如 0.1表示样本数的比例。影响如果值较大树会更容易修剪有助于防止过拟合如果值较小树会更复杂可能导致过拟合。示例如果min_samples_split设置为 10那么只有当一个节点包含至少 10 个样本时才会考虑对其进行分裂。 min_samples_leaf 含义叶子节点所需的最小样本数。取值范围同样可以是整数或者浮点数。影响这个参数可以平滑模型避免叶子节点包含太少的样本从而防止过拟合。示例当min_samples_leaf设置为 5 时每个叶子节点至少要有 5 个样本。 max_features 含义在寻找最佳分裂时考虑的特征数量。取值范围可以是整数如 5表示考虑 5 个特征、浮点数如 0.5表示考虑一半的特征、“auto”自动考虑sqrt(n_features)个特征、“sqrt”同 “auto”、“log2”考虑log2(n_features)个特征或者None考虑所有特征。影响减少这个参数的值可以降低模型的方差但可能会增加偏差。示例如果max_features 0.3并且总共有 10 个特征那么在每次分裂时模型只会随机考虑 3 个特征来寻找最佳分裂点。 bootstrap 含义是否使用自助采样有放回采样来构建每棵树。取值范围默认为True。影响如果设置为True可以引入随机性有助于减少模型的方差如果设置为False每棵树会使用全部的训练数据可能会导致模型过拟合。示例当bootstrap True时对于一个有 100 个样本的数据集构建每棵树时可能会对这 100 个样本进行有放回采样有些样本可能会被多次采样而有些样本可能不会被采样到。 oob_score 含义是否使用袋外Out - Of - BagOOB样本来估计模型的泛化误差。取值范围默认为False。影响当bootstrap True时大约有 1/3 的样本不会被用于构建某一棵树这些样本称为袋外样本。使用oob_score True可以利用这些样本进行模型评估提供一个额外的评估指标。示例如果设置oob_score True在模型训练完成后可以通过model.oob_score_属性获取袋外样本的准确率估计值。 random_state 含义随机数生成器的种子。取值范围可以是整数或者None。影响当设置为整数时可以保证每次运行代码时模型的结果是可复现的因为相同的种子会产生相同的随机序列。示例如果random_state 42那么每次使用相同的数据集和参数运行模型时都会得到相同的决策树结构和分类结果。 class_weight 含义类别权重。取值范围可以是 “balanced”自动根据类别频率调整权重使得每个类别有相同的权重、字典如{0:1, 1:2}表示类别 0 的权重为 1类别 1 的权重为 2或者None所有类别权重相等。影响在类别不平衡的情况下调整类别权重可以使模型更关注少数类从而提高少数类的分类准确率。示例在一个正负样本比例为 1:9 的数据集里使用class_weightbalanced可以让模型在训练过程中对正样本给予更多的关注提高正样本的分类效果。
实例 我们将通过实例进行对随机森林的进一步了解。 本次实例是对垃圾邮件进行分类共有4597条数据其中有57个特征列和一个标签列。其中标签1为垃圾邮件0不是垃圾邮件。 以下为少量数据
实例步骤
导入数据处理数据切分数据构建模型训练模型测试数据并输出分类报告和混淆矩阵画出模型的前十重要性的特征
导入数据
# 读取 csv 文件数据
df pd.read_csv(spambase.csv)处理数据切分数据
# 导入数据集划分的工具
from sklearn.model_selection import train_test_split
# 获取特征列
x df.iloc[:, :-1]
# 获取标签列
y df.iloc[:, -1]
# 将数据集划分为训练集和测试集测试集占 20%随机种子为 100
xtrain, xtest, ytrain, ytest train_test_split(x, y, test_size0.2, random_state100)构建模型
# 导入随机森林分类器
from sklearn.ensemble import RandomForestClassifier
# 实例化随机森林分类器设置估计器数量为 100最大特征比例为 0.8随机种子为 0
rf RandomForestClassifier(n_estimators100,max_features0.8,random_state0
)训练模型
# 在训练集上训练随机森林模型
rf.fit(xtrain, ytrain)测试数据并输出分类报告和混淆矩阵
def cm_plot(y, yp):# 导入混淆矩阵计算和绘图所需的库from sklearn.metrics import confusion_matriximport matplotlib.pyplot as plt# 计算混淆矩阵cm confusion_matrix(y, yp)# 使用蓝色调色板绘制混淆矩阵plt.matshow(cm, cmapplt.cm.Blues)# 添加颜色条plt.colorbar()# 遍历混淆矩阵元素添加注释for x in range(len(cm)):for y in range(len(cm)):plt.annotate(cm[x, y], xy(y, x), horizontalalignmentcenter,verticalalignmentcenter)# 给 y 轴添加标签plt.ylabel(True label)# 给 x 轴添加标签plt.xlabel(Predicted label)# 返回绘图对象return plt# 对训练集进行预测
train_predicted rf.predict(xtrain)from sklearn import metrics
# 输出训练集上的分类报告
print(metrics.classification_report(ytrain, train_predicted))
# 调用 cm_plot 函数绘制混淆矩阵并显示
cm_plot(ytrain, train_predicted).show()# 对测试集进行预测
test_predicted rf.predict(xtest)
# 输出测试集上的分类报告
print(metrics.classification_report(ytest, test_predicted))
# 调用 cm_plot 函数绘制混淆矩阵并显示
cm_plot(ytest, test_predicted).show()从分类报告和混淆矩阵来看准确率和召回率还是很高的也没有产生过拟合和欠拟合。 画出模型的前十重要性的特征
import matplotlib.pyplot as plt
from pylab import mpl
# 获取随机森林模型的特征重要性
importances rf.feature_importances_
# 将特征重要性转换为 DataFrame
im pd.DataFrame(importances, columns[importances])
# 获取数据框的列名
clos df.columns
# 将列名转换为 numpy 数组
clos_1 clos.values
# 将 numpy 数组转换为列表
clos_2 clos_1.tolist()
# 去掉最后一个元素标签列
clos clos_2[0:-1]
# 将特征名添加到特征重要性 DataFrame 中
im[clos] clos
# 按特征重要性降序排序并取前 10 个
im im.sort_values(by[importances], ascendingFalse)[:10]# 设置字体为微软雅黑以支持中文显示
mpl.rcParams[font.sans-serif] [Microsoft YaHei]
# 解决负号显示问题
mpl.rcParams[axes.unicode_minus] False
# 生成 y 轴刻度的范围
index range(len(im))
# 设置 y 轴刻度标签为特征名
plt.yticks(index, im.clos)
# 绘制水平柱状图展示特征重要性
plt.barh(index, im[importances])
# 显示图形
plt.show()扩展 本实例还可以配合过采样对数据进行处理再进行随机森林模型的训练效果更好。 过采样算法可参考《机器学习》——逻辑回归过采样