决策边界可视化需先构造二维网格并确保数据尺度一致:用np.meshgrid生成xx、yy,经scaler.transform处理后输入模型;predict()得离散标签用于contourf填充,decision_function()得距离值用于contour画线;多分类用OvO或predict+reshape填充,注意坐标范围与colormap匹配。

决策边界可视化本身不难,但多数人卡在数据准备和坐标网格构造上——尤其是当特征维度 > 2 或模型不支持 decision_function 时。
用 meshgrid 构造二维坐标平面
Scikit-learn 模型(如 SVC、LogisticRegression)只能对“点”做预测,无法直接画出边界线。必须人工构造一个密集的二维网格,逐点预测再绘图。
- 只适用于前两个特征(
X[:, 0]和X[:, 1]),高维模型需先降维或固定其他特征为中位数 - 网格步长太大会漏掉细边界,太小则拖慢速度;建议
np.linspace(start, stop, 200)起步 - 务必用
np.c_[xx.ravel(), yy.ravel()]展平坐标,否则model.predict()会报错ValueError: X has 1 features, but SVC is expecting 2 features
区分 predict() 和 decision_function() 的使用场景
不是所有模型都提供 decision_function():它返回“到超平面的距离”,能画等高线;而 predict() 只返回离散类别,只能画填充色块。
-
SVC(kernel='linear')、SVC(kernel='rbf')、LogisticRegression支持decision_function() -
RandomForestClassifier、KNeighborsClassifier不支持,只能用predict()+ 填充色块 - 用
plt.contour(xx, yy, Z.reshape(xx.shape), levels=[0], colors='k')画线边界时,Z 必须来自decision_function,不能是predict
处理多分类问题的边界重叠
二分类边界是单条线,但三类及以上时,decision_function 返回的是 (n_samples, n_classes) 数组,不能直接用于 contour。
立即学习“Python免费学习笔记(深入)”;
- 方法一:对每一对类别训练 OvO 分类器,分别画边界(适合理解模型逻辑)
- 方法二:用
predict()得到每个网格点的预测标签,再用plt.contourf(xx, yy, Z.reshape(xx.shape), alpha=0.3)填充区域(最常用) - 注意:
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])返回的是 1D array,必须.reshape(xx.shape)才能匹配网格形状,否则绘图错位
避免常见的 Matplotlib 颜色与坐标错位问题
边界图看着“歪了”或颜色混杂,大概率是坐标轴范围、数据缩放或 colormap 选择不当。
- 确保
plt.xlim(xx.min(), xx.max())和plt.ylim(yy.min(), yy.max())与网格一致,别用原始数据的min()/max()直接套用 - 如果用了
StandardScaler训练模型,网格点也必须用同一 scaler.transform() 处理,否则边界位置完全错误 - 多分类推荐用
cmap='viridis'或cmap='tab10',避免用jet(易误导数值大小关系)
真正麻烦的从来不是调用 plt.contour,而是保证输入给模型的网格点和原始训练数据处于同一尺度、同一特征子空间——这点在 pipeline 中嵌套 scaler 或 PCA 时最容易被忽略。


















