我不知道如何为这个问题写出更好的标题。它的工作原理如下:我有一个填充了一些数据的CSV文件。 CSV文件如下所示:
14 tests runed: 6 passed and 8 failed with accuracy: 42.00%
Picture name ; Detected as ; Status
categ1_0.jpg ; categ8=0.875931 ; Failed
categ1_1.jpg ; categ8=0.553985 ; Failed
categ2_0.jpg ; categ2=0.994332 ; Passed
categ2_1.jpg ; categ2=0.994736 ; Passed
categ3_0.jpg ; categ3=0.97933 ; Passed
categ3_1.jpg ; categ3=0.825793 ; Failed
categ4_0.jpg ; categ4=0.63532 ; Failed
categ4_1.jpg ; categ4=0.520756 ; Failed
categ5_0.jpg ; categ5=0.999963 ; Failed
categ5_1.jpg ; categ5=0.999827 ; Failed
categ6_0.jpg ; categ6=0.99825 ; Passed
categ6_1.jpg ; categ6=0.475022 ; Failed
categ7_0.jpg ; categ7=0.9987 ; Passed
categ7_1.jpg ; categ7=0.982103 ; Passed
在此之外,我使用此python代码(代码工作)提取混淆矩阵:
import csv
import argparse
import pandas as pd
parser = argparse.ArgumentParser(description='Creating confusion matrix.')
parser.add_argument('-i', '--input', help='Input path/to/file.csv', required=True)
parser.add_argument('-ca', '--categ-path', nargs='+', help='Name of categories (do not separe by other characters)', required=True)
parser.add_argument('-oh', '--output-html', help='Output path/to/confusion_matrix.html', required=True)
args = parser.parse_args()
data = csv.reader(open(args.input, 'r'), delimiter=";", quotechar='|')
next(data)
next(data)
true_data = []
pred_data = []
for row in data:
if len(row) >= 2:
true_data.append(row[0])
pred_data.append(row[1])
true_data = [s.strip().split('_')[0] for s in true_data]
pred_data = [s.strip().split('=')[0] for s in pred_data]
y_true = pd.Series(true_data, name="Actual")
y_pred = pd.Series(pred_data, name="Predicted")
df_confusion = pd.crosstab(y_true, y_pred)
df_confusion.to_html(args.output_html)
但是,如果我更改以下行:
y_true = pd.Series(args.categ_path, name="Actual")
它不再起作用。当我这样说时,我指的是它没有显示整个Predicted类别。例如,如果工作版本中的预测类别为categ8 | categ2 | categ3 | etc
(所有来自Detected as
列的类别),则在非工作版本中,我将只有3个类别(并非所有类别)
我想要完成的是在命令行中提供真正的类别名称,而不是从CSV文件中获取它们。
答案 0 :(得分:0)
我明白了。如果有人遇到同样的问题:真实(实际)结果必须具有与预测结果相同的条目数。
一个人根本不能指望一个模型以20种不同的方式解释1张图片,具有相同的信心:)