我正在尝试训练一个带有自定义得分手的RandomForestClassifier,其输出需要依赖于其中一个功能。
在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 中解压缩(第一列是实际标签,第二列是功能值我需要计算自定义分数):
但是这样做会违反分类器的要求,即拥有1D标签数组并触发以下错误。
ValueError:未知标签类型:'continuous-multioutput'
非常感谢任何帮助。
谢谢。
答案 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)
...