Scikit-learn返回错误的分类报告和准确度分数

时间:2014-09-30 07:03:24

标签: python scikit-learn

我在标签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

1 个答案:

答案 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)