繁体   English   中英

Scikit学习返回错误的分类报告和准确性得分

[英]Scikit-learn returning incorrect classification report and accuracy score

我正在使用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)

它得到了50%。 我相信我由于虚假的准确性得分和分类报告而浪费了数周的工作。 谁能为我提供原因解释? 对于这是怎么发生的,我感到非常困惑。 我看不到我在做什么错。 当我在某些虚拟数据(例如pred = [1, 1, 2, 2]; 1,1,2,2])上测试metrics.accuracy_score函数时pred = [1, 1, 2, 2]; test = [1, 2, 1, 2] ,它给了我50%的期望。 我以为我的特定数据可能会导致precision_score错误。

我有27个特征向量和1类的1200个向量以及2类的1200个向量。我的代码如下:

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

您对naive_score实现存在错误。 您正在将第一个元素与所有其他元素进行比较( i从未更新过)。

如果不是针对您设计的测试用例,我只会发表评论,这将使您无法自行发现bug。

尝试使用以下代码运行代码:

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM