我试图让分类器尽可能简约.为此,我使用交叉验证来迭代删除功能.

在我的模型中,精度是最重要的指标.然而,我还想看看随着模型中输入的功能越来越少,其他指标如何发展.

我特别想判断模特的召回率和F1成绩.

rfe = RFECV(
    estimator=clf,  # An XGBClassifier instance
    step=1,
    min_features_to_select=1,
    cv=cv,  # A StratifiedKFold instance
    scoring='precision',
    # scoring=['f1', 'precision', 'recall'],  # throws error
    verbose=1,
    n_jobs=1
)

我删除了将指标列表传递给scoring参数的行,因为它抛出了InvalidParameterError(也就是说,它不高兴我传递给它一个列表).

有没有方法将多个指标传递给RFECV实例?

推荐答案

RFECV仅根据功能的重要性逐个删除功能.理论上,每个使用k < K个特征的模型都可以通过多个指标进行评分.然而,一旦测试了所有可能数量的特征,RFECV就会 Select 具有最大mean_test_score的模型,这意味着它依赖于一个数字来 Select 最佳数量的特征.

RFECV如何工作,简短版本:

RFE根据"feature_importance"删除功能.然而,您仍然需要 Select k个参数-要使用的功能数量.您可以通过在测试数据集上判断所有可能的k个值的评分函数来实现这一点.然后 Select 在测试数据集上提供最佳性能的k个.这就是你最后k个功能结束的方式.然而,为了使此过程更加可靠,您可以在CV-fold上重复此过程多次.然后所有折叠的测试数据集的平均分数.

RFECV如何工作,长版本:

  1. 首先,它使用提供的CV拆分来拆分数据,从而返回每个折叠的对(X_train、X_Test).
  2. 对于每对(X_train,X_Test),它应用RFE(显然对于每个cv对RFE结果可能不同).因此,在每个步骤的每个cv对上,如果匹配给定X_train,RFE根据feature_importance Select k个最佳特征.然后,在所选特征的每个步骤中,它使用评分器判断X_test上的模型,并返回所选k个特征的分数.
  3. 现在,对于每个cv折叠(X_train,X_Test)和每个k值,您都会在测试折叠上获得一个分数.该分数在所有cv折叠中获得平均值.所以您最终得到了对:(k_features,cv_Test_score)
  4. 现在,对于RFE Select 的每k个特征,我们都有一个平均单分值.对这些分数进行排序并用于 Select 分数最高的k个.你得到best-k
  5. 最后,我们再次运行RFE,但这次是在整个X数据集上运行RFE,目标是返回恰好best-k个特征.

总而言之,RFECV需要一个数字来决定哪个k值最好.因此,它不能使用多个评分功能,除非它们通过自定义评分器以某种方式组合在一起.

回答您的问题:如果您想获得3个单独的评分函数输出,则需要单独对rfe输出进行评分.

还要注意的是,由于f1已经是precisionrecall的混合体,因此可能值得用scoring='f1'运行RFECV.

Python相关问答推荐

零填充2D数组上的Numpy切片

如何使用关键参数按列对Pandas rame进行排序

替换字符串中的点/逗号,以便可以将其转换为浮动

查找下一个值=实际值加上使用极点的50%

如何使用Python中的clinicalTrials.gov API获取完整结果?

如何使用矩阵在sklearn中同时对每个列执行matthews_corrcoef?

在Pandas框架中截短至固定数量的列

用gekko解决的ADE方程系统突然不再工作,错误消息异常:@错误:模型文件未找到.& &

Class_weight参数不影响RandomForestClassifier不平衡数据集中的结果

Polars比较了两个预设-有没有方法在第一次不匹配时立即失败

将整组数组拆分为最小值与最大值之和的子数组

可变参数数量的重载类型(args或kwargs)

修复mypy错误-赋值中的类型不兼容(表达式具有类型xxx,变量具有类型yyy)

如何请求使用Python将文件下载到带有登录名的门户网站?

Pandas—合并数据帧,在公共列上保留非空值,在另一列上保留平均值

pyscript中的压痕问题

如何将一个动态分配的C数组转换为Numpy数组,并在C扩展模块中返回给Python

如何让这个星型模式在Python中只使用一个for循环?

多处理队列在与Forking http.server一起使用时随机跳过项目

什么是合并两个embrame的最佳方法,其中一个有日期范围,另一个有日期没有任何共享列?