Apache spark 不应该';SVM二值分类器是否能从训练集中理解阈值?

Apache spark 不应该';SVM二值分类器是否能从训练集中理解阈值?,apache-spark,classification,svm,libsvm,Apache Spark,Classification,Svm,Libsvm,我对SVM分类器非常困惑,如果我听起来很愚蠢,我很抱歉。 我正在使用Spark library for java,这是线性支持向量机段落中的第一个示例。在此培训集中: 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或负值上给出负值。我读到,如果预测为正双精度,则标准阈值为“正”,如果预测为负,则标准阈值为“负”,并且我看到有一种

我对SVM分类器非常困惑,如果我听起来很愚蠢,我很抱歉。 我正在使用Spark library for java,这是线性支持向量机段落中的第一个示例。在此培训集中:

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]
因此,我认为支持向量机分类器可以自己理解阈值;如何对spark库执行相同的操作

解决:我解决了问题,将示例更改为:

SVMWithSGD std = new SVMWithSGD();
std.setIntercept(true);
final SVMModel model = std.run(training.rdd());
由此:

final SVMModel model = SVMWithSGD.train(training.rdd(), numIterations);

“截距”的标准值为假,这正是我需要为真的。

如果您搜索概率校准,您将发现一些相关问题的研究(重新校准输出以返回更好的分数)

如果您的问题是二元分类问题,您可以通过将值指定给真/假正/负选项乘以类别比率来计算成本的斜率。然后,您可以使用给定的AUC曲线形成一条直线,该曲线仅在一个点相交,以找到某种意义上作为问题阈值的最佳点


阈值是一个区分类的值

如果您搜索概率校准,您将发现一些相关问题的研究(重新校准输出以返回更好的分数)

如果您的问题是二元分类问题,您可以通过将值指定给真/假正/负选项乘以类别比率来计算成本的斜率。然后,您可以使用给定的AUC曲线形成一条直线,该曲线仅在一个点相交,以找到某种意义上作为问题阈值的最佳点


阈值是一个区分类的值

您的数据是线性可分离的,每个SVM实现对训练集的分类应100%正确。没有重量的情况下,分离度应精确到5.5。问题一定出在您的实现中。您的数据是线性可分离的,每个SVM实现对训练集的分类应100%正确。没有重量的情况下,分离度应精确到5.5。问题一定出在您的实现中。