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
相关产品推荐
相关产品推荐

