逻辑回归的预测函数返回整个数据集的结果,而不仅仅是训练数据集
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)
此时我们可以看到trainSA
和testSA
中的行数不同。
> 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。
我可能会遇到一个问题,我的逻辑回归模型的预测函数返回的是整个数据集的预测,而不仅仅是测试数据。我的测试数据有 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)
此时我们可以看到trainSA
和testSA
中的行数不同。
> 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。