【问题标题】:Predict function for logistic regression returning results for entire dataset not just training dataset预测函数用于逻辑回归返回整个数据集的结果,而不仅仅是训练数据集
【发布时间】:2020-07-17 23:42:33
【问题描述】:

我可能遇到一个问题,即我的逻辑回归模型的预测函数返回整个数据集的预测,而不仅仅是测试数据。我的测试数据中有 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+ 行。

【问题讨论】:

  • 您在看似您的测试数据的基础上构建了模型。这是你的意思吗?
  • 是的,我打算这样做。
  • reproducible example 会有所帮助。否则,不清楚您期望模型使用的其他数据是什么,因为您已经构建了模型,现在正尝试基于标记为测试集的同一数据集进行预测
  • 这是怎么回事-这是我使用训练数据集构建的原始模式:
  • 这是怎么回事 - 这是我使用训练数据集构建的原始模式:Loantrain_Four &lt;- glm(status2~grade + verified + term + income + revolRatio +totalAcc + totalRevLim + accOpen24 ,data=Loan_training,family="binomial")

标签: r glm predict


【解决方案1】:

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

# 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")

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

这是一个使用来自ElemStatLearnpackage 的南非心脏病数据的完整工作示例,它显示了当我们将数据框拆分为测试和训练时,使用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
> 

结论:当输入predict()时,原始帖子中的代码不知何故引用了原始数据框,但我们看不到它,因为它不包含minimal reproducible example

【讨论】:

  • 好的,我已经使用我的训练数据集完成了这项工作,其中有大约 27000 行,就像这样。test_model &lt;- glm(status2~grade + verified + term + income + revolRatio +totalAcc + totalRevLim + accOpen24 ,data=Loan_training,family="binomial") probabilities &lt;- predict(test_model,newdata=Loan_test, type="response") 但我仍然返回 34000+ 个概率值
  • 我的测试数据框中有 6931 行。
  • @JimRyan - 我无法重现您的问题。 predict() 在测试数据框上按预期工作,请参阅我更新的答案。另外,请发布您的代码的最小可重现示例,否则我们将无法更明确地为您提供帮助。
  • 谢谢。我想到了。我的概率 ios 的长度应该是 6931。但是当我显示概率时,它显示的是整个数据集的概率。
猜你喜欢
  • 2015-01-07
  • 2019-03-02
  • 2016-01-31
  • 2020-02-25
  • 1970-01-01
  • 2015-04-10
  • 2019-10-21
  • 2018-11-07
  • 2019-02-14
相关资源
最近更新 更多