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

Mat*_*att 0 python scikit-learn

我正在使用RBF内核训练1200个标签2和1200个标签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)
Run Code Online (Sandbox Code Playgroud)

它得到了50%.我相信基于错误的准确度分数和分类报告,我浪费了数周的工作.任何人都能向我提供解释为什么会发生这种情况的原因吗?关于如何发生这种情况,我非常非常困惑.我不明白我做错了什么.当我在一些虚拟数据上测试metrics.accuracy_score函数时pred = [1, 1, 2, 2]; test = [1, 2, 1, 2],它给了我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
Run Code Online (Sandbox Code Playgroud)

axi*_*iom 6

你的实施naive_score是错误的.您正在将第一个元素与所有其他元素进行比较(i从未更新过).

如果不是你设计的测试用例,我会留下评论,这会阻止你自己归零.

尝试运行代码:

pred = list([1, 2, 2, 2]); 
test = list([1, 1, 1, 1])
Run Code Online (Sandbox Code Playgroud)

返回的准确性将是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)
Run Code Online (Sandbox Code Playgroud)