r - Logistic 回归的 ROC 异常
问题描述
目前,我正在学习逻辑回归和 LDA(线性判别分析)分类。我正在尝试以不同的方式生成数据以学习逻辑回归和 LDA 行为。
这是二维预测变量的数据可视化,其中类绘制为颜色:
这是我的代码:
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 曲线图
真的很让人沮丧,因为我在我的代码中找不到任何会产生这种问题的错误。谁能帮我指出我的代码中产生这种奇怪的 ROC 的任何错误,或者解释为什么 ROC 会变得像这样奇怪?
NB:请假设上面生成的数据集是训练数据,我想再次预测训练数据。
解决方案
您的代码没有错误。
你的数据集是一个典型的例子,不能用特征的线性组合来分开。因此,逻辑回归或 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))
推荐阅读
- maven - docker中的maven依赖解析和打包
- python - 如何将变量指定为 re.sub 中的第一个参数
- akka - 复合流(来自 Sink 和 Source)的目的是什么?
- openid-connect - 从第三方发起登录的用例
- javascript - 数据库更改时在 React 中重新渲染组件
- ios - 如何在 Storyboard 中设置 UI 元素的委托?
- javascript - HTML5 视频:未捕获的类型错误:无法读取未定义的属性“0”
- java - 给定 BinaryTree 创建递归方法
- wso2 - API Manager 和 Intergration Server 之间有什么区别?
- php - 如何修复PHP说框是空的