2014-09-30 67 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