我正在尝试用一个定制的记分器训练一个RandomForestClassifier,它的输出需要依赖于其中一个特性。
X数据集包含18个功能:
python - 具有定制评分器的Scikit学习分类器(取决于培训功能)-LMLPHP
y是通常的0和1数组:
python - 具有定制评分器的Scikit学习分类器(取决于培训功能)-LMLPHP
带有自定义记分器的RandomForestClassifier用于GridSearchCV实例中:
GridSearchCV(分类器,param_grid=[…],scoring=custom_scorer)。
自定义记分器通过Scikit学习功能定义,使记分器:
custom_scorer=make_scorer(custom_scorer_function,greater_is_better=True)。
如果自定义的scorer_函数仅依赖于y_true和y_pred,则此框架非常简单。但是,在我的例子中,我需要定义一个记分器,它使用X数据集中包含的18个特征之一,即,根据y_pred和y_true的值,自定义分数将是它们和特征的组合。
我的问题是,如果特性的标准签名接受yútrue和yúpred,那么如何将其传递到自定义的scorer戋u函数中?
我知道它接受额外的**kwargs,但是以这种方式传递整个特性数组并不能解决问题,因为这个函数是为每对yútrue和yúpred值调用的(需要提取与它们相对应的单个特性值才能使其工作,我不确定是否可以做到)。
我试图扩展y_true数组打包功能,并在custom_scorer_函数中对其进行解包(第一列是实际标签,第二列是计算自定义分数所需的功能值):
python - 具有定制评分器的Scikit学习分类器(取决于培训功能)-LMLPHP
但是,这样做违反了具有1D标签数组的分类器的要求,并触发以下错误。
ValueError:未知的标签类型:“连续多输出”
任何帮助都非常感谢。
谢谢您。

最佳答案

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

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)
...

关于python - 具有定制评分器的Scikit学习分类器(取决于培训功能),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49246856/

10-12 16:39