Sklearn逻辑回归在80/20平衡数据集仅预测单一类别问题求助
问题解答
1. 现象是否正常?
完全正常,原因如下:
- 默认
LogisticRegression对所有样本权重一致,而你的数据集多数类(0)占比83.5%,模型预测全0就能获得83%左右的准确率,这种情况下模型会自然偏向多数类,导致少数类(1)的召回率为0——这是不平衡数据集下的典型问题。 - 设置
class_weight='balanced'后,模型会根据类别占比自动调整权重(少数类权重=总样本数/(类别数×该类样本数)),迫使模型关注少数类。这时候模型会开始预测类别1,但不可避免会错分一部分多数类样本。由于加权F1-score是按类别样本量加权计算的,多数类的权重远高于少数类,错分多数类会大幅拉低加权F1值,所以从0.76降到0.59是合理的权衡结果。
2. 是否需要先重平衡数据集?
不一定必须,要根据你的业务目标选择方案:
- 如果核心目标是识别出违约用户(类别1),那么召回率、精确率(针对类别1)比整体加权F1更重要。此时可以选择:
- 继续使用
class_weight='balanced',但重点关注类别1的召回率、精确率、F1-score(而非加权F1) - 重采样:
- 过采样:对少数类样本进行复制或生成合成样本(比如SMOTE),注意避免过拟合
- 欠采样:随机删除多数类样本,注意不要丢失重要信息
- 继续使用
- 如果业务允许一定的漏检违约用户,但要求整体准确率高,那默认设置可能更适合,但显然你的场景应该更关注违约用户识别。
额外建议
- 评估模型时,不要只看加权F1或准确率,重点关注少数类的召回率、精确率、F1,或者使用ROC-AUC(不受类别不平衡影响)、PR-AUC(更适合不平衡数据集)
- 可以尝试调整
LogisticRegression的正则化参数C,配合class_weight='balanced',可能在少数类识别和整体性能之间找到更好的平衡 - 除了逻辑回归,也可以试试对不平衡数据更友好的模型,比如XGBoost、LightGBM,它们自带样本权重或不平衡处理参数
内容的提问来源于stack exchange,提问作者sybren
相关产品推荐
相关产品推荐

