lightgbm可视化后的threshold和leaf_value是什么意思?

博客围绕lgb的一颗树展开,解读了threshold和leaf_value的含义。threshold是根据某个feature分裂的阈值,leaf_value是未经sigmoid规格化的预测值,经sigmoid函数后会被规格化到0 - 1之间,还给出了相关参考链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<think>我们之前已经构建了一个决策树模型,现在需要详细展示如何可视化决策树。 决策树可视化可以帮助我们理解模型如何做出决策,以及哪些特征在决策过程中最重要。 我们将使用scikit-learn的plot_tree函数graphviz库两种方法进行可视化。</think># 决策树可视化详解 决策树可视化是理解模型决策过程的关键工具。我将展示多种决策树可视化方法,包括基础可视化、高级美化、交互式可视化以及模型解释技术。 ## 1. 基础决策树可视化 ```python import matplotlib.pyplot as plt from sklearn.tree import plot_tree # 创建决策树模型 from sklearn.datasets import load_iris from sklearn.tree import DecisionTreeClassifier # 加载鸢尾花数据集 iris = load_iris() X, y = iris.data, iris.target # 训练决策树 dt = DecisionTreeClassifier(max_depth=3, random_state=42) dt.fit(X, y) # 基础可视化 plt.figure(figsize=(20, 10)) plot_tree( dt, feature_names=iris.feature_names, class_names=iris.target_names, filled=True, # 填充颜色表示类别 proportion=True, # 显示比例而非样本数 rounded=True, # 圆角矩形 fontsize=10 ) plt.title("鸢尾花分类决策树", fontsize=16) plt.savefig('decision_tree.png', dpi=300, bbox_inches='tight') plt.show() ``` **代码解释**: - `filled=True`:根据多数类填充节点颜色 - `proportion=True`:显示各类别比例而非绝对数量 - `rounded=True`:使用圆角矩形使图更美观 - `fontsize=10`:设置字体大小确保可读性 ## 2. 高级美化决策树可视化 ```python import numpy as np import matplotlib as mpl from matplotlib.colors import ListedColormap # 创建自定义颜色映射 custom_cmap = ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF']) plt.figure(figsize=(18, 10)) plot_tree( dt, feature_names=iris.feature_names, class_names=iris.target_names, filled=True, impurity=False, # 不显示不纯度 node_ids=True, # 显示节点ID proportion=True, rounded=True, precision=2, # 小数点精度 fontsize=9, colormap=custom_cmap # 自定义颜色 ) # 添加网格背景 plt.grid(False) plt.gca().set_facecolor('#F5F5F5') # 添加自定义图例 legend_elements = [ plt.Line2D([0], [0], marker='s', color='w', markerfacecolor='#FFAAAA', markersize=10, label='Setosa'), plt.Line2D([0], [0], marker='s', color='w', markerfacecolor='#AAFFAA', markersize=10, label='Versicolor'), plt.Line2D([0], [0], marker='s', color='w', markerfacecolor='#AAAAFF', markersize=10, label='Virginica') ] plt.legend(handles=legend_elements, loc='lower right', fontsize=12) plt.title("美化版决策树可视化", fontsize=18, pad=20) plt.tight_layout() plt.savefig('enhanced_tree.png', dpi=300) plt.show() ``` ## 3. 交互式决策树可视化 ```python # 需要安装dtreeviz库: pip install dtreeviz from dtreeviz.trees import dtreeviz # 创建交互式可视化 viz = dtreeviz( dt, X, y, target_name="target", feature_names=iris.feature_names, class_names=list(iris.target_names), orientation='TD', # 从上到下 (LR表示从左到右) show_just_path=True, # 高亮特定路径 X=np.array([5.0, 3.5, 1.3, 0.3]), # 高亮特定样本的路径 scale=1.5, # 缩放比例 fontname="DejaVu Sans", title_fontsize=16, label_fontsize=12 ) # 保存为SVG或显示 viz.save("interactive_tree.svg") viz.view() ``` ## 4. 决策树边界可视化 ```python # 可视化决策边界 def plot_decision_boundary(clf, X, y, feature_names, axes): # 创建网格 x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02), np.arange(y_min, y_max, 0.02)) # 预测网格点 Z = clf.predict(np.c_[xx.ravel(), yy.ravel(), np.zeros_like(xx.ravel()), np.zeros_like(xx.ravel())]) Z = Z.reshape(xx.shape) # 绘制决策边界 plt.contourf(xx, yy, Z, alpha=0.3, cmap=custom_cmap) # 绘制数据点 scatter = plt.scatter(X[:, 0], X[:, 1], c=y, cmap=custom_cmap, edgecolor='black', s=50) plt.xlabel(feature_names[0], fontsize=12) plt.ylabel(feature_names[1], fontsize=12) plt.title(f"决策边界: {feature_names[0]} vs {feature_names[1]}", fontsize=14) # 添加图例 plt.legend(*scatter.legend_elements(), title="Classes", fontsize=10) # 选择两个特征进行可视化 plt.figure(figsize=(15, 10)) # 特征组合1 plt.subplot(2, 2, 1) plot_decision_boundary(dt, X[:, [0, 2]], y, [iris.feature_names[0], iris.feature_names[2]], [0, 1]) # 特征组合2 plt.subplot(2, 2, 2) plot_decision_boundary(dt, X[:, [1, 3]], y, [iris.feature_names[1], iris.feature_names[3]], [2, 3]) # 特征组合3 plt.subplot(2, 2, 3) plot_decision_boundary(dt, X[:, [0, 3]], y, [iris.feature_names[0], iris.feature_names[3]], [0, 3]) # 特征组合4 plt.subplot(2, 2, 4) plot_decision_boundary(dt, X[:, [2, 3]], y, [iris.feature_names[2], iris.feature_names[3]], [2, 3]) plt.tight_layout() plt.savefig('decision_boundaries.png', dpi=300) plt.show() ``` ## 5. 决策树路径解释器 ```python from sklearn.tree import _tree def tree_to_code(tree, feature_names, class_names): tree_ = tree.tree_ feature_name = [ feature_names[i] if i != _tree.TREE_UNDEFINED else "undefined!" for i in tree_.feature ] print("def tree({}):".format(", ".join(feature_names))) def recurse(node, depth): indent = " " * depth if tree_.feature[node] != _tree.TREE_UNDEFINED: name = feature_name[node] threshold = tree_.threshold[node] print(f"{indent}if {name} <= {threshold:.2f}:") recurse(tree_.children_left[node], depth + 1) print(f"{indent}else: # if {name} > {threshold:.2f}") recurse(tree_.children_right[node], depth + 1) else: class_id = np.argmax(tree_.value[node][0]) class_name = class_names[class_id] print(f"{indent}return '{class_name}' # {tree_.value[node][0]}") recurse(0, 1) # 生成可读的决策树代码 print("决策树决策逻辑代码:") tree_to_code(dt, iris.feature_names, iris.target_names) ``` ## 6. 决策树动画可视化 ```python # 需要安装celluloid: pip install celluloid from celluloid import Camera from sklearn.tree import DecisionTreeClassifier fig = plt.figure(figsize=(12, 8)) camera = Camera(fig) # 创建不同深度的树并捕获动画帧 for depth in range(1, 5): dt = DecisionTreeClassifier(max_depth=depth, random_state=42) dt.fit(X[:, :2], y) # 只使用前两个特征 # 绘制决策边界 plot_decision_boundary(dt, X[:, :2], y, iris.feature_names[:2], [0, 1]) plt.title(f"决策树深度: {depth}", fontsize=16) camera.snap() # 创建动画 animation = camera.animate(blit=True, interval=1000) animation.save('tree_animation.gif', writer='pillow', fps=1) ``` ## 决策树可视化最佳实践 1. **简化复杂树**: - 限制最大深度 (`max_depth=3-5`) - 设置最小叶节点样本数 (`min_samples_leaf=10`) ```python dt = DecisionTreeClassifier(max_depth=4, min_samples_leaf=10) ``` 2. **特征选择**: - 可视化前选择最重要的特征 ```python important_features = np.argsort(dt.feature_importances_)[-2:] X_important = X[:, important_features] ``` 3. **解释性增强**: - 添加特征描述工具提示 - 包含业务领域解释 ```python feature_descriptions = { 'petal length (cm)': '花瓣长度(厘米)', 'petal width (cm)': '花瓣宽度(厘米)', 'sepal length (cm)': '花萼长度(厘米)', 'sepal width (cm)': '花萼宽度(厘米)' } ``` 4. **导出与共享**: - 导出为SVG格式保持清晰度 - 使用PDF格式用于学术出版 ```python plt.savefig('decision_tree.svg', format='svg') plt.savefig('decision_tree.pdf', format='pdf') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值