import%20marimo%0A%0A__generated_with%20%3D%20%220.24.0%22%0Aapp%20%3D%20marimo.App()%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20import%20pandas%20as%20pd%0A%20%20%20%20import%20plotly.graph_objects%20as%20go%0A%20%20%20%20from%20plotly.subplots%20import%20make_subplots%0A%20%20%20%20from%20sklearn.datasets%20import%20make_classification%0A%20%20%20%20from%20sklearn.ensemble%20import%20RandomForestClassifier%0A%20%20%20%20from%20sklearn.inspection%20import%20permutation_importance%0A%20%20%20%20from%20sklearn.linear_model%20import%20LogisticRegression%0A%20%20%20%20from%20sklearn.metrics%20import%20accuracy_score%0A%20%20%20%20from%20sklearn.model_selection%20import%20train_test_split%0A%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20LogisticRegression%2C%0A%20%20%20%20%20%20%20%20RandomForestClassifier%2C%0A%20%20%20%20%20%20%20%20accuracy_score%2C%0A%20%20%20%20%20%20%20%20go%2C%0A%20%20%20%20%20%20%20%20make_classification%2C%0A%20%20%20%20%20%20%20%20make_subplots%2C%0A%20%20%20%20%20%20%20%20mo%2C%0A%20%20%20%20%20%20%20%20np%2C%0A%20%20%20%20%20%20%20%20pd%2C%0A%20%20%20%20%20%20%20%20permutation_importance%2C%0A%20%20%20%20%20%20%20%20train_test_split%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%5B%E2%86%90%2038%20Oversampling%5D(38_oversampling.py)%20%7C%20%5BIndex%5D(..%2Findex.html)%20%7C%20%5B40%20PCA%20vs%20Feature%20Agglomeration%20%E2%86%92%5D(40_pca_vs_feat_ag.py)%0A%0A%20%20%20%20%23%20Permutation%20Feature%20Importance%3A%20Model-Agnostic%20Interpretability%20and%20Distributional%20Shifts%0A%0A%20%20%20%20%23%23%20%5Ba%5D%20Why%20do%20you%20need%20to%20know%20these%20concepts%3F%0A%0A%20%20%20%20Model%20interpretability%20is%20essential%20when%20deploying%20machine%20learning%20systems%20in%20high-stakes%20domains%20such%20as%20credit%20underwriting%2C%20healthcare%20diagnostics%2C%20and%20autonomous%20operations.%20While%20tree-based%20ensembles%20natively%20output%20feature%20importances%20via%20Mean%20Decrease%20in%20Impurity%20(MDI%20%2F%20Gini%20Importance)%2C%20MDI%20suffers%20from%20severe%20pathological%20flaws%3A%0A%20%20%20%201.%20**High-Cardinality%20Bias**%3A%20Features%20with%20high%20cardinality%20(or%20continuous%20random%20noise%20with%20many%20unique%20values)%20provide%20countless%20opportunities%20for%20split%20selection.%20As%20a%20result%2C%20MDI%20assigns%20high%20importance%20to%20pure%20noise%20features%20that%20simply%20memorize%20training%20data.%0A%20%20%20%202.%20**Training-Set%20Memorization**%3A%20MDI%20is%20computed%20entirely%20on%20training%20node%20splits%2C%20failing%20to%20distinguish%20between%20genuine%20predictive%20signals%20and%20overfitted%20sample%20idiosyncrasies.%0A%0A%20%20%20%20%23%23%23%23%20Model-Agnostic%20Post-Hoc%20Auditing%20via%20PFI%0A%20%20%20%20**Permutation%20Feature%20Importance%20(PFI)**%2C%20originally%20developed%20by%20Leo%20Breiman%20for%20Random%20Forests%2C%20resolves%20these%20flaws%20by%20measuring%20the%20out-of-sample%20performance%20drop%20when%20a%20given%20feature%20is%20corrupted%3A%0A%20%20%20%20-%20It%20is%20completely%20**model-agnostic**%3A%20it%20treats%20any%20trained%20model%20(logistic%20regression%2C%20gradient%20boosted%20trees%2C%20deep%20neural%20networks%2C%20or%20support%20vector%20machines)%20as%20a%20black%20box.%0A%20%20%20%20-%20It%20evaluates%20on%20an%20**unseen%20holdout%20validation%20set**%3A%20if%20a%20feature%20was%20merely%20overfitted%20during%20training%2C%20shuffling%20its%20holdout%20values%20will%20not%20degrade%20test%20score%20(or%20may%20even%20improve%20it).%0A%20%20%20%20-%20It%20directly%20links%20interpretability%20to%20the%20specific%20evaluation%20metric%20that%20matters%20for%20the%20task%20(accuracy%2C%20%24F_1%24-score%2C%20ROC%20AUC%2C%20or%20mean%20squared%20error).%0A%0A%20%20%20%20%23%23%23%23%20The%20Collinearity%20Pitfall%0A%20%20%20%20When%20two%20features%20%24X_1%24%20and%20%24X_2%24%20are%20strongly%20correlated%2C%20shuffling%20%24X_1%24%20alone%20forces%20the%20model%20into%20unnatural%20off-manifold%20regions%20(combinations%20of%20features%20that%20never%20appear%20in%20real%20life).%20Furthermore%2C%20because%20%24X_2%24%20remains%20unpermuted%20and%20retains%20redundant%20signal%2C%20the%20model%20can%20rely%20on%20%24X_2%24%20to%20compensate%2C%20causing%20PFI%20to%20underestimate%20the%20true%20predictive%20value%20of%20both%20features.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%5Bb%5D%20Mathematical%20Foundations%20and%20Permutation%20Mechanics%0A%0A%20%20%20%20%23%23%23%201.%20Formal%20Definition%20of%20Permutation%20Importance%0A%0A%20%20%20%20Let%20%24f%3A%20%5Cmathcal%7BX%7D%20%5Cto%20%5Cmathcal%7BY%7D%24%20be%20a%20trained%20predictive%20model%20and%20%24%5Cmathcal%7BD%7D_%7B%5Ctext%7Btest%7D%7D%20%3D%20%5C%7B(x_i%2C%20y_i)%5C%7D_%7Bi%3D1%7D%5E%7BN_%7B%5Ctext%7Btest%7D%7D%7D%24%20an%20independent%20test%20set.%20Each%20feature%20vector%20is%20%24x_i%20%3D%20(x_%7Bi%2C1%7D%2C%20x_%7Bi%2C2%7D%2C%20%5Cdots%2C%20x_%7Bi%2Cp%7D)%20%5Cin%20%5Cmathbb%7BR%7D%5Ep%24.%0A%0A%20%20%20%20Let%20%24%5Cmathcal%7BS%7D(f%2C%20X%2C%20y)%24%20denote%20an%20evaluation%20metric%20where%20higher%20values%20denote%20superior%20performance%20(e.g.%20accuracy%20or%20negative%20cross-entropy).%0A%0A%20%20%20%201.%20**Baseline%20Performance**%3A%20Evaluate%20the%20baseline%20score%20on%20the%20uncorrupted%20test%20dataset%3A%0A%0A%20%20%20%20%24%24s_%7B%5Ctext%7Bbase%7D%7D%20%3D%20%5Cmathcal%7BS%7D(f%2C%20X_%7B%5Ctext%7Btest%7D%7D%2C%20y_%7B%5Ctext%7Btest%7D%7D)%24%24%0A%0A%20%20%20%202.%20**Permutation%20Corruption**%3A%20For%20each%20feature%20index%20%24j%20%5Cin%20%5C%7B1%2C%20%5Cdots%2C%20p%5C%7D%24%20and%20repetition%20index%20%24b%20%5Cin%20%5C%7B1%2C%20%5Cdots%2C%20B%5C%7D%24%3A%0A%20%20%20%20%20%20%20-%20Construct%20a%20corrupted%20feature%20matrix%20%24X_%7B%5Ctext%7Btest%7D%7D%5E%7B%5Cpi(j%2C%20b)%7D%24%20by%20permuting%20the%20%24j%24-th%20column%20with%20a%20random%20permutation%20%24%5Cpi_b%24%20of%20row%20indices%20%24%5C%7B1%2C%20%5Cdots%2C%20N_%7B%5Ctext%7Btest%7D%7D%5C%7D%24%3A%0A%0A%20%20%20%20%24%24x_%7Bi%2C%20j%7D%5E%7B%5Cpi(j%2C%20b)%7D%20%3D%20x_%7B%5Cpi_b(i)%2C%20j%7D%2C%20%5Cquad%20%5Ctext%7Bwhile%20%7D%20x_%7Bi%2C%20k%7D%5E%7B%5Cpi(j%2C%20b)%7D%20%3D%20x_%7Bi%2C%20k%7D%20%5Ctext%7B%20for%20all%20%7D%20k%20%5Cneq%20j%24%24%0A%0A%20%20%20%20%20%20%20-%20Evaluate%20the%20degraded%20score%3A%0A%0A%20%20%20%20%24%24s_%7Bj%2C%20b%7D%20%3D%20%5Cmathcal%7BS%7D(f%2C%20X_%7B%5Ctext%7Btest%7D%7D%5E%7B%5Cpi(j%2C%20b)%7D%2C%20y_%7B%5Ctext%7Btest%7D%7D)%24%24%0A%0A%20%20%20%20%20%20%20-%20The%20importance%20for%20repetition%20%24b%24%20is%20the%20performance%20drop%3A%0A%0A%20%20%20%20%24%24I_%7Bj%2C%20b%7D%20%3D%20s_%7B%5Ctext%7Bbase%7D%7D%20-%20s_%7Bj%2C%20b%7D%24%24%0A%0A%20%20%20%203.%20**Aggregate%20Statistics**%3A%20Compute%20the%20mean%20importance%20and%20standard%20error%20over%20%24B%24%20permutations%3A%0A%0A%20%20%20%20%24%24%5Cbar%7BI%7D_j%20%3D%20%5Cfrac%7B1%7D%7BB%7D%20%5Csum_%7Bb%3D1%7D%5EB%20I_%7Bj%2C%20b%7D%2C%20%5Cquad%20%5Ctext%7BSE%7D(%5Cbar%7BI%7D_j)%20%3D%20%5Cfrac%7B1%7D%7B%5Csqrt%7BB%7D%7D%20%5Csqrt%7B%5Cfrac%7B1%7D%7BB%20-%201%7D%20%5Csum_%7Bb%3D1%7D%5EB%20(I_%7Bj%2C%20b%7D%20-%20%5Cbar%7BI%7D_j)%5E2%7D%24%24%0A%0A%20%20%20%20%23%23%23%202.%20Interpretation%20of%20Importance%20Values%0A%0A%20%20%20%20-%20%24%5Cbar%7BI%7D_j%20%3E%200%24%3A%20The%20model%20relies%20heavily%20on%20feature%20%24j%24%3B%20breaking%20its%20association%20with%20the%20target%20and%20other%20features%20significantly%20hurts%20performance.%0A%20%20%20%20-%20%24%5Cbar%7BI%7D_j%20%5Capprox%200%24%3A%20The%20model%20does%20not%20depend%20on%20feature%20%24j%24%3B%20its%20predictions%20remain%20invariant%20to%20random%20scrambling%20of%20that%20column.%0A%20%20%20%20-%20%24%5Cbar%7BI%7D_j%20%3C%200%24%3A%20Shuffling%20the%20feature%20actually%20**improves**%20test%20score%2C%20indicating%20that%20the%20model's%20training-set%20reliance%20on%20feature%20%24j%24%20caused%20test%20generalization%20error%20(overfitting).%0A%0A%20%20%20%20%23%23%23%203.%20Comparison%20with%20Mean%20Decrease%20in%20Impurity%20(MDI)%0A%0A%20%20%20%20In%20tree-based%20algorithms%2C%20MDI%20measures%20the%20total%20reduction%20in%20criterion%20impurity%20(Gini%20or%20entropy)%20brought%20by%20feature%20%24j%24%20across%20all%20internal%20splits%20%24t%24%3A%0A%0A%20%20%20%20%24%24%5Ctext%7BMDI%7D(j)%20%3D%20%5Cfrac%7B1%7D%7BN_%7B%5Ctext%7Btrees%7D%7D%7D%20%5Csum_%7BT%20%5Cin%20%5Ctext%7BForest%7D%7D%20%5Csum_%7Bt%20%5Cin%20T%20%3A%20v(t)%20%3D%20j%7D%20%5Cfrac%7BN_t%7D%7BN%7D%20%5CDelta%20I(t)%24%24%0A%0A%20%20%20%20Because%20MDI%20operates%20on%20in-sample%20training%20splits%2C%20any%20continuous%20feature%20with%20large%20numbers%20of%20unique%20random%20values%20will%20be%20chosen%20by%20deep%20trees%20to%20partition%20residuals%2C%20receiving%20high%20artificial%20MDI%20despite%20having%20zero%20true%20relationship%20with%20the%20target.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20LogisticRegression%2C%0A%20%20%20%20RandomForestClassifier%2C%0A%20%20%20%20make_classification%2C%0A%20%20%20%20np%2C%0A%20%20%20%20permutation_importance%2C%0A%20%20%20%20train_test_split%2C%0A)%3A%0A%20%20%20%20np.random.seed(42)%0A%0A%20%20%20%20%23%20Generate%20synthetic%20dataset%3A%0A%20%20%20%20%23%202%20informative%20features%2C%201%20redundant%20(linear%20combination)%2C%202%20pure%20random%20noise%20features%0A%20%20%20%20x_synth%2C%20y_synth%20%3D%20make_classification(%0A%20%20%20%20%20%20%20%20n_samples%3D1200%2C%0A%20%20%20%20%20%20%20%20n_features%3D5%2C%0A%20%20%20%20%20%20%20%20n_informative%3D2%2C%0A%20%20%20%20%20%20%20%20n_redundant%3D1%2C%0A%20%20%20%20%20%20%20%20n_repeated%3D0%2C%0A%20%20%20%20%20%20%20%20n_classes%3D2%2C%0A%20%20%20%20%20%20%20%20weights%3D%5B0.6%2C%200.4%5D%2C%0A%20%20%20%20%20%20%20%20flip_y%3D0.03%2C%0A%20%20%20%20%20%20%20%20random_state%3D42%2C%0A%20%20%20%20)%0A%0A%20%20%20%20feature_names%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%22F0_Informative_1%22%2C%0A%20%20%20%20%20%20%20%20%22F1_Informative_2%22%2C%0A%20%20%20%20%20%20%20%20%22F2_Redundant_Linear%22%2C%0A%20%20%20%20%20%20%20%20%22F3_Pure_Noise_1%22%2C%0A%20%20%20%20%20%20%20%20%22F4_Pure_Noise_2%22%2C%0A%20%20%20%20%5D%0A%0A%20%20%20%20x_train%2C%20x_test%2C%20y_train%2C%20y_test%20%3D%20train_test_split(%0A%20%20%20%20%20%20%20%20x_synth%2C%20y_synth%2C%20test_size%3D0.35%2C%20random_state%3D42%2C%20stratify%3Dy_synth%0A%20%20%20%20)%0A%0A%20%20%20%20%23%201.%20Fit%20Random%20Forest%0A%20%20%20%20rf_model%20%3D%20RandomForestClassifier(n_estimators%3D100%2C%20max_depth%3D6%2C%20random_state%3D42)%0A%20%20%20%20rf_model.fit(x_train%2C%20y_train)%0A%0A%20%20%20%20%23%202.%20Fit%20Logistic%20Regression%0A%20%20%20%20lr_model%20%3D%20LogisticRegression(random_state%3D42)%0A%20%20%20%20lr_model.fit(x_train%2C%20y_train)%0A%0A%20%20%20%20%23%20Permutation%20importance%20on%20holdout%20test%20set%20(15%20repeats)%0A%20%20%20%20n_repeats%20%3D%2015%0A%20%20%20%20pfi_rf%20%3D%20permutation_importance(%0A%20%20%20%20%20%20%20%20rf_model%2C%20x_test%2C%20y_test%2C%20scoring%3D%22accuracy%22%2C%20n_repeats%3Dn_repeats%2C%20random_state%3D42%0A%20%20%20%20)%0A%20%20%20%20pfi_lr%20%3D%20permutation_importance(%0A%20%20%20%20%20%20%20%20lr_model%2C%20x_test%2C%20y_test%2C%20scoring%3D%22accuracy%22%2C%20n_repeats%3Dn_repeats%2C%20random_state%3D42%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20MDI%20for%20Random%20Forest%20on%20training%20data%0A%20%20%20%20mdi_rf%20%3D%20rf_model.feature_importances_%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20feature_names%2C%0A%20%20%20%20%20%20%20%20lr_model%2C%0A%20%20%20%20%20%20%20%20mdi_rf%2C%0A%20%20%20%20%20%20%20%20pfi_lr%2C%0A%20%20%20%20%20%20%20%20pfi_rf%2C%0A%20%20%20%20%20%20%20%20rf_model%2C%0A%20%20%20%20%20%20%20%20x_test%2C%0A%20%20%20%20%20%20%20%20y_test%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20_(feature_names%2C%20go%2C%20make_subplots%2C%20mdi_rf%2C%20mo%2C%20pfi_lr%2C%20pfi_rf)%3A%0A%20%20%20%20fig%20%3D%20make_subplots(%0A%20%20%20%20%20%20%20%20rows%3D1%2C%0A%20%20%20%20%20%20%20%20cols%3D2%2C%0A%20%20%20%20%20%20%20%20subplot_titles%3D%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%3Cb%3EPFI%3A%20Random%20Forest%20vs%20Logistic%20Regression%20(Test%20Set)%3C%2Fb%3E%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%3Cb%3ERandom%20Forest%3A%20MDI%20(Train%20Impurity)%20vs%20PFI%20(Test%20Accuracy)%3C%2Fb%3E%22%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20horizontal_spacing%3D0.14%2C%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Left%3A%20PFI%20RF%20vs%20PFI%20LR%0A%20%20%20%20fig.add_trace(%0A%20%20%20%20%20%20%20%20go.Bar(%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3Dfeature_names%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Dpfi_rf.importances_mean%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20error_x%3Ddict(type%3D%22data%22%2C%20array%3Dpfi_rf.importances_std%2C%20visible%3DTrue)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20orientation%3D%22h%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20marker_color%3D%22%232563EB%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20name%3D%22Random%20Forest%20PFI%22%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20row%3D1%2C%0A%20%20%20%20%20%20%20%20col%3D1%2C%0A%20%20%20%20)%0A%0A%20%20%20%20fig.add_trace(%0A%20%20%20%20%20%20%20%20go.Bar(%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3Dfeature_names%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Dpfi_lr.importances_mean%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20error_x%3Ddict(type%3D%22data%22%2C%20array%3Dpfi_lr.importances_std%2C%20visible%3DTrue)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20orientation%3D%22h%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20marker_color%3D%22%23F59E0B%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20name%3D%22Logistic%20Regression%20PFI%22%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20row%3D1%2C%0A%20%20%20%20%20%20%20%20col%3D1%2C%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Right%3A%20MDI%20vs%20PFI%20for%20RF%0A%20%20%20%20fig.add_trace(%0A%20%20%20%20%20%20%20%20go.Bar(%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3Dfeature_names%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Dmdi_rf%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20orientation%3D%22h%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20marker_color%3D%22%238B5CF6%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20name%3D%22RF%20MDI%20(Gini%20Impurity)%22%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20row%3D1%2C%0A%20%20%20%20%20%20%20%20col%3D2%2C%0A%20%20%20%20)%0A%0A%20%20%20%20fig.add_trace(%0A%20%20%20%20%20%20%20%20go.Bar(%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3Dfeature_names%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Dpfi_rf.importances_mean%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20orientation%3D%22h%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20marker_color%3D%22%2310B981%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20name%3D%22RF%20PFI%20(Test%20Accuracy%20Drop)%22%2C%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20row%3D1%2C%0A%20%20%20%20%20%20%20%20col%3D2%2C%0A%20%20%20%20)%0A%0A%20%20%20%20fig.update_xaxes(title_text%3D%22Accuracy%20Drop%20Upon%20Permutation%22%2C%20row%3D1%2C%20col%3D1)%0A%20%20%20%20fig.update_xaxes(title_text%3D%22Importance%20Metric%20Value%22%2C%20row%3D1%2C%20col%3D2)%0A%20%20%20%20fig.update_yaxes(autorange%3D%22reversed%22)%0A%0A%20%20%20%20fig.update_layout(%0A%20%20%20%20%20%20%20%20template%3D%22plotly_white%22%2C%0A%20%20%20%20%20%20%20%20height%3D500%2C%0A%20%20%20%20%20%20%20%20margin%3Ddict(l%3D40%2C%20r%3D40%2C%20t%3D70%2C%20b%3D50)%2C%0A%20%20%20%20%20%20%20%20legend%3Ddict(orientation%3D%22h%22%2C%20yanchor%3D%22bottom%22%2C%20y%3D-0.28%2C%20xanchor%3D%22center%22%2C%20x%3D0.5)%2C%0A%20%20%20%20%20%20%20%20barmode%3D%22group%22%2C%0A%20%20%20%20)%0A%0A%20%20%20%20viz%20%3D%20mo.ui.plotly(fig)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20accuracy_score%2C%0A%20%20%20%20feature_names%2C%0A%20%20%20%20lr_model%2C%0A%20%20%20%20mdi_rf%2C%0A%20%20%20%20mo%2C%0A%20%20%20%20np%2C%0A%20%20%20%20pd%2C%0A%20%20%20%20pfi_lr%2C%0A%20%20%20%20pfi_rf%2C%0A%20%20%20%20rf_model%2C%0A%20%20%20%20x_test%2C%0A%20%20%20%20y_test%2C%0A)%3A%0A%20%20%20%20%23%20Example%201%3A%20Pure%20NumPy%20Permutation%20Importance%20Implementation%0A%20%20%20%20def%20manual_permutation_importance(model%2C%20x_val%2C%20y_val%2C%20metric_fn%2C%20n_reps%3D10)%3A%0A%20%20%20%20%20%20%20%20base_score%20%3D%20metric_fn(y_val%2C%20model.predict(x_val))%0A%20%20%20%20%20%20%20%20n_feats%20%3D%20x_val.shape%5B1%5D%0A%20%20%20%20%20%20%20%20mean_drops%20%3D%20np.zeros(n_feats)%0A%20%20%20%20%20%20%20%20std_drops%20%3D%20np.zeros(n_feats)%0A%0A%20%20%20%20%20%20%20%20for%20j%20in%20range(n_feats)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20drops%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20_%20in%20range(n_reps)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20x_perm%20%3D%20x_val.copy()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20x_perm%5B%3A%2C%20j%5D%20%3D%20np.random.permutation(x_perm%5B%3A%2C%20j%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20score_perm%20%3D%20metric_fn(y_val%2C%20model.predict(x_perm))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20drops.append(base_score%20-%20score_perm)%0A%20%20%20%20%20%20%20%20%20%20%20%20mean_drops%5Bj%5D%20%3D%20np.mean(drops)%0A%20%20%20%20%20%20%20%20%20%20%20%20std_drops%5Bj%5D%20%3D%20np.std(drops)%0A%0A%20%20%20%20%20%20%20%20return%20mean_drops%2C%20std_drops%0A%0A%20%20%20%20np.random.seed(42)%0A%20%20%20%20manual_means%2C%20manual_stds%20%3D%20manual_permutation_importance(%0A%20%20%20%20%20%20%20%20rf_model%2C%20x_test%2C%20y_test%2C%20accuracy_score%2C%20n_reps%3D15%0A%20%20%20%20)%0A%0A%20%20%20%20df_verification%20%3D%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Feature%22%3A%20feature_names%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22From_Scratch_PFI_Mean%22%3A%20manual_means.round(4)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Sklearn_PFI_Mean%22%3A%20pfi_rf.importances_mean.round(4)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Difference%22%3A%20np.abs(manual_means%20-%20pfi_rf.importances_mean).round(6)%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Example%202%3A%20Quantitative%20MDI%20vs%20PFI%20Diagnostic%20Comparison%20Table%0A%20%20%20%20df_diagnostic%20%3D%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Feature_Name%22%3A%20feature_names%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Role%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Primary%20Informative%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Primary%20Informative%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Redundant%20Linear%20Combination%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Pure%20Gaussian%20Noise%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Pure%20Gaussian%20Noise%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22MDI_Train_Impurity%22%3A%20mdi_rf.round(4)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22PFI_Test_Mean%22%3A%20pfi_rf.importances_mean.round(4)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22PFI_Test_Std%22%3A%20pfi_rf.importances_std.round(4)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22False_Positive_In_MDI%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22No%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22No%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22No%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Yes%20(Non-zero%20train%20Gini)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Yes%20(Non-zero%20train%20Gini)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Example%203%3A%20Model%20Architecture%20Comparison%20Table%20(Random%20Forest%20vs%20Logistic%20Regression)%0A%20%20%20%20rf_acc%20%3D%20accuracy_score(y_test%2C%20rf_model.predict(x_test))%0A%20%20%20%20lr_acc%20%3D%20accuracy_score(y_test%2C%20lr_model.predict(x_test))%0A%0A%20%20%20%20df_models%20%3D%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Model%22%3A%20%22Random%20Forest%20(Non-Linear)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Test_Accuracy%22%3A%20f%22%7Brf_acc%20*%20100%3A.2f%7D%25%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Top_Feature%22%3A%20feature_names%5Bnp.argmax(pfi_rf.importances_mean)%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Top_Feature_PFI%22%3A%20f%22%7Bnp.max(pfi_rf.importances_mean)%20*%20100%3A.2f%7D%25%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Noise_Feature_PFI_Sum%22%3A%20f%22%7Bnp.sum(pfi_rf.importances_mean%5B3%3A%5D)%20*%20100%3A.2f%7D%25%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Model%22%3A%20%22Logistic%20Regression%20(Linear)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Test_Accuracy%22%3A%20f%22%7Blr_acc%20*%20100%3A.2f%7D%25%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Top_Feature%22%3A%20feature_names%5Bnp.argmax(pfi_lr.importances_mean)%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Top_Feature_PFI%22%3A%20f%22%7Bnp.max(pfi_lr.importances_mean)%20*%20100%3A.2f%7D%25%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Noise_Feature_PFI_Sum%22%3A%20f%22%7Bnp.sum(pfi_lr.importances_mean%5B3%3A%5D)%20*%20100%3A.2f%7D%25%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%0A%20%20%20%20table_verif%20%3D%20mo.ui.table(df_verification)%0A%20%20%20%20table_diag%20%3D%20mo.ui.table(df_diagnostic)%0A%20%20%20%20table_models%20%3D%20mo.ui.table(df_models)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
92f52eeee352c517f746e40295a30622