Python分类混淆矩阵指标计算代码无输出问题排查
代码中的错误分析及修正方案
核心错误点
- 函数代码块未缩进:Python是缩进敏感语言,
def err_metric(CM):声明后,所有属于函数内部的代码必须缩进(通常用4个空格)。当前代码完全没有缩进,会直接触发语法错误,导致代码无法正常解析执行。 iloc方法使用逻辑完全错误:iloc是pandas DataFrame的位置索引方法,用于按行/列位置提取数据,但你把TP/FP/FN/TN的数值存在列表A中,试图用CM.iloc[A[0]]提取第100行,这和获取混淆矩阵指标的需求完全不符;同时你未定义CM的类型(是DataFrame还是普通数组),直接调用iloc会触发属性错误。- 未调用定义好的函数:代码仅定义了
err_metric函数,但从未执行err_metric(...)调用语句,就算函数逻辑正确,也不会触发内部的计算和打印操作,自然没有输出。 - 冗余导入
numpy:代码开头导入了numpy但全程未使用,属于无效代码。 - 混淆矩阵指标提取逻辑错误:你混淆了“混淆矩阵的索引位置”和“指标数值”,正确逻辑应该是直接传入TP/FP/FN/TN数值,或传入标准2x2混淆矩阵后提取对应位置的数值。
修正后的代码示例
方案1:直接传入TP/FP/FN/TN数值
def err_metric(TP, FP, FN, TN): # 添加除零判断,避免运行时错误 precision = TP / (TP + FP) if (TP + FP) != 0 else 0 recall = TP / (TP + FN) if (TP + FN) != 0 else 0 specificity = TN / (TN + FP) if (TN + FP) != 0 else 0 false_negative_rate = FN / (FN + TP) if (FN + TP) != 0 else 0 false_positive_rate = FP / (FP + TN) if (FP + TN) != 0 else 0 accuracy = (TP + TN) / (TP + TN + FP + FN) if (TP + TN + FP + FN) != 0 else 0 spatial_accuracy = TP / (TP + FN + FP) if (TP + FN + FP) != 0 else 0 f_measure = 2 * ((precision * recall) / (precision + recall)) if (precision + recall) != 0 else 0 print("Precision : ", precision) print("Recall: ", recall) print("Specificity : ", specificity) print("False negative rate: ", false_negative_rate) print("False positive rate: ", false_positive_rate) print("Accuracy: ", accuracy) print("Spatial accuracy: ", spatial_accuracy) print("F-measure: ", f_measure) # 调用函数,传入已知数值 err_metric(TP=100, FP=900, FN=0, TN=0)
方案2:传入标准2x2混淆矩阵
def err_metric(confusion_matrix): # 从2x2矩阵中提取指标:格式为[[TN, FP], [FN, TP]] TN, FP = confusion_matrix[0] FN, TP = confusion_matrix[1] # 带除零判断的指标计算 precision = TP / (TP + FP) if (TP + FP) != 0 else 0 recall = TP / (TP + FN) if (TP + FN) != 0 else 0 specificity = TN / (TN + FP) if (TN + FP) != 0 else 0 false_negative_rate = FN / (FN + TP) if (FN + TP) != 0 else 0 false_positive_rate = FP / (FP + TN) if (FP + TN) != 0 else 0 accuracy = (TP + TN) / (TP + TN + FP + FN) if (TP + TN + FP + FN) != 0 else 0 spatial_accuracy = TP / (TP + FN + FP) if (TP + FN + FP) != 0 else 0 f_measure = 2 * ((precision * recall) / (precision + recall)) if (precision + recall) != 0 else 0 print("Precision : ", precision) print("Recall: ", recall) print("Specificity : ", specificity) print("False negative rate: ", false_negative_rate) print("False positive rate: ", false_positive_rate) print("Accuracy: ", accuracy) print("Spatial accuracy: ", spatial_accuracy) print("F-measure: ", f_measure) # 定义混淆矩阵 cm = [[0, 900], [0, 100]] err_metric(cm)
内容的提问来源于stack exchange,提问作者Arvuz10
相关产品推荐
相关产品推荐

