Yellowbrick是scikit-learn的诊断延伸,所有可视化必须遵循fit→score→poof/show流程;poof()仅在Jupyter中默认生效,脚本中需指定outpath;confusion_matrix要求y_train/y_test标签顺序一致;ROCAUC多模型比较须用MultiROCAUC;ResidualsPlot异常提示异方差,且visualizer须置于Pipeline中StandardScaler之后。

Yellowbrick 不是“画图附加包”,它是 scikit-learn 的诊断延伸——所有可视化都必须走 fit → score → poof(或 show)流程,跳过任一环节就只能看到空图或报错。
为什么 poof() 报 AttributeError:'NoneType' object has no attribute 'poof'
这是新手最常卡住的地方:直接调用 feature_importances(model, X, y) 这类“快速函数”时,底层其实已自动调用 poof();但若你手动实例化 Visualizer(比如 LearningCurve(model)),就必须显式调用 poof() 或 show()。更关键的是——poof() 只在 Jupyter / IPython 环境中默认生效;在普通 Python 脚本里它不显示也不保存,得加 outpath="xxx.png" 参数。
- ✅ 正确(Jupyter):
lc = LearningCurve(model); lc.fit(X, y); lc.poof() - ✅ 正确(脚本):
lc.poof(outpath="learning_curve.png", clear_figure=True) - ❌ 错误:
LearningCurve(model).fit(X, y)后没调poof或show,图形对象被丢弃
confusion_matrix 为什么训练集和测试集标签顺序总对不上
Yellowbrick 的 confusion_matrix 快速函数要求 y_train 和 y_test 必须是原始标签(非 one-hot),且两个数组的 classes_ 顺序必须一致。scikit-learn 默认按升序排类,但如果你用 LabelEncoder 手动编码过,又没传 labels=encoder.classes_,就会出现训练集显示 [0,1,2]、测试集显示 [2,0,1] 的错位。
- 保险做法:统一用
np.unique(y_train)提取类名,再传给confusion_matrix(..., labels=unique_labels) - 注意:
confusion_matrix不接受class_names参数,只认labels;传错类型(如字符串列表 vs 整数数组)会静默失败 - 若模型输出概率但未指定
decoder,二分类时可能把 0.6 当作正类预测,导致矩阵行列颠倒
用 ROCAUC 比较多个模型时,AUC 值不显示或曲线重叠
ROCAUC 默认只对单个模型画 ROC 曲线并计算 AUC;想并排比较多个模型,必须用 MultiROCAUC,且所有模型必须支持 predict_proba 或 decision_function。常见陷阱是混用 LogisticRegression(有 predict_proba)和 SVC(kernel='linear')(默认无,需设 probability=True)。
立即学习“Python免费学习笔记(深入)”;
- 必须检查:
hasattr(model, 'predict_proba') or hasattr(model, 'decision_function') - 多模型传入方式:
visualizer = ROCAUC([model1, model2], micro=False),不是分别调用两次 - 如果
y_test是多分类,micro=True才能算全局 AUC;否则默认按每个类单独画,不叠加
ResidualsPlot 显示残差严重倾斜,但线性回归 R² 很高
这说明模型在均值附近拟合得好,但误差分布非正态或存在异方差——ResidualsPlot 的 y 轴是残差,x 轴默认是预测值;若残差随预测值增大而发散(漏斗形),就是典型异方差,此时 OLS 标准误不可靠,哪怕 R²=0.95 也得换模型或加权。
- 关键参数:
residuals="standardized"可标准化残差,让异方差更易识别 - 对比看:
ResidualsPlot和PredictionErrorPlot一起用——前者看误差结构,后者看预测偏差方向 - 注意:该 visualizer 对
X做了内部 copy,若 X 含 categorical 列且未 dummy 编码,会静默跳过这些列,导致残差图基于不完整特征生成
真正容易被忽略的点是:Yellowbrick 的所有 visualizer 都继承自 scikit-learn 的 BaseEstimator 和 TransformerMixin,这意味着你能把它塞进 Pipeline,但一旦 pipeline 中有 StandardScaler,就必须确保 visualizer 放在 scaler 之后——否则看到的残差或特征重要性,全是原始量纲下的结果,完全失真。


















