Я хочу нормализовать значения 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
Программы на Python
-
Anonymous
1730793997
Anonymous
Я хочу нормализовать значения 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()
Подробнее здесь: [url]https://stackoverflow.com/questions/79158112/normalize-shap-values-across-columns-to-equal-1[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия