SVM二元分类器不应该理解训练集中的阈值吗?
Posted
技术标签:
【中文标题】SVM二元分类器不应该理解训练集中的阈值吗?【英文标题】:Shouldn't a SVM binary classifier understand the threshold from the training set? 【发布时间】:2016-07-24 04:39:00 【问题描述】:我对 SVM 分类器感到非常困惑,如果我听起来很愚蠢,我很抱歉。 我正在使用用于 java http://spark.apache.org/docs/latest/mllib-linear-methods.html 的 Spark 库,这是线性支持向量机段落中的第一个示例。在这个训练集上:
1 1:10
1 1:9
1 1:9
1 1:9
0 1:1
1 1:8
1 1:8
0 1:2
0 1:2
0 1:3
对值的预测:8、2 和 1 都是正数 (1)。给定训练集,我希望它们是积极的、消极的、消极的。它仅对 0 或负值给出负值。我读到,如果预测为正双精度,则标准阈值为“正”,如果为负,则为“负”,并且我已经看到有一种手动设置阈值的方法。但这不是我需要二进制分类器的确切原因吗?我的意思是,如果我事先知道阈值是多少,我就可以区分正值和负值,那么为什么还要训练分类器呢?
更新: 使用来自不同库的此 python 代码:
X = [[10], [9],[9],[9],[1],[8],[8],[2],[2],[3]]
y = [1,1,1,1,0,1,1,0,0,0]
from sklearn.svm import SVC
from sklearn.cross_validation import StratifiedKFold
from sklearn.metrics import precision_recall_fscore_support, accuracy_score
import numpy as np
# we convert our list of lists in numpy arrays
X = np.array(X)
y = np.array(y)
# we compute the general accuracy of the system - we need more "false questions" to continue the study
accuracy = []
#we do 10 fold cross-validation - to be sure to test all possible combination of training and test
kf_total = StratifiedKFold(y, n_folds=5, shuffle=True)
for train, test in kf_total:
X_train, X_test = X[train], X[test]
y_train, y_test = y[train], y[test]
print X_train
clf = SVC().fit(X_train, y_train)
y_pred = clf.predict(X_test)
print "the classifier says: ", y_pred
print "reality is: ", y_test
print accuracy_score(y_test, y_pred)
print ""
accuracy.append(accuracy_score(y_test, y_pred))
print sum(accuracy)/len(accuracy)
结果正确:
######
1 [0]
######
2 [0]
######
8 [1]
所以我认为 SVM 分类器可以自己理解阈值;如何使用 spark 库做同样的事情?
已解决:我解决了将示例更改为此的问题:
SVMWithSGD std = new SVMWithSGD();
std.setIntercept(true);
final SVMModel model = std.run(training.rdd());
从这里:
final SVMModel model = SVMWithSGD.train(training.rdd(), numIterations);
“拦截”的标准值是假的,这是我需要的。
【问题讨论】:
你的数据是线性可分的,训练集应该被每个 SVM 实现分类 100% 正确。没有重量,分离应该正好在 5.5。问题一定出在您的实施中。 【参考方案1】:如果您搜索概率校准,您会发现一些关于相关问题的研究(重新校准输出以返回更好的分数)。
如果您的问题是二元分类问题,您可以通过将值分配给真/假正/负选项乘以类别比率来计算成本斜率。然后,您可以与给定的 AUC 曲线形成一条仅在一个点相交的线,以找到一个在某种意义上最佳的点作为您的问题的阈值。
阈值是区分类别的一个值。
【讨论】:
以上是关于SVM二元分类器不应该理解训练集中的阈值吗?的主要内容,如果未能解决你的问题,请参考以下文章