大样本量(180 万个观测值)的逻辑回归预测器仅预测 0
Predictor in logistic regression for a large sample size (1.8 million obs.) predicts only 0's
我正在尝试 运行 逻辑回归模型来预测单笔贷款的违约概率。我有 185 万个观察的大样本量,其中约 81% 已全额还清,其余违约。我有 运行 逻辑回归与 20 多个具有统计显着性的其他预测变量并收到警告“拟合概率为 0 或 1”,并且通过逐步添加预测变量,我发现只有 1 个预测变量导致了这个问题, “年收入”(annual_inc)。我 运行 仅使用此预测变量进行逻辑回归,发现它仅预测 0(完全还清贷款),尽管有很大比例的违约贷款。我尝试了不同比例的训练和测试数据。如果我以将原始样本的 80% 分配给测试集,将 20% 分配给训练集的方式拆分模型,R 不会显示拟合概率警告,但模型仍然仅在测试集上预测 0 .下面我附上相关的小代码以防万一。我怀疑在这种情况下添加一小部分数据样本是否有任何用处,但如果我弄错了,请告诉我,我会添加它。
>set.seed(42)
>indexes <- sample(1:nrow(df), 0.8*nrow(df))
>df_test = df[indexes,]
>df_train = df[-indexes,]
>mymodel_2 <- glm(loan_status ~ annual_inc, data = df_train, family = 'binomial')
>summary(mymodel_2)
Call:
glm(formula = loan_status ~ annual_inc, family = "binomial",
data = df_train)
Deviance Residuals:
Min 1Q Median 3Q Max
-0.6902 -0.6530 -0.6340 -0.5900 5.4533
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -1.308e+00 8.290e-03 -157.83 <2e-16 ***
annual_inc -2.426e-06 9.382e-08 -25.86 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 352917 on 370976 degrees of freedom
Residual deviance: 352151 on 370975 degrees of freedom
AIC: 352155
Number of Fisher Scoring iterations: 4
>res <- predict(mymodel_2, df_test, type = "response")
>confmatrix <- table(Actual_value = df_test$loan_status, Predicted_value = res >0.5)
>confmatrix
Predicted_value
Actual_value FALSE
0 1212481
1 271426
另外,我在网上搜索问题的解决方案时,看到的往往是完美分离,但我的案例预测只有0,而且我看到的模拟案例样本量很小.到目前为止,我对实施惩罚逻辑回归犹豫不决,因为我认为我的问题不是完美分离。另外,值得指出的是,由于研究的特殊性,我想专门使用逻辑回归。我该如何解决手头的问题?
正如@deschen 所建议的,我使用了 R 的 ROSE 包中的重采样 ROSE 技术,它解决了我的问题,尽管过采样、欠采样方法以及两者的组合也有效。
我正在尝试 运行 逻辑回归模型来预测单笔贷款的违约概率。我有 185 万个观察的大样本量,其中约 81% 已全额还清,其余违约。我有 运行 逻辑回归与 20 多个具有统计显着性的其他预测变量并收到警告“拟合概率为 0 或 1”,并且通过逐步添加预测变量,我发现只有 1 个预测变量导致了这个问题, “年收入”(annual_inc)。我 运行 仅使用此预测变量进行逻辑回归,发现它仅预测 0(完全还清贷款),尽管有很大比例的违约贷款。我尝试了不同比例的训练和测试数据。如果我以将原始样本的 80% 分配给测试集,将 20% 分配给训练集的方式拆分模型,R 不会显示拟合概率警告,但模型仍然仅在测试集上预测 0 .下面我附上相关的小代码以防万一。我怀疑在这种情况下添加一小部分数据样本是否有任何用处,但如果我弄错了,请告诉我,我会添加它。
>set.seed(42)
>indexes <- sample(1:nrow(df), 0.8*nrow(df))
>df_test = df[indexes,]
>df_train = df[-indexes,]
>mymodel_2 <- glm(loan_status ~ annual_inc, data = df_train, family = 'binomial')
>summary(mymodel_2)
Call:
glm(formula = loan_status ~ annual_inc, family = "binomial",
data = df_train)
Deviance Residuals:
Min 1Q Median 3Q Max
-0.6902 -0.6530 -0.6340 -0.5900 5.4533
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -1.308e+00 8.290e-03 -157.83 <2e-16 ***
annual_inc -2.426e-06 9.382e-08 -25.86 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 352917 on 370976 degrees of freedom
Residual deviance: 352151 on 370975 degrees of freedom
AIC: 352155
Number of Fisher Scoring iterations: 4
>res <- predict(mymodel_2, df_test, type = "response")
>confmatrix <- table(Actual_value = df_test$loan_status, Predicted_value = res >0.5)
>confmatrix
Predicted_value
Actual_value FALSE
0 1212481
1 271426
另外,我在网上搜索问题的解决方案时,看到的往往是完美分离,但我的案例预测只有0,而且我看到的模拟案例样本量很小.到目前为止,我对实施惩罚逻辑回归犹豫不决,因为我认为我的问题不是完美分离。另外,值得指出的是,由于研究的特殊性,我想专门使用逻辑回归。我该如何解决手头的问题?
正如@deschen 所建议的,我使用了 R 的 ROSE 包中的重采样 ROSE 技术,它解决了我的问题,尽管过采样、欠采样方法以及两者的组合也有效。