You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在同一张图中绘制自定义与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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 11:20:29