From b4c9d046759ce1ad20403350f3d2a78d62ed8f2c Mon Sep 17 00:00:00 2001 From: "Anthony D. Blaom" Date: Sat, 27 Sep 2025 09:59:29 +1200 Subject: [PATCH 1/8] StatisticalMeasures = "0.1, 0.2, 0.3" --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 2f1d9b3..8dd106b 100644 --- a/Project.toml +++ b/Project.toml @@ -19,7 +19,7 @@ MLJScikitLearnInterface = "0.6" MLJModelInterface = "1.10" ScientificTypesBase = "3" StableRNGs = "1" -StatisticalMeasures = "0.1, 0.2" +StatisticalMeasures = "0.1, 0.2, 0.3" Tables = "1.2" Test = "1.6" From 0d37f5916efde8291914d777b44aac1d6eb9a176 Mon Sep 17 00:00:00 2001 From: "Anthony D. Blaom" Date: Sat, 27 Sep 2025 10:49:35 +1200 Subject: [PATCH 2/8] get rid of some noisy test logging --- test/models/featureselector.jl | 14 +++++++------- test/models/rfe.jl | 10 +++++----- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/test/models/featureselector.jl b/test/models/featureselector.jl index d643128..c38dc82 100644 --- a/test/models/featureselector.jl +++ b/test/models/featureselector.jl @@ -12,7 +12,7 @@ # Test feature selection with `features=Symbol[]` namesX = MLJBase.schema(X).names |> collect selector = FeatureSelector() - f, = MLJBase.fit(selector, 1, X) + f, = MLJBase.fit(selector, 0, X) @test f == namesX Xt = MLJBase.transform(selector, f, MLJBase.selectrows(X, 1:2)) @test Set(MLJBase.schema(Xt).names) == Set(namesX) @@ -20,13 +20,13 @@ # Test on selecting features if `features` keyword is defined selector = FeatureSelector(features=[:Zn, :Crim]) - f, = MLJBase.fit(selector, 1, X) + f, = MLJBase.fit(selector, 0, X) @test MLJBase.transform(selector, f, MLJBase.selectrows(X, 1:2)) == MLJBase.select(X, 1:2, [:Zn, :Crim]) # test on ignoring a feature, even if it's listed in the `features` selector.ignore = true - f, = MLJBase.fit(selector, 1, X) + f, = MLJBase.fit(selector, 0, X) Xnew = MLJBase.transform(selector, f, X) @test MLJBase.transform(selector, f, MLJBase.selectrows(X, 1:2)) == MLJBase.select(X, 1:2, [:x3, :x4]) @@ -35,7 +35,7 @@ selector = FeatureSelector(features=[:x1, :mickey_mouse]) @test_throws( ArgumentError, - MLJBase.fit(selector, 1, X) + MLJBase.fit(selector, 0, X) ) selector.ignore = true @test_logs( @@ -50,13 +50,13 @@ selector = FeatureSelector(features= x-> x == (:x1)) @test_throws( ArgumentError, - MLJBase.fit(selector, 1, X) + MLJBase.fit(selector, 0, X) ) selector.ignore = true selector.features = x-> x in [:Zn, :Crim, :x3, :x4] @test_throws( ArgumentError, - MLJBase.fit(selector, 1, X) + MLJBase.fit(selector, 0, X) ) # Test model Metadata @@ -67,4 +67,4 @@ end # To be added with FeatureSelectorRule X = (n1=["a", "b", "a"], n2=["g", "g", "g"], n3=[7, 8, 9], # n4 =UInt8[3,5,10], o1=[4.5, 3.6, 4.0], ) # MLJBase.schema(X) -# Xc = coerce(X, :n1=>Multiclass, :n2=>Multiclass) \ No newline at end of file +# Xc = coerce(X, :n1=>Multiclass, :n2=>Multiclass) diff --git a/test/models/rfe.jl b/test/models/rfe.jl index 4c5e2d0..fb635c9 100644 --- a/test/models/rfe.jl +++ b/test/models/rfe.jl @@ -62,9 +62,9 @@ const DTM = DummyTestModels selector_mach3 = machine(selector3, Xt, y) selector_mach4 = machine(selector4, Xt, y) - fit!(selector_mach) - fit!(selector_mach2) - fit!(selector_mach3) + fit!(selector_mach, verbosity=0) + fit!(selector_mach2, verbosity=0) + fit!(selector_mach3, verbosity=0) @test_logs( (:warn, "n_features > number of features in training data, hence no feature will be eliminated."), match_mode=:any, @@ -149,7 +149,7 @@ end svm = SVR(kernel="linear") rfe = RecursiveFeatureElimination(model=svm, n_features=5) mach = machine(rfe, Xs, ys) - fit!(mach) + fit!(mach, verbosity=0) rfecv = RecursiveFeatureElimination(model=svm) tuning_rfe_model = TunedModel( @@ -160,7 +160,7 @@ end range=range(rfecv, :n_features, values=1:10) ) self_tuning_rfe_mach = machine(tuning_rfe_model, Xs, ys) - fit!(self_tuning_rfe_mach) + fit!(self_tuning_rfe_mach, verbosity=0) # Compare results # Convert MLJ RFE scores to rankings From 9aec7ebf6ca542d3249a6dbef16fa40cb862d10b Mon Sep 17 00:00:00 2001 From: "Anthony D. Blaom" Date: Sat, 27 Sep 2025 10:51:37 +1200 Subject: [PATCH 3/8] dump support for julia < 1.10 --- .github/workflows/ci.yml | 2 +- Project.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 36384a9..d29561f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,7 @@ jobs: fail-fast: false matrix: version: - - '1.6' + - '1.10' - '1' # automatically expands to the latest stable 1.x release of Julia. os: - ubuntu-latest diff --git a/Project.toml b/Project.toml index 8dd106b..c233e82 100644 --- a/Project.toml +++ b/Project.toml @@ -11,7 +11,7 @@ Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" [compat] Aqua = "0.8" Distributions = "0.25" -julia = "1.6" +julia = "1.10" MLJBase = "1.4" MLJTuning = "0.8" MLJDecisionTreeInterface = "0.4" From fd7c85eb5b33707e8351398ff86f9120b738f2d2 Mon Sep 17 00:00:00 2001 From: "Anthony D. Blaom" Date: Sat, 27 Sep 2025 10:54:30 +1200 Subject: [PATCH 4/8] bump 0.2.4 --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index c233e82..0ae8b54 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "FeatureSelection" uuid = "33837fe5-dbff-4c9e-8c2f-c5612fe2b8b6" authors = ["Anthony D. Blaom ", "Samuel Okon Date: Tue, 4 Nov 2025 15:29:15 +1300 Subject: [PATCH 5/8] fix a doctest broken by removal of type piracy in MLJBase.show --- docs/src/index.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/docs/src/index.md b/docs/src/index.md index e17ecec..570b892 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -104,11 +104,10 @@ We can view the important features used by our model by inspecting the `fitted_p object. ```jldoctest julia> p = fitted_params(mach) -(features_left = [:x4, :x2, :x1, :x5, :x3], - model_fitresult = (forest = Ensemble of Decision Trees -Trees: 100 -Avg Leaves: 25.3 -Avg Depth: 8.01,),) +(features_left = [:x4, :x2, :x1, :x5, :x3], model_fitresult = (forest = Ensemble of Decision Trees +│ Trees: 100 +│ Avg Leaves: 25.3 +│ Avg Depth: 8.01,)) julia> p.features_left 5-element Vector{Symbol}: @@ -180,4 +179,4 @@ For resampling methods different from cross-validation, and for other [MLJ Documentation](https://juliaai.github.io/MLJ.jl/dev/) ```@meta DocTestSetup = nothing -``` \ No newline at end of file +``` From a93a20fcaa506b165a8a29e211b75c8bf41717a3 Mon Sep 17 00:00:00 2001 From: "Anthony D. Blaom" Date: Tue, 4 Nov 2025 15:50:11 +1300 Subject: [PATCH 6/8] try again --- docs/src/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/src/index.md b/docs/src/index.md index 570b892..ca84fbb 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -105,9 +105,9 @@ object. ```jldoctest julia> p = fitted_params(mach) (features_left = [:x4, :x2, :x1, :x5, :x3], model_fitresult = (forest = Ensemble of Decision Trees -│ Trees: 100 -│ Avg Leaves: 25.3 -│ Avg Depth: 8.01,)) +Trees: 100 +Avg Leaves: 25.3 +Avg Depth: 8.01,)) julia> p.features_left 5-element Vector{Symbol}: From ce03b0f020dd076f200fbe8b545ae304fe7bf0ad Mon Sep 17 00:00:00 2001 From: "Anthony D. Blaom" Date: Wed, 5 Nov 2025 07:06:36 +1300 Subject: [PATCH 7/8] try one more time --- docs/src/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/src/index.md b/docs/src/index.md index ca84fbb..10935e8 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -108,6 +108,7 @@ julia> p = fitted_params(mach) Trees: 100 Avg Leaves: 25.3 Avg Depth: 8.01,)) +Avg Depth: 8.01,)) julia> p.features_left 5-element Vector{Symbol}: From 1970915cd6ad875f7389f7599886f5415a65f82c Mon Sep 17 00:00:00 2001 From: "Anthony D. Blaom" Date: Wed, 5 Nov 2025 07:14:13 +1300 Subject: [PATCH 8/8] and again... --- docs/src/index.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/src/index.md b/docs/src/index.md index 10935e8..ca84fbb 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -108,7 +108,6 @@ julia> p = fitted_params(mach) Trees: 100 Avg Leaves: 25.3 Avg Depth: 8.01,)) -Avg Depth: 8.01,)) julia> p.features_left 5-element Vector{Symbol}: