我在标签2的1200个示例和1200个带有RBF内核的标签1示例上训练SVM。我以为我的准确率达到了77%,而且我使用sklearn.metrics.accuracy_score
获得了准确性。但是当我手动推出自己的精确分数时,就像这样:
def naive_accuracy(true, pred):
number_correct = 0
i = 0
for y in true:
if pred[i] == y:
number_correct += 1.0
return number_correct / len(true)
它得到了50%。我相信基于错误的准确度分数和分类报告,我浪费了数周的工作。任何人都能向我提供解释为什么会发生这种情况的原因吗?关于如何发生这种情况,我非常非常困惑。我不知道自己做错了什么。当我在pred = [1, 1, 2, 2];
test = [1, 2, 1, 2]
等虚拟数据上测试metrics.accuracy_score函数时,它给了我50%的预期。我认为,鉴于我的具体数据不一致,accuracy_score可能会犯错。
我有27个特征向量和1200个向量的1类和1200个向量的类2.我的代码如下:
X = scale(np.asarray(X))
y = np.asarray(y)
X_train, X_test, y_train, y_test = train_test_split(X, y)
######## SVM ########
clf = svm.SVC()
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
# 77%
print "SVM Accuracy:", accuracy_score(y_test, y_pred) # debugging
# 50%
print "*True* SVM Accuracy:", naive_accuracy(y_test, y_pred) # in-house debugging
# also 77%!
print "Classification report:\n", classification_report(y_test, y_pred) # debugging
答案 0 :(得分:6)
您naive_score
的实施是错误的。您正在将第一个元素与所有其他元素进行比较(i
永远不会更新)。
如果没有针对您设计的测试用例,我会留下评论,这会阻止您自己将错误归结为错误。
尝试使用以下代码运行代码:
pred = list([1, 2, 2, 2]);
test = list([1, 1, 1, 1])
返回的准确度为1.0
!
另外值得注意的是,如果类是均匀分布的,那么错误代码返回的预期准确度可以在任何随机测试集上显示为50%
。
拥有包含多个测试用例的测试套件也是一个好主意。在非平凡的情况下,单个测试用例很少能够测试所有可能的场景。
虽然不是真的需要,但你应该做的就是:
def naive_accuracy(true, pred):
number_correct = 0
i = 0
for i, y in enumerate(true):
if pred[i] == y:
number_correct += 1.0
return number_correct / len(true)