【问题标题】:Scikit-learn returning incorrect classification report and accuracy scoreScikit-learn 返回不正确的分类报告和准确度分数
【发布时间】:2014-11-24 17:15:52
【问题描述】:

我正在使用 RBF 内核在标签 2 的 1200 个示例和标签 1 的 1200 个示例上训练 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

【问题讨论】:

    标签: python scikit-learn


    【解决方案1】:

    您对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)
    

    【讨论】:

    • 嗯,这不是很有趣。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-04-14
    • 2017-02-07
    • 2018-09-29
    • 2020-02-14
    • 2012-12-23
    • 2017-05-18
    • 2019-06-06
    • 2019-10-30
    相关资源
    最近更新 更多