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

scikit-learn RFE用statsmodels NegativeBinomial作估计器报fit缺参错误

问题成因

触发报错的核心原因是自定义估计器完全不符合scikit-learn的接口规范,具体问题包括:

  • fit方法签名不符合要求:scikit-learn所有估计器的fit方法必须接收X(特征矩阵)、y(标签)两个位置参数,你定义的fit(self, **kwargs)没有声明这两个入参,RFE内部调用fit传入特征和标签时,就会直接触发「缺少X、y参数」的报错。
  • __init__方法逻辑错误:一方面参数名写错,传入的参数是formula_,内部调用时用的是formula,会直接触发NameError;另一方面scikit-learn要求__init__方法仅能做超参数赋值,不能直接实例化模型,否则RFE、交叉验证这类需要克隆估计器的逻辑会完全失效。
  • 依赖缺失:代码中用到了np、pd但没有导入numpy、pandas,运行时会触发模块不存在的错误。
  • 模型拟合逻辑错误:调用self.model.fit()会返回新的拟合结果对象,你没有把这个结果赋值回实例属性,后续取系数、调用预测方法时,操作的还是未拟合的原始模型对象,会直接报错。
  • 接口适配逻辑错误:你用了固定的patsy公式初始化模型,但RFE迭代筛选特征时会传入列数动态变化的特征数组,固定公式根本无法匹配动态变化的特征输入,就算解决了参数报错也跑不通。
  • RFE调用方式错误:你调用selector.fit()时没有传入必须的X、y参数,就算估计器写对了这步也会报错。

修正方案

放弃固定公式的写法,严格按照scikit-learn估计器约定重写自定义类,适配数组输入逻辑:

  • __init__仅声明需要的超参数,不做实际模型初始化
  • fit方法接收X、y入参,内部动态组装特征、拟合模型,保存拟合结果并生成RFE必须的coef_属性(注意排除截距项的系数,保证系数长度和输入特征数一致)
  • predict方法基于已拟合的模型输出预测结果
  • 调用RFE的fit方法时正确传入特征矩阵和标签

修正后的可运行代码如下:

import numpy as np
import pandas as pd
from sklearn.datasets import make_friedman1
from sklearn.feature_selection import RFE
from sklearn.base import BaseEstimator
import statsmodels.api as sm

class MyNegBinomEstimator(BaseEstimator):
    def __init__(self, alpha=1.0):
        self.alpha = alpha

    def fit(self, X, y):
        # 为特征添加截距项
        X_with_const = sm.add_constant(X)
        # 拟合负二项回归模型
        self.model_ = sm.GLM(
            y,
            X_with_const,
            family=sm.families.NegativeBinomial(alpha=self.alpha)
        ).fit()
        # 仅保留特征对应的系数,排除截距项
        self.coef_ = self.model_.params[1:]
        return self

    def predict(self, X):
        X_with_const = sm.add_constant(X)
        return self.model_.predict(X_with_const)

# 生成测试数据
X, y = make_friedman1(n_samples=50, n_features=10, random_state=0)
# 初始化估计器与RFE选择器
estimator = MyNegBinomEstimator()
selector = RFE(estimator, n_features_to_select=5, step=1)
# 传入特征与标签完成拟合
selector.fit(X, y)

# 输出特征筛选结果
print("特征选中掩码:", selector.support_)
print("特征排名:", selector.ranking_)

如果需要自动优化负二项分布的alpha参数,可以在fit方法内先调用负二项模型拟合得到最优alpha值,再传入GLM初始化即可,整体逻辑不需要调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 05:54:16