我有一个与评估逻辑回归模型的预测有关的问题。我对此很陌生,所以请多多包涵。首先,我将展示我对 LDA 所做的工作,因为我希望在完成逻辑回归后获得类似的“错误分类率”。
install.packages("ElemStatLearn")
library(ElemStatLearn)
# training data
train = vowel.train
# but we only need to preform everything on the first two classes
train.new = train[1:3]
# test data
test = vowel.test
test.new = test[1:3]
# normalizing the training data (0 mean and sd 1)
my_scale <- function(x) sweep(sweep(x, 2, colMeans(x)), 2, apply(x, 2, sd),
'/')
train.scaled = my_scale(train.new[,2:3])
train.scaled = cbind(y = train.new[,1], train.scaled)
test.scaled = my_scale(test[,2:11])
test.scaled = cbind(y = test[,1], test.scaled)
# LDA
library(MASS)
train.lda = lda(y~ ., data = train.scaled)
train.lda.values <- predict(train.lda, newdata=train.scaled)
train.lda.rate <- mean(train.lda.values$class != train.scaled[,1])
train.lda.rate
test.lda.values <- predict(train.lda, newdata=test.scaled)
test.lda.rate <- mean(test.lda.values$class != test.scaled[,1])
test.lda.rate
这给出了 train.lda.rate = 0.5265152 和 test.lda.rate = 0.461039。
现在基本上我希望能够从逻辑回归中提取相同类型的错误分类率,但我知道在我的逻辑回归模型上使用 predict() 后,没有 $class 选项。所以我想知道如何找到预测的类,以便我可以查看它们是否等于原始类,从而像我上面那样获得分类率。
这是我的逻辑回归代码:
train.scaled$y <- as.factor(train.scaled$y)
logit <- glm(y ~ ., data = train.scaled, family = "binomial")
pred.train.logit <- predict(logit, newdata=train.scaled, type = "response",
se = TRUE)
编辑
实施评论中提供的解决方案后,我执行了以下操作:
compare.train = data.frame(Actual=train.scaled$y,
Predicted_probability=predict(logit, type="response"),
Predicted = ifelse(predict(logit, type="response") > 0.5, 1, 0))
pred.train.logit.error <- mean(compare.train$Predicted != train$y)
pred.train.logit.error
这给了我 0.9715909 的错误分类错误。这似乎有点高,让我觉得我在某个地方出错了。任何建议,将不胜感激!
另一个编辑
我已经按照评论中的建议进行了处理,并使用了多项逻辑回归,因此我可以处理 11 个类。
library("nnet")
multi.logit.train <- multinom(y ~ ., data = train.new)
summary(multi.logit.train)
head(fitted(multi.logit.train))
predicted.train = predict(multi.logit.train, data=train.new, type="probs")
head(predicted.train)
我离这里很近,因为 head(predicted.train) 看起来像正确的结构,我只是得到原子向量错误 - 我想我需要将类 (1-11) 更改为因子类型,但我不是积极的。
> str(predicted.train)
> num [1:528, 1:11] 6.06e-01 4.13e-01 8.41e-03 1.71e-05 1.80e-05 ...
> - attr(*, "dimnames")=List of 2
> ..$ : chr [1:528] "1" "2" "3" "4" ...
> ..$ : chr [1:11] "1" "2" "3" "4" ...