为什么我的逻辑回归预测全 0?

数据挖掘 逻辑回归
2021-09-29 18:08:15

我在 scikit-learn 中建立了一个逻辑回归,我所有的预测值都是 0,不可能是这样。它必须至少具有一定的预测能力。

我试图预测哪些航班可能会延误。在我的探索性数据分析中,我发现一些起源比其他起源造成更多问题,一些航空公司也往往比其他航空公司晚。因此,我使用始发地和报告航空公司作为我的自变量和迟到(是或否)作为我的因变量。我尝试了 Python 和 R 并且都产生了相同的结果。

数据:

由于我不能包含数据文件,我会尽力解释数据。数据只有三列: Reporting_Airline(有 HJ、AK、CF 等条目) Origin(也有 HYS、JSI、SHS 等数据。它们是机场名称。目的地也像有三个字母的 YSU ,HSU,JSA等。还有第四列,它是'late',是0或1。有159k个条目。我已经将Char类型的因变量转换为Python中的虚拟变量和因子在 R。

代码:

这是我在 R 中的代码:

Rdata2$Reporting_Airline <- as.factor(Rdata2$Reporting_Airline)
Rdata2$Dest <- as.factor(Rdata2$Dest)
Rdata2$late <- as.factor(Rdata2$late)
Rdata2$Origin <- as.factor(Rdata2$Origin

logistic <- glm(late ~ Origin+ Reporting_Airline, data=Rdata2, 
                family="binomial")

res2 = predict(logistic,Rdata2, type = "response")
res2

这是显示模型执行情况的混淆矩阵:

实际值 预测值
错误的 真的
0 139191 8
1 30576 11

Python代码:

log_reg = LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
                   intercept_scaling=1, l1_ratio=None, max_iter=4000,
                   multi_class='auto', n_jobs=None, penalty='l2',
                   random_state=10, solver='lbfgs', tol=0.0001, verbose=0,
                   warm_start=False)

import numpy as np

log_reg

    data4 = data3[['Origin', 'Dest', 'Reporting_Airline','late']]
    dummies = pd.get_dummies(data4)
dummies.head

    X_train, X_test, y_train, y_test = train_test_split(dummies.drop('late', axis=1),dummies.late,test_size=0.1)
    log_reg.fit(X_train, y_train)
    log_reg.predict(y_train)
y_pred = log_reg.predict(y_train)

它使一切都归零...

1个回答

由于数据中的大量不平衡,预测始终为 0。

正类仅代表数据的 0.01%。在这种情况下,要让模型“冒险”将某些实例预测为正面,它需要一些非常强大的指标。本质上,模型需要 99.99% 的把握将实例预测为正例,因为如果置信度更低,则模型会产生比找到真例实例更多的 False Positive 错误。由于它从未达到正面实例的置信水平,因此它将每个实例预测为负面。您可以查看当前实验中的概率分布:概率都非常低。

如果你真的想看到一些预测为正的实例,你可以:

  • 对负类进行欠采样和/或对正类进行过采样。这将迫使模型预测更多的正面实例,因为错误的风险相对较低。
  • 更改预测类别的阈值:默认是选择概率最高的类别,即只有当阳性概率高于 0.5 时才预测为阳性。如果您将阈值设置为非常小的值p相反,获得更高概率的实例p将被预测为阳性。

自然,这两个选项都会在测试集上导致更多的 False Positive 错误,当然这必须遵循真实的分布。