如何为GradientBoostingClassifier使用export_text导出树结构?
问题背景
DecisionTreeClassifier可直接传入export_text导出树结构文本,运行正常,代码如下:
r = export_text(tree2, feature_names=fn) print(r)
RandomForestClassifier通过指定单棵基评估器的方式可正常导出,代码如下:
from sklearn.tree import export_text print(export_text(tree3.estimators_[0], spacing=3, decimals=3, feature_names=fn))
- 相同逻辑直接作用于
GradientBoostingClassifier时运行失败,报错信息如下:
AttributeError Traceback (most recent call last) ~\AppData\Local\Temp/ipykernel_1840/2106124489.py in <module> 1 from sklearn.tree import export_text ----> 2 r = export_text(tree4, feature_names=fn) 3 print(r) ~\anaconda\anaconda3\lib\site-packages\sklearn\utils\validation.py in inner_f(*args, **kwargs) 61 extra_args = len(args) - len(all_args) 62 if extra_args <= 0: ---> 63 return f(*args, **kwargs) 64 65 # extra_args > 0 ~\anaconda\anaconda3\lib\site-packages\sklearn\tree\_export.py in export_text(decision_tree, feature_names, max_depth, spacing, decimals, show_weights) 875 """ 876 check_is_fitted(decision_tree) --> 877 tree_ = decision_tree.tree_ 878 if is_classifier(decision_tree): 879 class_names = decision_tree.classes_ AttributeError: 'GradientBoostingClassifier' object has no attribute 'tree_'
待解决问题:是否存在可行方法,为GradientBoostingClassifier实现export_text树结构导出功能?
解决方法
报错核心原因是export_text仅支持传入单棵已拟合的决策树对象,GradientBoostingClassifier属于集成模型,本身不携带单棵树才有的tree_属性,无法直接传入。
和随机森林的调用逻辑一致,GradientBoostingClassifier训练得到的所有基决策树都存储在模型的estimators_属性中。和随机森林不同的是,梯度提升分类器的estimators_是形状为(n_estimators, n_classes)的二维数组——每轮迭代会为每个分类类别单独训练一棵回归树,取数组中对应的单棵树对象传入export_text即可完成导出。
单棵树导出示例:
from sklearn.tree import export_text # 导出第1轮迭代、对应第0个类别的基决策树文本规则 print(export_text(tree4.estimators_[0, 0], spacing=3, decimals=3, feature_names=fn))
如果需要导出所有基学习器的规则,直接遍历二维数组即可:
from sklearn.tree import export_text for iter_id, trees_in_iter in enumerate(tree4.estimators_): print(f"===== 第{iter_id + 1}轮迭代基树规则 =====") for class_id, tree in enumerate(trees_in_iter): print(f"--- 类别{class_id}对应子树 ---") print(export_text(tree, spacing=3, decimals=3, feature_names=fn))
注意:梯度提升分类器的基学习器是回归树,导出的叶子节点值为残差拟合值,并非直接分类结果,模型最终分类输出需要所有基树的结果累加后经过激活函数转换得到。
内容的提问来源于stack exchange,提问作者ZERO_BRAIN
相关产品推荐
相关产品推荐

