为啥我的模型的准确性会根据它是从泡菜加载还是新训练的而改变?
Posted
技术标签:
【中文标题】为啥我的模型的准确性会根据它是从泡菜加载还是新训练的而改变?【英文标题】:Why does my model's accuracy change depending on whether it is loaded from a pickle or newly trained?为什么我的模型的准确性会根据它是从泡菜加载还是新训练的而改变? 【发布时间】: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”。我尝试在不保存的情况下运行训练并得到相同的结果。
【参考方案1】:
我发现在clf.train
函数中,我使用我的特征工程更改了training
数组,因为该数组是通过引用传入的。这就是为什么该模型在训练后立即在评估中表现不佳的原因,因为它是基于工程特征的有效工程特征。在评估之前重新加载训练数据解决了这个问题。
【讨论】:
以上是关于为啥我的模型的准确性会根据它是从泡菜加载还是新训练的而改变?的主要内容,如果未能解决你的问题,请参考以下文章