В этом руководстве мы рассмотрим различные визуализации SHAP-IQ, которые помогают понять, как модель машинного обучения делает свои прогнозы. Эти визуализации разбивают сложное поведение модели на интерпретируемые компоненты, показывая как индивидуальный, так и совместный вклад признаков в конкретное предсказание.
Установка зависимостей
Для начала работы установите необходимые зависимости:
`!pip install shapiq overrides scikit-learn pandas numpy seaborn`
Импортирование набора данных
В этом руководстве мы будем использовать набор данных MPG (Miles Per Gallon), который мы загрузим непосредственно из библиотеки Seaborn. Этот набор данных содержит информацию о различных моделях автомобилей, включая такие характеристики, как мощность, вес и происхождение.
`import seaborn as sns`
`df = sns.load_dataset(“mpg”)`
`df`
Обработка набора данных
Мы используем Label Encoding для преобразования категориальных столбцов в числовой формат, чтобы они подходили для обучения модели.
`import pandas as pd`
`from sklearn.preprocessing import LabelEncoder`
`# Drop rows with missing values`
`df = df.dropna()`
`# Encoding the origin column`
`le = LabelEncoder()`
`df.loc[:, “origin”] = le.fit_transform(df[“origin”])`
`df[‘origin’].unique()`
Разделение данных на обучающую и тестовую выборки
`# Select features and target`
`X = df.drop(columns=[“mpg”, “name”])`
`y = df[“mpg”]`
`feature_names = X.columns.tolist()`
`xdata, ydata = X.values, y.values`
`# Train-test split`
`xtrain, xtest, ytrain, ytest = traintestsplit(xdata, ydata, testsize=0.2, randomstate=42)`
Обучение модели
Мы обучаем модель Random Forest Regressor с максимальной глубиной 10 и 10 деревьями решений (nestimators=10). Фиксированное значение randomstate обеспечивает воспроизводимость.
`# Train model`
`model = RandomForestRegressor(randomstate=42, maxdepth=10, n_estimators=10)`
`model.fit(xtrain, ytrain)`
Оценка модели
`# Evaluate`
`mse = meansquarederror(ytest, model.predict(xtest))`
`r2 = r2score(ytest, model.predict(x_test))`
`print(f”Mean Squared Error: {mse:.2f}”)`
`print(f”R2 Score: {r2:.2f}”)`
Объяснение локального экземпляра
Мы выбираем конкретный тестовый экземпляр (с instance_id = 7), чтобы изучить, как модель пришла к своему прогнозу. Мы распечатаем истинное значение, предсказанное значение и значения признаков для этого экземпляра.
`# select a local instance to be explained`
`instance_id = 7`
`xexplain = xtest[instance_id]`
`ytrue = ytest[instance_id]`
`ypred = model.predict(xexplain.reshape(1, -1))[0]`
`print(f”Instance {instanceid}, True Value: {ytrue}, Predicted Value: {y_pred}”)`
`for i, feature in enumerate(feature_names):`
`print(f”{feature}: {x_explain[i]}”)`
Генерация объяснений для различных порядков взаимодействия
Мы генерируем объяснения на основе Shapley для разных порядков взаимодействия с помощью пакета shapiq.
`# create explanations for different orders`
`feature_names = list(X.columns) # get the feature names`
`nfeatures = len(featurenames)`
`si_order: dict[int, shapiq.InteractionValues] = {}`
`for order in tqdm([1, 2, n_features]):`
`index = “k-SII” if order > 1 else “SV” # will also be set automatically by the explainer`
`explainer = shapiq.TreeExplainer(model=model, max_order=order, index=index)`
`siorder[order] = explainer.explain(x=xexplain)`
`si_order`
Визуализации
1. Force Chart
The force plot — это мощный инструмент визуализации, который помогает нам понять, как модель машинного обучения пришла к конкретному прогнозу. Он отображает базовое предсказание (т. е. ожидаемое значение модели до того, как она увидела какие-либо признаки), а затем показывает, как каждый признак «подталкивает» предсказание выше или ниже.
`sv = si_order[1] # get the SV`
`si = si_order[2] # get the 2-SII`
`mi = siorder[nfeatures] # get the Moebius transform`
`sv.plotforce(featurenames=feature_names, show=True)`
`si.plotforce(featurenames=feature_names, show=True)`
`mi.plotforce(featurenames=feature_names, show=True)`
2. Waterfall Chart
Подобно force plot, waterfall chart — это ещё один популярный способ визуализации значений Shapley. Он показывает, как различные признаки подталкивают прогноз выше или ниже по сравнению с базовым значением.
`sv.plotwaterfall(featurenames=feature_names, show=True)`
`si.plotwaterfall(featurenames=feature_names, show=True)`
`mi.plotwaterfall(featurenames=feature_names, show=True)`
3. Network Plot
The network plot shows how features interact with each other using first- and second-order Shapley interactions. Node size reflects individual feature impact, while edge width and color show interaction strength and direction.
`si.plotnetwork(featurenames=feature_names, show=True)`
`mi.plotnetwork(featurenames=feature_names, show=True)`
4. SI Graph Plot
The SI graph plot extends the network plot by visualizing all higher-order interactions as hyper-edges connecting multiple features. Node size shows individual feature impact, while edge width, color, and transparency reflect the strength and direction of interactions.
`sv.plotsigraph(featurenames=abbrevfeaturenames, show=True, sizefactor=2.5, nodesizescaling=1.5, plotoriginalnodes=True)`
`si.plotsigraph(featurenames=abbrevfeaturenames, show=True, sizefactor=2.5, nodesizescaling=1.5, plotoriginalnodes=True)`
`mi.plotsigraph(featurenames=abbrevfeaturenames, show=True, sizefactor=2.5, nodesizescaling=1.5, plotoriginalnodes=True)`
5. Bar Plot
The bar plot is tailored for global explanations. While other plots can be used both locally and globally, the bar plot summarizes the overall importance of features (or feature interactions) by showing the mean absolute Shapley (or interaction) values across all instances.
`explanations = []`
`explainer = shapiq.TreeExplainer(model=model, max_order=2, index=”k-SII”)`
`for instance_id in tqdm(range(20)):`
`xexplain = xtest[instance_id]`
`si = explainer.explain(x=x_explain)`
`explanations.append(si)`
`shapiq.plot.barplot(explanations, featurenames=feature_names, show=True)`
Заключение
«Distance» и «Horsepower» являются наиболее влиятельными признаками в целом, что означает, что они оказывают наибольшее индивидуальное влияние на прогнозы модели. Это видно по их высоким средним абсолютным значениям Shapley interaction в бар-плоте.
Дополнительно, при рассмотрении вторых порядков взаимодействия (т. е., как два признака взаимодействуют вместе), комбинации «Horsepower × Weight» и «Distance × Horsepower» показывают значительное совместное влияние. Их совокупная атрибуция составляет около 1,4, что указывает на то, что эти взаимодействия играют важную роль в формировании прогнозов модели помимо того, что каждый признак вносит индивидуально. Это подчёркивает наличие нелинейных отношений между признаками в модели.
1. Какие визуализации SHAP-IQ представлены в статье и для чего они используются?
В статье представлены следующие визуализации SHAP-IQ:
* Force Chart;
* Waterfall Chart;
* Network Plot;
* SI Graph Plot;
* Bar Plot.
Они используются для объяснения того, как модель машинного обучения делает свои прогнозы, показывая индивидуальный и совместный вклад признаков в конкретное предсказание.
2. Какие шаги необходимо предпринять для установки зависимостей и загрузки набора данных в этом руководстве?
Для установки зависимостей необходимо выполнить команду `!pip install shapiq overrides scikit-learn pandas numpy seaborn`.
Для загрузки набора данных MPG используется библиотека Seaborn: `import seaborn as sns` `df = sns.load_dataset(“mpg”)`.
3. Какие методы используются для обработки набора данных перед обучением модели?
Для обработки набора данных используются следующие методы:
* Удаление строк с пропущенными значениями: `df = df.dropna()`.
* Преобразование категориальных столбцов в числовой формат с помощью Label Encoding: `import pandas as pd` `from sklearn.preprocessing import LabelEncoder` `le = LabelEncoder()` `df.loc[:, “origin”] = le.fit_transform(df[“origin”])`.
4. Какие параметры используются при обучении модели Random Forest Regressor?
При обучении модели используются следующие параметры:
* Максимальная глубина дерева: `max_depth=10`.
* Количество деревьев решений: `n_estimators=10`.
* Фиксированное значение randomstate для обеспечения воспроизводимости: `randomstate=42`.
5. Какие метрики используются для оценки модели после обучения?
Для оценки модели используются следующие метрики:
* Mean Squared Error (MSE): `mse = meansquarederror(ytest, model.predict(xtest))`.
* R2 Score: `r2 = r2score(ytest, model.predict(x_test))`.