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

获取不同k值下kNN的confusion_matrix与classification_report报错求助

解决KNN多k值混淆矩阵与分类报告的TypeError问题

问题场景

尝试为一系列k值的KNN模型生成混淆矩阵和分类报告,编写的代码如下:

confusion_matrix = {}
classification_report = {}
neighbors = np.arange(5, 20)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,
random_state=42, stratify=y)
for neighbor in neighbors:    
    # Set up a KNN Classifier
    knn = KNeighborsClassifier(n_neighbors=neighbor)    
    # Fit the model
    knn.fit(X_train, y_train) 
     # Compute 
    y_pred= knn.predict(X_test) 
    confusion_matrix[neighbor] = confusion_matrix(y_test,y_pred)
    classification_report[neighbor] = classification_report(y_test,y_pred)

print(confusion_matrix(y_test,y_pred))
print(classification_report(y_test,y_pred))

运行后触发如下错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/var/folders/92/5m7b39tj1j5g7s50bvjdxglc0000gp/T/ipykernel_12129/985428575.py in <module>
     13      # Compute
     14     y_pred= knn.predict(X_test)
---> 15     confusion_matrix[neighbor] = confusion_matrix(y_test,y_pred)
     16     classification_report[neighbor] = classification_report(y_test,y_pred)
     17 

TypeError: 'dict' object is not callable

错误原因

你将存储结果的字典命名为confusion_matrix和classification_report,这两个名字与sklearn库中生成混淆矩阵、分类报告的同名函数完全一致。第一次执行循环时,字典会覆盖原有的函数引用,后续再尝试调用confusion_matrix(y_test,y_pred)时,实际是在调用一个字典对象,因此触发"dict不可调用"的TypeError。

修改后的代码

将存储结果的字典重命名为不冲突的名称,比如cm_dict和cr_dict,同时调整最后打印逻辑以输出所有k值的结果:

# 重命名字典,避免与sklearn函数名冲突
cm_dict = {}
cr_dict = {}
neighbors = np.arange(5, 20)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,
random_state=42, stratify=y)

for neighbor in neighbors:    
    knn = KNeighborsClassifier(n_neighbors=neighbor)    
    knn.fit(X_train, y_train) 
    y_pred = knn.predict(X_test) 
    # 调用sklearn的原函数,结果存入重命名后的字典
    cm_dict[neighbor] = confusion_matrix(y_test, y_pred)
    cr_dict[neighbor] = classification_report(y_test, y_pred)

# 遍历输出所有k值对应的结果
for k in neighbors:
    print(f"=== k={k} 的结果 ===")
    print("混淆矩阵:")
    print(cm_dict[k])
    print("分类报告:")
    print(cr_dict[k])

关键修改点

  • 避免变量名与库函数名重名:把confusion_matrix、classification_report这两个字典改成cm_dict、cr_dict,确保后续能正常调用sklearn的原函数
  • 调整输出逻辑:遍历字典打印每个k值对应的结果,而不是仅打印最后一次循环的结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 23:10:25