前言
本文主要说明 Python 的 sklearn 库中的随机森林模型的常用接口、属性以及参数调优说明。需要读者或多或少了解过sklearn库和一些基本的机器学习知识。
- 更多关于随机森林的原理知识:【机器学习】RandomForest-随机森林中的数学原理 – 掘金 (juejin.cn)
sklearn中的随机森林
sklearn中的集成学习算法模块ensemble中与随机森林相关的类
类 | 说明 |
---|---|
ensemble.RandomForestClassifier | 随机森林分类 |
ensemble.RandomForestRegressor | 随机森林回归 |
基本使用
以红酒数据集和波士顿房价数据集为例,sklearn中的分类树和回归树的简单使用如下:
# 导包
from sklearn.datasets import load_wine, load_boston
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor
# 分类树
data_wine = load_wine() # 加载红酒数据集
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(data_wine.data, data_wine.target, test_size=0.3, random_state=42)
rfc = RandomForestClassifier() # 分类树
rfc.fit(X_train, y_train) # 拟合训练集
print(rfc.predict(X_train)) # 输出测试集的预测结果
print(rfc.score(X_test, y_test)) # 测试集上的准确率
# 回归树
data_boston = load_boston() # 加载波士顿房价数据集
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(data_boston.data, data_boston.target, test_size=0.3, random_state=42)
reg = RandomForestRegressor() # 回归树
reg.fit(X_train, y_train) # 拟合训练集
print(reg.predict(X_train)) # 测试集的预测结果
print(reg.score(X_test, y_test)) # 测试集上的决定系数 R2
常用属性和接口
.feature_importances_
:每个特征的特征重要性,总和为1.oob_score_
:当模型oob_score=True
时,训练后可查看树模型使用oob数据进行测试的平均准确度.estimators_
:返回集成的所有决策树模型的模型列表.apply()
:传入样本特征数据,返回每个样本被分到的节点索引,每个样本对应一个列表,列表中是该样本在随机森林中所有树模型中被分到的叶子节点索引.predict_proba()
:传入样本特征数据返回每个测试样本对应的被分到每个标签的概率
随机森林的 .score()
接口的选用指标:
- 随机森林分类:准确度 Accuracy
- 随机森林回归:决定系数 R2R^2
参数说明
与sklearn中的决策树参数很多都很相似,以下参数说明是针对分类树的,对于回归树,几乎所有参数、属性及接口都和分类树一模一样。需要注意的是,在回归树中,没有标签分布是否均衡的问题,因此没有class_weight这样的参数。
sklearn中随机森林分类和随机森林回归的默认参数
- 随机森林分类
RandomForestClassifier(bootstrap=True, ccp_alpha=0.0, class_weight=None,
criterion='gini', max_depth=None, max_features='auto',
max_leaf_nodes=None, max_samples=None,
min_impurity_decrease=0.0, min_impurity_split=None,
min_samples_leaf=1, min_samples_split=2,
min_weight_fraction_leaf=0.0, n_estimators=100,
n_jobs=None, oob_score=False, random_state=None,
verbose=0, warm_start=False)
- 随机森林回归
RandomForestRegressor(bootstrap=True, ccp_alpha=0.0, criterion='mse',
max_depth=None, max_features='auto', max_leaf_nodes=None,
max_samples=None, min_impurity_decrease=0.0,
min_impurity_split=None, min_samples_leaf=1,
min_samples_split=2, min_weight_fraction_leaf=0.0,
n_estimators=100, n_jobs=None, oob_score=False,
random_state=None, verbose=0, warm_start=False)
sklearn中随机森林的许多参数是用于限定集成的决策树模型的,这部分参数和决策树模型中的许多参数相同,这里就一笔带过,不再重复进行详细说明了,可以参考之前关于决策树的文章。
- criterion:不纯度的衡量指标,Gini系数或信息熵
- max_depth:树的最大深度,超过最大深度的树枝都会被剪掉
- min_samples_leaf:一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分枝就不会发生
- min_samples_split:一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分枝,否则分枝就不会发生
- max_features:max_features限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃, 默认值为总特征个数开平方取整
- min_impurity_decrease:限制信息增益的大小,信息增益小于设定数值的分枝不会发生
- class_weight:用于平衡不均衡数据集样本
- min_weight_fraction_leaf:计算样本权重版本的 min_samples_leaf
n_estimators
n_estimators是随机森林中树模型的数量,即基评估器的数量。这个参数对随机森林模型的精确性影响是单调的,n_estimators越大,模型的效果往往越好。但是相应的,任何模型都有决策边界,n_estimators达到一定的程度之后,随机森林的性能往往不再上升或开始波动,并且,n_estimators越大,需要的计算量和内存也越大,训练的时间也会越长。对于这个参数,我们是会在计算资源和模型效果之间取得平衡。
random_state
随机森林中的random_state和决策树中相似,只不过在决策树中,一个random_state只控制生成一棵树的随机状态,而随机森林中的random_state控制的是其集成的所有树模型中的随机状态,例如随机森林的random_state为一个常数后,包含的所有树模型的random_state则状态下固定的随机数。
注意:sklearn中的决策树不是传统的决策树模型,也含有random_state参数,也就是随机选择部分特征,但在一些情况下或许你会发现随机森林集成单棵决策树和用sklearn直接创建单个决策树模型的效果也是不同的,这是因为在sklearn中随机森林中集成的决策树的特征选择随机性要比tree模块中的决策树模型的随机性大得多,例如某数据集有700个特征,那随机森林中的每棵树可能随机选择其中的几十个特征来考虑,而独立的单个决策树模型可能随机选择其中的几百个特征来考虑。因此随机森林在处理高维数据时速度也会快很多。
bootstrap & oob_score
随机森林中在保证树模型的随机性时,除了原本决策树模型自带的随机性(从原始特征中随机选择部分特征),对于其中每个树模型的训练样本,则采用bootstrap方法,当 bootstrap
参数为True时,假设有 nn 个树模型,则会从原始训练样本中进行有放回随机抽样得到大小与原始训练样本数量相同的 nn 个自助集,这 nn 个自助集作为对对应的 nn 个树模型的训练数据。该方法可进一步增大模型的随机性。
每个自助集中只包含原始数据中的部分数据,由于可重复抽样,因此大小与原始训练数据集相同,对于每棵树而言,训练数据都仅包含原始数据的部分数据,其它数据被称为袋外数据(out of bag, oob data),为了不让这部分数据浪费,对于每棵树我们将它对应的袋外数据作为这单棵树模型的测试集进行性能测试,当 oob_score
参数为True时,随机森林模型在训练后会针对每棵树模型使用袋外数据计算准确度后取其均值,则在训练随机森林模型后可调用 oob_score_
接口查看。
n_jobs
n_jobs表示并行运行的作业数,用于指定随机森林的并行计算,可以加速训练过程
- -1:使用最大的CPU核心数,例如4核CPU会启动4个并行作业。
- 1(默认):禁用并行计算,串行运行。
- 2、3等整数:指定并行运行的作业数。
并行运行时,会拆分数据到不同CPU内核分别训练,然后合并结果,可大幅减少随机森林的训练时间,但会消耗更多CPU资源。
参数影响程度
我们在调参的时候,一般会从基于主观判断来从对模型影响最大的参数向影响最小的参数调整,对于可控的数值型参数,例如随机森林的 n_estimators
我们往往基于经验和主观判断调节,对于选项较少的如 criterion等参数,我们一般可以使用网格调参,当然算力允许的话想怎么调都是可以的。
参数 | 影响 | 影响程度 |
---|---|---|
n_estimators | 随着参数值的增加,模型性能提升至平稳,不影响单个模型的复杂度 | 4 |
max_depth | 默认为最大值(不限制),值越小,模型复杂度越小 | 3 |
min_samples_leaf | 默认为最小值(1),值越大,模型复杂度越小 | 2 |
min_samples_split | 默认为最小值(2),值越大,模型复杂度越小 | 2 |
max_features | 默认为中间值(auto),值越小,模型复杂度越小,值越大,模型复杂度越大 | 1 |
模型复杂度越大,过拟合风险越大,欠拟合风险越小;模型复杂度越小,欠拟合风险越大,过拟合风险越小。
ps:这里的参数中除了 n_estimators 外的其它参数影响程度对于单个决策树模型也是同理的。
Reference
- 菜菜的sklearn机器学习
- 相关网络资源和笔记