如何在同一张图中绘制自定义与SKlearn逻辑回归的决策边界
解决多分类逻辑回归自定义模型与SKlearn模型决策边界同图绘制问题
问题根源
你之前的SKlearn代码存在两个核心问题:
- 手动计算直线时误用了
clf.intercept_[0],应该对应每个类别的clf.intercept_[i] - 直接通过系数推导直线的方式,和自定义模型基于概率输出生成边界的逻辑不一致,导致边界匹配度差
正确解决方案
和自定义模型的绘图逻辑对齐,用网格数据预测SKlearn模型的类别概率,再通过contour绘制0.5概率阈值的边界线,就能实现两个模型边界的准确同图对比。
完整代码示例
假设你已训练好自定义模型ol、权重ws,SKlearn模型clf,以及特征数据X、标签y:
import numpy as np import matplotlib.pyplot as plt # 统一坐标轴范围(和自定义模型保持一致) x1_min, x1_max = X[:,0].min()-.5, X[:,0].max()+.5 x2_min, x2_max = X[:,1].min()-.5, X[:,1].max()+.5 # 生成网格数据 xx1, xx2 = np.meshgrid(np.linspace(x1_min, x1_max, 100), np.linspace(x2_min, x2_max, 100)) grid = np.c_[xx1.ravel(), xx2.ravel()] # ---------------------- 绘制自定义模型决策边界 ---------------------- for i in range(len(ws)): probs = ol.predict_prob(grid, ws[i]).reshape(xx1.shape) # 绿色实线表示自定义模型边界 plt.contour(xx1, xx2, probs, [0.5], linewidths=1, colors='green', label=f'Custom Class {i+1}') # ---------------------- 绘制SKlearn模型决策边界 ---------------------- # 获取SKlearn模型对网格的概率预测(OVR多分类下每个类别对应一组概率) sk_probs = clf.predict_proba(grid) for i in range(sk_probs.shape[1]): prob = sk_probs[:, i].reshape(xx1.shape) # 黑色虚线表示SKlearn模型边界 plt.contour(xx1, xx2, prob, [0.5], linewidths=1, colors='black', linestyles='--', label=f'SKlearn Class {i+1}') # 绘制原始数据点(可选,辅助观察) plt.scatter(X[:,0], X[:,1], c=y, edgecolors='white', cmap=plt.cm.Paired) plt.xlabel('Feature 1') plt.ylabel('Feature 2') plt.legend() plt.show()
关键说明
- 用
predict_proba获取SKlearn模型的概率输出,和自定义模型的predict_prob逻辑完全对齐,确保边界基于相同的0.5概率阈值生成 - 通过不同颜色、线型区分两个模型的边界,对比更清晰
- 网格采样点数(示例中为100)可按需调整,点数越多边界越平滑
关于DecisionBoundaryDisplay的替代方案
如果偏好使用DecisionBoundaryDisplay,可关闭背景填充后提取边界线绘制:
from sklearn.inspection import DecisionBoundaryDisplay # 绘制单个类别的概率边界 disp = DecisionBoundaryDisplay.from_estimator( clf, grid, response_method="predict_proba", class_of_interest=0, alpha=0.0, # 关闭背景填充 levels=[0.5], linestyles="--", colors="black" ) disp.ax_.contour(xx1, xx2, disp.decision_function.reshape(xx1.shape), [0.5], linewidths=1)
内容的提问来源于stack exchange,提问作者RedYoel
相关产品推荐
相关产品推荐

