Кривая ROC для дискретных классификаторов, таких как SVM: почему мы до сих пор называем это «кривой»? Разве это не просто «точка»?

25

В обсуждении: как создать кривую roc для бинарной классификации , я думаю, что путаница заключалась в том, что «двоичный классификатор» (который является любым классификатором, разделяющим 2 класса) был для Янга так называемым «дискретным классификатором» (который производит дискретные выходы 0/1 (например, SVM), а не непрерывные выходы, такие как ANN или байесовские классификаторы ... и т. д. Итак, обсуждение было о том, как строится ROC для "двоичных непрерывных классификаторов", и ответ заключается в том, что выходные данные сортируются по их оценкам, поскольку выходные данные являются непрерывными, и пороговое значение используется для получения каждой точки на кривой ROC.

Мой вопрос касается «двоичных дискретных классификаторов», таких как SVM, выходные значения равны 0 или 1. Таким образом, ROC выдает только одну точку, а не кривую. Я не понимаю, почему мы до сих пор называем это кривой? !! Можем ли мы еще поговорить о порогах? Как можно использовать пороги в SVM в частности? Как можно вычислить AUC? Играет ли здесь перекрестная проверка?

Абдельхак Махмуди
источник
10
SVM выводит реальное значение решения, а именно расстояние со знаком до разделяющей гиперплоскости в пространстве признаков. При классификации метка присваивается на основании знака значения этого решения. Таким образом, SVM выдают больше, чем просто двоичное значение, их вывод просто преобразуется в двоичную форму как этап последующей обработки в классификации.
Марк Клазен

Ответы:

15
  • Да, существуют ситуации, когда обычная рабочая кривая приемника не может быть получена и существует только одна точка.

  • SVM можно настроить так, чтобы они выводили вероятности членства в классе. Это будет обычное значение, для которого будет изменяться пороговое значение для получения кривой работы приемника .
    Это то, что вы ищете?

  • Шаги в ROC обычно выполняются с небольшим числом тестовых случаев, а не с каким-либо влиянием на дискретное изменение ковариаты (в частности, вы получаете те же самые точки, если выбираете свои дискретные пороги так, чтобы для каждой новой точки изменялся только один образец) его назначение).

  • Непрерывное изменение других (гипер) параметров модели, конечно, создает наборы пар специфичности / чувствительности, которые дают другие кривые в системе координат FPR; TPR.
    Интерпретация кривой, конечно, зависит от того, какое изменение породило эту кривую.

Вот обычный ROC (то есть запрос вероятностей в качестве выходных данных) для класса "versicolor" набора данных радужной оболочки:

  • FPR; TPR (γ = 1, C = 1, порог вероятности):
    РПЦ

Система координат того же типа, но TPR и FPR как функция параметров настройки γ и C:

  • FPR; TPR (γ, C = 1, порог вероятности = 0,5):
    гамма

  • FPR; TPR (γ = 1, C, порог вероятности = 0,5):
    Стоимость

Эти сюжеты действительно имеют значение, но значение определенно отличается от значения обычного ROC!

Вот код R, который я использовал:

svmperf <- function (cost = 1, gamma = 1) {
    model <- svm (Species ~ ., data = iris, probability=TRUE, 
                  cost = cost, gamma = gamma)
    pred <- predict (model, iris, probability=TRUE, decision.values=TRUE)
    prob.versicolor <- attr (pred, "probabilities")[, "versicolor"]

    roc.pred <- prediction (prob.versicolor, iris$Species == "versicolor")
    perf <- performance (roc.pred, "tpr", "fpr")

    data.frame (fpr = perf@x.values [[1]], tpr = perf@y.values [[1]], 
                threshold = perf@alpha.values [[1]], 
                cost = cost, gamma = gamma)
}

df <- data.frame ()
for (cost in -10:10)
  df <- rbind (df, svmperf (cost = 2^cost))
head (df)
plot (df$fpr, df$tpr)

cost.df <- split (df, df$cost)

cost.df <- sapply (cost.df, function (x) {
    i <- approx (x$threshold, seq (nrow (x)), 0.5, method="constant")$y 
    x [i,]
})

cost.df <- as.data.frame (t (cost.df))
plot (cost.df$fpr, cost.df$tpr, type = "l", xlim = 0:1, ylim = 0:1)
points (cost.df$fpr, cost.df$tpr, pch = 20, 
        col = rev(rainbow(nrow (cost.df),start=0, end=4/6)))

df <- data.frame ()
for (gamma in -10:10)
  df <- rbind (df, svmperf (gamma = 2^gamma))
head (df)
plot (df$fpr, df$tpr)

gamma.df <- split (df, df$gamma)

