有没有办法从 sklearn RandomForestRegressor 中提取模型训练期间适合的(有效)可训练参数数量?
可训练参数的数量可以用来比较两个模型的复杂度。此外,它还可用于估计 chi^2 分布中的自由度数。
感谢您的帮助!
简答:
n_params = sum(tree.tree_.node_count for tree in model.estimators_) * 4
RandomForestRegressor
有一个 estimators_
属性,它在拟合后填充了所有决策树的列表。
反过来,每个 DecisionTreeRegressor
依次具有一个 tree_
属性,其中包含二元决策树的表示。
根据本教程,每个二叉树都使用四个向量来完整描述,每个向量的长度等于节点数:
children_left
:节点的左子节点的 id,如果是叶节点children_right
:节点的右孩子的 id 或 -1 如果是叶节点feature
:用于分裂节点的特征,编码为整数threshold
:分裂节点的阈值我从计算中排除了
n_node_samples
和 impurity
,因为它们是信息性的,不是构建树所必需的。
因此,参数总数是集成中所有估计器的节点数的总和乘以四。
import numpy as np
import sklearn.ensemble
# Mock regression problem.
N = 10000
X = np.random.rand(N, 4)
y = np.mean(X, axis=1)
model = (
sklearn.ensemble.RandomForestRegressor(
n_estimators=100,
min_samples_leaf=11,
n_jobs=4,
)
.fit(X, y)
)
# Each binary tree is described by left & righ children, feature, and threshold for each node.
n_params = sum(tree.tree_.node_count for tree in model.estimators_) * 4
print(f"Total number of parameters: {n_params:d}")
输出:
Total number of parameters: 353024
min_samples_leaf
时增加,因为树变深了。RandomForestClassifier
.拟合后
RandomForestRegressor
您可以访问 feature_importances_
这表明进行拆分时特征的重要性,以及 n_features_
总共使用了多少个特征用于拟合。