Разве двоичный классификатор SVM не должен понимать порог из обучающего набора?

Я очень озадачен классификаторами SVM, и мне жаль, если я буду звучать глупо. Я использую библиотеку Spark для Java http://spark.apache.org/docs/latest/mllib-linear-methods.html, первый пример из абзаца линейных опорных векторных машин. На этом тренировочном наборе:

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 может сам понять порог; Как я могу сделать то же самое с библиотекой искры?

РЕШЕНО: Я решил проблему, изменив пример так:

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

Из этого:

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

Стандартное значение для "перехвата" является ложным, и это то, что мне нужно, чтобы быть правдой.

1 ответ

Если вы ищете калибровку вероятности, вы найдете некоторые исследования по этому вопросу (перекалибровка результатов, чтобы получить лучшие результаты).

Если ваша проблема - проблема бинарной классификации, вы можете рассчитать наклон стоимости, назначив вейлсы для истинных / ложных положительных / отрицательных опций, умноженных на соотношение классов. Затем вы можете сформировать линию с заданной кривой AUC, которая пересекается только в одной точке, чтобы найти точку, которая в некотором смысле является оптимальной в качестве порога для вашей задачи.

Порог - это одно значение, которое будет дифференцировать классы.

Другие вопросы по тегам