INSTANCIA_I = int(np.clip(INSTANCIA_I, 0, len(X_test)-1)) x = X_test.iloc[INSTANCE_I].valores y_true = float(y_test.iloc[INSTANCE_I]) pred = float(modelo.predict([x])[0]) iv = explicador.explain(x, presupuesto=int(BUDGET_LOCAL), estado_aleatorio=0) baseline = float(getattr(iv, “baseline_value”, 0.0)) main_effects = extract_main_effects(iv, feature_names) pair_df = extract_pair_matrix(iv, feature_names) print(“\n” + “=”*90) print(“EXPLICACIÓN LOCAL (instancia de prueba única)”) print(“=”*90) print(f”Index={INDEX} | max_order={MAX_ORDER} | presupuesto={BUDGET_LOCAL} | instancia={INSTANCE_I}”) print(f”Predicción: {pred:.6f} | Verdadero: {y_true:.6f} | Línea base (si está disponible): {baseline:.6f}”) print(“\nEfectos principales principales (firmado):”) display(main_effects.reindex(main_effects.abs().sort_values(ascending=False).head(TOP_K).index).to_frame()) print(“\nVista ASCII (efectos principales firmados, top-k):”) print(ascii_bar(main_effects, top_k=TOP_K)) print(“\nTop interacciones por pares por |valor| (local):”) pares = []
para i en rango(n_features): para j en rango(i+1, n_features): v = float(pair_df.iat[i, j]) pares.append((nombres_características[i]nombres_de_funciones[j]v, abs(v))) pares_df = pd.DataFrame(pares, columnas=[“feature_i”, “feature_j”, “interaction”, “abs_interaction”]).sort_values(“abs_interaction”, ascending=False).head(min(25, len(pairs))) display(pairs_df) fig1 = plot_local_feature_bar(main_effects, TOP_K) fig2 = plot_local_interaction_heatmap(pair_df, list(main_effects.abs().sort_values(ascending=False).head(TOP_K).index)) fig3 = plot_waterfall(baseline, main_effects, TOP_K) fig1.show() fig2.show() fig3.show() if GLOBAL_ON: print(“\n” + “=”*90) print(“RESÚMENES GLOBALES (muestreados en múltiples puntos de prueba)”) print(“=”*90) GLOBAL_N = int(np.clip(GLOBAL_N, 5, len(X_test))) muestra = X_test.sample(n=GLOBAL_N, random_state=1).values global_main, global_pair = global_summaries( explicador=explicador, X_samples=muestra, feature_names=feature_names, presupuesto=int(BUDGET_GLOBAL), semilla=123, ) print(f”Samples={GLOBAL_N} | presupuesto/muestra={BUDGET_GLOBAL}”) print(“\nImportancia de la característica global (media |efecto principal|):”) display(global_main.head(TOP_K)) top_feats_global = list(global_main[“feature”].head(TOP_K).valores) sub = global_pair.loc[top_feats_global, top_feats_global]
para i en rango(n_features): para j en rango(i+1, n_features): v = float(pair_df.iat[i, j]) pares.append((nombres_características[i]nombres_de_funciones[j]v, abs(v))) pares_df = pd.DataFrame(pares, columnas=[“feature_i”, “feature_j”, “interaction”, “abs_interaction”]).sort_values(“abs_interaction”, ascending=False).head(min(25, len(pairs))) display(pairs_df) fig1 = plot_local_feature_bar(main_effects, TOP_K) fig2 = plot_local_interaction_heatmap(pair_df, list(main_effects.abs().sort_values(ascending=False).head(TOP_K).index)) fig3 = plot_waterfall(baseline, main_effects, TOP_K) fig1.show() fig2.show() fig3.show() if GLOBAL_ON: print(“\n” + “=”*90) print(“RESÚMENES GLOBALES (muestreados en múltiples puntos de prueba)”) print(“=”*90) GLOBAL_N = int(np.clip(GLOBAL_N, 5, len(X_test))) muestra = X_test.sample(n=GLOBAL_N, random_state=1).values global_main, global_pair = global_summaries( explicador=explicador, X_samples=muestra, feature_names=feature_names, presupuesto=int(BUDGET_GLOBAL), semilla=123, ) print(f”Samples={GLOBAL_N} | presupuesto/muestra={BUDGET_GLOBAL}”) print(“\nImportancia de la característica global (media |efecto principal|):”) display(global_main.head(TOP_K)) top_feats_global = list(global_main[“feature”].head(TOP_K).valores) sub = global_pair.loc[top_feats_global, top_feats_global]
figg1 = px.bar(global_main.head(TOP_K), x=”mean_abs_main_effect”, y=”feature”, orientación=”h”, title=”Importancia global de la característica (media |efecto principal|, muestra)”) figg1.update_layout(yaxis={“categoryorder”: “total ascendente”}) figg2 = px.imshow(sub.values, x=sub.columns, y=sub.index, aspecto=”auto”, title=”Importancia global de la interacción por pares (media |interacción|, muestra)”) figg1.show() figg2.show() print(“\nListo. Si lo desea más rápido: presupuestos más bajos o GLOBAL_N, o establezca MAX_ORDER=1.”)