我正在努力学习排名任务,数据集有一列thread_id
,这是一个组标签(分层数据)。
在评估阶段,我必须考虑这些组,因为我的评分函数以每线程方式工作(例如nDCG)。
现在,如果我使用签名scorer(estimator, X, y)
实现nDCG,我可以轻松地将其作为评分函数传递给GridSearchCV,如下例所示:
def my_nDCG(estimator, X, y):
# group by X['thread_id']
# compute the result
return result
splitter = GroupShuffleSplit(...).split(X, groups=X['thread_id'])
cv = GridSearchCV(clf, cv=splitter, scoring=my_nDCG)
GridSearchCV通过调用my_nDCG()
来选择模型。
不幸的是,在my_nDCG
内,X没有thread_id
列,因为必须事先将X传递给fit()
,否则我会使用thread_id
训练模型特征
cv.fit(X.drop('best_answer', axis=1), y)
如果没有可怕的解决方法,thread_id
与global
分开,并将其与my_nDCG()
内的X合并,我该怎么做呢?
有没有其他方法可以将nDCG与scikit-learn一起使用?我看到scikit支持分层数据,但是当使用分层数据进行模型评估时,似乎缺少适当的支持。
注意到GridSearchCV.fit()接受groups
参数,就我而言,它仍然是X['thread_id']
。
此时我只需要在自定义评分函数中读取该参数。怎么做?