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)
你的实施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)
| 归档时间: |
|
| 查看次数: |
1289 次 |
| 最近记录: |