获取不同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
相关产品推荐
相关产品推荐

