ROC логистической регрессии идет ненормально - PullRequest
0 голосов
/ 06 октября 2018

В настоящее время я изучаю логистическую регрессию и классификацию LDA (линейный дискриминантный анализ).Я пытаюсь генерировать данные по-разному, чтобы изучить логистическую регрессию и поведение LDA.

Вот визуализация данных двумерных предикторов с классом, нанесенным на график цветом: This is the link to see the visualization
Вот мой код:

library(ggplot2)
library(MASS)

set.seed(1)

a <- mvrnorm(n = 1000, mu = c(0,0), Sigma = matrix(c(0.4,0,0,0.4), nrow = 2, ncol = 2))
b <- mvrnorm(n = 1000, mu = c(0,0), Sigma = matrix(c(10,0,0,10), nrow = 2, ncol =2 ))

#I want to make sure b1 separated from a
b1 <- b[sqrt(b[,1]^2 + b[,2]^2) > 4,]

df <- as.data.frame(rbind(a,b1))
names(df) <- c('x','y')
labelA <- rep('A', nrow(a))
labelB <- rep('B', nrow(b1))
#Put the label column to the data frame
df$labs <- c(labelA,labelB)
ggplot(df, aes(x = x, y = y, col = labs)) + geom_point()

prd <- glm(as.factor(labs) ~ x + y, family = binomial('probit'), data = df)
prd_score <- predict(prd, type = 'response')
plot(roc(df$labs,prd_score))
auc(roc(df$labs,prd_score))

И это график кривой roc Weird ROC here

Это действительно расстраивает, потому что я не смог найти ошибку в своем коде, которая порождает такие проблемы.Может ли кто-нибудь помочь мне указать на ошибку в моем коде, которая порождает этот странный вид ROC, или на любое объяснение, почему ROC может стать таким странным?

Примечание: пожалуйста, предположите, что сгенерированные данные, указанные выше, являются данными обучения, и я хочу снова предсказать данные обучения.

1 Ответ

0 голосов
/ 07 октября 2018

В вашем коде нет ошибки.

Ваш набор данных является типичным примером, который нельзя разделить линейной комбинацией функций.Поэтому метод линейной классификации, такой как логистическая регрессия или LDA, здесь вам не поможет.Вот почему ваша кривая ROC выглядит «странно», но это абсолютно нормально и говорит вам только о том, что ваша модель не может разделить данные.

Вам необходимо изучить методы нелинейной классификации.Учитывая радиальное распределение данных, я могу себе представить, что машины опорных векторов (SVM) с ядром на радиальной основе могли бы добиться цели.

require(e1071)

# We need a numeric label for SVM regression
labelA <- rep(0, nrow(a))
labelB <- rep(1, nrow(b1))
df$labsNum <- c(labelA,labelB)

# We create a radial basis model
svm_prd <- svm(labsNum ~ x + y, data = df, kernel = "radial", type = "eps-regression")
svm_score <- predict(svm_prd)
plot(roc(df$labs,prd_score))
auc(roc(df$labs,prd_score))
...