我正在尝试使用一个自定义评分器来训练一个RandomForestClassifier,这个评分器的输出需要依赖于其中一个特征。
带有自定义评分器的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_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数组(第一列是实际标签,第二列是我需要计算自定义评分的特征值):
然而,这样做违反了分类器需要一个一维标签数组的要求,并触发了以下错误。
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)...