You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Logistic回归模型混淆矩阵第二列全为0,求排查与解决方法

分析你的Logistic回归问题:模型仅预测单一类别

从你给出的混淆矩阵 array([[1006, 0], [ 125, 0]]) 能明显看出,你的模型把所有测试样本都预测成了类别0,完全没有识别出类别1的样本。结合你的代码,我发现几个关键问题,下面逐一说明并给出解决方案:

1. 标签编码顺序错误(核心bug)

你当前的代码逻辑完全搞反了标签编码和数据集拆分的顺序:先拆分了训练/测试集,再对整个y做LabelEncoder编码,但训练模型用的是未编码的y_train,这会导致模型训练时的标签格式和后续预测逻辑不匹配!正确的流程应该是先完成标签编码,再拆分数据集。

看你代码里的这段错误逻辑:

# 先拆分数据集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, random_state=42)
# 再编码整个y
label_encoder_y = LabelEncoder()
y = label_encoder_y.fit_transform(y)

这里y_train和y_test还是原始的类别值(比如"yes"/"no"),但你后续用它来训练模型,相当于模型在学习错误的标签格式,这必然会导致预测异常。

2. 严重的类别不平衡问题

从混淆矩阵的数值来看,测试集里类别0有1006个,类别1只有125个,属于典型的类别不平衡场景。Logistic回归默认会偏向多数类——因为它的损失函数是基于整体准确率优化的,模型会倾向于预测多数类来获得更高的表面准确率,从而完全忽略少数类。

修正后的完整代码

先修正标签编码顺序,再通过设置类别权重处理不平衡问题,同时加入分层采样保持训练/测试集的类别分布一致:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder, StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix

# 导入数据集
dataset = pd.read_csv('/home/stayal0ne/Machine-learning/datasets/bank.csv', sep=';')
dataset['age'] = dataset['age'].astype(float)
dataset['balance'] = dataset['balance'].astype(float)

# 提取特征和标签
X = dataset.iloc[:, [0, 5]].values
y = dataset.iloc[:, -1].values

# 先对标签编码,再拆分数据集!
label_encoder_y = LabelEncoder()
y = label_encoder_y.fit_transform(y)

# 拆分数据集时加入stratify=y,保持训练/测试集类别分布一致
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, random_state=42, stratify=y)

# 特征缩放
scale = StandardScaler()
X_train = scale.fit_transform(X_train)
X_test = scale.transform(X_test)

# 训练模型,设置class_weight='balanced'处理类别不平衡
classifier = LogisticRegression(random_state=42, class_weight='balanced')
classifier.fit(X_train, y_train)

# 预测
y_predicted = classifier.predict(X_test)

# 生成混淆矩阵
con_matrix = confusion_matrix(y_test, y_predicted)
print(con_matrix)

额外优化建议

  • 检查特征有效性:你只用了年龄和余额两个特征,可能这两个特征与购房能力的相关性极低。可以先做相关性分析(比如计算皮尔逊相关系数),或者尝试加入更多有意义的特征(如工作状态、婚姻状况、教育程度等)。
  • 更换评估指标:对于不平衡数据集,准确率已经失去参考价值,建议使用精确率(Precision)、召回率(Recall)、F1分数或ROC-AUC来评估模型性能。
  • 尝试其他不平衡处理方法:除了设置类别权重,还可以尝试过采样少数类(如SMOTE算法)、欠采样多数类,或者使用对不平衡数据更友好的集成模型(如XGBoost、LightGBM)。

内容的提问来源于stack exchange,提问作者Elzhan Zeinulla

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:18:20