【发布时间】:2019-06-10 20:18:39
【问题描述】:
我正在创建 Viola-Jones 算法的自定义实现。当我训练分类器并评估其准确性时,它准确地分类了 1000 个示例中的 462 个。但是,当我从 pickle 文件加载相同的模型并在同一数据集上测试其准确性时,它的准确性突然变为 999(满分 1000)。
我尝试改变算法的超参数,但训练后的准确率始终为 462/1000,即数据集中负样本的数量。我相信这意味着clf.classify(x) 总是返回 0,但我不明白为什么当我从 pickle 文件加载模型时不再是这种情况。
training = training[0:1000] #An array of tuples, first element in each tuple is a numpy array, the second is its classification
try:
clf = ViolaJones.load("viola_jones") #Loads classifier from pickle
print("Loaded classifier from file")
except Exception as e:
print("Failed to load classifier from file: %s" % str(e))
pos_num, neg_num = 0, 0
for x, y in training:
if y == 1:
pos_num += 1
else:
neg_num += 1
clf = ViolaJones(feature_num=2)
clf.train(training, pos_num, neg_num)
clf.save("viola_jones") #Saves classifier to pickle
correct = 0
for x, y in training:
prediction = clf.classify(x)
correct += prediction == y
print("Correctly labeled %d out of %d training examples" % (correct, len(training)))
我运行一次文件来训练模型、评估模型并将其保存到文件中(为了简单起见,我将训练集用于训练和评估,尽管我知道这是不好的做法)。再次运行文件时,它将改为从文件中加载模型并对其进行评估。提前致谢。
【问题讨论】:
-
可能是两者之一:
1. when you trained/fitted your model, did you set the parameter 'seed' to a fixed value?- 如果不是,每次您预测同一个数据集时,都会设置一个新的随机种子,并且预测将是完全随机的。2. are you sure that the columns from both loaded files are in the same order?- 训练模型时最重要的是列的顺序,而不是列名。所以在预测的时候,列的顺序需要一致。 -
我在算法中没有使用任何种子参数。每次运行时,数据集都是从同一个文件中加载的,因此我从不更改训练示例的顺序或训练数据的列。
-
您是否验证了在训练后分类器确实为每个输入预测了“0”?
-
另外,尝试运行训练而不是保存它。也许腌制它的过程会搞砸?
-
我检查了一下,分类器确实为每个输入预测了“0”。我尝试在不保存的情况下运行训练并得到相同的结果。
标签: python machine-learning pickle