Как использовать значения SHAP для ЭЭГ-биомаркеров и важности признаков?Python

Программы на Python
Anonymous
Как использовать значения SHAP для ЭЭГ-биомаркеров и важности признаков?

Сообщение Anonymous »

Чем я занимаюсь:
Я анализирую различные биомаркеры на основе данных ЭЭГ с помощью разных алгоритмов машинного обучения, различных этапов предварительной обработки и т. д. В результате получается несколько моделей для каждой комбинации этап и алгоритм предварительной обработки.
Каждая модель обучается с использованием StratifiedGroupKFold, всего 6 сгибов.
Каждый сгиб сохраняется в виде библиотеки заданий под именем .joblib
Биомаркеры:
Каждая полоса сигнала ЭЭГ имеет ряд биомаркеров. Эти биомаркеры, в свою очередь, состоят из всех сигналов со всех электродов ЭЭГ. Таким образом, биомаркер состоит из нескольких функций, которые нельзя разделять (каждый биомаркер должен содержать все данные электрода).
Что я хотел бы сделать:
В моем первом подходе я обучил каждую модель всем биомаркерам. Теперь я хотел бы использовать важность функции, чтобы выяснить, можно ли опустить некоторые из них.
Для этого я хотел бы рассмотреть каждый шаг предварительной обработки и каждую модель.
Мне рекомендовали SHAP, но моя проблема в том, что я не знаю, как суммировать складки и каналы каждого биомаркера.
Вот моя первая попытка хотя бы суммировать складки (для примера я только используя все складки одной модели):

Код: Выделить всё

for i, (train_index, test_index) in enumerate(sgkf.split(X, y, groups)):
X_test, y_test = X.iloc[test_index], y.iloc[test_index]

# Modell
fold_file = fold_files[i]
clf = joblib.load(fold_file)

# SHAP-Explainer
explainer = shap.LinearExplainer(clf, X_test)
shap_values = explainer.shap_values(X_test)
sv = explainer(X_test)

all_shap_values.append(shap_values)

shap_values_stacked = np.vstack([sv[1] for sv in all_shap_values])
shap_values_mean = np.abs(shap_values_stacked).mean(0)
importance_df = pd.DataFrame({
"feature": columns,
"shap_values": shap_values_mean
})
Сначала я попробовал это с помощью объяснения.shap_values, потому что это показалось мне самым простым способом. Но тогда я не могу это построить, мне нужен sv = expalliner(X).
Мой вопрос разделен на 2 части:
  • как суммировать складки? (среднее значение?)
  • как сгруппировать каналы каждого биомаркера? Могу ли я добавить значения или исказлю результат?
(Биомаркеры названы таким образом, что я могу легко идентифицировать каналы )
Заранее спасибо!

Подробнее здесь: https://stackoverflow.com/questions/785 ... importance

Вернуться в «Python»