使用自定义评分器依赖于训练特征的Scikit-learn分类器

我正在尝试使用一个自定义评分器来训练一个RandomForestClassifier,这个评分器的输出需要依赖于其中一个特征。

X数据集包含18个特征:X dataset

y是常规的0和1的数组:y_true

带有自定义评分器的RandomForestClassifier在GridSearchCV实例中使用:GridSearchCV(classifier, param_grid=[…], scoring=custom_scorer)

自定义评分器是通过Scikit-learn的make_scorer函数定义的:custom_scorer = make_scorer(custom_scorer_function, greater_is_better=True)

如果自定义评分函数仅依赖于y_truey_pred,这个框架非常简单。然而,在我的情况下,我需要定义一个评分器,它使用X数据集中包含的18个特征之一,即根据y_predy_true的值,自定义评分将是它们和该特征的组合。

我的问题是,如何将特征传递给custom_scorer_function,因为它的标准签名只接受y_truey_pred

我知道它接受额外的**kwargs,但以这种方式传递整个特征数组并不能解决问题,因为这个函数是为每一对y_truey_pred值调用的(需要提取与它们对应的单个特征值才能使其工作,我不确定是否可以做到这一点)。

我尝试通过在y_true数组中打包该特征,并在custom_scorer_function中解包它来增强y_true数组(第一列是实际标签,第二列是我需要计算自定义评分的特征值):y_true_augmented

然而,这样做违反了分类器需要一个一维标签数组的要求,并触发了以下错误。

ValueError: Unknown label type: ‘continuous-multioutput’

任何帮助都将不胜感激。

谢谢你。


回答:

你可以像这样做(请注意你没有提供任何实际代码,所以这只是一个基本框架)

X = [...]y = [...]def custom_scorer_function(y, y_pred, **kwargs):   a_feature = X[:,1]   # 现在你有了y, y_pred 和你想要的特征custom_scorer = make_scorer(custom_scorer_function, greater_is_better=True)...

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注