from smm_funcs import test_4_permutation_importance
# Определяем функцию-обёртку для вашей модели прогнозирования
# Она должна принимать df и model_coefs, и добавлять в df столбец с прогнозом
def smm_wrapper(df, model_coefs):
"""
Обёртка для функции predict_prolongation.
Добавляет в DataFrame столбец 'prediction'.
"""
# Используем глобальные переменные: coeff_dict, features, F
z = coeff_dict['intercept']
for feat in features:
z += coeff_dict[feat] * df[feat].values
df['prediction'] = F(z)
return df
# Запуск теста перестановочной важности
importance_result = test_4_permutation_importance(
df=df, # данные для теста
df_history=df, # данные для расчёта бенчмарка (можно те же)
features=features, # список признаков
smm_func=smm_wrapper, # функция расчёта прогноза
model_coefs=None, # коэффициенты (не используются, т.к. они в функции)
random_states=[42, 123, 456], # несколько состояний для устойчивости
group_column='end_month_plan',
weight_column='portfolio_share',
smm_fact_column='renewed_fact_rate',
smm_pred_column='prediction'
)
print("=== ПЕРЕСТАНОВОЧНАЯ ВАЖНОСТЬ ПРИЗНАКОВ ===")
print(importance_result)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# Предполагается, что у вас есть:
# - model_results – результат test_3_ols_metrics (или test_3_wls_metrics)
# - X_train – матрица признаков (DataFrame) для тренировочных данных
# - z_train – преобразованная целевая переменная
# Извлекаем коэффициенты (без константы, если она есть)
if 'const' in model_results.params.index:
coefs = model_results.params.drop('const')
else:
coefs = model_results.params
# Стандартные отклонения признаков и z
X_std = X_train.std()
z_std = z_train.std()
# Бета-коэффициенты
beta_coefs = coefs * X_std[coefs.index] / z_std
# Сортировка по убыванию абсолютного значения
beta_sorted = beta_coefs.abs().sort_values(ascending=False)
# Вывод таблицы
importance_beta = pd.DataFrame({
'Признак': beta_sorted.index,
'Коэффициент': coefs[beta_sorted.index].round(4),
'Бета (стандартизованный)': beta_sorted.round(4),
'|Бета|': beta_sorted.abs().round(4)
})
print("\n=== СТАНДАРТИЗОВАННЫЕ КОЭФФИЦИЕНТЫ (БЕТА) ===")
print(importance_beta.to_string(index=False))
# График важности
plt.figure(figsize=(10, 6))
plt.barh(beta_sorted.index, beta_sorted.abs().values, color='steelblue')
plt.axvline(x=0.2, color='red', linestyle='--', label='Порог существенности (|β| > 0.2)')
plt.xlabel('|Стандартизованный коэффициент| (бета)')
plt.title('Существенность влияния факторов модели')
plt.legend()
plt.gca().invert_yaxis()
plt.tight_layout()
plt.show()
# Объединение результатов
if 'importance_result' in locals():
# Извлекаем относительное изменение RMSE из перестановочной важности
perm_change = importance_result['Относительное изменение, %']
perm_change = perm_change[perm_change.index != 'Без изменений']
# Создаём итоговую таблицу
final_importance = pd.DataFrame({
'Признак': beta_sorted.index,
'|Бета|': beta_sorted.abs().round(4),
'Изменение RMSE, %': perm_change.reindex(beta_sorted.index).round(2)
}).sort_values('|Бета|', ascending=False)
print("\n=== СВОДНАЯ ТАБЛИЦА СУЩЕСТВЕННОСТИ ФАКТОРОВ ===")
print(final_importance.to_string(index=False))