Важность функции, возвращаемая SHAP (мера Лундберга), противоречит моей проблеме. Похоже, что это зависит от порядка признаков.
Основной показатель в модели - MSE, относительно некоторой базовой модели. Пусть GAIN = 1 - MSE_model / MSE_base
будет прирост производительности при использовании модели (или уменьшение MSE). Для сравнения я исправил наборы ГСЧ и параметров.
1) GAIN(LightGBM.train(X1=[x1, x2]))=20%
,
2) GAIN(LightGBM.train(X2=[x1, x2, x3]))=30%
,
3) GAIN(LightGBM.train(X3=[x1, x2, x4]))=60%
,
4) GAIN(LightGBM.train(X4=[x1, x2, x3, x4]))=70%
.
Следовательно, я могу сделать вывод, что x4
важнее, чем x3
(и чем x1, x2
): он добавляет модели большей предсказуемости.
Однако, когда я вычисляю SHAP
для 1), он возвращает SHAP(x3) > SHAP(x4)
. Что еще более удивительно, когда я использовал X в другом порядке, т.е. X5=[x4, x3, x2, x1]
, я получаю то же самое GAIN=70%
, но SHAP в другом порядке: SHAP(x4) > SHAP(x3)
. Хуже того, SHAP(x1), SHAP(x2) > SHAP(x4)
.
Возможно, это присуще любым деревьям решений: дерево разделяет листья с помощью жадного алгоритма, поэтому, если x1
случайно будет выбран какпервая переменная разбиения будет иметь больший информационный прирост, хотя и будет иметь небольшой вклад в уменьшение MSE.
(https://github.com/Microsoft/LightGBM/issues/1294 говорит, что LightGBM действительно зависит от порядка объектов: если 2 функции имеютПри таком же коэффициенте усиления будет выбрана функция с меньшим индексом, однако, даже если я использую другой порядок, значение GAIN существенно не изменится, поэтому я полагаю, что это не из-за LightGBM.train
.)
НоНасколько мне известно, SHAP
рассматривает комбинацию порядков элементов, поэтому она не должна зависеть от порядков элементов, которые я передаю.
Это потому, что я слишком ограничиваю параметры модели - скажем, max_depth или max_leaves?
- Я ограничил
tree_limit=100
(что является моим n_estimator
из LightGBM
) в explainer.shap_values()
, значение по умолчанию которого None
(б / с слишком долго безпредел). Может ли это быть причиной?
Или SHAP (или получение информации) согласован только в рамках данной модели, и я не должен судить о «важности функции» по уменьшению MSE (то есть заключение x4
важнее, чем x3
, сравнивая 1) - 4) вводит в заблуждение)?
Если это зависит от порядка объектов, есть ли способы исправить это в LightGBM
?
РЕДАКТИРОВАТЬ) Я попытался tree_limit>100
, и получил SHAP(x4) > SHAP(x3)
. По мере увеличения tree_limit
SHAP(x4) - SHAP(x3)
увеличивается. Тем не менее, по-прежнему SHAP(x4)
по-прежнему не самый большой, который должен быть. Это может быть наибольшее значение, если я предоставлю достаточно большое значение tree_limit
, но время расчета линейно увеличивается на tree_limit
, что я не могу увеличить больше некоторого порога. Есть ли способ для «хороших начальных значений»?