多分类任务中为每个特征绘制多类别PartialDependencePlot线的技术求助
多分类任务中基于partial_dependence结果绘制多类别Partial Dependence Plot
核心思路
sklearn.inspection.partial_dependence返回的结果包含了每个特征在不同取值下,每个类别的部分依赖值。我们可以直接用matplotlib手动遍历这些数据,为每个特征单独绘制一张图,图内包含所有类别的PDP折线。
具体实现代码
假设你已经完成了模型训练,并通过以下代码获取了部分依赖结果:
from sklearn.inspection import partial_dependence # 假设model是训练好的多分类模型,X是特征数据集,features是要分析的特征索引/名称列表 results = partial_dependence( model, X=X, features=features, # 示例:[0,1,2] 或 ["age", "income"] target=range(10) # 指定10个目标类别 )
接下来用matplotlib绘图:
import matplotlib.pyplot as plt # 根据特征数量设置子图布局 n_features = len(features) fig, axes = plt.subplots(n_features, 1, figsize=(10, 5*n_features)) # 处理单特征的特殊情况,统一为列表格式 if n_features == 1: axes = [axes] # 遍历每个特征和对应的子图 for idx, (ax, feature_name) in enumerate(zip(axes, features)): # 获取当前特征的x轴网格点取值 x_vals = results["values"][idx] # 获取当前特征下所有类别的部分依赖值(形状:(10, 网格点数量)) pdp_vals = results["average"][idx] # 为每个类别绘制折线 for class_idx in range(10): ax.plot(x_vals, pdp_vals[class_idx], label=f"类别 {class_idx}") # 美化子图 ax.set_title(f"特征 {feature_name} 的部分依赖图") ax.set_xlabel(feature_name) ax.set_ylabel("部分依赖值") ax.legend(bbox_to_anchor=(1.05, 1), loc="upper left") # 图例放图外避免遮挡 ax.grid(alpha=0.3) plt.tight_layout() plt.show()
关键细节说明
results["values"]:列表类型,每个元素对应一个特征的x轴网格点取值,形状为(网格点数量,)results["average"]:列表类型,每个元素对应一个特征的部分依赖值,形状为(类别数, 网格点数量),第一个维度是类别索引,第二个维度是对应网格点的依赖值- 如果需要将所有特征的PDP放在同一张图(不推荐,易拥挤),可去掉子图循环,直接在同一个Axes上绘制所有折线,标签改为
f"特征{feature_name} - 类别{class_idx}"即可
内容的提问来源于stack exchange,提问作者amestrian
相关产品推荐
相关产品推荐

