Как правильно определить важность локальных функций с помощью SHAP из группового обучения алгоритму ранжирования
У меня есть данные за последние 6 месяцев, которые включают несколько сотен тысяч запросов пользователей. В среднем запрос возвращает 500 элементов. Я использую LightGBM для парного обучения алгоритму ранжирования для сортировки элементов, возвращаемых из пользовательского запроса, где для обучения я группирую по запросу пользователя (как описано здесь).
На основании этого и этого я понимаю, что SHAP не выполняет групповое прогнозирование для расчета важности функций, которое может привести к смещенным результатам. Меня интересует местное объяснение, почему конкретный элемент занимает первое место по определенному запросу.
Чтобы получить эту информацию, я определяю объяснитель ТОЛЬКО для данных, содержащих результаты запроса, который включает элемент, который я пытаюсь объяснить. Пример кода:
# the item for which we want to extract the local shapley values
item_of_interest = "ABC"
# subset the training data to include only this item
item_to_explain_df = data.loc[data.item == item_of_interest]
# find the query that generated this item
query_of_interest = data.loc[data.item == item_of_interest].query.unique()
# subset the training data to include the results from the query that generated the item of interest
data_for_one_query_df = data.loc[data.query == query_of_interest]
# define a tree explainer
# model is a LightGBM learning to rank model
# data_for_one_query_df is the data containing the results from the query that includes the item I am trying to explain
explainer = shap.TreeExplainer(model=model, data=data_for_one_query_df)
# get shapley values
# item_to_explain_df is the item I am trying to explain
shap_values = explainer.shap_values(data=item_to_explain_df)
# plot
shap.force_plot(explainer.expected_value, shap_values, item_to_explain_df)
Вышеупомянутое дает очень разные результаты по сравнению с определением объяснителя на основе всех данных обучения. Я думаю, что, учитывая тот факт, что SHAP не выполняет групповое прогнозирование, определение объяснителя по ОДНОМУ запросу и извлечение ожидаемого значения для него более точное, однако я не нашел никакой подтверждающей документации. Есть ли у кого-нибудь опыт использования SHAP для группового обучения алгоритму ранжирования, и верен ли мой подход?
Просто для ясности, если я введу все данные в объяснитель, поток будет следующим:
# define a tree explainer
explainer = shap.TreeExplainer(model=model)
# get shapley values
# item_to_explain is the item I am trying to explain
shap_values = explainer.shap_values(data=item_to_explain_df)
# plot
shap.force_plot(explainer.expected_value, shap_values, item_to_explain_df)