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

运行plot_2d_classification代码遇NameError,求解决建议

解决plot_2d_classification未定义的问题

我正在学习在线教材《Applied Machine Learning in Python》的Supervised Learning章节,运行章节末尾的以下代码时:

fig, axes = plt.subplots(2, 2, figsize=(8, 8))
for ax, n_neighbors in zip(axes.ravel(), [3, 5, 11, 33]):
    ax.set_title(f"n_neighbors={n_neighbors}")
    clf = KNeighborsClassifier(n_neighbors=n_neighbors).fit(X_train[['mean compactness', 'worst concave points']], y_train)
    ax.scatter(X_train['mean compactness'], X_train['worst concave points'], c=y_train, cmap='bwr', s=2)
    plot_2d_classification(clf, np.array(X_train[['mean compactness', 'worst concave points']]), ax=ax, alpha=.4, cmap='bwr')
    ax.set_aspect("equal")
    ax.set_xlim(0.05, 0.17)
    ax.set_ylim(0.06, 0.2)

Jupyter Notebook返回以下错误:

NameError                                 Traceback (most recent call last)
Input In [24], in <cell line: 2>()
4 clf = KNeighborsClassifier(n_neighbors=n_neighbors).fit(X_train[['mean compactness', 'worst concave points']], y_train)
5 ax.scatter(X_train['mean compactness'], X_train['worst concave points'], c=y_train, cmap='bwr', s=2)
6 plot_2d_classification(clf, np.array(X_train[['mean compactness', 'worst concave points']]), ax=ax, alpha=.4, cmap='bwr')
7 ax.set_aspect("equal")
8 ax.set_xlim(0.05, 0.17)

NameError: name 'plot_2d_classification' is not defined

该代码本应生成4幅分类图。我已搜索plot_2d_classification但未获得有效信息,找到A. Mueller的plot_2d_separator.py和plot_helpers.py文件,复制相关代码后仍出现其他错误,无法成功运行,恳请提供解决建议。


解决方法

plot_2d_classification是该课程自定义的辅助函数,不属于通用Python库,可通过以下两种方式解决:

方法1:手动实现plot_2d_classification函数

在原代码前添加以下函数定义,该函数会生成分类器的决策边界并填充区域:

import numpy as np
import matplotlib.pyplot as plt

def plot_2d_classification(clf, X, ax=None, alpha=0.4, cmap='bwr'):
    if ax is None:
        ax = plt.gca()
    # 创建覆盖数据范围的网格
    x_min, x_max = X[:, 0].min() - 0.1, X[:, 0].max() + 0.1
    y_min, y_max = X[:, 1].min() - 0.1, X[:, 1].max() + 0.1
    xx, yy = np.meshgrid(np.linspace(x_min, x_max, 100),
                         np.linspace(y_min, y_max, 100))
    # 预测网格点的分类结果
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    # 填充决策区域
    ax.contourf(xx, yy, Z, alpha=alpha, cmap=cmap)
    return ax

方法2:使用sklearn官方替代函数(sklearn 1.0+版本适用)

如果你的scikit-learn版本在1.0及以上,可直接用官方的DecisionBoundaryDisplay替代原代码中的plot_2d_classification调用:

  1. 先导入模块:
from sklearn.inspection import DecisionBoundaryDisplay
  1. 替换原代码中第6行:
DecisionBoundaryDisplay.from_estimator(
    clf,
    X_train[['mean compactness', 'worst concave points']],
    ax=ax,
    alpha=0.4,
    cmap='bwr'
)

额外检查项

  • 确保已导入所有必要库:import matplotlib.pyplot as plt、from sklearn.neighbors import KNeighborsClassifier、import numpy as np
  • 若之前复制第三方辅助代码出错,大概率是依赖的其他自定义函数缺失,手动实现核心功能更可靠

内容的提问来源于stack exchange,提问作者Dynamic1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 10:51:10