Scikit-learn分类器与自定义记分员依赖于训练功能

时间:2018-03-13 01:20:34

标签: python machine-learning scikit-learn classification grid-search

我正在尝试训练一个带有自定义得分手的RandomForestClassifier,其输出需要依赖于其中一个功能。

X 数据集包含18个功能: X dataset

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

在GridSearchCV实例中使用带有自定义记分器的RandomForestClassifier: GridSearchCV(分类器,param_grid = [...],得分= custom_scorer

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

如果custom_scorer_function仅依赖于 y_true y_pred ,则此框架非常简单。但是在我的情况下,我需要定义一个记分器,它使用 X 数据集中包含的18个特征之一,即取决于 y_pred 的值y_true 自定义分数将是它们与功能的组合。

我的问题是如何将该功能传递到 custom_scorer_function ,因为其标准签名接受 y_true y_pred ?< /强>

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

我试图扩充 y_true 数组,将该功能打包到其中并在 custom_scorer_function 中解压缩(第一列是实际标签,第二列是功能值我需要计算自定义分数): y_true_augmented

但是这样做会违反分类器的要求,即拥有1D标签数组并触发以下错误。

ValueError:未知标签类型:'continuous-multioutput'

非常感谢任何帮助。

谢谢。

1 个答案:

答案 0 :(得分:0)

你可以这样做(注意你没有给出真正的代码,所以这是准系统)

X = [...]
y = [...]

def custom_scorer_function(y, y_pred, **kwargs):
   a_feature = X[:,1]
   # now have y, y_pred and the feature you want

custom_scorer = make_scorer(custom_scorer_function, greater_is_better=True)
...