Scikit-Learn逻辑回归OvR策略下如何访问对应二分类器实例
问题解答
关于是否生成n_classes个二分类器的问题
是的,在多分类场景下使用solver='liblinear'参数的Logistic Regression默认采用OvR策略时,确实会生成与类别数量n_classes相等的二分类器,每个分类器负责区分「目标类别」和「其他所有类别」的二分类任务。
二分类器的访问方法
分两种场景对应不同的访问方式:
场景1:直接使用原生LogisticRegression类训练
scikit-learn的原生实现为了提升运行效率,没有单独存储独立的二分类器实例,所有子分类器的参数都被堆叠存储在模型的公共属性中:
coef_:形状为(n_classes, n_features),第i行对应第i个类别对应的二分类器的特征权重intercept_:形状为(n_classes,),第i个值对应第i个类别对应的二分类器的偏置项
你可以直接提取对应行的参数手动实现子分类器的预测逻辑,示例代码如下:
from sklearn.linear_model import LogisticRegression from sklearn.datasets import load_iris import numpy as np # 加载示例数据训练模型 X, y = load_iris(return_X_y=True) clf = LogisticRegression(solver='liblinear', multi_class='ovr').fit(X, y) # 提取第0个类别的二分类器参数 cls0_coef = clf.coef_[0] cls0_intercept = clf.intercept_[0] # 手动实现该二分类器的预测 def predict_cls0(X): logit = X @ cls0_coef + cls0_intercept prob = 1 / (1 + np.exp(-logit)) return (prob >= 0.5).astype(int)
场景2:需要获取可直接调用的子分类器实例
如果需要直接拿到独立的二分类器对象,可以显式用OneVsRestClassifier包装LogisticRegression,该类会单独存储所有子分类器,可通过estimators_属性直接访问:
from sklearn.multiclass import OneVsRestClassifier from sklearn.linear_model import LogisticRegression from sklearn.datasets import load_iris X, y = load_iris(return_X_y=True) # 显式构造OvR多分类器 clf_wrap = OneVsRestClassifier(LogisticRegression(solver='liblinear')).fit(X, y) # 获取所有二分类器列表,长度等于类别数量 binary_clfs = clf_wrap.estimators_ # 直接调用第0个二分类器做预测 cls0_pred = binary_clfs[0].predict(X)
补充说明
你在官方文档中没有找到相关访问说明,是因为原生LogisticRegression的OvR实现没有设计单独的子分类器实例暴露入口,仅在显式使用OneVsRestClassifier包装时才有可访问的子分类器列表。
内容的提问来源于stack exchange,提问作者Darren Christopher
相关产品推荐
相关产品推荐