gamma.df <- sapply (gamma.df, function (x) {
     i <- approx (x$threshold, seq (nrow (x)), 0.5, method="constant")$y
     x [i,]
})

gamma.df <- as.data.frame (t (gamma.df))
plot (gamma.df$fpr, gamma.df$tpr, type = "l", xlim = 0:1, ylim = 0:1, lty = 2)
points (gamma.df$fpr, gamma.df$tpr, pch = 20, 
        col = rev(rainbow(nrow (gamma.df),start=0, end=4/6)))

roc.df <- subset (df, cost == 1 & gamma == 1)
plot (roc.df$fpr, roc.df$tpr, type = "l", xlim = 0:1, ylim = 0:1)
points (roc.df$fpr, roc.df$tpr, pch = 20, 
        col = rev(rainbow(nrow (roc.df),start=0, end=4/6)))
cbeleites поддерживает Монику
источник
1
Это очень ясно, спасибо. У меня была идея, что изменение b похоже на перемещение гиперплоскости и, следовательно, на разные (TPR, FPR)! но с классификатором SVM смещение b изучено, так что это, кажется, лучший параметр? нет ?, если это так, нет необходимости выполнять анализ ROC ?, нет?
Абдельхак Махмуди
@AbdelhakMahmoudi: Полагаю, что параметры, полученные с помощью модели, не то, что вы хотите изменить. Но поскольку у вас может быть вывод вероятности (я не копался в коде, поэтому я не знаю, действительно ли SVM вероятности эквивалентны «сложным»), почему бы не использовать его? Это очень распространенный результат, из которого генерируется РПЦ. Функция svm в R - это интерфейс к широко используемому libsvm, поэтому вы не можете использовать R для этого.
cbeleites поддерживает Монику
these plots do have a meaning- в чем смысл этих сюжетов?
Гульзар
8

Y^Y^знак равноподписать(весTИкс+б)весб

Y^знак равно{0если  весTИкс+б<01иначе

ηη

Y^знак равно{0если  весTИкс+б<η1иначе

η

весбη

>>> from sklearn.svm import SVC
>>> model = SVC(kernel='linear', C=0.001, probability=False, class_weight='balanced')
>>> model.fit(X, y)
>>> # The coefficients w are given by
>>> w = list(model.coef_)
>>> # The intercept b is given by
>>> b = model.intercept_[0]
>>> y_hat = X.apply(lambda s: np.sum(np.array(s)*np.array(w))+b, axis=1)
>>> y_hat = (y_hat > eta).astype(float)
Раймон Кван
источник
3

Кривая ROC отображает специфичность в зависимости от чувствительности, которая изменяется в зависимости от порога ковариации (которая может быть непрерывной или дискретной). Я думаю, что вы путаете ковариату с ответом и, возможно, не до конца понимаете, что такое кривая ROC. Это конечно кривая, если ковариата непрерывна, и мы смотрим на порог для ковариаты, постоянно меняющейся. Если ковариата является дискретной, вы все равно можете построить график как функцию непрерывного порога. Тогда кривая будет плоской с шагами вверх (или вниз) на порогах, которые соответствуют дискретным значениям ковариаты. Так что это относится к SVM и любым другим дискретным классификаторам.

Что касается AUC, так как у нас все еще есть ROC (оценочный), мы все еще можем вычислить площадь под ним. Я не уверен, почему вы имели в виду вопрос о перекрестной проверке. В контексте задач классификации перекрестная проверка используется для получения объективных или почти непредвзятых оценок коэффициентов ошибок для классификатора. Таким образом, это может войти в то, как мы оцениваем точки на РПЦ.

Майкл Р. Черник
источник
1
Хорошо, какие могут быть пороги для классификатора SVM?
Абдельхак Махмуди
Я не знаю. Какие ковариаты? Если у вас есть один ковариат, любое значение может быть порогом. Если у вас есть более одного ковариата, производительность классификатора зависит от выбора нескольких значений, а не от одного порога, но он все еще изменяется в пространстве ковариат.
Майкл Р. Черник
Например, линейные SVM основаны на разделяющей гиперплоскости, которая зависит от выбранного значения C (низкий C допускает больше ошибок обучения), может ли набор значений C быть набором порогов?
Абдельхак Махмуди
Да и не являются ли значения C просто линейными комбинациями ковариат?
Майкл Р. Черник
2
C - это штрафной коэффициент, введенный для контроля компромисса между сложностью гиперплоскости и ошибками обучения. Другой альтернативой может быть использование смещения b в качестве порогового значения, поскольку b - это расстояние от центра пространства признаков до разделяющей гиперплоскости. Таким образом, изменение b похоже на перемещение гиперплоскости и, следовательно, на разные TP и FP! Это мое понимание!
Абдельхак Махмуди