Scikit-Learn中是否存在带非负权重约束的线性分类器?
符合要求的分类器及使用方案
现有符合所有要求的分类器
你需要的分类器是存在的,Scikit-Learn 官方自带的线性分类器已经支持非负权重约束,满足所有你列的条件:
- 完全兼容 Scikit-Learn API,属于官方内置实现
- 属于线性模型范畴
- 为分类器
- 支持非负权重约束
首选方案:LogisticRegression
Scikit-Learn 0.24 及以上版本的LogisticRegression新增了positive参数,将该参数设置为True即可强制模型所有特征系数为非负。
- 支持二分类、多分类场景
- 兼容 L1、L2、弹性网正则配置
- 注意事项:开启
positive=True时,仅支持lbfgs、newton-cg、newton-cholesky三类求解器,默认的lbfgs求解器可直接适配无需额外配置。
示例代码:
from sklearn.linear_model import LogisticRegression from sklearn.datasets import make_classification # 生成测试分类数据 X, y = make_classification(n_samples=1000, n_features=10, random_state=42) # 初始化带非负权重约束的逻辑回归 clf = LogisticRegression(positive=True, random_state=42) clf.fit(X, y) # 输出的系数矩阵所有元素均为非负 print(clf.coef_)
次选方案:SGDClassifier
如果你的数据集规模较大,优先选择SGDClassifier,它同样支持positive参数,通过设置不同损失函数可实现不同类型的线性分类器:
- 设置
loss="log_loss"时为带非负约束的逻辑回归 - 设置
loss="hinge"时为带非负约束的线性支持向量机分类器
示例代码:
from sklearn.linear_model import SGDClassifier clf = SGDClassifier(loss="log_loss", positive=True, random_state=42) clf.fit(X, y)
低版本 Scikit-Learn 替代方案
如果你使用的Scikit-Learn版本低于0.24,没有内置positive参数,可使用以下兼容方案:
- 先正常拟合线性分类器,将所有小于0的系数手动置为0,再固定系数重新拟合截距项,保证模型输出符合约束
- 自定义Scikit-Learn兼容分类器,继承
BaseEstimator和ClassifierMixin,在损失函数中加入权重非负约束,使用scipy.optimize.minimize求解
内容的提问来源于stack exchange,提问作者Pengin
相关产品推荐
相关产品推荐

