文章目录
一、什么是随机森林
随机森林(Random Forest)是一种集成学习方法,属于监督学习算法,主要用于分类和回归任务。它通过在数据集的多个子集上构建多个决策树,并输出这些树预测结果的众数(对于分类问题)或平均值(对于回归问题)来工作。随机森林以其高准确率、不易过拟合以及能够有效评估变量的重要性等特点而广受欢迎。
二、随机森林的主要特点
- 集成学习:通过结合多个决策树的预测结果来做出最终决策,可以提高模型的泛化能力。
- 随机性:在构建每棵树时,随机选择部分特征(特征子集)和样本(有放回抽样,称为bootstrap sampling),这有助于减少过拟合并增加模型的多样性。
- 并行性:由于每棵树的构建是独立的,因此可以并行化计算,提高训练速度。
- 易于使用和调参:Scikit-learn 提供了易于使用的接口和丰富的参数,使得随机森林模型易于构建和调优。
三、随机森林参数
-
Python中是使用sklearn库中的 sklearn.ensemble 中的 RandomForestClassifier 类来实现随机森林的方法
-
sklearn.ensemble.RandomForestClassifier 中有很多的参数的默认值如下:
class sklearn.ensemble.RandomForestClassifier( n_estimators=’warn’, criterion=’gini’, max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=’auto’, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, class_weight=None )
-
一些重要参数的讲解:
-
n_estimators :
- 随机森林中决策树的个数。
-
criterion :
- 节点分割依据,默认为基尼系数。
- 可选【entropy:信息增益】
-
max_depth:
- default=(None)设置决策树的最大深度,默认为None。
- (1)数据少或者特征少的时候,可以不用管这个参数,按照默认的不限制生长即可
- (2)如果数据比较多特征也比较多的情况下,可以限制这个参数,范围在10~100之间比较好】
-
min_samples_split :
- 这个值限制了子树继续划分的条件,如果某节点的样本数少于设定值,则不会再继续分裂。
- 默认是2 如果样本量不大,不需要管这个值。如果样本量数量级非常大,则建议增大这个值。
-
min_samples_leaf :
- 这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。
- 叶是决策树的末端节点。 较小的叶子使模型更容易捕捉训练数据中的噪声。 一般来说,我更偏向于将最小叶子节点数目设置为大于50。在你自己的情况中,你应该尽量尝试多种叶子大小种类,以找到最优的那个。
- 比如,设定为50,此时,上一个节点(100个样本)进行分裂,分裂为两个节点,其中一个节点的样本数小于50个,那么这两个节点都会被剪枝
-
min_weight_fraction_leaf :
- 这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。【一般不需要注意】
-
max_features :
- 随机森林允许单个决策树使用特征的最大数量。选择最适属性时划分的特征不能超过此值。
- 当为整数时,即最大特征数;当为小数时,训练集特征数*小数;
if “auto”, then max_features=sqrt(n_features).
If “sqrt”, then max_features=sqrt(n_features).
If “log2”, then max_features=log2(n_features).
If None, then max_features=n_features. - 增加max_features一般能提高模型的性能,因为在每个节点上,我们有更多的选择可以考虑。 然而,这未必完全是对的,因为它降低了单个树的多样性,而这正是随机森林独特的优点。 但是,可以肯定,你通过增加max_features会降低算法的速度。 因此,你需要适当的平衡和选择最佳max_features。
-
max_leaf_nodes:
- 通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。
- 比如,一颗决策树,如果不加限制的话,可以分裂100个叶子节点,如果设置此参数等于50,那么最多可以分裂50个叶子节点
-
min_impurity_split:
- 这个值限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。一般不推荐改动默认值1e-7。
-
bootstrap=True:
- 是否有放回的采样,按默认,有放回采样
-
n_jobs=1:
- 并行job个数。这个在是bagging训练过程中有重要作用,可以并行从而提高性能。1=不并行;
- n:n个并行;
- -1:CPU有多少core,就启动多少job。
-
四、案例的代码实现
-
这里有一份关于统计出现在文件中的关键字的概率,来判断此文件是否删除的数据集
- 最后一列为标签列,标签为1的表示要删除,为0的表示不要删除
- 每一行代表一条文件数据,一共4000+数据
- 如下图所示:
-
步骤:
- 1、读取数据
- 2、划分训练集和测试集
- 3、构建模型并训练
- 4、将测试集传入模型进行测试
-
1、读取数据
import pandas as pd # 用pandas方法读取数据,数据存放在名为spambase.csv的文件中 data = pd.read_csv("spambase.csv")
-
2、划分训练集和测试集
X = data.iloc[:, :-1] # 读取除了最后一列的所有数据,作为训练和测试数据 Y = data.iloc[:, -1] # 读取最后一列,作为标签 # 导入sklearn库中的train_test_split方法对数据进行切分 from sklearn.model_selection import train_test_split # 划分20%的数据作为测试集数据,其余的作为训练集数据,并抛出一个随机种子,为了以后每次运行所划分的数据都与第一次相同 x_train, x_test, y_train, y_test = \ train_test_split(X, Y, test_size=0.2, random_state=100) # x_train:训练集 # x_test:测试集 # y_train:训练集标签 # y_test:测试集标签
-
3、构建模型并训练
# 导入随机森林方法 from sklearn.ensemble import RandomForestClassifier # 调用方法,并用一个变量接收 # 因为此训练数据并不是很多,所以一些参数都以默认的值进行训练 rf = RandomForestClassifier( n_estimators=100, max_features=0.8, random_state=0 ) # 传入训练集,和训练集标签 rf.fit(x_train, y_train)
-
4、将测试集传入模型进行测试
-
调用以下两种方法对模型进行评估
-
predict 方法接受一个数组(或类似数组的结构,如列表的列表、Pandas DataFrame等),其中包含了要预测的目标变量的新数据点。然后,它使用训练好的模型对这些数据点进行预测,并返回一个包含预测结果的数组。
-
metrics.classification_report 是 scikit-learn(一个流行的 Python 机器学习库)中的一个函数,用于展示主要分类指标的文本报告。这个函数特别适用于评估分类模型的性能,尤其是在处理多类分类问题时。它提供了每个类别的精确度(precision)、召回率(recall)、F1 分数(F1-score)和支持度(support,即每个类别的真实样本数量)的详细报告。
from sklearn import metrics # 传入测试集,并查看测试出的标签结果 test_predicted = rf.predict(x_test) print(test_predicted) # 传入测试集标签(每个测试数据的真实标签)和测试出的标签结果 print(metrics.classification_report(y_test, test_predicted))
-
结果如下:
-
从各个指标的分数来看,随机森林模型的分类性能还是很强的
-