Я хочу нормализовать значения SHAP в кадре данных, чтобы сумма всего набора данных была равна 1 (или единице), а затем визуализировать результат. Другими словами, я хочу сравнить значения SHAP по столбцам для нескольких моделей. таким образом, значения должны находиться в диапазоне от 0 до 1, чтобы я мог легко их сравнить.
это данные:
import pandas as pd
import numpy as np
data = {
'TotalAssets': [8.978503e+05, 9.507830e+05, 9.845343e+05],
'NItoCommon': [2.178703e+05, 1.925330e+05, 2.476941e+05],
'NIbefEIPrefDiv': [0.0, 0.0, 0.0],
'NIbefPrefDiv': [0.0, 0.0, 0.0],
'Sales': [8.828264e+05, 9.306458e+05, 9.378206e+05],
'GainLossAssetSale': [0.0, 0.0, 0.0],
'PPT': [-4.531455e+06, -4.423612e+06, -4.418668e+06],
'LTDebt': [6.144519e+06, 6.288970e+06, 6.238800e+06],
'CommonEquity': [2.166374e+06, 2.166508e+06, 2.149763e+06],
'OtherIncome': [-3.695190e+06, -4.470608e+06, -2.469038e+06],
'CashSTInv': [-1.911441e+05, -4.436216e+04, -6.975130e+04],
'OtherCA': [-690354.375, -474606.71875, -584398.0],
'OtherCL': [6594.917, 11110.29, 11649.62],
'TotalDiv': [-5.500094e+05, -3.867318e+05, -7.207764e+05],
'Tone': [-1.216460e+04, 2.065150e+06, 1.016223e+06],
'Positive_Score': [-517750.875, 271456.8125, -674126.625],
'Negative_Score': [848004.5, 93113.703125, 608219.0],
'Polarity': [-429908.90625, -209987.734375, -282620.90625],
'Activity_Reference_Density': [-105832.390625, -350564.28125, -420945.84375],
'Self_Group_Reference_Density': [-216270.3125, 32296.185547, -694138.125]
}
df = pd.DataFrame(data)
пока я использую этот подход:
mean_shap_values = df.mean()
normalized_shap_values = mean_shap_values / np.sum(df.mean())
absolute_shap_values = normalized_shap_values.abs().sort_values(ascending=True)
однако при построении графика сумма значений больше единицы. как я могу нормализовать значения SHAP по столбцам так, чтобы сумма равнялась 1?
весь код (это может помочь)
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
data = {
'TotalAssets': [8.978503e+05, 9.507830e+05, 9.845343e+05],
'NItoCommon': [2.178703e+05, 1.925330e+05, 2.476941e+05],
'NIbefEIPrefDiv': [0.0, 0.0, 0.0],
'NIbefPrefDiv': [0.0, 0.0, 0.0],
'Sales': [8.828264e+05, 9.306458e+05, 9.378206e+05],
'GainLossAssetSale': [0.0, 0.0, 0.0],
'PPT': [-4.531455e+06, -4.423612e+06, -4.418668e+06],
'LTDebt': [6.144519e+06, 6.288970e+06, 6.238800e+06],
'CommonEquity': [2.166374e+06, 2.166508e+06, 2.149763e+06],
'OtherIncome': [-3.695190e+06, -4.470608e+06, -2.469038e+06],
'CashSTInv': [-1.911441e+05, -4.436216e+04, -6.975130e+04],
'OtherCA': [-690354.375, -474606.71875, -584398.0],
'OtherCL': [6594.917, 11110.29, 11649.62],
'TotalDiv': [-5.500094e+05, -3.867318e+05, -7.207764e+05],
'Tone': [-1.216460e+04, 2.065150e+06, 1.016223e+06],
'Positive_Score': [-517750.875, 271456.8125, -674126.625],
'Negative_Score': [848004.5, 93113.703125, 608219.0],
'Polarity': [-429908.90625, -209987.734375, -282620.90625],
'Activity_Reference_Density': [-105832.390625, -350564.28125, -420945.84375],
'Self_Group_Reference_Density': [-216270.3125, 32296.185547, -694138.125]
}
df = pd.DataFrame(data)
# List of indices for subfigures
# indices = ['_1',0,1,2,3,4]
# indices = [-1,0,1,2,3,4]
indices = [5,6,7,8,9]
# Calculate number of rows and columns for subplots
n_rows = (len(indices) + 2) // 3 # this ensures that there are enough rows to fit all indices
n_cols = 3
# # USE FOR AVERAGES
fig, axs = plt.subplots(n_rows, n_cols, figsize=(15, 20), constrained_layout=True)
# #USE FOR NON AVERAGES
# fig, axs = plt.subplots(n_rows, n_cols, figsize=(15, 14), constrained_layout=True)
axs = axs.ravel() # Flatten the array for easier iteration
# Loop through indices and create subplots
for i, ax in zip(indices, axs):
shap_values_df = df
mean_shap_values = shap_values_df.mean()
normalized_shap_values = mean_shap_values / np.sum(shap_values_df.mean())
absolute_shap_values = normalized_shap_values.abs().sort_values(ascending=True)
ax.barh(absolute_shap_values.index, absolute_shap_values.values, color='blue')
description = get_description_for_number(i)
ax.set_title(description, fontsize=12)
ax.grid(True, linestyle='--', linewidth=0.7, alpha=1, axis='x')
ax.tick_params(axis='y', labelsize=11)
# plt.savefig(r'C:example.png')
plt.show()
Подробнее здесь: https://stackoverflow.com/questions/791 ... to-equal-1
Нормализовать значения SHAP по столбцам, чтобы они были равны 1. ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
PHP: ложные значения всегда равны «», истинные значения всегда равны «1»? [дубликат]
Anonymous » » в форуме Php - 0 Ответы
- 76 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как использовать значения SHAP для ЭЭГ-биомаркеров и важности признаков?
Anonymous » » в форуме Python - 0 Ответы
- 23 Просмотры
-
Последнее сообщение Anonymous
-