From 8bbb653ba26927d5b6f30217ce83abe9add75759 Mon Sep 17 00:00:00 2001 From: Pat Alt <55311242+pat-alt@users.noreply.github.com> Date: Wed, 5 Apr 2023 17:57:28 +0200 Subject: [PATCH] ufff --- notebooks/Manifest.toml | 2 +- notebooks/Project.toml | 1 + notebooks/mnist.qmd | 28 +++++++++++++++++++++------- www/cce_mnist.png | Bin 13286 -> 13058 bytes 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/notebooks/Manifest.toml b/notebooks/Manifest.toml index edccb799..c0afb208 100644 --- a/notebooks/Manifest.toml +++ b/notebooks/Manifest.toml @@ -2,7 +2,7 @@ julia_version = "1.8.5" manifest_format = "2.0" -project_hash = "512d9080e47cd18c9e3a640716f9947dd8512bcb" +project_hash = "70fd26ae44f12d0456544e252f519edafee7b553" [[deps.AbstractFFTs]] deps = ["ChainRulesCore", "LinearAlgebra"] diff --git a/notebooks/Project.toml b/notebooks/Project.toml index 538c2879..614baa9d 100644 --- a/notebooks/Project.toml +++ b/notebooks/Project.toml @@ -21,4 +21,5 @@ MLUtils = "f1d291b0-491e-4a28-83b9-f70985020b54" Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" Serialization = "9e88b42a-f829-5b0c-bbe9-9e923198166b" +StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" Tidier = "f0413319-3358-4bb0-8e7c-0c83523a93bd" diff --git a/notebooks/mnist.qmd b/notebooks/mnist.qmd index c04ca57e..7a1a41dd 100644 --- a/notebooks/mnist.qmd +++ b/notebooks/mnist.qmd @@ -7,7 +7,7 @@ eval(setup_notebooks) ```{julia} # Data: -counterfactual_data = load_mnist(1000) +counterfactual_data = load_mnist() X, y = CounterfactualExplanations.DataPreprocessing.unpack_data(counterfactual_data) X = table(permutedims(X)) labels = counterfactual_data.output_encoder.labels @@ -16,7 +16,11 @@ input_dim, n_obs = size(counterfactual_data.X) ```{julia} epochs = 100 -clf = NeuralNetworkClassifier(builder=MLJFlux.MLP(hidden=(32,), σ=relu), epochs=epochs) +clf = NeuralNetworkClassifier( + builder=MLJFlux.MLP(hidden=(32,), σ=relu), + epochs=epochs, + batch_size=Int(round(n_obs/10)) +) conf_model = conformal_model(clf; method=:simple_inductive) mach = machine(conf_model, X, labels) fit!(mach) @@ -32,11 +36,17 @@ f1 = CounterfactualExplanations.Models.model_evaluation(M, test_data) println("F1 score (test): $(round(f1,digits=3))") ``` +```{julia} +using CounterfactualExplanations.DataPreprocessing: undersample +dt_reduced = undersample(counterfactual_data, 100) +# dt_reduced = counterfactual_data +``` + ```{julia} # Set up search: -factual_label = 8 +factual_label = 9 x = reshape(counterfactual_data.X[:,rand(findall(predict_label(M, counterfactual_data).==factual_label))],input_dim,1) -target = 3 +target = 4 factual = predict_label(M, counterfactual_data, x)[1] γ = 0.9 T = 100 @@ -44,15 +54,19 @@ T = 100 # Generate counterfactual using generic generator: generator = GenericGenerator() ce_wachter = generate_counterfactual( - x, target, counterfactual_data, M, generator; + x, target, dt_reduced, M, generator; decision_threshold=γ, max_iter=T, initialization=:identity, ) # Generate counterfactual using CCE generator: -generator = CCEGenerator(λ=[0.0,10.0], temp=0.01, opt=CounterfactualExplanations.Generators.JSMADescent(η=5.0)) +generator = CCEGenerator( + λ=[0.0,10.0], + temp=0.01, + # opt=CounterfactualExplanations.Generators.JSMADescent(η=5.0), +) ce_conformal = generate_counterfactual( - x, target, counterfactual_data, M, generator; + x, target, dt_reduced, M, generator; decision_threshold=γ, max_iter=T, initialization=:identity, converge_when=:generator_conditions, diff --git a/www/cce_mnist.png b/www/cce_mnist.png index 85eed69096b075c1519480191c1693cf0ceaf950..6de563ed4b67f3c267336a85556098625edc0b55 100644 GIT binary patch literal 13058 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 KnOx}yPyY+*;0ZYZ literal 13286 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 W?bf>@Rs@B6=++ID>p7_VPyY{9Rg|#+ -- GitLab