scikit-learn的logisticregression默认支持多元分类:标签≥3类时自动启用ovr;设multi_class="multinomial"则用softmax,需匹配支持的solver(如"lbfgs"、"sag"等),且class_weight="balanced"在multinomial模式下失效,须手动指定各类权重。

逻辑回归在scikit-learn里默认就能做多元分类
scikit-learn 的 LogisticRegression 不是只能二分类——只要标签有 ≥3 个取值,它自动启用 OvR(One-vs-Rest)策略;设 multi_class="multinomial" 则用 softmax(需配合 solver="lbfgs"、"newton-cg" 或 "sag")。别手动写 OvR 循环,这是内置行为。
必须注意 solver 和 multi_class 的组合限制
选错求解器会导致报错或静默降级。比如:multi_class="multinomial" 时,solver="liblinear" 会直接抛 ValueError: Solver liblinear does not support a multinomial backend.;而 solver="saga" 支持 L1 正则 + multinomial,但 solver="lbfgs" 不支持 L1。
-
solver="liblinear":仅支持 OvR,不支持multi_class="multinomial" -
solver="lbfgs"/"newton-cg"/"sag":支持multi_class="multinomial",但仅限 L2 或无正则 -
solver="saga":唯一支持multi_class="multinomial"+penalty="l1"的组合
预测输出是概率矩阵,不是单个标签
调用 predict_proba() 返回 shape 为 (n_samples, n_classes) 的数组,每行和为 1;predict() 才返回类别标签。常见误操作是把 predict_proba() 结果当硬分类用,或对多类结果错误地套用二分类阈值(如 >0.5)。
示例:
clf = LogisticRegression(multi_class="multinomial", solver="lbfgs") clf.fit(X_train, y_train) proba = clf.predict_proba(X_test) # shape: (100, 3) —— 3 类 y_pred = clf.predict(X_test) # shape: (100,) —— 标签索引
类别不平衡时 class_weight 不能直接填 "balanced"
填 class_weight="balanced" 对 OvR 模式有效,但对 multi_class="multinomial" 会失效(scikit-learn 1.2+ 已明确警告),此时权重被忽略。真要处理不平衡,得手动构造字典传给 class_weight,且该字典需覆盖所有类(包括未在训练集出现的类,否则报错)。
- OvR 模式下:
class_weight="balanced"自动按类频次反比缩放 - multinomial 模式下:必须显式写成
{0: 1.0, 1: 2.5, 2: 3.0}这种形式 - 用
compute_class_weight时,确保classes=np.unique(y_train),否则漏类
实际跑通的关键,往往卡在 solver 和 multi_class 的隐式绑定,以及 multinomial 下 class_weight 的“静默失效”——这两个点不手动验证,模型可能看起来训完了,但效果远低于预期。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











