2014-09-30 74 views
0

我正在训练1200个标签2的示例和1200个具有RBF内核的标签1的示例的SVM。我以为我获得了77%的准确性,并且我使用sklearn.metrics.accuracy_score获得了准确性。但是当我手推我自己的精确分数时,像这样:Scikit学会返回不正确的分类报告和准确性分数

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的特征向量和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 

回答

5

你实现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) 
+0

嘛,是不是觉得有趣。谢谢! – Matt 2014-09-30 07:49:22

+0

不客气:) – axiom 2014-09-30 08:20:12