逻辑回归的预测函数返回整个数据集的结果,而不仅仅是训练数据集

Predict function for logistic regression returning results for entire dataset not just training dataset

我可能会遇到一个问题,我的逻辑回归模型的预测函数返回的是整个数据集的预测,而不仅仅是测试数据。我的测试数据有 6,931 行。这是我的模型:

test_model <- glm(status2~grade +  verified  + term + income + revolRatio +totalAcc + totalRevLim + accOpen24 ,data=Loan_test,family="binomial")

这是我的预测函数:

probabilities <- predict(test_model,newdata=Loan_test, type="response") 

感谢任何对我做错的帮助。

好的,这是我使用我的训练数据集将其更改为约 27000 行的内容:

test_model <- glm(status2~grade +  verified  + term + income + revolRatio +totalAcc + totalRevLim + accOpen24 ,data=Loan_training,family="binomial")

probabilities <- predict(test_model,newdata=Loan_test, type="response")

但概率仍然包含 34000 多行。

为了针对保留数据集进行预测,应将初始数据拆分为训练数据帧和测试数据帧。由于 OP 评论指出有单独的训练和测试数据框,我们将简单地使用训练数据框来构建模型,并对测试数据框进行预测。

# use training data for model
test_model <- glm(status2~grade +  verified  + term + income + revolRatio +totalAcc + totalRevLim + accOpen24 ,
                  data=Loan_training,family="binomial")

#make predictions using hold out data (test)
probabilities <- predict(test_model,newdata=Loan_test, type="response")

一个完整的例子:二项式回归预测

这是一个完整的工作示例,使用 ElemStatLearn 包中的南非心脏病数据,显示当我们将数据框拆分为测试和训练时,使用 glm() 和拟合二项式模型使用测试和训练数据帧进行预测,预测的数量等于 predict() 中使用的数据帧的大小。

library(ElemStatLearn)
data(SAheart)
set.seed(801248)
train = sample(1:dim(SAheart)[1],size=dim(SAheart)[1]*.6,replace=F)
trainSA = SAheart[train,]
nrow(trainSA)
testSA = SAheart[-train,]
nrow(testSA)

此时我们可以看到trainSAtestSA中的行数不同。

> nrow(trainSA)
[1] 277
> testSA = SAheart[-train,]
> nrow(testSA)
[1] 185
> 

接下来,我们用 glm() 拟合一个二项一般线性模型。

modFit <- glm(chd ~ age + alcohol + obesity + tobacco + typea + ldl,
            data=trainSA,
            family="binomial")

当我们对测试和训练数据帧进行预测时,我们注意到输出向量的长度与原始数据帧中的行数相匹配。

predicted_test <- predict(modFit,testSA)
length(predicted_test)
predicted_train <- predict(modFit,trainSA)
length(predicted_train)

...和输出:

> length(predicted_test)
[1] 185
> predicted_train <- predict(modFit,trainSA)
> length(predicted_train)
[1] 277

最后,我们通过计算每个数据帧的误分类率来证明 predict() 结果的差异。

missClass = function(values,prediction){sum(((prediction > 0.5)*1) != values)/length(values)}
# Classification errors on TrainSA
missClass(trainSA$chd,predicted_train)
# Classification Errors on TestSA
missClass(testSA$chd,predicted_test)

...和输出:

> missClass(trainSA$chd,predicted_train)
[1] 0.2924188
> # Classification Errors on TestSA
> missClass(testSA$chd,predicted_test)
[1] 0.2594595
> 

结论: 原始 post 中的代码在输入 predict() 时引用了原始数据框,但我们看不到它因为它不包括 minimal reproducible example