diff --git a/docs/Project.toml b/docs/Project.toml index c86ddfde..720d52a7 100644 --- a/docs/Project.toml +++ b/docs/Project.toml @@ -1,5 +1,6 @@ [deps] CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +CategoricalArrays = "324d7699-5711-5eae-9e2f-1d82baa6b597" DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" DocumenterTools = "35a29f4d-8980-5a13-9543-d66fff28ecb8" @@ -16,5 +17,9 @@ MLJXGBoostInterface = "54119dfa-1dab-4055-a167-80440f4f7a91" MLUtils = "f1d291b0-491e-4a28-83b9-f70985020b54" Optimisers = "3bd65402-5787-11e9-1adc-39752487f4e2" Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +ProgressMeter = "92933f4c-e287-5a05-a399-4b506db050ca" RDatasets = "ce6b1742-4840-55fa-b093-852dadbb1d8b" +Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +ScientificTypes = "321657f4-b219-11e9-178b-2701a2544e81" +Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" WordTokenizers = "796a5d58-b03d-544a-977e-18100b691f6e" diff --git a/docs/make.jl b/docs/make.jl index 4c2b0d2c..b80a3dc0 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -2,7 +2,7 @@ using Documenter using MLJFlux using Flux -DocMeta.setdocmeta!(MLJFlux, :DocTestSetup, :(using MLJFlux); recursive=true) +DocMeta.setdocmeta!(MLJFlux, :DocTestSetup, :(using MLJFlux); recursive = true) makedocs( sitename = "MLJFlux", @@ -17,42 +17,36 @@ makedocs( asset( "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css", class = :css, - ) + ), ], - repolink="https://github.com/FluxML/MLJFlux.jl" + repolink = "https://github.com/FluxML/MLJFlux.jl", ), modules = [MLJFlux], warnonly = true, pages = [ "Introduction" => "index.md", "Interface" => Any[ - "Summary" => "interface/Summary.md", - "Builders" => "interface/Builders.md", - "Custom Builders" => "interface/Custom Builders.md", - "Classification" => "interface/Classification.md", - "Regression" => "interface/Regression.md", - "Multi-Target Regression" => "interface/Multitarget Regression.md", - "Image Classification" => "interface/Image Classification.md", + "Summary"=>"interface/Summary.md", + "Builders"=>"interface/Builders.md", + "Custom Builders"=>"interface/Custom Builders.md", + "Classification"=>"interface/Classification.md", + "Regression"=>"interface/Regression.md", + "Multi-Target Regression"=>"interface/Multitarget Regression.md", + "Image Classification"=>"interface/Image Classification.md", ], "Common Workflows" => Any[ - "Incremental Training" => - "common_workflows/incremental_training/notebook.md", - "Hyperparameter Tuning" => - "common_workflows/hyperparameter_tuning/notebook.md", - "Model Composition" => - "common_workflows/composition/notebook.md", - "Model Comparison" => - "common_workflows/comparison/notebook.md", - "Early Stopping" => - "common_workflows/early_stopping/notebook.md", - "Live Training" => - "common_workflows/live_training/notebook.md", - "Neural Architecture Search" => - "common_workflows/architecture_search/notebook.md", + "Incremental Training"=>"common_workflows/incremental_training/notebook.md", + "Entity Embeddings"=>"common_workflows/entity_embeddings/notebook.md", + "Hyperparameter Tuning"=>"common_workflows/hyperparameter_tuning/notebook.md", + "Model Composition"=>"common_workflows/composition/notebook.md", + "Model Comparison"=>"common_workflows/comparison/notebook.md", + "Early Stopping"=>"common_workflows/early_stopping/notebook.md", + "Live Training"=>"common_workflows/live_training/notebook.md", + "Neural Architecture Search"=>"common_workflows/architecture_search/notebook.md", ], "Extended Examples" => Any[ - "MNIST Images" => "extended_examples/MNIST/notebook.md", - "Spam Detection with RNNs" => "extended_examples/spam_detection/notebook.md", + "MNIST Images"=>"extended_examples/MNIST/notebook.md", + "Spam Detection with RNNs"=>"extended_examples/spam_detection/notebook.md", ], "Contributing" => "contributing.md"], doctest = false, diff --git a/docs/src/common_workflows/entity_embeddings/Manifest.toml b/docs/src/common_workflows/entity_embeddings/Manifest.toml new file mode 100644 index 00000000..bba70ae3 --- /dev/null +++ b/docs/src/common_workflows/entity_embeddings/Manifest.toml @@ -0,0 +1,2146 @@ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.11.1" +manifest_format = "2.0" +project_hash = "e3bdab57cceee403b38faa80687d7ee87d9f1ccf" + +[[deps.ARFFFiles]] +deps = ["CategoricalArrays", "Dates", "Parsers", "Tables"] +git-tree-sha1 = "678eb18590a8bc6674363da4d5faa4ac09c40a18" +uuid = "da404889-ca92-49ff-9e8b-0aa6b4d38dc8" +version = "1.5.0" + +[[deps.AbstractFFTs]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "d92ad398961a3ed262d8bf04a1a2b8340f915fef" +uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" +version = "1.5.0" +weakdeps = ["ChainRulesCore", "Test"] + + [deps.AbstractFFTs.extensions] + AbstractFFTsChainRulesCoreExt = "ChainRulesCore" + AbstractFFTsTestExt = "Test" + +[[deps.Accessors]] +deps = ["CompositionsBase", "ConstructionBase", "InverseFunctions", "LinearAlgebra", "MacroTools", "Markdown"] +git-tree-sha1 = "b392ede862e506d451fc1616e79aa6f4c673dab8" +uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" +version = "0.1.38" + + [deps.Accessors.extensions] + AccessorsAxisKeysExt = "AxisKeys" + AccessorsDatesExt = "Dates" + AccessorsIntervalSetsExt = "IntervalSets" + AccessorsStaticArraysExt = "StaticArrays" + AccessorsStructArraysExt = "StructArrays" + AccessorsTestExt = "Test" + AccessorsUnitfulExt = "Unitful" + + [deps.Accessors.weakdeps] + AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5" + Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + Requires = "ae029012-a4dd-5104-9daa-d747884805df" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.Adapt]] +deps = ["LinearAlgebra", "Requires"] +git-tree-sha1 = "d80af0733c99ea80575f612813fa6aa71022d33a" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "4.1.0" +weakdeps = ["StaticArrays"] + + [deps.Adapt.extensions] + AdaptStaticArraysExt = "StaticArrays" + +[[deps.AliasTables]] +deps = ["PtrArrays", "Random"] +git-tree-sha1 = "9876e1e164b144ca45e9e3198d0b689cadfed9ff" +uuid = "66dad0bd-aa9a-41b7-9441-69ab47430ed8" +version = "1.1.3" + +[[deps.ArgCheck]] +git-tree-sha1 = "a3a402a35a2f7e0b87828ccabbd5ebfbebe356b4" +uuid = "dce04be8-c92d-5529-be00-80e4d2c0e197" +version = "2.3.0" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.2" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" +version = "1.11.0" + +[[deps.Atomix]] +deps = ["UnsafeAtomics"] +git-tree-sha1 = "c06a868224ecba914baa6942988e2f2aade419be" +uuid = "a9b6321e-bd34-4604-b9c9-b65b8de01458" +version = "0.1.0" + +[[deps.BSON]] +git-tree-sha1 = "4c3e506685c527ac6a54ccc0c8c76fd6f91b42fb" +uuid = "fbb218c0-5317-5bc6-957e-2ee96dd4b1f0" +version = "0.3.9" + +[[deps.BangBang]] +deps = ["Accessors", "ConstructionBase", "InitialValues", "LinearAlgebra", "Requires"] +git-tree-sha1 = "e2144b631226d9eeab2d746ca8880b7ccff504ae" +uuid = "198e06fe-97b7-11e9-32a5-e1d131e6ad66" +version = "0.4.3" + + [deps.BangBang.extensions] + BangBangChainRulesCoreExt = "ChainRulesCore" + BangBangDataFramesExt = "DataFrames" + BangBangStaticArraysExt = "StaticArrays" + BangBangStructArraysExt = "StructArrays" + BangBangTablesExt = "Tables" + BangBangTypedTablesExt = "TypedTables" + + [deps.BangBang.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" + TypedTables = "9d95f2ec-7b3d-5a63-8d20-e2491e220bb9" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" +version = "1.11.0" + +[[deps.Baselet]] +git-tree-sha1 = "aebf55e6d7795e02ca500a689d326ac979aaf89e" +uuid = "9718e550-a3fa-408a-8086-8db961cd8217" +version = "0.1.1" + +[[deps.BitFlags]] +git-tree-sha1 = "0691e34b3bb8be9307330f88d1a3c3f25466c24d" +uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" +version = "0.1.9" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "8873e196c2eb87962a2048b3b8e08946535864a1" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.8+2" + +[[deps.CEnum]] +git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.5.0" + +[[deps.CSV]] +deps = ["CodecZlib", "Dates", "FilePathsBase", "InlineStrings", "Mmap", "Parsers", "PooledArrays", "PrecompileTools", "SentinelArrays", "Tables", "Unicode", "WeakRefStrings", "WorkerUtilities"] +git-tree-sha1 = "deddd8725e5e1cc49ee205a1964256043720a6c3" +uuid = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +version = "0.10.15" + +[[deps.Cairo_jll]] +deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "009060c9a6168704143100f36ab08f06c2af4642" +uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" +version = "1.18.2+1" + +[[deps.CategoricalArrays]] +deps = ["DataAPI", "Future", "Missings", "Printf", "Requires", "Statistics", "Unicode"] +git-tree-sha1 = "1568b28f91293458345dabba6a5ea3f183250a61" +uuid = "324d7699-5711-5eae-9e2f-1d82baa6b597" +version = "0.10.8" + + [deps.CategoricalArrays.extensions] + CategoricalArraysJSONExt = "JSON" + CategoricalArraysRecipesBaseExt = "RecipesBase" + CategoricalArraysSentinelArraysExt = "SentinelArrays" + CategoricalArraysStructTypesExt = "StructTypes" + + [deps.CategoricalArrays.weakdeps] + JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" + RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" + SentinelArrays = "91c51154-3ec4-41a3-a24f-3f23e20d615c" + StructTypes = "856f2bd8-1eba-4b0a-8007-ebc267875bd4" + +[[deps.CategoricalDistributions]] +deps = ["CategoricalArrays", "Distributions", "Missings", "OrderedCollections", "Random", "ScientificTypes"] +git-tree-sha1 = "926862f549a82d6c3a7145bc7f1adff2a91a39f0" +uuid = "af321ab8-2d2e-40a6-b165-3d674595d28e" +version = "0.1.15" + + [deps.CategoricalDistributions.extensions] + UnivariateFiniteDisplayExt = "UnicodePlots" + + [deps.CategoricalDistributions.weakdeps] + UnicodePlots = "b8865327-cd53-5732-bb35-84acbb429228" + +[[deps.ChainRules]] +deps = ["Adapt", "ChainRulesCore", "Compat", "Distributed", "GPUArraysCore", "IrrationalConstants", "LinearAlgebra", "Random", "RealDot", "SparseArrays", "SparseInverseSubset", "Statistics", "StructArrays", "SuiteSparse"] +git-tree-sha1 = "be227d253d132a6d57f9ccf5f67c0fb6488afd87" +uuid = "082447d4-558c-5d27-93f4-14fc19e9eca2" +version = "1.71.0" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra"] +git-tree-sha1 = "3e4b134270b372f2ed4d4d0e936aabaefc1802bc" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.25.0" +weakdeps = ["SparseArrays"] + + [deps.ChainRulesCore.extensions] + ChainRulesCoreSparseArraysExt = "SparseArrays" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "bce6804e5e6044c6daab27bb533d1295e4a2e759" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.6" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] +git-tree-sha1 = "13951eb68769ad1cd460cdb2e64e5e95f1bf123d" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.27.0" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "b10d0b65641d57b8b4d5e234446582de5047050d" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.11.5" + +[[deps.ColorVectorSpace]] +deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] +git-tree-sha1 = "a1f44953f2382ebb937d60dafbe2deea4bd23249" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.10.0" +weakdeps = ["SpecialFunctions"] + + [deps.ColorVectorSpace.extensions] + SpecialFunctionsExt = "SpecialFunctions" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "362a287c3aa50601b0bc359053d5c2468f0e7ce0" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.12.11" + +[[deps.Combinatorics]] +git-tree-sha1 = "08c8b6831dc00bfea825826be0bc8336fc369860" +uuid = "861a8166-3701-5b0c-9a16-15d98fcdc6aa" +version = "1.0.2" + +[[deps.CommonSubexpressions]] +deps = ["MacroTools"] +git-tree-sha1 = "cda2cfaebb4be89c9084adaca7dd7333369715c5" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.3.1" + +[[deps.Compat]] +deps = ["TOML", "UUIDs"] +git-tree-sha1 = "8ae8d32e09f0dcf42a36b90d4e17f5dd2e4c4215" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.16.0" +weakdeps = ["Dates", "LinearAlgebra"] + + [deps.Compat.extensions] + CompatLinearAlgebraExt = "LinearAlgebra" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.1.1+0" + +[[deps.CompositionsBase]] +git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad" +uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b" +version = "0.1.2" +weakdeps = ["InverseFunctions"] + + [deps.CompositionsBase.extensions] + CompositionsBaseInverseFunctionsExt = "InverseFunctions" + +[[deps.ComputationalResources]] +git-tree-sha1 = "52cb3ec90e8a8bea0e62e275ba577ad0f74821f7" +uuid = "ed09eef8-17a6-5b46-8889-db040fac31e3" +version = "0.3.2" + +[[deps.ConcurrentUtilities]] +deps = ["Serialization", "Sockets"] +git-tree-sha1 = "ea32b83ca4fefa1768dc84e504cc0a94fb1ab8d1" +uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" +version = "2.4.2" + +[[deps.ConstructionBase]] +git-tree-sha1 = "76219f1ed5771adbb096743bff43fb5fdd4c1157" +uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" +version = "1.5.8" + + [deps.ConstructionBase.extensions] + ConstructionBaseIntervalSetsExt = "IntervalSets" + ConstructionBaseLinearAlgebraExt = "LinearAlgebra" + ConstructionBaseStaticArraysExt = "StaticArrays" + + [deps.ConstructionBase.weakdeps] + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.ContextVariablesX]] +deps = ["Compat", "Logging", "UUIDs"] +git-tree-sha1 = "25cc3803f1030ab855e383129dcd3dc294e322cc" +uuid = "6add18c4-b38d-439d-96f6-d6bc489c04c5" +version = "0.1.3" + +[[deps.Contour]] +git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.6.3" + +[[deps.Crayons]] +git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" +uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" +version = "4.1.1" + +[[deps.DataAPI]] +git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.16.0" + +[[deps.DataFrames]] +deps = ["Compat", "DataAPI", "DataStructures", "Future", "InlineStrings", "InvertedIndices", "IteratorInterfaceExtensions", "LinearAlgebra", "Markdown", "Missings", "PooledArrays", "PrecompileTools", "PrettyTables", "Printf", "Random", "Reexport", "SentinelArrays", "SortingAlgorithms", "Statistics", "TableTraits", "Tables", "Unicode"] +git-tree-sha1 = "fb61b4812c49343d7ef0b533ba982c46021938a6" +uuid = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +version = "1.7.0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "1d0a14036acb104d9e89698bd408f63ab58cdc82" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.20" + +[[deps.DataValueInterfaces]] +git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" +uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" +version = "1.0.0" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" +version = "1.11.0" + +[[deps.Dbus_jll]] +deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "fc173b380865f70627d7dd1190dc2fce6cc105af" +uuid = "ee1fde0b-3d02-5ea6-8484-8dfef6360eab" +version = "1.14.10+0" + +[[deps.DefineSingletons]] +git-tree-sha1 = "0fba8b706d0178b4dc7fd44a96a92382c9065c2c" +uuid = "244e2a9f-e319-4986-a169-4d1fe445cd52" +version = "0.1.2" + +[[deps.DelimitedFiles]] +deps = ["Mmap"] +git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae" +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" +version = "1.9.1" + +[[deps.DiffResults]] +deps = ["StaticArraysCore"] +git-tree-sha1 = "782dd5f4561f5d267313f23853baaaa4c52ea621" +uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" +version = "1.1.0" + +[[deps.DiffRules]] +deps = ["IrrationalConstants", "LogExpFunctions", "NaNMath", "Random", "SpecialFunctions"] +git-tree-sha1 = "23163d55f885173722d1e4cf0f6110cdbaf7e272" +uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" +version = "1.15.1" + +[[deps.Distances]] +deps = ["LinearAlgebra", "Statistics", "StatsAPI"] +git-tree-sha1 = "c7e3a542b999843086e2f29dac96a618c105be1d" +uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" +version = "0.10.12" +weakdeps = ["ChainRulesCore", "SparseArrays"] + + [deps.Distances.extensions] + DistancesChainRulesCoreExt = "ChainRulesCore" + DistancesSparseArraysExt = "SparseArrays" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" +version = "1.11.0" + +[[deps.Distributions]] +deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] +git-tree-sha1 = "d7477ecdafb813ddee2ae727afa94e9dcb5f3fb0" +uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" +version = "0.25.112" + + [deps.Distributions.extensions] + DistributionsChainRulesCoreExt = "ChainRulesCore" + DistributionsDensityInterfaceExt = "DensityInterface" + DistributionsTestExt = "Test" + + [deps.Distributions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DensityInterface = "b429d917-457f-4dbc-8f4c-0cc954292b1d" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "2fb1e02f2b635d0845df5d7c167fec4dd739b00d" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.3" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.EarlyStopping]] +deps = ["Dates", "Statistics"] +git-tree-sha1 = "98fdf08b707aaf69f524a6cd0a67858cefe0cfb6" +uuid = "792122b4-ca99-40de-a6bc-6742525f08b6" +version = "0.3.0" + +[[deps.EpollShim_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8e9441ee83492030ace98f9789a654a6d0b1f643" +uuid = "2702e6a9-849d-5ed8-8c21-79e8b8f9ee43" +version = "0.0.20230411+0" + +[[deps.ExceptionUnwrapping]] +deps = ["Test"] +git-tree-sha1 = "dcb08a0d93ec0b1cdc4af184b26b591e9695423a" +uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4" +version = "0.1.10" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1c6317308b9dc757616f0b5cb379db10494443a7" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.6.2+0" + +[[deps.ExprTools]] +git-tree-sha1 = "27415f162e6028e81c72b82ef756bf321213b6ec" +uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" +version = "0.1.10" + +[[deps.FFMPEG]] +deps = ["FFMPEG_jll"] +git-tree-sha1 = "53ebe7511fa11d33bec688a9178fac4e49eeee00" +uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" +version = "0.4.2" + +[[deps.FFMPEG_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "466d45dc38e15794ec7d5d63ec03d776a9aff36e" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "4.4.4+1" + +[[deps.FLoops]] +deps = ["BangBang", "Compat", "FLoopsBase", "InitialValues", "JuliaVariables", "MLStyle", "Serialization", "Setfield", "Transducers"] +git-tree-sha1 = "0a2e5873e9a5f54abb06418d57a8df689336a660" +uuid = "cc61a311-1640-44b5-9fba-1b764f453329" +version = "0.2.2" + +[[deps.FLoopsBase]] +deps = ["ContextVariablesX"] +git-tree-sha1 = "656f7a6859be8673bf1f35da5670246b923964f7" +uuid = "b9860ae5-e623-471e-878b-f6a53c775ea6" +version = "0.1.1" + +[[deps.FeatureSelection]] +deps = ["MLJModelInterface", "ScientificTypesBase", "Tables"] +git-tree-sha1 = "d78c565b6296e161193eb0f053bbcb3f1a82091d" +uuid = "33837fe5-dbff-4c9e-8c2f-c5612fe2b8b6" +version = "0.2.2" + +[[deps.FileIO]] +deps = ["Pkg", "Requires", "UUIDs"] +git-tree-sha1 = "62ca0547a14c57e98154423419d8a342dca75ca9" +uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +version = "1.16.4" + +[[deps.FilePathsBase]] +deps = ["Compat", "Dates"] +git-tree-sha1 = "7878ff7172a8e6beedd1dea14bd27c3c6340d361" +uuid = "48062228-2e41-5def-b9a4-89aafe57970f" +version = "0.9.22" +weakdeps = ["Mmap", "Test"] + + [deps.FilePathsBase.extensions] + FilePathsBaseMmapExt = "Mmap" + FilePathsBaseTestExt = "Test" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" +version = "1.11.0" + +[[deps.FillArrays]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "6a70198746448456524cb442b8af316927ff3e1a" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "1.13.0" +weakdeps = ["PDMats", "SparseArrays", "Statistics"] + + [deps.FillArrays.extensions] + FillArraysPDMatsExt = "PDMats" + FillArraysSparseArraysExt = "SparseArrays" + FillArraysStatisticsExt = "Statistics" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.5" + +[[deps.Flux]] +deps = ["Adapt", "ChainRulesCore", "Compat", "Functors", "LinearAlgebra", "MLDataDevices", "MLUtils", "MacroTools", "NNlib", "OneHotArrays", "Optimisers", "Preferences", "ProgressLogging", "Random", "Reexport", "Setfield", "SparseArrays", "SpecialFunctions", "Statistics", "Zygote"] +git-tree-sha1 = "37fa32a50c69c10c6ea1465d3054d98c75bd7777" +uuid = "587475ba-b771-5e3f-ad9e-33799f191a9c" +version = "0.14.22" + + [deps.Flux.extensions] + FluxAMDGPUExt = "AMDGPU" + FluxCUDAExt = "CUDA" + FluxCUDAcuDNNExt = ["CUDA", "cuDNN"] + FluxEnzymeExt = "Enzyme" + FluxMPIExt = "MPI" + FluxMPINCCLExt = ["CUDA", "MPI", "NCCL"] + FluxMetalExt = "Metal" + + [deps.Flux.weakdeps] + AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195" + Metal = "dde4c033-4e86-420c-a63e-0dd931031962" + NCCL = "3fe64909-d7a1-4096-9b7d-7a0f12cf0f6b" + cuDNN = "02a925ec-e4fe-4b08-9a7e-0d78e3d38ccd" + +[[deps.Fontconfig_jll]] +deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"] +git-tree-sha1 = "db16beca600632c95fc8aca29890d83788dd8b23" +uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" +version = "2.13.96+0" + +[[deps.Format]] +git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc" +uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8" +version = "1.3.7" + +[[deps.ForwardDiff]] +deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] +git-tree-sha1 = "cf0fe81336da9fb90944683b8c41984b08793dad" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "0.10.36" +weakdeps = ["StaticArrays"] + + [deps.ForwardDiff.extensions] + ForwardDiffStaticArraysExt = "StaticArrays" + +[[deps.FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "5c1d8ae0efc6c2e7b1fc502cbe25def8f661b7bc" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.13.2+0" + +[[deps.FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1ed150b39aebcc805c26b93a8d0122c940f64ce2" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.14+0" + +[[deps.Functors]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "64d8e93700c7a3f28f717d265382d52fac9fa1c1" +uuid = "d9f16b24-f501-4c13-a1f2-28368ffc5196" +version = "0.4.12" + +[[deps.Future]] +deps = ["Random"] +uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" +version = "1.11.0" + +[[deps.GLFW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll", "libdecor_jll", "xkbcommon_jll"] +git-tree-sha1 = "532f9126ad901533af1d4f5c198867227a7bb077" +uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" +version = "3.4.0+1" + +[[deps.GPUArrays]] +deps = ["Adapt", "GPUArraysCore", "LLVM", "LinearAlgebra", "Printf", "Random", "Reexport", "Serialization", "Statistics"] +git-tree-sha1 = "62ee71528cca49be797076a76bdc654a170a523e" +uuid = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7" +version = "10.3.1" + +[[deps.GPUArraysCore]] +deps = ["Adapt"] +git-tree-sha1 = "ec632f177c0d990e64d955ccc1b8c04c485a0950" +uuid = "46192b85-c4d5-4398-a991-12ede77f4527" +version = "0.1.6" + +[[deps.GR]] +deps = ["Artifacts", "Base64", "DelimitedFiles", "Downloads", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Preferences", "Printf", "Qt6Wayland_jll", "Random", "Serialization", "Sockets", "TOML", "Tar", "Test", "p7zip_jll"] +git-tree-sha1 = "ee28ddcd5517d54e417182fec3886e7412d3926f" +uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" +version = "0.73.8" + +[[deps.GR_jll]] +deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "FreeType2_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Qt6Base_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "f31929b9e67066bee48eec8b03c0df47d31a74b3" +uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" +version = "0.73.8+0" + +[[deps.Gettext_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" +uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" +version = "0.21.0+0" + +[[deps.Glib_jll]] +deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] +git-tree-sha1 = "674ff0db93fffcd11a3573986e550d66cd4fd71f" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.80.5+0" + +[[deps.Graphite2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011" +uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" +version = "1.3.14+0" + +[[deps.Grisu]] +git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" +uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" +version = "1.0.2" + +[[deps.HTTP]] +deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] +git-tree-sha1 = "d1d712be3164d61d1fb98e7ce9bcbc6cc06b45ed" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "1.10.8" + +[[deps.HarfBuzz_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll"] +git-tree-sha1 = "401e4f3f30f43af2c8478fc008da50096ea5240f" +uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" +version = "8.3.1+0" + +[[deps.HypergeometricFunctions]] +deps = ["LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"] +git-tree-sha1 = "7c4195be1649ae622304031ed46a2f4df989f1eb" +uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" +version = "0.3.24" + +[[deps.IRTools]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "950c3717af761bc3ff906c2e8e52bd83390b6ec2" +uuid = "7869d1d1-7146-5819-86e3-90919afe41df" +version = "0.4.14" + +[[deps.InitialValues]] +git-tree-sha1 = "4da0f88e9a39111c2fa3add390ab15f3a44f3ca3" +uuid = "22cec73e-a1b8-11e9-2c92-598750a2cf9c" +version = "0.3.1" + +[[deps.InlineStrings]] +git-tree-sha1 = "45521d31238e87ee9f9732561bfee12d4eebd52d" +uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48" +version = "1.4.2" + + [deps.InlineStrings.extensions] + ArrowTypesExt = "ArrowTypes" + ParsersExt = "Parsers" + + [deps.InlineStrings.weakdeps] + ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd" + Parsers = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" +version = "1.11.0" + +[[deps.InverseFunctions]] +git-tree-sha1 = "a779299d77cd080bf77b97535acecd73e1c5e5cb" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.17" +weakdeps = ["Dates", "Test"] + + [deps.InverseFunctions.extensions] + InverseFunctionsDatesExt = "Dates" + InverseFunctionsTestExt = "Test" + +[[deps.InvertedIndices]] +git-tree-sha1 = "0dc7b50b8d436461be01300fd8cd45aa0274b038" +uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f" +version = "1.3.0" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "630b497eafcc20001bba38a4651b327dcfc491d2" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.2.2" + +[[deps.IterationControl]] +deps = ["EarlyStopping", "InteractiveUtils"] +git-tree-sha1 = "e663925ebc3d93c1150a7570d114f9ea2f664726" +uuid = "b3c1a2ee-3fec-4384-bf48-272ea71de57c" +version = "0.5.4" + +[[deps.IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[deps.JLD2]] +deps = ["FileIO", "MacroTools", "Mmap", "OrderedCollections", "PrecompileTools", "Requires", "TranscodingStreams"] +git-tree-sha1 = "783c1be5213a09609b23237a0c9e5dfd258ae6f2" +uuid = "033835bb-8acc-5ee8-8aae-3f567f8a3819" +version = "0.5.7" + +[[deps.JLFzf]] +deps = ["Pipe", "REPL", "Random", "fzf_jll"] +git-tree-sha1 = "39d64b09147620f5ffbf6b2d3255be3c901bec63" +uuid = "1019f520-868f-41f5-a6de-eb00f4b6a39c" +version = "0.1.8" + +[[deps.JLLWrappers]] +deps = ["Artifacts", "Preferences"] +git-tree-sha1 = "be3dc50a92e5a386872a493a10050136d4703f9b" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.6.1" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.4" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "25ee0be4d43d0269027024d75a24c24d6c6e590c" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "3.0.4+0" + +[[deps.JuliaVariables]] +deps = ["MLStyle", "NameResolution"] +git-tree-sha1 = "49fb3cb53362ddadb4415e9b73926d6b40709e70" +uuid = "b14d175d-62b4-44ba-8fb7-3064adc8c3ec" +version = "0.2.4" + +[[deps.KernelAbstractions]] +deps = ["Adapt", "Atomix", "InteractiveUtils", "MacroTools", "PrecompileTools", "Requires", "StaticArrays", "UUIDs", "UnsafeAtomics", "UnsafeAtomicsLLVM"] +git-tree-sha1 = "04e52f596d0871fa3890170fa79cb15e481e4cd8" +uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c" +version = "0.9.28" + + [deps.KernelAbstractions.extensions] + EnzymeExt = "EnzymeCore" + LinearAlgebraExt = "LinearAlgebra" + SparseArraysExt = "SparseArrays" + + [deps.KernelAbstractions.weakdeps] + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.LAME_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "170b660facf5df5de098d866564877e119141cbd" +uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" +version = "3.100.2+0" + +[[deps.LERC_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "36bdbc52f13a7d1dcb0f3cd694e01677a515655b" +uuid = "88015f11-f218-50d7-93a8-a6af411a945d" +version = "4.0.0+0" + +[[deps.LLVM]] +deps = ["CEnum", "LLVMExtra_jll", "Libdl", "Preferences", "Printf", "Unicode"] +git-tree-sha1 = "d422dfd9707bec6617335dc2ea3c5172a87d5908" +uuid = "929cbde3-209d-540e-8aea-75f648917ca0" +version = "9.1.3" + + [deps.LLVM.extensions] + BFloat16sExt = "BFloat16s" + + [deps.LLVM.weakdeps] + BFloat16s = "ab4f0b2a-ad5b-11e8-123f-65d77653426b" + +[[deps.LLVMExtra_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] +git-tree-sha1 = "05a8bd5a42309a9ec82f700876903abce1017dd3" +uuid = "dad2f222-ce93-54a1-a47d-0025e8a3acab" +version = "0.0.34+0" + +[[deps.LLVMOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "78211fb6cbc872f77cad3fc0b6cf647d923f4929" +uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" +version = "18.1.7+0" + +[[deps.LZO_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "854a9c268c43b77b0a27f22d7fab8d33cdb3a731" +uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" +version = "2.10.2+1" + +[[deps.LaTeXStrings]] +git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.4.0" + +[[deps.Latexify]] +deps = ["Format", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Requires"] +git-tree-sha1 = "ce5f5621cac23a86011836badfedf664a612cee4" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.16.5" + + [deps.Latexify.extensions] + DataFramesExt = "DataFrames" + SparseArraysExt = "SparseArrays" + SymEngineExt = "SymEngine" + + [deps.Latexify.weakdeps] + DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + SymEngine = "123dc426-2d89-5057-bbad-38513e3affd8" + +[[deps.LatinHypercubeSampling]] +deps = ["Random", "StableRNGs", "StatsBase", "Test"] +git-tree-sha1 = "825289d43c753c7f1bf9bed334c253e9913997f8" +uuid = "a5e1c1ea-c99a-51d3-a14d-a9a37257b02d" +version = "1.9.0" + +[[deps.LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" +version = "1.11.0" + +[[deps.LearnAPI]] +deps = ["InteractiveUtils", "Statistics"] +git-tree-sha1 = "ec695822c1faaaa64cee32d0b21505e1977b4809" +uuid = "92ad9a40-7767-427a-9ee6-6e577f1266cb" +version = "0.1.0" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.4" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "8.6.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" +version = "1.11.0" + +[[deps.LibGit2_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] +uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" +version = "1.7.2+0" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.11.0+1" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" +version = "1.11.0" + +[[deps.Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.2.2+1" + +[[deps.Libgcrypt_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll"] +git-tree-sha1 = "9fd170c4bbfd8b935fdc5f8b7aa33532c991a673" +uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" +version = "1.8.11+0" + +[[deps.Libglvnd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"] +git-tree-sha1 = "6f73d1dd803986947b2c750138528a999a6c7733" +uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" +version = "1.6.0+0" + +[[deps.Libgpg_error_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "c6ce1e19f3aec9b59186bdf06cdf3c4fc5f5f3e6" +uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8" +version = "1.50.0+0" + +[[deps.Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "f9557a255370125b405568f9767d6d195822a175" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.17.0+0" + +[[deps.Libmount_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "0c4f9c4f1a50d8f35048fa0532dabbadf702f81e" +uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" +version = "2.40.1+0" + +[[deps.Libtiff_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "b404131d06f7886402758c9ce2214b636eb4d54a" +uuid = "89763e89-9b03-5906-acba-b20f662cd828" +version = "4.7.0+0" + +[[deps.Libuuid_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "5ee6203157c120d79034c748a2acba45b82b8807" +uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" +version = "2.40.1+0" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +version = "1.11.0" + +[[deps.LogExpFunctions]] +deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "a2d09619db4e765091ee5c6ffe8872849de0feea" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.28" + + [deps.LogExpFunctions.extensions] + LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" + LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables" + LogExpFunctionsInverseFunctionsExt = "InverseFunctions" + + [deps.LogExpFunctions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ChangesOfVariables = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" +version = "1.11.0" + +[[deps.LoggingExtras]] +deps = ["Dates", "Logging"] +git-tree-sha1 = "f02b56007b064fbfddb4c9cd60161b6dd0f40df3" +uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" +version = "1.1.0" + +[[deps.MLDataDevices]] +deps = ["Adapt", "Compat", "Functors", "LinearAlgebra", "Preferences", "Random"] +git-tree-sha1 = "3207c2e66164e6366440ad3f0243a8d67abb4a47" +uuid = "7e8f7934-dd98-4c1a-8fe8-92b47a384d40" +version = "1.4.1" + + [deps.MLDataDevices.extensions] + MLDataDevicesAMDGPUExt = "AMDGPU" + MLDataDevicesCUDAExt = "CUDA" + MLDataDevicesChainRulesCoreExt = "ChainRulesCore" + MLDataDevicesFillArraysExt = "FillArrays" + MLDataDevicesGPUArraysExt = "GPUArrays" + MLDataDevicesMLUtilsExt = "MLUtils" + MLDataDevicesMetalExt = ["GPUArrays", "Metal"] + MLDataDevicesReactantExt = "Reactant" + MLDataDevicesRecursiveArrayToolsExt = "RecursiveArrayTools" + MLDataDevicesReverseDiffExt = "ReverseDiff" + MLDataDevicesSparseArraysExt = "SparseArrays" + MLDataDevicesTrackerExt = "Tracker" + MLDataDevicesZygoteExt = "Zygote" + MLDataDevicescuDNNExt = ["CUDA", "cuDNN"] + MLDataDevicesoneAPIExt = ["GPUArrays", "oneAPI"] + + [deps.MLDataDevices.weakdeps] + AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + FillArrays = "1a297f60-69ca-5386-bcde-b61e274b549b" + GPUArrays = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7" + MLUtils = "f1d291b0-491e-4a28-83b9-f70985020b54" + Metal = "dde4c033-4e86-420c-a63e-0dd931031962" + Reactant = "3c362404-f566-11ee-1572-e11a4b42c853" + RecursiveArrayTools = "731186ca-8d62-57ce-b412-fbd966d074cd" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + cuDNN = "02a925ec-e4fe-4b08-9a7e-0d78e3d38ccd" + oneAPI = "8f75cd03-7ff8-4ecb-9b8f-daf728133b1b" + +[[deps.MLFlowClient]] +deps = ["Dates", "FilePathsBase", "HTTP", "JSON", "ShowCases", "URIs", "UUIDs"] +git-tree-sha1 = "9abb12b62debc27261c008daa13627255bf79967" +uuid = "64a0f543-368b-4a9a-827a-e71edb2a0b83" +version = "0.5.1" + +[[deps.MLJ]] +deps = ["CategoricalArrays", "ComputationalResources", "Distributed", "Distributions", "FeatureSelection", "LinearAlgebra", "MLJBalancing", "MLJBase", "MLJEnsembles", "MLJFlow", "MLJIteration", "MLJModels", "MLJTuning", "OpenML", "Pkg", "ProgressMeter", "Random", "Reexport", "ScientificTypes", "StatisticalMeasures", "Statistics", "StatsBase", "Tables"] +git-tree-sha1 = "521eec7a22417d54fdc66f5dc0b7dc9628931c54" +uuid = "add582a8-e3ab-11e8-2d5e-e98b27df1bc7" +version = "0.20.7" + +[[deps.MLJBalancing]] +deps = ["MLJBase", "MLJModelInterface", "MLUtils", "OrderedCollections", "Random", "StatsBase"] +git-tree-sha1 = "f707a01a92d664479522313907c07afa5d81df19" +uuid = "45f359ea-796d-4f51-95a5-deb1a414c586" +version = "0.1.5" + +[[deps.MLJBase]] +deps = ["CategoricalArrays", "CategoricalDistributions", "ComputationalResources", "Dates", "DelimitedFiles", "Distributed", "Distributions", "InteractiveUtils", "InvertedIndices", "LearnAPI", "LinearAlgebra", "MLJModelInterface", "Missings", "OrderedCollections", "Parameters", "PrettyTables", "ProgressMeter", "Random", "RecipesBase", "Reexport", "ScientificTypes", "Serialization", "StatisticalMeasuresBase", "StatisticalTraits", "Statistics", "StatsBase", "Tables"] +git-tree-sha1 = "6f45e12073bc2f2e73ed0473391db38c31e879c9" +uuid = "a7f614a8-145f-11e9-1d2a-a57a1082229d" +version = "1.7.0" +weakdeps = ["StatisticalMeasures"] + + [deps.MLJBase.extensions] + DefaultMeasuresExt = "StatisticalMeasures" + +[[deps.MLJEnsembles]] +deps = ["CategoricalArrays", "CategoricalDistributions", "ComputationalResources", "Distributed", "Distributions", "MLJModelInterface", "ProgressMeter", "Random", "ScientificTypesBase", "StatisticalMeasuresBase", "StatsBase"] +git-tree-sha1 = "84a5be55a364bb6b6dc7780bbd64317ebdd3ad1e" +uuid = "50ed68f4-41fd-4504-931a-ed422449fee0" +version = "0.4.3" + +[[deps.MLJFlow]] +deps = ["MLFlowClient", "MLJBase", "MLJModelInterface"] +git-tree-sha1 = "508bff8071d7d1902d6f1b9d1e868d58821f1cfe" +uuid = "7b7b8358-b45c-48ea-a8ef-7ca328ad328f" +version = "0.5.0" + +[[deps.MLJFlux]] +deps = ["CategoricalArrays", "ColorTypes", "ComputationalResources", "Flux", "MLJModelInterface", "Metalhead", "Optimisers", "ProgressMeter", "Random", "Statistics", "Tables"] +git-tree-sha1 = "98fd05da1bc1527f7849efb645ef1921ccf97c9a" +uuid = "094fc8d1-fd35-5302-93ea-dabda2abf845" +version = "0.6.0" + +[[deps.MLJIteration]] +deps = ["IterationControl", "MLJBase", "Random", "Serialization"] +git-tree-sha1 = "ad16cfd261e28204847f509d1221a581286448ae" +uuid = "614be32b-d00c-4edb-bd02-1eb411ab5e55" +version = "0.6.3" + +[[deps.MLJModelInterface]] +deps = ["Random", "ScientificTypesBase", "StatisticalTraits"] +git-tree-sha1 = "ceaff6618408d0e412619321ae43b33b40c1a733" +uuid = "e80e1ace-859a-464e-9ed9-23947d8ae3ea" +version = "1.11.0" + +[[deps.MLJModels]] +deps = ["CategoricalArrays", "CategoricalDistributions", "Combinatorics", "Dates", "Distances", "Distributions", "InteractiveUtils", "LinearAlgebra", "MLJModelInterface", "Markdown", "OrderedCollections", "Parameters", "Pkg", "PrettyPrinting", "REPL", "Random", "RelocatableFolders", "ScientificTypes", "StatisticalTraits", "Statistics", "StatsBase", "Tables"] +git-tree-sha1 = "c1b1f72379d15079d2c97937d9c1ed38f9ab4679" +uuid = "d491faf4-2d78-11e9-2867-c94bc002c0b7" +version = "0.17.4" + +[[deps.MLJTuning]] +deps = ["ComputationalResources", "Distributed", "Distributions", "LatinHypercubeSampling", "MLJBase", "ProgressMeter", "Random", "RecipesBase", "StatisticalMeasuresBase"] +git-tree-sha1 = "38aab60b1274ce7d6da784808e3be69e585dbbf6" +uuid = "03970b2e-30c4-11ea-3135-d1576263f10f" +version = "0.8.8" + +[[deps.MLStyle]] +git-tree-sha1 = "bc38dff0548128765760c79eb7388a4b37fae2c8" +uuid = "d8e11817-5142-5d16-987a-aa16d5891078" +version = "0.4.17" + +[[deps.MLUtils]] +deps = ["ChainRulesCore", "Compat", "DataAPI", "DelimitedFiles", "FLoops", "NNlib", "Random", "ShowCases", "SimpleTraits", "Statistics", "StatsBase", "Tables", "Transducers"] +git-tree-sha1 = "b45738c2e3d0d402dffa32b2c1654759a2ac35a4" +uuid = "f1d291b0-491e-4a28-83b9-f70985020b54" +version = "0.4.4" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "2fa9ee3e63fd3a4f7a9a4f4744a52f4856de82df" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.13" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" +version = "1.11.0" + +[[deps.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"] +git-tree-sha1 = "c067a280ddc25f196b5e7df3877c6b226d390aaf" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.1.9" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.6+0" + +[[deps.Measures]] +git-tree-sha1 = "c13304c81eec1ed3af7fc20e75fb6b26092a1102" +uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" +version = "0.3.2" + +[[deps.Metalhead]] +deps = ["Artifacts", "BSON", "ChainRulesCore", "Flux", "Functors", "JLD2", "LazyArtifacts", "MLUtils", "NNlib", "PartialFunctions", "Random", "Statistics"] +git-tree-sha1 = "aef476e4958303f5ea9e1deb81a1ba2f510d4e11" +uuid = "dbeba491-748d-5e0e-a39e-b530a07fa0cc" +version = "0.9.4" + + [deps.Metalhead.extensions] + MetalheadCUDAExt = "CUDA" + + [deps.Metalhead.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + +[[deps.MicroCollections]] +deps = ["Accessors", "BangBang", "InitialValues"] +git-tree-sha1 = "44d32db644e84c75dab479f1bc15ee76a1a3618f" +uuid = "128add7d-3638-4c79-886c-908ea0c25c34" +version = "0.2.0" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.2.0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" +version = "1.11.0" + +[[deps.Mocking]] +deps = ["Compat", "ExprTools"] +git-tree-sha1 = "2c140d60d7cb82badf06d8783800d0bcd1a7daa2" +uuid = "78c3b35d-d492-501b-9361-3d52fe80e533" +version = "0.8.1" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2023.12.12" + +[[deps.NNlib]] +deps = ["Adapt", "Atomix", "ChainRulesCore", "GPUArraysCore", "KernelAbstractions", "LinearAlgebra", "Random", "Statistics"] +git-tree-sha1 = "da09a1e112fd75f9af2a5229323f01b56ec96a4c" +uuid = "872c559c-99b0-510c-b3b7-b6c96a88d5cd" +version = "0.9.24" + + [deps.NNlib.extensions] + NNlibAMDGPUExt = "AMDGPU" + NNlibCUDACUDNNExt = ["CUDA", "cuDNN"] + NNlibCUDAExt = "CUDA" + NNlibEnzymeCoreExt = "EnzymeCore" + NNlibFFTWExt = "FFTW" + NNlibForwardDiffExt = "ForwardDiff" + + [deps.NNlib.weakdeps] + AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + FFTW = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + cuDNN = "02a925ec-e4fe-4b08-9a7e-0d78e3d38ccd" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "0877504529a3e5c3343c6f8b4c0381e57e4387e4" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.0.2" + +[[deps.NameResolution]] +deps = ["PrettyPrint"] +git-tree-sha1 = "1a0fa0e9613f46c9b8c11eee38ebb4f590013c5e" +uuid = "71a1bf82-56d0-4bbc-8a3c-48b961074391" +version = "0.1.5" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+1" + +[[deps.OneHotArrays]] +deps = ["Adapt", "ChainRulesCore", "Compat", "GPUArraysCore", "LinearAlgebra", "NNlib"] +git-tree-sha1 = "963a3f28a2e65bb87a68033ea4a616002406037d" +uuid = "0b1bfda6-eb8a-41d2-88d8-f5af5cad476f" +version = "0.2.5" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.27+1" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.1+2" + +[[deps.OpenML]] +deps = ["ARFFFiles", "HTTP", "JSON", "Markdown", "Pkg", "Scratch"] +git-tree-sha1 = "6efb039ae888699d5a74fb593f6f3e10c7193e33" +uuid = "8b6db2d4-7670-4922-a472-f9537c81ab66" +version = "0.3.1" + +[[deps.OpenSSL]] +deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] +git-tree-sha1 = "38cb508d080d21dc1128f7fb04f20387ed4c0af4" +uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" +version = "1.4.3" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "7493f61f55a6cce7325f197443aa80d32554ba10" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "3.0.15+1" + +[[deps.OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.5+0" + +[[deps.Optimisers]] +deps = ["ChainRulesCore", "Functors", "LinearAlgebra", "Random", "Statistics"] +git-tree-sha1 = "6572fe0c5b74431aaeb0b18a4aa5ef03c84678be" +uuid = "3bd65402-5787-11e9-1adc-39752487f4e2" +version = "0.3.3" + +[[deps.Opus_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6703a85cb3781bd5909d48730a67205f3f31a575" +uuid = "91d4177d-7536-5919-b921-800302f37372" +version = "1.3.3+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "dfdf5519f235516220579f949664f1bf44e741c5" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.6.3" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.42.0+1" + +[[deps.PDMats]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "949347156c25054de2db3b166c52ac4728cbad65" +uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" +version = "0.11.31" + +[[deps.Pango_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "FriBidi_jll", "Glib_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e127b609fb9ecba6f201ba7ab753d5a605d53801" +uuid = "36c8627f-9965-5494-a995-c6b170f724f3" +version = "1.54.1+0" + +[[deps.Parameters]] +deps = ["OrderedCollections", "UnPack"] +git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" +uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" +version = "0.12.3" + +[[deps.Parsers]] +deps = ["Dates", "PrecompileTools", "UUIDs"] +git-tree-sha1 = "8489905bcdbcfac64d1daa51ca07c0d8f0283821" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.8.1" + +[[deps.PartialFunctions]] +deps = ["MacroTools"] +git-tree-sha1 = "47b49a4dbc23b76682205c646252c0f9e1eb75af" +uuid = "570af359-4316-4cb7-8c74-252c00c2016b" +version = "1.2.0" + +[[deps.Pipe]] +git-tree-sha1 = "6842804e7867b115ca9de748a0cf6b364523c16d" +uuid = "b98c9c47-44ae-5843-9183-064241ee97a0" +version = "1.3.0" + +[[deps.Pixman_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] +git-tree-sha1 = "35621f10a7531bc8fa58f74610b1bfb70a3cfc6b" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.43.4+0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "Random", "SHA", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.11.0" +weakdeps = ["REPL"] + + [deps.Pkg.extensions] + REPLExt = "REPL" + +[[deps.PlotThemes]] +deps = ["PlotUtils", "Statistics"] +git-tree-sha1 = "6e55c6841ce3411ccb3457ee52fc48cb698d6fb0" +uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" +version = "3.2.0" + +[[deps.PlotUtils]] +deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "StableRNGs", "Statistics"] +git-tree-sha1 = "650a022b2ce86c7dcfbdecf00f78afeeb20e5655" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.4.2" + +[[deps.Plots]] +deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JLFzf", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "PrecompileTools", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "TOML", "UUIDs", "UnicodeFun", "UnitfulLatexify", "Unzip"] +git-tree-sha1 = "45470145863035bb124ca51b320ed35d071cc6c2" +uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +version = "1.40.8" + + [deps.Plots.extensions] + FileIOExt = "FileIO" + GeometryBasicsExt = "GeometryBasics" + IJuliaExt = "IJulia" + ImageInTerminalExt = "ImageInTerminal" + UnitfulExt = "Unitful" + + [deps.Plots.weakdeps] + FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" + GeometryBasics = "5c1252a2-5f33-56bf-86c9-59e7332b4326" + IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" + ImageInTerminal = "d8c32880-2388-543b-8c61-d9f865259254" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.PooledArrays]] +deps = ["DataAPI", "Future"] +git-tree-sha1 = "36d8b4b899628fb92c2749eb488d884a926614d3" +uuid = "2dfb63ee-cc39-5dd5-95bd-886bf059d720" +version = "1.4.3" + +[[deps.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.2.1" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.4.3" + +[[deps.PrettyPrint]] +git-tree-sha1 = "632eb4abab3449ab30c5e1afaa874f0b98b586e4" +uuid = "8162dcfd-2161-5ef2-ae6c-7681170c5f98" +version = "0.2.0" + +[[deps.PrettyPrinting]] +git-tree-sha1 = "142ee93724a9c5d04d78df7006670a93ed1b244e" +uuid = "54e16d92-306c-5ea0-a30b-337be88ac337" +version = "0.4.2" + +[[deps.PrettyTables]] +deps = ["Crayons", "LaTeXStrings", "Markdown", "PrecompileTools", "Printf", "Reexport", "StringManipulation", "Tables"] +git-tree-sha1 = "1101cd475833706e4d0e7b122218257178f48f34" +uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" +version = "2.4.0" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" +version = "1.11.0" + +[[deps.ProgressLogging]] +deps = ["Logging", "SHA", "UUIDs"] +git-tree-sha1 = "80d919dee55b9c50e8d9e2da5eeafff3fe58b539" +uuid = "33c8b6b6-d38a-422a-b730-caa89a2f386c" +version = "0.1.4" + +[[deps.ProgressMeter]] +deps = ["Distributed", "Printf"] +git-tree-sha1 = "8f6bc219586aef8baf0ff9a5fe16ee9c70cb65e4" +uuid = "92933f4c-e287-5a05-a399-4b506db050ca" +version = "1.10.2" + +[[deps.PtrArrays]] +git-tree-sha1 = "77a42d78b6a92df47ab37e177b2deac405e1c88f" +uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d" +version = "1.2.1" + +[[deps.Qt6Base_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Vulkan_Loader_jll", "Xorg_libSM_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_cursor_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "libinput_jll", "xkbcommon_jll"] +git-tree-sha1 = "492601870742dcd38f233b23c3ec629628c1d724" +uuid = "c0090381-4147-56d7-9ebc-da0b1113ec56" +version = "6.7.1+1" + +[[deps.Qt6Declarative_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll", "Qt6ShaderTools_jll"] +git-tree-sha1 = "e5dd466bf2569fe08c91a2cc29c1003f4797ac3b" +uuid = "629bc702-f1f5-5709-abd5-49b8460ea067" +version = "6.7.1+2" + +[[deps.Qt6ShaderTools_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll"] +git-tree-sha1 = "1a180aeced866700d4bebc3120ea1451201f16bc" +uuid = "ce943373-25bb-56aa-8eca-768745ed7b5a" +version = "6.7.1+1" + +[[deps.Qt6Wayland_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll", "Qt6Declarative_jll"] +git-tree-sha1 = "729927532d48cf79f49070341e1d918a65aba6b0" +uuid = "e99dba38-086e-5de3-a5b1-6e4c66e897c3" +version = "6.7.1+1" + +[[deps.QuadGK]] +deps = ["DataStructures", "LinearAlgebra"] +git-tree-sha1 = "cda3b045cf9ef07a08ad46731f5a3165e56cf3da" +uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" +version = "2.11.1" + + [deps.QuadGK.extensions] + QuadGKEnzymeExt = "Enzyme" + + [deps.QuadGK.weakdeps] + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + +[[deps.RData]] +deps = ["CategoricalArrays", "CodecZlib", "DataFrames", "Dates", "FileIO", "Requires", "TimeZones", "Unicode"] +git-tree-sha1 = "19e47a495dfb7240eb44dc6971d660f7e4244a72" +uuid = "df47a6cb-8c03-5eed-afd8-b6050d6c41da" +version = "0.8.3" + +[[deps.RDatasets]] +deps = ["CSV", "CodecZlib", "DataFrames", "FileIO", "Printf", "RData", "Reexport"] +git-tree-sha1 = "2720e6f6afb3e562ccb70a6b62f8f308ff810333" +uuid = "ce6b1742-4840-55fa-b093-852dadbb1d8b" +version = "0.7.7" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "StyledStrings", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" +version = "1.11.0" + +[[deps.Random]] +deps = ["SHA"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +version = "1.11.0" + +[[deps.RealDot]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "9f0a1b71baaf7650f4fa8a1d168c7fb6ee41f0c9" +uuid = "c1ae055f-0cd5-4b69-90a6-9a35b1a98df9" +version = "0.1.0" + +[[deps.RecipesBase]] +deps = ["PrecompileTools"] +git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.3.4" + +[[deps.RecipesPipeline]] +deps = ["Dates", "NaNMath", "PlotUtils", "PrecompileTools", "RecipesBase"] +git-tree-sha1 = "45cf9fd0ca5839d06ef333c8201714e888486342" +uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" +version = "0.6.12" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "1.0.1" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.Rmath]] +deps = ["Random", "Rmath_jll"] +git-tree-sha1 = "852bd0f55565a9e973fcfee83a84413270224dc4" +uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" +version = "0.8.0" + +[[deps.Rmath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "58cdd8fb2201a6267e1db87ff148dd6c1dbd8ad8" +uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" +version = "0.5.1+0" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.ScientificTypes]] +deps = ["CategoricalArrays", "ColorTypes", "Dates", "Distributions", "PrettyTables", "Reexport", "ScientificTypesBase", "StatisticalTraits", "Tables"] +git-tree-sha1 = "75ccd10ca65b939dab03b812994e571bf1e3e1da" +uuid = "321657f4-b219-11e9-178b-2701a2544e81" +version = "3.0.2" + +[[deps.ScientificTypesBase]] +git-tree-sha1 = "a8e18eb383b5ecf1b5e6fc237eb39255044fd92b" +uuid = "30f210dd-8aff-4c5f-94ba-8e64358c1161" +version = "3.0.0" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "3bac05bc7e74a75fd9cba4295cde4045d9fe2386" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.2.1" + +[[deps.SentinelArrays]] +deps = ["Dates", "Random"] +git-tree-sha1 = "305becf8af67eae1dbc912ee9097f00aeeabb8d5" +uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c" +version = "1.4.6" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" +version = "1.11.0" + +[[deps.Setfield]] +deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] +git-tree-sha1 = "e2cc6d8c88613c05e1defb55170bf5ff211fbeac" +uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" +version = "1.1.1" + +[[deps.ShowCases]] +git-tree-sha1 = "7f534ad62ab2bd48591bdeac81994ea8c445e4a5" +uuid = "605ecd9f-84a6-4c9e-81e2-4798472b76a3" +version = "0.1.0" + +[[deps.Showoff]] +deps = ["Dates", "Grisu"] +git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" +uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" +version = "1.0.3" + +[[deps.SimpleBufferStream]] +git-tree-sha1 = "f305871d2f381d21527c770d4788c06c097c9bc1" +uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" +version = "1.2.0" + +[[deps.SimpleTraits]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" +uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" +version = "0.9.4" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" +version = "1.11.0" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "66e0a8e672a0bdfca2c3f5937efb8538b9ddc085" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.2.1" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +version = "1.11.0" + +[[deps.SparseInverseSubset]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "52962839426b75b3021296f7df242e40ecfc0852" +uuid = "dc90abb0-5640-4711-901d-7e5b23a2fada" +version = "0.1.2" + +[[deps.SpecialFunctions]] +deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "2f5d4697f21388cbe1ff299430dd169ef97d7e14" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.4.0" +weakdeps = ["ChainRulesCore"] + + [deps.SpecialFunctions.extensions] + SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" + +[[deps.SplittablesBase]] +deps = ["Setfield", "Test"] +git-tree-sha1 = "e08a62abc517eb79667d0a29dc08a3b589516bb5" +uuid = "171d559e-b47b-412a-8079-5efa626c420e" +version = "0.1.15" + +[[deps.StableRNGs]] +deps = ["Random"] +git-tree-sha1 = "83e6cce8324d49dfaf9ef059227f91ed4441a8e5" +uuid = "860ef19b-820b-49d6-a774-d7a799459cd3" +version = "1.0.2" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] +git-tree-sha1 = "777657803913ffc7e8cc20f0fd04b634f871af8f" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.9.8" +weakdeps = ["ChainRulesCore", "Statistics"] + + [deps.StaticArrays.extensions] + StaticArraysChainRulesCoreExt = "ChainRulesCore" + StaticArraysStatisticsExt = "Statistics" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "192954ef1208c7019899fbf8049e717f92959682" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.3" + +[[deps.StatisticalMeasures]] +deps = ["CategoricalArrays", "CategoricalDistributions", "Distributions", "LearnAPI", "LinearAlgebra", "MacroTools", "OrderedCollections", "PrecompileTools", "ScientificTypesBase", "StatisticalMeasuresBase", "Statistics", "StatsBase"] +git-tree-sha1 = "c1d4318fa41056b839dfbb3ee841f011fa6e8518" +uuid = "a19d573c-0a75-4610-95b3-7071388c7541" +version = "0.1.7" + + [deps.StatisticalMeasures.extensions] + LossFunctionsExt = "LossFunctions" + ScientificTypesExt = "ScientificTypes" + + [deps.StatisticalMeasures.weakdeps] + LossFunctions = "30fc2ffe-d236-52d8-8643-a9d8f7c094a7" + ScientificTypes = "321657f4-b219-11e9-178b-2701a2544e81" + +[[deps.StatisticalMeasuresBase]] +deps = ["CategoricalArrays", "InteractiveUtils", "MLUtils", "MacroTools", "OrderedCollections", "PrecompileTools", "ScientificTypesBase", "Statistics"] +git-tree-sha1 = "17dfb22e2e4ccc9cd59b487dce52883e0151b4d3" +uuid = "c062fc1d-0d66-479b-b6ac-8b44719de4cc" +version = "0.1.1" + +[[deps.StatisticalTraits]] +deps = ["ScientificTypesBase"] +git-tree-sha1 = "542d979f6e756f13f862aa00b224f04f9e445f11" +uuid = "64bff920-2084-43da-a3e6-9bb72801c0c9" +version = "3.4.0" + +[[deps.Statistics]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0" +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.11.1" +weakdeps = ["SparseArrays"] + + [deps.Statistics.extensions] + SparseArraysExt = ["SparseArrays"] + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1ff449ad350c9c4cbc756624d6f8a8c3ef56d3ed" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.7.0" + +[[deps.StatsBase]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "5cf7606d6cef84b543b483848d4ae08ad9832b21" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.34.3" + +[[deps.StatsFuns]] +deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] +git-tree-sha1 = "b423576adc27097764a90e163157bcfc9acf0f46" +uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" +version = "1.3.2" +weakdeps = ["ChainRulesCore", "InverseFunctions"] + + [deps.StatsFuns.extensions] + StatsFunsChainRulesCoreExt = "ChainRulesCore" + StatsFunsInverseFunctionsExt = "InverseFunctions" + +[[deps.StringManipulation]] +deps = ["PrecompileTools"] +git-tree-sha1 = "a6b1675a536c5ad1a60e5a5153e1fee12eb146e3" +uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e" +version = "0.4.0" + +[[deps.StructArrays]] +deps = ["ConstructionBase", "DataAPI", "Tables"] +git-tree-sha1 = "f4dc295e983502292c4c3f951dbb4e985e35b3be" +uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" +version = "0.6.18" +weakdeps = ["Adapt", "GPUArraysCore", "SparseArrays", "StaticArrays"] + + [deps.StructArrays.extensions] + StructArraysAdaptExt = "Adapt" + StructArraysGPUArraysCoreExt = "GPUArraysCore" + StructArraysSparseArraysExt = "SparseArrays" + StructArraysStaticArraysExt = "StaticArrays" + +[[deps.StyledStrings]] +uuid = "f489334b-da3d-4c2e-b8f0-e476e12c162b" +version = "1.11.0" + +[[deps.SuiteSparse]] +deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] +uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "7.7.0+0" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.TZJData]] +deps = ["Artifacts"] +git-tree-sha1 = "36b40607bf2bf856828690e097e1c799623b0602" +uuid = "dc5dba14-91b3-4cab-a142-028a31da12f7" +version = "1.3.0+2024b" + +[[deps.TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[deps.Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "OrderedCollections", "TableTraits"] +git-tree-sha1 = "598cd7c1f68d1e205689b1c2fe65a9f85846f297" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.12.0" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.TensorCore]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" +version = "0.1.1" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" +version = "1.11.0" + +[[deps.TimeZones]] +deps = ["Dates", "Downloads", "InlineStrings", "Mocking", "Printf", "Scratch", "TZJData", "Unicode", "p7zip_jll"] +git-tree-sha1 = "8323074bc977aa85cf5ad71099a83ac75b0ac107" +uuid = "f269a46b-ccf7-5d73-abea-4c690281aa53" +version = "1.18.1" +weakdeps = ["RecipesBase"] + + [deps.TimeZones.extensions] + TimeZonesRecipesBaseExt = "RecipesBase" + +[[deps.TranscodingStreams]] +git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.11.3" + +[[deps.Transducers]] +deps = ["Accessors", "ArgCheck", "BangBang", "Baselet", "CompositionsBase", "ConstructionBase", "DefineSingletons", "Distributed", "InitialValues", "Logging", "Markdown", "MicroCollections", "Requires", "SplittablesBase", "Tables"] +git-tree-sha1 = "7deeab4ff96b85c5f72c824cae53a1398da3d1cb" +uuid = "28d57a85-8fef-5791-bfe6-a80928e7c999" +version = "0.4.84" + + [deps.Transducers.extensions] + TransducersAdaptExt = "Adapt" + TransducersBlockArraysExt = "BlockArrays" + TransducersDataFramesExt = "DataFrames" + TransducersLazyArraysExt = "LazyArrays" + TransducersOnlineStatsBaseExt = "OnlineStatsBase" + TransducersReferenceablesExt = "Referenceables" + + [deps.Transducers.weakdeps] + Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" + BlockArrays = "8e7c35d0-a365-5155-bbbb-fb81a777f24e" + DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" + LazyArrays = "5078a376-72f3-5289-bfd5-ec5146d43c02" + OnlineStatsBase = "925886fa-5bf2-5e8e-b522-a9147a512338" + Referenceables = "42d2dcc6-99eb-4e98-b66c-637b7d73030e" + +[[deps.URIs]] +git-tree-sha1 = "67db6cc7b3821e19ebe75791a9dd19c9b1188f2b" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.5.1" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" +version = "1.11.0" + +[[deps.UnPack]] +git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" +uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" +version = "1.0.2" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" +version = "1.11.0" + +[[deps.UnicodeFun]] +deps = ["REPL"] +git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" +uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" +version = "0.4.1" + +[[deps.Unitful]] +deps = ["Dates", "LinearAlgebra", "Random"] +git-tree-sha1 = "d95fe458f26209c66a187b1114df96fd70839efd" +uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" +version = "1.21.0" +weakdeps = ["ConstructionBase", "InverseFunctions"] + + [deps.Unitful.extensions] + ConstructionBaseUnitfulExt = "ConstructionBase" + InverseFunctionsUnitfulExt = "InverseFunctions" + +[[deps.UnitfulLatexify]] +deps = ["LaTeXStrings", "Latexify", "Unitful"] +git-tree-sha1 = "975c354fcd5f7e1ddcc1f1a23e6e091d99e99bc8" +uuid = "45397f5d-5981-4c77-b2b3-fc36d6e9b728" +version = "1.6.4" + +[[deps.UnsafeAtomics]] +git-tree-sha1 = "6331ac3440856ea1988316b46045303bef658278" +uuid = "013be700-e6cd-48c3-b4a1-df204f14c38f" +version = "0.2.1" + +[[deps.UnsafeAtomicsLLVM]] +deps = ["LLVM", "UnsafeAtomics"] +git-tree-sha1 = "2d17fabcd17e67d7625ce9c531fb9f40b7c42ce4" +uuid = "d80eeb9a-aca5-4d75-85e5-170c8b632249" +version = "0.2.1" + +[[deps.Unzip]] +git-tree-sha1 = "ca0969166a028236229f63514992fc073799bb78" +uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" +version = "0.2.0" + +[[deps.Vulkan_Loader_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Wayland_jll", "Xorg_libX11_jll", "Xorg_libXrandr_jll", "xkbcommon_jll"] +git-tree-sha1 = "2f0486047a07670caad3a81a075d2e518acc5c59" +uuid = "a44049a8-05dd-5a78-86c9-5fde0876e88c" +version = "1.3.243+0" + +[[deps.Wayland_jll]] +deps = ["Artifacts", "EpollShim_jll", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "7558e29847e99bc3f04d6569e82d0f5c54460703" +uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" +version = "1.21.0+1" + +[[deps.Wayland_protocols_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "93f43ab61b16ddfb2fd3bb13b3ce241cafb0e6c9" +uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" +version = "1.31.0+0" + +[[deps.WeakRefStrings]] +deps = ["DataAPI", "InlineStrings", "Parsers"] +git-tree-sha1 = "b1be2855ed9ed8eac54e5caff2afcdb442d52c23" +uuid = "ea10d353-3f73-51f8-a26c-33c1cb351aa5" +version = "1.4.2" + +[[deps.WorkerUtilities]] +git-tree-sha1 = "cd1659ba0d57b71a464a29e64dbc67cfe83d54e7" +uuid = "76eceee3-57b5-4d4a-8e66-0e911cebbf60" +version = "1.6.1" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] +git-tree-sha1 = "1165b0443d0eca63ac1e32b8c0eb69ed2f4f8127" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.13.3+0" + +[[deps.XSLT_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "XML2_jll", "Zlib_jll"] +git-tree-sha1 = "a54ee957f4c86b526460a720dbc882fa5edcbefc" +uuid = "aed1982a-8fda-507f-9586-7b0439959a61" +version = "1.1.41+0" + +[[deps.XZ_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "15e637a697345f6743674f1322beefbc5dcd5cfc" +uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" +version = "5.6.3+0" + +[[deps.Xorg_libICE_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "326b4fea307b0b39892b3e85fa451692eda8d46c" +uuid = "f67eecfb-183a-506d-b269-f58e52b52d7c" +version = "1.1.1+0" + +[[deps.Xorg_libSM_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libICE_jll"] +git-tree-sha1 = "3796722887072218eabafb494a13c963209754ce" +uuid = "c834827a-8449-5923-a945-d239c165b7dd" +version = "1.2.4+0" + +[[deps.Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "afead5aba5aa507ad5a3bf01f58f82c8d1403495" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.8.6+0" + +[[deps.Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6035850dcc70518ca32f012e46015b9beeda49d8" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.11+0" + +[[deps.Xorg_libXcursor_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "12e0eb3bc634fa2080c1c37fccf56f7c22989afd" +uuid = "935fb764-8cf2-53bf-bb30-45bb1f8bf724" +version = "1.2.0+4" + +[[deps.Xorg_libXdmcp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "34d526d318358a859d7de23da945578e8e8727b7" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.4+0" + +[[deps.Xorg_libXext_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "d2d1a5c49fae4ba39983f63de6afcbea47194e85" +uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" +version = "1.3.6+0" + +[[deps.Xorg_libXfixes_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "0e0dc7431e7a0587559f9294aeec269471c991a4" +uuid = "d091e8ba-531a-589c-9de9-94069b037ed8" +version = "5.0.3+4" + +[[deps.Xorg_libXi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXfixes_jll"] +git-tree-sha1 = "89b52bc2160aadc84d707093930ef0bffa641246" +uuid = "a51aa0fd-4e3c-5386-b890-e753decda492" +version = "1.7.10+4" + +[[deps.Xorg_libXinerama_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll"] +git-tree-sha1 = "26be8b1c342929259317d8b9f7b53bf2bb73b123" +uuid = "d1454406-59df-5ea1-beac-c340f2130bc3" +version = "1.1.4+4" + +[[deps.Xorg_libXrandr_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "34cea83cb726fb58f325887bf0612c6b3fb17631" +uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484" +version = "1.5.2+4" + +[[deps.Xorg_libXrender_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "47e45cd78224c53109495b3e324df0c37bb61fbe" +uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" +version = "0.9.11+0" + +[[deps.Xorg_libpthread_stubs_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8fdda4c692503d44d04a0603d9ac0982054635f9" +uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" +version = "0.1.1+0" + +[[deps.Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] +git-tree-sha1 = "bcd466676fef0878338c61e655629fa7bbc69d8e" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.17.0+0" + +[[deps.Xorg_libxkbfile_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "730eeca102434283c50ccf7d1ecdadf521a765a4" +uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" +version = "1.1.2+0" + +[[deps.Xorg_xcb_util_cursor_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_jll", "Xorg_xcb_util_renderutil_jll"] +git-tree-sha1 = "04341cb870f29dcd5e39055f895c39d016e18ccd" +uuid = "e920d4aa-a673-5f3a-b3d7-f755a4d47c43" +version = "0.1.4+0" + +[[deps.Xorg_xcb_util_image_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "0fab0a40349ba1cba2c1da699243396ff8e94b97" +uuid = "12413925-8142-5f55-bb0e-6d7ca50bb09b" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll"] +git-tree-sha1 = "e7fd7b2881fa2eaa72717420894d3938177862d1" +uuid = "2def613f-5ad1-5310-b15b-b15d46f528f5" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_keysyms_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "d1151e2c45a544f32441a567d1690e701ec89b00" +uuid = "975044d2-76e6-5fbe-bf08-97ce7c6574c7" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_renderutil_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "dfd7a8f38d4613b6a575253b3174dd991ca6183e" +uuid = "0d47668e-0667-5a69-a72c-f761630bfb7e" +version = "0.3.9+1" + +[[deps.Xorg_xcb_util_wm_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "e78d10aab01a4a154142c5006ed44fd9e8e31b67" +uuid = "c22f9ab0-d5fe-5066-847c-f4bb1cd4e361" +version = "0.4.1+1" + +[[deps.Xorg_xkbcomp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxkbfile_jll"] +git-tree-sha1 = "330f955bc41bb8f5270a369c473fc4a5a4e4d3cb" +uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" +version = "1.4.6+0" + +[[deps.Xorg_xkeyboard_config_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xkbcomp_jll"] +git-tree-sha1 = "691634e5453ad362044e2ad653e79f3ee3bb98c3" +uuid = "33bec58e-1273-512f-9401-5d533626f822" +version = "2.39.0+0" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e92a1a012a10506618f10b7047e478403a046c77" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.5.0+0" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+1" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "555d1076590a6cc2fdee2ef1469451f872d8b41b" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.6+1" + +[[deps.Zygote]] +deps = ["AbstractFFTs", "ChainRules", "ChainRulesCore", "DiffRules", "Distributed", "FillArrays", "ForwardDiff", "GPUArrays", "GPUArraysCore", "IRTools", "InteractiveUtils", "LinearAlgebra", "LogExpFunctions", "MacroTools", "NaNMath", "PrecompileTools", "Random", "Requires", "SparseArrays", "SpecialFunctions", "Statistics", "ZygoteRules"] +git-tree-sha1 = "f816633be6dc5c0ed9ffedda157ecfda0b3b6a69" +uuid = "e88e6eb3-aa80-5325-afca-941959d7151f" +version = "0.6.72" + + [deps.Zygote.extensions] + ZygoteColorsExt = "Colors" + ZygoteDistancesExt = "Distances" + ZygoteTrackerExt = "Tracker" + + [deps.Zygote.weakdeps] + Colors = "5ae59095-9a9b-59fe-a467-6f913c188581" + Distances = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.ZygoteRules]] +deps = ["ChainRulesCore", "MacroTools"] +git-tree-sha1 = "27798139afc0a2afa7b1824c206d5e87ea587a00" +uuid = "700de1a5-db45-46bc-99cf-38207098b444" +version = "0.2.5" + +[[deps.eudev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "gperf_jll"] +git-tree-sha1 = "431b678a28ebb559d224c0b6b6d01afce87c51ba" +uuid = "35ca27e7-8b34-5b7f-bca9-bdc33f59eb06" +version = "3.2.9+0" + +[[deps.fzf_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "936081b536ae4aa65415d869287d43ef3cb576b2" +uuid = "214eeab7-80f7-51ab-84ad-2988db7cef09" +version = "0.53.0+0" + +[[deps.gperf_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "3516a5630f741c9eecb3720b1ec9d8edc3ecc033" +uuid = "1a1c6b14-54f6-533d-8383-74cd7377aa70" +version = "3.1.1+0" + +[[deps.libaom_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1827acba325fdcdf1d2647fc8d5301dd9ba43a9d" +uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" +version = "3.9.0+0" + +[[deps.libass_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "e17c115d55c5fbb7e52ebedb427a0dca79d4484e" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.15.2+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.11.0+0" + +[[deps.libdecor_jll]] +deps = ["Artifacts", "Dbus_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pango_jll", "Wayland_jll", "xkbcommon_jll"] +git-tree-sha1 = "9bf7903af251d2050b467f76bdbe57ce541f7f4f" +uuid = "1183f4f0-6f2a-5f1a-908b-139f9cdfea6f" +version = "0.2.2+0" + +[[deps.libevdev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "141fe65dc3efabb0b1d5ba74e91f6ad26f84cc22" +uuid = "2db6ffa8-e38f-5e21-84af-90c45d0032cc" +version = "1.11.0+0" + +[[deps.libfdk_aac_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8a22cf860a7d27e4f3498a0fe0811a7957badb38" +uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" +version = "2.0.3+0" + +[[deps.libinput_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "eudev_jll", "libevdev_jll", "mtdev_jll"] +git-tree-sha1 = "ad50e5b90f222cfe78aa3d5183a20a12de1322ce" +uuid = "36db933b-70db-51c0-b978-0f229ee0e533" +version = "1.18.0+0" + +[[deps.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "b70c870239dc3d7bc094eb2d6be9b73d27bef280" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.44+0" + +[[deps.libvorbis_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] +git-tree-sha1 = "490376214c4721cdaca654041f635213c6165cb3" +uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" +version = "1.3.7+2" + +[[deps.mtdev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "814e154bdb7be91d78b6802843f76b6ece642f11" +uuid = "009596ad-96f7-51b1-9f1b-5ce2d5e8a71e" +version = "1.1.6+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.59.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+2" + +[[deps.x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "2021.5.5+0" + +[[deps.x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "3.5.0+0" + +[[deps.xkbcommon_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] +git-tree-sha1 = "9c304562909ab2bab0262639bd4f444d7bc2be37" +uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" +version = "1.4.1+1" diff --git a/docs/src/common_workflows/entity_embeddings/Project.toml b/docs/src/common_workflows/entity_embeddings/Project.toml new file mode 100644 index 00000000..9c6674ba --- /dev/null +++ b/docs/src/common_workflows/entity_embeddings/Project.toml @@ -0,0 +1,13 @@ +[deps] +CategoricalArrays = "324d7699-5711-5eae-9e2f-1d82baa6b597" +DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +Flux = "587475ba-b771-5e3f-ad9e-33799f191a9c" +MLJ = "add582a8-e3ab-11e8-2d5e-e98b27df1bc7" +MLJFlux = "094fc8d1-fd35-5302-93ea-dabda2abf845" +Optimisers = "3bd65402-5787-11e9-1adc-39752487f4e2" +Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +ProgressMeter = "92933f4c-e287-5a05-a399-4b506db050ca" +RDatasets = "ce6b1742-4840-55fa-b093-852dadbb1d8b" +Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +ScientificTypes = "321657f4-b219-11e9-178b-2701a2544e81" +Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" diff --git a/docs/src/common_workflows/entity_embeddings/generate.jl b/docs/src/common_workflows/entity_embeddings/generate.jl new file mode 100644 index 00000000..0f122402 --- /dev/null +++ b/docs/src/common_workflows/entity_embeddings/generate.jl @@ -0,0 +1,4 @@ +# Execute this julia file to generate the notebooks from ../notebook.jl + +joinpath(@__DIR__, "..", "..", "generate.jl") |> include +generate(@__DIR__, execute=true, pluto=false) diff --git a/docs/src/common_workflows/entity_embeddings/notebook.ipynb b/docs/src/common_workflows/entity_embeddings/notebook.ipynb new file mode 100644 index 00000000..34b86b64 --- /dev/null +++ b/docs/src/common_workflows/entity_embeddings/notebook.ipynb @@ -0,0 +1,2756 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# Entity Embeddings with MLJFlux" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "This demonstration is available as a Jupyter notebook or julia script\n", + "[here](https://github.com/FluxML/MLJFlux.jl/tree/dev/docs/src/common_workflows/entity_embeddings)." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Entity embedding is newer deep learning approach for categorical encoding introduced in 2016 by Cheng Guo and Felix Berkhahn.\n", + "It employs a set of embedding layers to map each categorical feature into a dense continuous vector in a similar fashion to how they are employed in NLP architectures." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "In MLJFlux, the `NeuralNetworkClassifier`, `NeuralNetworkRegressor`, and the `MultitargetNeuralNetworkRegressor`` can be trained and evaluated with heterogenous data (i.e., containing categorical features) because they have a built-in entity embedding layer.\n", + "Moreover, they now offer a transform which encode the categorical features with the learnt embeddings to be used by an upstream machine learning model." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "In this notebook, we will explore how to use entity embeddings in MLJFlux models." + ], + "metadata": {} + }, + { + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Activating project at `~/Documents/GitHub/MLJFlux.jl/docs/src/common_workflows/entity_embeddings`\n" + ] + } + ], + "cell_type": "code", + "source": [ + "using Pkg\n", + "Pkg.activate(@__DIR__);\n", + "Pkg.instantiate();" + ], + "metadata": {}, + "execution_count": 1 + }, + { + "cell_type": "markdown", + "source": [ + "**Julia version** is assumed to be 1.10.*" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "### Basic Imports" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using MLJ\n", + "using Flux\n", + "using Optimisers\n", + "using CategoricalArrays\n", + "using DataFrames\n", + "using Random\n", + "using Tables\n", + "using ProgressMeter\n", + "using Plots\n", + "using ScientificTypes" + ], + "metadata": {}, + "execution_count": 2 + }, + { + "cell_type": "markdown", + "source": [ + "Generate some data" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "X, y = make_blobs(1000, 2; centers=2, as_table=true, rng=40)\n", + "X = DataFrame(X);" + ], + "metadata": {}, + "execution_count": 3 + }, + { + "cell_type": "markdown", + "source": [ + "Visualize it" + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "Plot{Plots.GRBackend() n=2}", + "image/png": "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", + "text/html": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "execution_count": 4 + } + ], + "cell_type": "code", + "source": [ + "X_class0 = X[y .== 1, :]\n", + "X_class1 = X[y .== 2, :]\n", + "\n", + "p = plot()\n", + "\n", + "scatter!(p, X_class0[!, 1], X_class0[!, 2], markercolor=:blue, label=\"Class 0\")\n", + "scatter!(p, X_class1[!, 1], X_class1[!, 2], markercolor=:red, label=\"Class 1\")\n", + "\n", + "title!(p, \"Classes in Different Colors\")\n", + "xlabel!(\"Feature 1\")\n", + "ylabel!(\"Feature 2\")\n", + "\n", + "plot(p)" + ], + "metadata": {}, + "execution_count": 4 + }, + { + "cell_type": "markdown", + "source": [ + "Let's write a function that creates categorical features C1 and C2 from x1 and x2 in a meaningful way:" + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "generate_C2 (generic function with 1 method)" + }, + "metadata": {}, + "execution_count": 5 + } + ], + "cell_type": "code", + "source": [ + "Random.seed!(40)\n", + "generate_C1(x1) = (x1 > mean(X.x1) ) ? rand(['A', 'B']) : rand(['C', 'D'])\n", + "generate_C2(x2) = (x2 > mean(X.x2) ) ? rand(['X', 'Y']) : rand(['Z'])" + ], + "metadata": {}, + "execution_count": 5 + }, + { + "cell_type": "markdown", + "source": [ + "Generate C1 and C2 columns" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "X[!, :C1] = [generate_C1(x) for x in X[!, :x1]]\n", + "X[!, :C2] = [generate_C2(x) for x in X[!, :x2]]\n", + "X[!, :R3] = rand(1000); # A random continuous column." + ], + "metadata": {}, + "execution_count": 6 + }, + { + "cell_type": "markdown", + "source": [ + "Form final dataset using categorical and continuous columns" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "X = X[!, [:C1, :C2, :R3]];" + ], + "metadata": {}, + "execution_count": 7 + }, + { + "cell_type": "markdown", + "source": [ + "It's also necessary to cast the categorical columns to the correct scientific type as the embedding layer\n", + "will have an effect on the model if and only if categorical columns exist." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "X = coerce(X, :C1 =>Multiclass, :C2 =>Multiclass);" + ], + "metadata": {}, + "execution_count": 8 + }, + { + "cell_type": "markdown", + "source": [ + "Split the data" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "(X_train, X_test), (y_train, y_test) = partition(\n", + "\t(X, y),\n", + "\t0.8,\n", + "\tmulti = true,\n", + "\tshuffle = true,\n", + "\tstratify = y,\n", + "\trng = Random.Xoshiro(41)\n", + ");" + ], + "metadata": {}, + "execution_count": 9 + }, + { + "cell_type": "markdown", + "source": [ + "### Build MLJFlux Model" + ], + "metadata": {} + }, + { + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ Info: For silent loading, specify `verbosity=0`. \n", + "import MLJFlux ✔\n", + "┌ Info: The CUDA functionality is being called but\n", + "│ `CUDA.jl` must be loaded to access it.\n", + "└ Add `using CUDA` or `import CUDA` to your code. Alternatively, configure a different GPU backend by calling `Flux.gpu_backend!`.\n", + "┌ Warning: `acceleration isa CUDALibs` but no CUDA device (GPU) currently live. \n", + "└ @ MLJFlux ~/.julia/packages/MLJFlux/AO4Dh/src/types.jl:62\n" + ] + } + ], + "cell_type": "code", + "source": [ + "NeuralNetworkClassifier = @load NeuralNetworkClassifier pkg = MLJFlux\n", + "\n", + "\n", + "clf = MLJFlux.NeuralNetworkBinaryClassifier(\n", + " builder = MLJFlux.Short(n_hidden = 5),\n", + " optimiser = Optimisers.Adam(0.01),\n", + " batch_size = 2,\n", + " epochs = 100,\n", + " acceleration = CUDALibs(),\n", + " embedding_dims = Dict(:C1 => 2, :C2 => 2,),\n", + ");" + ], + "metadata": {}, + "execution_count": 10 + }, + { + "cell_type": "markdown", + "source": [ + "Notice that we specified to embed each of the columns to 2D columns. By default, it uses `min(numfeats - 1, 10)`\n", + "for the new dimensionality of any categorical feature." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "### Train and evaluate" + ], + "metadata": {} + }, + { + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "┌ Info: The CUDA functionality is being called but\n", + "│ `CUDA.jl` must be loaded to access it.\n", + "└ Add `using CUDA` or `import CUDA` to your code. Alternatively, configure a different GPU backend by calling `Flux.gpu_backend!`.\n", + "┌ Warning: `acceleration isa CUDALibs` but no CUDA device (GPU) currently live. \n", + "└ @ MLJBase ~/.julia/packages/MLJBase/7nGJF/src/machines.jl:654\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": "trained Machine; caches model-specific representations of data\n model: NeuralNetworkBinaryClassifier(builder = Short(n_hidden = 5, …), …)\n args: \n 1:\tSource @941 ⏎ Table{Union{AbstractVector{Continuous}, AbstractVector{Multiclass{4}}, AbstractVector{Multiclass{3}}}}\n 2:\tSource @035 ⏎ AbstractVector{Multiclass{2}}\n" + }, + "metadata": {}, + "execution_count": 11 + } + ], + "cell_type": "code", + "source": [ + "mach = machine(clf, X_train, y_train)\n", + "\n", + "fit!(mach, verbosity = 0)" + ], + "metadata": {}, + "execution_count": 11 + }, + { + "cell_type": "markdown", + "source": [ + "Get predictions on the training data" + ], + "metadata": {} + }, + { + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "┌ Warning: Layer with Float32 parameters got Float64 input.\n", + "│ The input will be converted, but any earlier layers may be very slow.\n", + "│ layer = Dense(5 => 5, σ) # 30 parameters\n", + "│ summary(x) = \"5×200 Matrix{Float64}\"\n", + "└ @ Flux ~/.julia/packages/Flux/htpCe/src/layers/stateless.jl:59\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": "1.0" + }, + "metadata": {}, + "execution_count": 12 + } + ], + "cell_type": "code", + "source": [ + "y_pred = predict_mode(mach, X_test)\n", + "balanced_accuracy(y_pred, y_test)" + ], + "metadata": {}, + "execution_count": 12 + }, + { + "cell_type": "markdown", + "source": [ + "Notice how the model has learnt to almost perfectly distinguish the classes and all the information\n", + "has been in the categorical variables." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "### Visualize the embedding space" + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "Plot{Plots.GRBackend() n=2}", + "image/png": "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xmjatGkNxLx27VpCyKBBg5r4GXfs2CHydNSgQYNEOm/If3vcqV9QkU/H5/MdHR0JIYJRlfHx8YSQoUOHHj58WEFBQVB///79Kysr4+PjhZ9/0tLSioiIEK5NWVlZT08vIiJC+M8YFRWVwMBA4WLbt28X+cUihGzdurWJHx8AWqzc3FwGg0Gj0ZKTk7+shqCgIEJIox3Pn+xx5/P5mzdvJoT83//9n2BLTk6OIBkVsLGxSUxMFDmvcLcOZfz48YICImPca2pqpk6dKlKeTqc/fvy4vphra2uNjIwIIZcvX27Kpfj48eOAAQOE61dRUdm9e7dwmbo97lSPPovFEi4WFRVFCPH09BRsWbBgASHk9OnTgwcPFtQvJyf3119/8fn8P/74Q/gp4SFDhrDZbMGxx48fJ4SsWrXq119/FU7ou3fvXlxcLChWWFjYp08fkUskLy//ueP4QTIwHST8i8/n37t3jxBSty9BAthsNnXX1d3dXbglKigo+Omnn27evBkfHx8XF7d//34NDQ1fX99bt24JyqxYsSI8PNzT0/Pp06cZGRkvX748f/68h4dHfecqKiqaPHkyl8sNCAhITExMT09/9OjRpk2bzMzMGogwPDycENJAtcL++uuvRYsWqaioHDt2LCUl5dGjRwMGDLh9+7aHhweXy21KDY16+fLlggUL/P39IyIigoODO3fuHBoaunr1and3d3t7+zt37kRERPz444/FxcXe3t78/67YUFlZOWzYsEGDBoWEhERERCxevLiqqmrq1Knl5eVUgejoaD8/PwMDgwsXLrx9+/bdu3fh4eHLli37shkVAKBFefjwIY/Ha9++fdu2bb+shuDgYEKIk5PTFxybmppKJfQjR44UbKyqqtLV1f3zzz8fPnyYkpLy4MGDmTNnJiQkDBs2rKamhipTVlY2YcIEFou1b9++xMTEjIyMx48fb9mype79YYH9+/efOHHCxcXl7t27GRkZ8fHxN27cmDZtWgPzgL1584bq8hfOlevD5XI9PDxCQkIGDx786NGjlJSUI0eOKCoqLliw4PDhw02/Jg375ZdfsrOzL168GB0dvWPHDjqdPm/evG3btq1Zs2bz5s2RkZE3btywtra+desW9ReCsFOnTh04cGDv3r3Pnz8PCgqyt7ePiIhYtWqVoMDy5cvv378/fvz4Z8+eUT+g586dc3d3b67goZlJ+Q8HaElKSkqob0VeXt7nHvtlPe59+/Z1c3Nzc3Pr0aOHlpaWkpLShAkTGv0rPyIigvy357tdu3aKiorC/fQiRHrcqaTf19e3idFSqLQ+NDS00ZLV1dXUfdjw8HDBRjabbWtrSwj5+++/BRvJV/S4E0LOnDkjKJOQkEBd1VGjRgkfS43Pef36tWALdR9g4cKFwsWogU9Xr16l3m7dupUQcvjw4UY/LADInE2bNhFCRo8e/WWHP3z4kMlkKikpNTp5C5WgGxgYUE19//79bW1tGQyGhYXFgQMHGj3R9OnTCSFXrlyh3oaFhRFC5s6d28AhIj3uI0aMIIQIz4fWKOpmQtu2bZtS+NSpU4QQOzs74R+gu3fvEkJ0dXUFDw98ZY+7iYlJeXm5YKOvry/1E3D79m3BxqdPnxJCnJ2dBVuoHncmk/nq1SvBxrS0NDk5OQMDA8EWKysrJSUlDofTlM8LUoced/hXaWkp9UJNTU0yZ4yJiYmOjo6Ojn79+jV1545Go7HZ7IaPcnJyMjQ0FH6iX0tLi81mv3jxoonnpR7Jio2NZbFYTY+Wuj6CcfMNePjwYUFBQc+ePYWHwsvLyy9evJgQcvny5aaftAHGxsZeXl6Ctx06dKBGxi9atEi4GHUPNDU1VeTwpUuXCr+lbvUKilGXKDIysra2tlmiBYCWg2rNvqypz8vLmzRpEpfL3b59ewNd3cKKioqopv7FixfJycnUFGRUztrwgVTaLWjtqTt+cXFxVVVVTYyWasqopLaJPuviUO35kiVLhG8U9+/f39HR8ePHjw8fPmz6eRswe/Zs4Z8eqlW3tbUdOHCgYGP37t0VFBTqNvVDhgwRTOlDCDE3N7e2ts7LyxNcQ+oHNCYmpllCBXFD4g7/EjyJUl1dLZkzZmRkFBUVFRUVlZeXFxUV/frrr6dPn+7Ro0dZWZmgTHV19aZNm3r06GFkZEQNyqTRaDk5OSUlJYIJKKdPn87n83v16uXm5rZx48bnz583/HvQtWvXzp0737t3z9zcfPr06SdOnMjPz280Wur6NOXiJCQkUGcR2d6tWzdCiKC//Cu1bdtW5FFaaqJlkXvf1Ma8vDzhjaqqqsID3Akh1JOpubm51Nvhw4e3atUqICCgbdu2CxYsuHz5smAUDQDIOqo1a3r6K1BSUjJkyJCMjAxfX98ff/yxiUeNGzeu6B8sFismJsbY2NjX1/fXX38VLvb69eupU6fa2Nioq6tTTT2VuBcUFFAFOnXq5ODg8PjxY3Nzcx8fn+PHjwuarPp4e3vT6XQfHx8nJ6fVq1eHhYVxOJyGD/msi0O19l26dBHZTs0LTO39etQcPgLUHV2RjTQarVWrViJNPSHE2tpaZIu+vj6fzxeU9PHxqa2t7dGjx4ABAzZt2hQVFdXoH1QgRUjc4V9aWlrU3/Tv3r2TytlXrlw5evTojIyMffv2URu5XK6bm9svv/xSWFg4ZswYf3//TZs2bdq0SVdXl8/nCxL32bNnnz171tHRMSwsbMWKFU5OTqampn///Xd955KTkwsLC/vpp59oNNrRo0enTZtmaGg4bNiwtLS0BiI0MTEhTbs4VI4rMjMM+Sc5bq4MuO66gNT0CyLbqeRepOO8vmMF7bWurm5kZOTEiRMLCgr27NkzZsyYVq1azZo1SzCeCgBkl6mpKSHk/fv3n3VUSUlJv379YmJi5s2bt2PHji87NZ1Ot7e3v3DhAp1O37Ztm6DT5PHjx05OTmfPnjU1NZ0zZw7V1M+ePZsQImjqGQxGSEiIr6+vnJzcsWPHvL29jY2Nhw4d2sAH6dOnT3h4uJubW2xs7O+//96/f389Pb0tW7Y0cC+RujgZGRlNeR6poqKC/NO2C2ve1l5kWvpPNvXU9ro5d6Ot/dy5c8+cOePg4BAaGvrLL784OjqamZmdOXOmWSKHZofEHf5Fp9N79epFCAkJCZFWDFQvRXR0NPX28uXLT548cXd3T0pK2rNnz+rVq5ctW7Zs2bK67amXl9ezZ89yc3PPnTs3ZcqU/Pz8yZMnCz/AKkJbW3v37t3Z2dkxMTF//PFHx44db9y44e7u3kBnjLOzMyGEGrzYMOoea92eD6pzSF1dvb4Dqfa07i+KyCyTkmFhYfH3339//Pjx0aNH/v7++vr6f/3114wZMyQfCQA0L6o1e/nyZd1mqj5lZWWDBw+OiYmZNWvWnj17vjIAAwMDExOTmpqaV69eUVtWrlxZXV198eLF27dvb968mWrq+/fvL3Kgpqbmjh07MjMzY2Njt2/f3qlTp1u3blGzqdR3LhcXl5CQkIKCghs3bsyfP5/L5S5btmznzp31le/UqZO6unpVVdXjx48b/SD1tfY5OTmkwdb+k10qUmnqCSHjx4+PiIjIyck5d+7c5MmTqdFQd+7ckUow0DAk7vAfPj4+hJD9+/cLD1YRVltbK9ZBz1TzJ+gJiI2NJYR4enoKzwCQmppaXFz8ycP19PQ8PT1PnDhBPeV56dKlhk9H9f34+flFR0fb2dklJCQkJibWV9jb25tGo12+fPnNmzf1laH+orCzsyOEUI8ZCXv+/DkhRHi4oQjqGV+R3wA2my2VeyAUeXn53r17r1mzJjY2Vl1dPTAwUDDDAwDIKEtLyz59+nA4nG3bttVXRrh/hJqHKiIiYtq0aQcOHGhgvYsmqq2tpQbACFr7uLg4VVVVkTnNBJ04IqiVKBYtWhQVFdW1a9fk5GTBHwD1UVdXd3d337Nnz40bNwghFy9erK8kg8GgZpCkHuH9JMHFodrzL2jtDQ0NSZ3WvrmG1nwZfX19T0/PkydPbt++nc/nN/oDClKBxB3+Y+zYsT179szMzPTy8qp7jy87O9vDw4O6MygO79+/P3nyJCHExcWF2kKNz87IyBAutnr1apED64ZEzcJbXx9M3fJMJpM6VwPdNnZ2dj4+Pmw2e8yYMR8+fBDZW15ePnfuXGrGG2dnZwMDg8jISGoOBAqbzd6+fTshZNy4cfWdglp0Izg4WPh257Zt2xp9YLfZ1b1EmpqaSkpKPB6vuaazBAAp2rx5s5yc3Pbt248dO1Z3b2BgILWUNSGkqqrKw8PjwYMH48aN++uvv+quiPQFtm7dWlVVpaSkRE2ZRQjR1dWtqqr6+PGjoExOTo7I5IYVFRUiQ0EYDAY1KLHprT2VMTfcqP7yyy+6urrBwcG//PJL3b6q6OhoaolxQgi1+Mn27duFezRu37794sULQ0ND6s7GJ1GT1t+8eVOwhcViffEApK/xuT+gIF1YORX+g8lknj9/fuDAgcHBwe3atZs+fbqjo6OKikpubm54ePi5c+eEn9dJTk4W9NZQPfQrVqygRsmPHj160KBBjZ7O39+fWuKHzWanpqYGBwez2ewuXbrMmjWLKuDq6kqj0TZv3qyjo+Pq6lpSUrJ///7AwMBWrVoJHlcihFhYWIwYMWLw4MGWlpaKiopxcXErVqwghHh6en7yvKdPn961a5e3t7e9vb2ZmVlpaem5c+fCwsLatGlT9xkjYXv27MnIyLh7966Njc20adNcXFy0tbWLioqePHly+vTpjx8/Tpo0iRAiLy+/ZcuWqVOnjhs3bsOGDc7OztnZ2evWrUtKSnJxcRkzZkx99dvb21tbW8fFxU2YMGHmzJlcLvfatWunT582NDSkbrxKzIoVK168eDF58uQOHToYGRllZ2fv27cvLy9v2LBhdUdMAoDM6d69+8GDB2fPnu3j43PixImxY8daWlpyudzk5ORLly49efJk4sSJVMn58+ffu3dPQUFBTU1t3rx5wpVoampSSyk1LCYmZvny5dTrwsLCFy9eUJOAbdiwQUNDg9ret2/f5OTkkSNH/vbbb2ZmZjExMStXrtTV1RXuQrp48eLmzZu9vb27dOlibm5eVlZGDa1p3bq14A8AEf379zcxMRk9enSbNm00NTVTUlKopfTq+3WgGBkZXbx4ccSIEZs2bbp58+bkyZNtbGzodHp6enpQUFBQUJCgK33MmDE//PDDw4cPhw4dunz5ckNDw/v371MP3W7ZsqXuGnYCXl5ehw4dWr58OZfL7datW1paWgMd/GJlZmY2ZswY6gdUQUEhNja24R9QkDIpTEEJLV5xcbGvr2/d/MzJyUl4cU1qtaZP2rx5c8On+OSdVmNj42XLlpWWlgqX3LZtm/DKqfr6+uHh4R06dCCECJaIo4amCFNVVRVeuE5kHverV6/WHXrYrVu3N2/eNHpxampqNm3aVHe57LZt2x48eJDL5QpKBgQECH6TKKNHjy4pKRGujfx3Hnc+n//ixQuqt4PSqlWru3fv1rdyqkhsnTp1IoSIXMD169cTQg4ePCjYQq2cKnIsdeP4559/pt5u2bJFUVFR5DN6eHhgLT2Ab8njx4/r9gorKSnNmDEjMzOTKtPAWjzGxsYN10/N4y6CyWT26tVLMDs7paioiHrISrjBCQwMJP/MG8bn84OCgkQaVUKIvb19fHy8oB6RedzHjBkjcotATk7Oz89PuK2uT3Jy8ujRo0WWamIwGCNGjHj58qWgWHFxsfBKUoQQDQ2NQ4cOCVdVdx53Pp+/evVq4dgGDx5M3aStO4/7tWvXhA+kBt/XXY/W1NSUwWAI3lLzuK9evVqkGDX577t376i31IzywtTU1Pbu3dvo9QGpoPEx6Q/Ug8ViPXny5MOHD9XV1To6Og4ODiLrUbNYrOzs7E8eq62t3fASm3UnAdDS0qIm3K0rMzMzMjLy48eP5ubmrq6uioqKHz584HA4FhYWgj8AqMdM8/Ly6HS6mZmZk5OT8Ky3FRUVOTk52traOjo61BYejxcbG/v+/fuioqJWrVq1bduWynqbiMfjPX/+/O3btxUVFWpqap07d7a1ta3710h5efn9+/czMzNVVFR69OhRd5HClJQUeXl5c3Nz4Y2VlZUhISF5eXn6+voDBgxQUVHJyspis9mtW7emWvmamprMzExlZWVqTLzwhaqpqREUo5SUlBQVFenq6gqmJU5NTaXT6XVPmpeXp6mpKVhOnMViRUdHp6WlVVRUGBkZ2draUiN5AOAbQ7Wx+fn5cnJyrVu37t69u3D7mZubW9/ciEwms+EFp8vKyoTvjlKH6OvrKygo1C3M5/MjIyMTEhIYDEaXLl3s7OyoXxk1NTVqKCMhhMfjxcXFvX//vrCwUEdHp23btp07dxauJCsrq6qqysLCQtDjU1xcHBUVlZ2dzeVyTUxMunbtKqitKah7qrm5uTwez9TU1NHR8ZOHJycnR0REVFZWmpiY9OnTR2Qa+NLS0vz8fF1dXZFfxnfv3j148IDH43Xq1MnJyYnNZmdlZamoqAimqSksLCwtLTUwMBDuSqMui6qqqsjcZdRMOIKGuqKiIj8/v+5va05OTnV1tampqWDueeEfUHNzc0dHx6asWAJSgcQdAAAAAEAG4OFUAAAAAAAZgMQdAAAAAEAGIHEHAAAAAJABSNwBAAAAAGRAy03cy8vL16xZI776qamgxFe/zMGqOsJwNYTx+XwejyftKFoQfD2a1/Xr1+/fvy+x0/F4PLEu/ywr8DUmyAT+gS8DkZ2L0HIT9/z8/FOnTomv/pqaGvx3FVZdXS3tEFoQXA1hPB6Pw+FIO4oWBF+P5vXo0aPIyEiJnY7L5eIPUYKvMSGEkJqaGvwVR/BlIIQQwmKxpB1Ck7TcxB0AvsDMmTNHjBgh7SgAAACg+TEbLwIAMiIjI+PixYtqamqRkZFOTk7SDgcAAAAIIaS2trbu77Kdnd3Ro0c/qx4k7gDfjuPHj48aNcrQ0PDo0aNI3AEAAFoIOp0eEBAgeFtUVDRu3LgJEyZ8bj1I3AG+EXw+//jx44cOHTI2NnZyctq2bZvwEtkAAAAgRd26daNe8Hi8YcOGeXh4+Pn5fW4lkkjck5OTP378aGVlZWBgIIHTAXwDgoODQx4+lWfKDerr7Orq2pRD7t27x+Fw+vTpQ6fT27dvf/Xq1YkTJ4o5TAAAAGhIaGjonftPeLW1g/r0GjBgACFk2bJlOTk5Fy9e/ILaxJu4V1RU2NnZ0Wg0U1PTuLi4+fPnr1u3TqxnBJB15eXl/Ud4psiZl1gPJjzewbVHO2/be/PCKUVFxYYPPHr0aIcOHS5dukQIsbS0PHLkCBJ3aC5lZWWCmViYTKaamlrdMnw+Pz4+nk6n29jYSDY6AICWqKqqavCYia852sUdhhFCO7LlXPstu2ZOGH38+PHIyMgvuysu3sSdyWSePHnS2dmZEPLmzRs7O7sJEybY2tqK9aQAMm2O3y8xbcZznf6Xcxd1Gf40fM+vv2/ctn5tA0eVlZVdvnzZ09Pz7t27hBA1NbWrV6+mpaW1bt1aAjHDN693797p6elMJpMQ0rNnz6CgIJECpaWlAwcOrKys5HA4xsbGQUFBSkpK0ogUAKClWLLyt0i9AewfZlNvizu7R934LXrO3Nu3gy0sLL6sTvFOB6moqEhl7YSQdu3aqampFRQUiPWMALIu5N4DruN/nlZhufx44drNho86e/Zs+/btjxw5EvCPwYMHHz9+XJyRwvclMDCwqKioqKiobtZOCNm1a5eWltbLly/j4+PZbPZff/0l+QgBAFqUa7fusHvP+Pd9RSHn8SklLd0mjoD9JMk9nHr69Gk1NTVHR8cmlufz+dXV1SEhIYIt1tbWJiYmzRVPbW0tll0QhgsiTFpXg8fj8ZmKhEb7z1aGXA2vkXjCw8NnzpwpXMbb23vnzp3N8ilq//H1VX0bJHw1aDQaTeQrIQ3l5eVZWVnGxsaf3HvhwoWVK1fS6XQ6nT516tRTp0799NNPEo4QAKBF4RIaoTP+94bHIfs9iWEHRtWH9+/fU9sYDIa5ufln1SmhxD0yMnLRokUXLlxo+oCe6urqkpKSjRs3CrZ4e3uPHj26uUKqqqqqra2l07EE1f9UV1czGIzGy30fpHg1GDw2qeUSutD/TXaFkjyzqqqqgaMOHTpECBEu069fv379+jV8VBNVV1efO3cOKw0LsNlsBQWFr6ykY8eOTezIYDAYLWHYyezZswkhPB5v796948aNE9mbnp5uaWlJvba0tMzIyGh6zZWVlSUlJdQoL0IIk8l0cXFB4wwgeUlJSQ8ePJB2FNLRLA27CG5ZIbl/kDiMJSrapCSHFGcSPr+sNId6RJUQ0qpVq4iIiM+qUxKJe2xs7PDhw48cOdKnT5+mH6WsrGxoaBgWFiamqOh0uqKiIn4bBPh8vqqqqrSjaCmkeDWmjR+3J3hD1dDV/4RSqxa4cuFsHyn+66Smpq5evbpurvbd4vP5X9kFnpOTc+nSpXv37jVTRGJ3+/ZtIyMjQsiFCxemTZvm5OQk3EtE3SAV/OYpKipWVlY2vfLMzMz4+Pi3b99SbxkMhqWlpba2dvOF/x9sNptOp8vJyZV3r7kAACAASURBVImpfllRWVnZEu7kSFdVVRWHw0GnleDLsHPnztevX3+fzyJ+fcNe1/CBfe+EbslW0iBOXkTHjKxPUrn+q6+j1vLFCwRlKioqBK8VFRWpR4kaIPbEPSkpyd3dfdeuXR4eHuI+F8A3YP3qX/IWLAnaO6DCeiCNX6uSeGuiR/+Fc/9PiiHx+XxDQ0PhlSPgK92/f9/f31/aUXwGKmsnhIwbN27t2rXPnj0TTtxpNJq+vn5RURH1trCw8LMm/7W2tnZ2dl66dGkzBtwAOTk5JO4EnTWEEELodLqCggISd8GXQU5Obvz48fPnz5d2RN+O0WPGhAb/zi1NJ4SmkhQ8qm+P31Yu/5peY/Em7iUlJX369LG2tk5LS9u8eTMhxMPD4/v8Sw6giRgMxtE/d6SlpT1//pzBYPToMV2QMwFIHZvN/vjxo5aWlsh2BweHx48fU09cPX78uOmPMwEAfMMUFRTW//wT1ZfRvfsUU1PTr6xQvIk7n8/38fEhhBQXF1NbampqxHpGgG9D69atMZMjtBDJycmHDh3q1asXn88/ePCgvr4+Ne7x7t27CxcujI+PJ4QsXLhwzJgxbdq0YbPZBw8eFN8oRwAA2aKjozN27Njmqk28ibuWltamTZvEegoAABArHR0deXn5EydOUI+Nzps3jxrObmRkNGrUKKpM3759T548eezYMSaTefXqVcHK3gAA0IwkNx0kAADIIh0dnfXr19fdbmNjI7wYtru7u7u7uwTjAgD47mBOFQAAAAAAGYAedwBofrW1taGhoQ8fPszPzzcyMurXr59gEWUAAPhmFBQUXL169fXr13w+39raetSoUYaGhtIO6luGxB0Amtnr169He038kJPPa9+Po26oEPtq/dYdnew6Xjxz6nOXiOPz+RERESkpKTo6Og4ODnp6etT26urqly9fysvLd+nSpb5ji4uLHz16VFJS0qZNGycnpwZmfFu5cuXs2bPNzMw+KzYAgO/c9u07fvl1pZypbZWJA5/OUL5zeuFiv1+WL1+zetXnznhYUlLy6NGj4uJiKyur7t27Uy12fn7+s2fPqqurHRwcrKys6js2Pj4+NjZWWVm5S5cuDczrkJiYePXq1V9++eWzAmtpMFQGAJrT+/fve7v0fW82kLXhLWf6cTJ2E3vm6ZqN72IZFj1d+hYWFja9qqysrO7du0+ePPnOnTsBAQFdunQ5duwYIWT79u2ampqDBg1asWJFfceePHnSwsJi165d4eHhfn5+NjY2DZz69OnTHz9+/JxPCQDwvdu8ZeuKdZtr5l+r/Pkxf+IuMn57lV841y9064GjS5d9XnJ86tSp1q1b79ixIzw8fMmSJR06dCgoKAgPD7e2tj548OD169e7du26d+/eugdWVlaOHj26f//+169fP3v2bJ8+fZYvX17fWT58+HD58uXP/pwtDHrcAaA5LVyyrNp2KG/Mxv9sVVTjTv2reI+7/9rf9+7e2cSqxo0bZ2lp+ejRI3l5eUJIYWFhbGwsIWTChAmzZs06fPjw7du3P3ng8+fPZ86cGRgYOHDgQGpLaGgon8+nXhcVFWVmZrZp00ZZWVnkwIqKCjk5OWrKFA6Hw2Kx1NTUamtry8rKNDU1k5OTCSHt2rUjhGRlZZWWllpbW1PdQtXV1VQNiYmJFhYWgmnOeTxeUlJSTU2NpaWlhoZGEz84AEALl5mZuWq1P2fRbWLV4z87LBxZ8wJ3r3Oa7j21iev2REdHz5gx49q1a4MHD6a2hIeH8/l8GxubtLQ0quUMCgry8vKaM2eOyL3TRYsWZWVlJSQkUGsts1gswe9CbW3t+/fvaTSapaWlyJKotbW1paWlgoa6oqJCXl5eXl6+urqaWj81MTGxdevW2tratbW1r1+/1tPTEywqV1JSoq6unpWVVVZWZm1tLVjotLi4OC0tTVFRsV27dmJd0guJOwA0m/Ly8ls3rvNWv/jEPhqNNXDpyaOT9+za0ZRlpaOioiIjI69cuUJl7YQQHR2d/v37E0IaHUC5b9++kSNHCrJ2Qgh1ICFk5cqVR44c6dix48uXL3ft2uXl5SV84NSpUz08PKZPn04ICQwM3Lt3b1hYWG5urqWlpZeXV3p6ekpKiqenp56e3vXr14uLi83NzYODg2k02q+//vru3bvMzEwNDY2YmJgLFy64ubnl5+f37dtXT09PTU3t1atX9+/fx2gcAPg2XLp0Sa6NE0cka6cYtmfYu585e3bd7783par9+/cPHz5ckLUTQvr27StSxtjYmMPh8Hg84Zy4vLz82LFjt2/fprJ2QoiiouKIESMIIZmZmcOHD5eTk+NyuQwG4/r168LLOX/8+NHMzIzNZlNvx4wZM336dC8vr02bNkVGRn78+FFNTS02Nvb8+fMbNmyg0WixsbEHDhzw9PQkhBgZGU2ePPnVq1fl5eXKysoPHz5UUFA4efLkihUrHBwcSkpKdHV1z58/35QP/mUwVAYAms379+/pTHli0O7Tu827lRV9LCgoaEpVL1++NDEx0dfX/4IwXr161bVr17rbHz58GBAQEBcXd+fOnUuXLs2ePbuJQ3fYbLaHh8e9e/ciIiL27t1bWVn59OnTV69eJSYmRkREUGWSk5MfPHgQFha2YcOGLVu2EEKCgoI6dOgQHh5+/fr1d+/eGRsbf8FnAQBogeITk6qMP9HMUtim3V68TGhiVfW12MLWrVs3efJkQT8OJSkpicPhfPLY5cuXOzo6RkREREdHd+jQ4ddff21iMElJSWFhYeHh4fPnzx81alRAQEBYWNjhw4c3bvz3NrK5ufnTp09fvnzJ4XCCgoIIIXv37j169OiVK1fCw8P//vvvJp7ryyBxB4Bmw+VyafT6bxEymFSZplTF4/Hk5OS+OAyR9p1y7949Dw8PXV1dQkjv3r2NjIyioqKaUiGDwRg5ciQhxMTERFNTk3otJyfXoUOHtLQ0qsyQIUNUVFQIId26daM22tnZhYaG+vr6hoaGUr0+X/ZxAABaGi6XR+j1j9pgMJvY1JP6W2wBf3//t2/fbt++XWQ7j8ej0WifPDY8PNzHx4d67ePjc+/evSYGM3DgQHV1dUKIvb19hw4dqLGRnTt3FjT1hBCq651Op3ft2jU1NZUQ0qVLFz8/v127dqWkpHzxL1cTIXEHgGbTunVrbnUFKcn+9O6seEUVNcHMMA1r27ZtRkZGZWXlF4TRtm3bxMTEuturqqqEx7WrqKg0UD+PxxO8lpOTE7TFTCZTUAmT+e+PE5W1C290cHB49OiRurr6woULra2t09PTv+CzAAC0QO3aWCrmf6KZpcjlJNi0q3cSGBH1tdiUTZs2Xbhw4fbt23UfE6LmmWm0tVdWVm74p0S4tRccxWAwPtnUC5cRbP/zzz9XrVr14sULR0fHOXPmNHCur4fEHQCajY6OjlNvF/q9A5/cK39///DhI5rY8ezs7Gxqaip8d5LH4yUkNOne67Rp0/7+++93794JtqSnp5eVldnY2Dx9+pTaUlRUlJSUJPLsVKtWrbKz//dXB/Ug7FeytbX97bffXr9+bWNjExgY+PUVAgC0BCNHjuS+vkvy331iX2ku7cXlcWPHNLGqadOmnT59OiUlRbAlIyOjtLSUELJz584jR47cvXv3k8MmdXV1hw4dum7dOuHM+9WrV4QQ4db+yZMnIk29trY2l8ulxm2y2ewm/rI0gMFgjB079vjx469evQoICKipqfnKChuAh1MBoDnt2b6lt4trja4V6T3t3618Pi14i9zroE0no5tYD5PJPHfu3NChQ2NjY11dXcvKym7cuOHp6WljY/P8+fO//vrr1atXmZmZ//d//9ezZ09vb2/hYz08PObPn+/g4ODj49O6deuEhISrV6/GxMR4eXn98ccfkyZN6tev35EjR8aOHWttbS184IgRI6ZPn66hoZGXlxcYGNiqVauvuRQHDx5MSkrq0qVLWVlZTEzMunXrvqY2AICWo3379jNmzjx+YDRr3nWiI7RAR2mOYsC4wUOG9O7du4lVDRkyZOHChY6OjtOnT2/dunViYuKVK1devHgRGRm5aNEid3f3tWvXUiXXr18v0iwHBAQMHDiwV69eI0aMoNFooaGhenp6p0+fXrNmzaRJkyoqKng83tatWy9evCh8lJycnLu7+7Rp00aMGBEUFPT1g1vGjRvXo0cPExOTkJAQZ2fnhkf+fCUk7gDQnBwcHK5euuA5cTLvyV/VHYcRVR1Smqsce0mFU3o9+KaFhUXTq+rWrdubN28uXLiQkpKipaW1e/duavlVbW3tbt26devWjSr2yeU2Nm/e7OXldfPmzaysLHt7+99//50a2v706dNTp069e/fO19d37NixVOF169ZRK0O5u7ufOHHi3r177dq1u3LlCnUHVlNTU3j+4K1btwqmtZk/f36bNm0IIePGjRNMCmZmZrZ+/XpCyNChQ2tra1+9eqWurh4SEtLEmdEAAGTC3l072Oy5p/w70RzHcswdCY3BzIyhRZ4bPHTI6RNHP6uqjRs3enp6BgUFZWVlderUae3atXp6elVVVQEBAcLFqLl6hRkbG8fExFy+fDkmJkZZWdnX13fo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AAAAMkBxBwAAAGSA4g4AAADIAMUdAAAAkAGKOwAAACADFHcAAABABijuAAAAgAxQ3AEAAAAZoLgDAAAAMkBxBwAAAGSA4g4AAADIgKnUAQAADd0777xz69Yt3bKXl9e6detqztm5c+fevXtNTExmz549ceJEwwYEgCaB4g4AqMPJkyeDgoK6dOkihHBwcKg54ciRI2vXro2Oji4rKxs/fryzs3P//v0NHhMAGjmKOwCgbgMGDKili0dERCxevLh3795CiDlz5mzfvp3iDgDPHNe4AwDqtmbNmldffXXFihUFBQU171Uqlb6+vrrll19+WalUGjYdADQJvOIOABA///zz3bt3Hxp0dHT08vISQrz11lseHh5GRkaRkZF9+/aNj483NzevnqbVavPz81u2bKm7qVAocnNz67/rhISEK1eubN++XXfT1NT01KlTj7wg55m4f/++sbGxmZmZnrYvF2q12sjISOoUEistLa2oqDAxMZE6iMQ4GYQQarVa6gjC3Nzc1LSOZk5xBwCITz755MaNGw8NDhkyRFfc582bVz3i6up65syZESNGVE8zMjKytbUtLS3V3SwpKaku8fXRpUuXF198ccaMGbqbJiYm7dq1e+IHUiczMzOKuxBCq9VaW1tLnUJixsbGzZs3p7hzMujI4iBQ3AEA4uOPP67PtGbNmtnb29d8bd7d3T05OfmVV14RQiQnJ7u5udV/16ampnZ2dh4eHvVfBQCaJq5xBwDURqVSJSYm6pb379//xx9/9OzZUwiRmJj4/vvv68YnTpwYFRVVXl5eWlq6a9euN954Q7K4ANB4UdwBALVRqVT9+vVzcHCwt7dfvXr1gQMHXFxchBC///57VFSUbs6cOXMcHR2dnZ1dXV1feOGFN998U9LIANA4cakMAKA2np6eubm5+fn5pqamCoWienzEiBFpaWm6ZXNz88OHDxcWFhobG7do0UKipADQyFHcAQB1a9WqVZ1zHqz1AIBnjktlAAAAABmguAMAAAAyQHEHAAAAZIDiDgAAAMgAxR0AAACQAYo7AAAAIAMUdwAAAEAGKO4AAACADFDcAQAAABmguAMAAAAyYKDirtVqtVqtYfZVH5WVlWq1WuoUAAAAQH3pvbhnZWUFBAQ0b97c0tLyjTfe0Pfu6pScnDxq1ChLS0tPT09nZ+dly5bdv39f6lAAAABAHfRb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o7/97W/VL7fn5OTMnTu3c+fObm5uo0ePvnDhwuO2Nnny5IMHDz44EhoaWj1y8ODBSZMmZWZmTpw4sX379r6+vl9++aUQ4qeffvL39/fw8Bg5cuT169er1/3444/feeed5OTkoKAgDw+PPn367N69u5bH0rdvX2dn579+DACgkfv5558PHz48e/bsB1u7EEKhULz//vvVN2NiYoYNG+bm5ubt7b148eI7d+48cmvnz58PCQlRqVSPG5k2bdqnn356+PDhXr16eXh4BAcHZ2RkVFVVffDBB926dfP29l6yZEn1m6Pu3bsXEhISExPzySef9OjRw9PTMygoKCkp6XGPpVWrVr169bKysnriowFUo7hDTnJycuLi4saOHVvLBY4FBQW9evXSde7ly5fn5uYOHDgwNjb2kZO//vrra9euPW7k2rVr0dHRw4cPt7OzW7RokY2Nzfjx43fs2BEYGOjn5zd//vzk5OQhQ4bcu3dPN//y5csHDx7U/RRZvHixlZXV9OnTv/vuu2f06AGgqTh69KgQ4s0336xlzoEDB/z9/TUazXvvvRcYGBgZGTlgwIDqJ+QHpaenR0dHl5aWPm7kyJEjH3zwwfLly8eNGzdjxozTp0+PGzdu4cKFx44dmzZt2vDhw7du3bp69WrdZI1GEx0d/e67727bti0kJGTq1Knnzp0bO3ZsZWXlM3v8wGNwqQzkJCUlRavVdunSpZY5H3744R9//HHp0qUePXoIIUJDQ318fBYuXHjjxo0n2GNZWdncuXNnz54thJg8eXLbtm3nzp0bFxeneyPsK6+80rNnz5iYmHHjxunmZ2VlHT16dNSoUUKIGTNmeHh47N69e9CgQU+wawBoslJSUoQQtTzbV1RULFq06OWXXz558qSpqakQwtfXNyAgYOfOnQsWLHiCPWZkZCQlJdnb2wshHBwc3nrrLXNz87NnzxobGwshCgoKPvnkk40bN1bPLykpUSqV5ubmQojOnTuPGzfu4sWLffr0eYJdA/X3/wGX/eYhedhdHgAAAABJRU5ErkJggg==", + "text/html": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "execution_count": 13 + } + ], + "cell_type": "code", + "source": [ + "mapping_matrices = MLJFlux.get_embedding_matrices(\n", + " fitted_params(mach).chain,\n", + " [1, 2], # feature indices\n", + " [:C1, :C2], # feature names (to assign to the indices)\n", + " )\n", + "\n", + "C1_basis = mapping_matrices[:C1]\n", + "C2_basis = mapping_matrices[:C2]\n", + "\n", + "p1 = scatter(C1_basis[1, :], C1_basis[2, :],\n", + " title = \"C1 Basis Columns\",\n", + " xlabel = \"Column 1\",\n", + " ylabel = \"Column 2\",\n", + " label = \"C1 Columns\",\n", + " legend = :topright)\n", + "\n", + "p2 = scatter(C2_basis[1, :], C2_basis[2, :],\n", + " title = \"C2 Basis Columns\",\n", + " xlabel = \"Column 1\",\n", + " ylabel = \"Column 2\",\n", + " label = \"C2 Columns\",\n", + " legend = :topright)\n", + "\n", + "c1_cats = ['A', 'B', 'C', 'D']\n", + "for (i, col) in enumerate(eachcol(C1_basis))\n", + " annotate!(p1, col[1] + 0.1, col[2] + 0.1, text(c1_cats[i], :black, 8))\n", + "end\n", + "\n", + "c2_cats = ['X', 'Y', 'Z']\n", + "for (i, col) in enumerate(eachcol(C2_basis))\n", + " annotate!(p2, col[1] + 0.1, col[2] + 0.1, text(string(c2_cats[i]), :black, 8))\n", + "end\n", + "\n", + "plot(p1, p2, layout = (1, 2), size = (1000, 400))" + ], + "metadata": {}, + "execution_count": 13 + }, + { + "cell_type": "markdown", + "source": [ + "As we can see, categories that were generated in a similar pattern were assigned similar vectors. In a dataset,\n", + "where some columns have high cardinality, it's expected that some of the categories will exhibit similar patterns." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "### Transform (embed) data" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "X_tr = MLJ.transform(mach, X);" + ], + "metadata": {}, + "execution_count": 14 + }, + { + "cell_type": "markdown", + "source": [ + "This will transform each categorical value into its corresponding embedding vector. Continuous value will remain intact." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "---\n", + "\n", + "*This notebook was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).*" + ], + "metadata": {} + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.11.1" + }, + "kernelspec": { + "name": "julia-1.11", + "display_name": "Julia 1.11.1", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/docs/src/common_workflows/entity_embeddings/notebook.jl b/docs/src/common_workflows/entity_embeddings/notebook.jl new file mode 100644 index 00000000..ed4b8389 --- /dev/null +++ b/docs/src/common_workflows/entity_embeddings/notebook.jl @@ -0,0 +1,148 @@ +# # Entity Embeddings with MLJFlux + +# This demonstration is available as a Jupyter notebook or julia script +# [here](https://github.com/FluxML/MLJFlux.jl/tree/dev/docs/src/common_workflows/entity_embeddings). + +# Entity embedding is newer deep learning approach for categorical encoding introduced in 2016 by Cheng Guo and Felix Berkhahn. +# It employs a set of embedding layers to map each categorical feature into a dense continuous vector in a similar fashion to how they are employed in NLP architectures. + +# In MLJFlux, the `NeuralNetworkClassifier`, `NeuralNetworkRegressor`, and the `MultitargetNeuralNetworkRegressor`` can be trained and evaluated with heterogenous data (i.e., containing categorical features) because they have a built-in entity embedding layer. +# Moreover, they offer a `transform` method which encodes the categorical features with the learned embeddings. Such embeddings can then be used as features in downstream machine learning models. + +# In this notebook, we will explore how to use entity embeddings in MLJFlux models. + +using Pkg #!md +Pkg.activate(@__DIR__); #!md +Pkg.instantiate(); #!md + +# **Julia version** is assumed to be 1.10.* + +# ### Basic Imports +using MLJ +using Flux +using Optimisers +using CategoricalArrays +using DataFrames +using Random +using Tables +using ProgressMeter +using Plots +using ScientificTypes + +# Generate some data +X, y = make_blobs(1000, 2; centers=2, as_table=true, rng=40) +X = DataFrame(X); + +# Visualize it +X_class0 = X[y .== 1, :] +X_class1 = X[y .== 2, :] + +p = plot() + +scatter!(p, X_class0[!, 1], X_class0[!, 2], markercolor=:blue, label="Class 0") +scatter!(p, X_class1[!, 1], X_class1[!, 2], markercolor=:red, label="Class 1") + +title!(p, "Classes in Different Colors") +xlabel!("Feature 1") +ylabel!("Feature 2") + +plot(p) + +# Let's write a function that creates categorical features C1 and C2 from x1 and x2 in a meaningful way: +Random.seed!(40) +generate_C1(x1) = (x1 > mean(X.x1) ) ? rand(['A', 'B']) : rand(['C', 'D']) +generate_C2(x2) = (x2 > mean(X.x2) ) ? rand(['X', 'Y']) : rand(['Z']) + +# Generate C1 and C2 columns +X[!, :C1] = [generate_C1(x) for x in X[!, :x1]] +X[!, :C2] = [generate_C2(x) for x in X[!, :x2]] +X[!, :R3] = rand(1000); # A random continuous column. + +# Form final dataset using categorical and continuous columns +X = X[!, [:C1, :C2, :R3]]; + +# It's also necessary to cast the categorical columns to the correct scientific type as the embedding layer +# will have an effect on the model if and only if categorical columns exist. +X = coerce(X, :C1 =>Multiclass, :C2 =>Multiclass); + + +# Split the data +(X_train, X_test), (y_train, y_test) = partition( + (X, y), + 0.8, + multi = true, + shuffle = true, + stratify = y, + rng = Random.Xoshiro(41) +); + + +# ### Build MLJFlux Model +NeuralNetworkClassifier = @load NeuralNetworkClassifier pkg = MLJFlux + + +clf = MLJFlux.NeuralNetworkBinaryClassifier( + builder = MLJFlux.Short(n_hidden = 5), + optimiser = Optimisers.Adam(0.01), + batch_size = 2, + epochs = 100, + acceleration = CUDALibs(), + embedding_dims = Dict(:C1 => 2, :C2 => 2,), +); +# Notice that we specified to embed each of the columns to 2D columns. By default, it uses `min(numfeats - 1, 10)` +# for the new dimensionality of any categorical feature. + +# ### Train and evaluate +mach = machine(clf, X_train, y_train) + +fit!(mach, verbosity = 0) + +# Get predictions on the training data +y_pred = predict_mode(mach, X_test) +balanced_accuracy(y_pred, y_test) +# Notice how the model has learnt to almost perfectly distinguish the classes and all the information +# has been in the categorical variables. + +# ### Visualize the embedding space + +mapping_matrices = MLJFlux.get_embedding_matrices( + fitted_params(mach).chain, + [1, 2], # feature indices + [:C1, :C2], # feature names (to assign to the indices) + ) + +C1_basis = mapping_matrices[:C1] +C2_basis = mapping_matrices[:C2] + +p1 = scatter(C1_basis[1, :], C1_basis[2, :], + title = "C1 Basis Columns", + xlabel = "Column 1", + ylabel = "Column 2", + label = "C1 Columns", + legend = :topright) + +p2 = scatter(C2_basis[1, :], C2_basis[2, :], + title = "C2 Basis Columns", + xlabel = "Column 1", + ylabel = "Column 2", + label = "C2 Columns", + legend = :topright) + +c1_cats = ['A', 'B', 'C', 'D'] +for (i, col) in enumerate(eachcol(C1_basis)) + annotate!(p1, col[1] + 0.1, col[2] + 0.1, text(c1_cats[i], :black, 8)) +end + +c2_cats = ['X', 'Y', 'Z'] +for (i, col) in enumerate(eachcol(C2_basis)) + annotate!(p2, col[1] + 0.1, col[2] + 0.1, text(string(c2_cats[i]), :black, 8)) +end + +plot(p1, p2, layout = (1, 2), size = (1000, 400)) + +# As we can see, categories that were generated in a similar pattern were assigned similar vectors. In a dataset, +# where some columns have high cardinality, it's expected that some of the categories will exhibit similar patterns. + +# ### Transform (embed) data +X_tr = MLJ.transform(mach, X); +# This will transform each categorical value into its corresponding embedding vector. Continuous value will remain intact. \ No newline at end of file diff --git a/docs/src/common_workflows/entity_embeddings/notebook.md b/docs/src/common_workflows/entity_embeddings/notebook.md new file mode 100644 index 00000000..dc7e509f --- /dev/null +++ b/docs/src/common_workflows/entity_embeddings/notebook.md @@ -0,0 +1,199 @@ +```@meta +EditURL = "notebook.jl" +``` + +# Entity Embeddings with MLJFlux + +This demonstration is available as a Jupyter notebook or julia script +[here](https://github.com/FluxML/MLJFlux.jl/tree/dev/docs/src/common_workflows/entity_embeddings). + +Entity embedding is newer deep learning approach for categorical encoding introduced in 2016 by Cheng Guo and Felix Berkhahn. +It employs a set of embedding layers to map each categorical feature into a dense continuous vector in a similar fashion to how they are employed in NLP architectures. + +In MLJFlux, the `NeuralNetworkClassifier`, `NeuralNetworkRegressor`, and the `MultitargetNeuralNetworkRegressor`` can be trained and evaluated with heterogenous data (i.e., containing categorical features) because they have a built-in entity embedding layer. +Moreover, they now offer a transform which encode the categorical features with the learnt embeddings to be used by an upstream machine learning model. + +In this notebook, we will explore how to use entity embeddings in MLJFlux models. + +**Julia version** is assumed to be 1.10.* + +### Basic Imports + +````@example entity_embeddings +using MLJ +using Flux +using Optimisers +using CategoricalArrays +using DataFrames +using Random +using Tables +using ProgressMeter +using Plots +using ScientificTypes +```` + +Generate some data + +````@example entity_embeddings +X, y = make_blobs(1000, 2; centers=2, as_table=true, rng=40) +X = DataFrame(X); +nothing #hide +```` + +Visualize it + +````@example entity_embeddings +X_class0 = X[y .== 1, :] +X_class1 = X[y .== 2, :] + +p = plot() + +scatter!(p, X_class0[!, 1], X_class0[!, 2], markercolor=:blue, label="Class 0") +scatter!(p, X_class1[!, 1], X_class1[!, 2], markercolor=:red, label="Class 1") + +title!(p, "Classes in Different Colors") +xlabel!("Feature 1") +ylabel!("Feature 2") + +plot(p) +```` + +Let's write a function that creates categorical features C1 and C2 from x1 and x2 in a meaningful way: + +````@example entity_embeddings +Random.seed!(40) +generate_C1(x1) = (x1 > mean(X.x1) ) ? rand(['A', 'B']) : rand(['C', 'D']) +generate_C2(x2) = (x2 > mean(X.x2) ) ? rand(['X', 'Y']) : rand(['Z']) +```` + +Generate C1 and C2 columns + +````@example entity_embeddings +X[!, :C1] = [generate_C1(x) for x in X[!, :x1]] +X[!, :C2] = [generate_C2(x) for x in X[!, :x2]] +X[!, :R3] = rand(1000); # A random continuous column. +nothing #hide +```` + +Form final dataset using categorical and continuous columns + +````@example entity_embeddings +X = X[!, [:C1, :C2, :R3]]; +nothing #hide +```` + +It's also necessary to cast the categorical columns to the correct scientific type as the embedding layer +will have an effect on the model if and only if categorical columns exist. + +````@example entity_embeddings +X = coerce(X, :C1 =>Multiclass, :C2 =>Multiclass); +nothing #hide +```` + +Split the data + +````@example entity_embeddings +(X_train, X_test), (y_train, y_test) = partition( + (X, y), + 0.8, + multi = true, + shuffle = true, + stratify = y, + rng = Random.Xoshiro(41) +); +nothing #hide +```` + +### Build MLJFlux Model + +````@example entity_embeddings +NeuralNetworkClassifier = @load NeuralNetworkClassifier pkg = MLJFlux + + +clf = MLJFlux.NeuralNetworkBinaryClassifier( + builder = MLJFlux.Short(n_hidden = 5), + optimiser = Optimisers.Adam(0.01), + batch_size = 2, + epochs = 100, + acceleration = CUDALibs(), + embedding_dims = Dict(:C1 => 2, :C2 => 2,), +); +nothing #hide +```` + +Notice that we specified to embed each of the columns to 2D columns. By default, it uses `min(numfeats - 1, 10)` +for the new dimensionality of any categorical feature. + +### Train and evaluate + +````@example entity_embeddings +mach = machine(clf, X_train, y_train) + +fit!(mach, verbosity = 0) +```` + +Get predictions on the training data + +````@example entity_embeddings +y_pred = predict_mode(mach, X_test) +balanced_accuracy(y_pred, y_test) +```` + +Notice how the model has learnt to almost perfectly distinguish the classes and all the information +has been in the categorical variables. + +### Visualize the embedding space + +````@example entity_embeddings +mapping_matrices = MLJFlux.get_embedding_matrices( + fitted_params(mach).chain, + [1, 2], # feature indices + [:C1, :C2], # feature names (to assign to the indices) + ) + +C1_basis = mapping_matrices[:C1] +C2_basis = mapping_matrices[:C2] + +p1 = scatter(C1_basis[1, :], C1_basis[2, :], + title = "C1 Basis Columns", + xlabel = "Column 1", + ylabel = "Column 2", + label = "C1 Columns", + legend = :topright) + +p2 = scatter(C2_basis[1, :], C2_basis[2, :], + title = "C2 Basis Columns", + xlabel = "Column 1", + ylabel = "Column 2", + label = "C2 Columns", + legend = :topright) + +c1_cats = ['A', 'B', 'C', 'D'] +for (i, col) in enumerate(eachcol(C1_basis)) + annotate!(p1, col[1] + 0.1, col[2] + 0.1, text(c1_cats[i], :black, 8)) +end + +c2_cats = ['X', 'Y', 'Z'] +for (i, col) in enumerate(eachcol(C2_basis)) + annotate!(p2, col[1] + 0.1, col[2] + 0.1, text(string(c2_cats[i]), :black, 8)) +end + +plot(p1, p2, layout = (1, 2), size = (1000, 400)) +```` + +As we can see, categories that were generated in a similar pattern were assigned similar vectors. In a dataset, +where some columns have high cardinality, it's expected that some of the categories will exhibit similar patterns. + +### Transform (embed) data + +````@example entity_embeddings +X_tr = MLJ.transform(mach, X); +nothing #hide +```` + +This will transform each categorical value into its corresponding embedding vector. Continuous value will remain intact. + +--- + +*This page was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).* + diff --git a/docs/src/common_workflows/entity_embeddings/notebook.unexecuted.ipynb b/docs/src/common_workflows/entity_embeddings/notebook.unexecuted.ipynb new file mode 100644 index 00000000..233bac71 --- /dev/null +++ b/docs/src/common_workflows/entity_embeddings/notebook.unexecuted.ipynb @@ -0,0 +1,403 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# Entity Embeddings with MLJFlux" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "This demonstration is available as a Jupyter notebook or julia script\n", + "[here](https://github.com/FluxML/MLJFlux.jl/tree/dev/docs/src/common_workflows/entity_embeddings)." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Entity embedding is newer deep learning approach for categorical encoding introduced in 2016 by Cheng Guo and Felix Berkhahn.\n", + "It employs a set of embedding layers to map each categorical feature into a dense continuous vector in a similar fashion to how they are employed in NLP architectures." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "In MLJFlux, the `NeuralNetworkClassifier`, `NeuralNetworkRegressor`, and the `MultitargetNeuralNetworkRegressor`` can be trained and evaluated with heterogenous data (i.e., containing categorical features) because they have a built-in entity embedding layer.\n", + "Moreover, they now offer a transform which encode the categorical features with the learnt embeddings to be used by an upstream machine learning model." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "In this notebook, we will explore how to use entity embeddings in MLJFlux models." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Pkg\n", + "Pkg.activate(@__DIR__);\n", + "Pkg.instantiate();" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "**Julia version** is assumed to be 1.10.*" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "### Basic Imports" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using MLJ\n", + "using Flux\n", + "using Optimisers\n", + "using CategoricalArrays\n", + "using DataFrames\n", + "using Random\n", + "using Tables\n", + "using ProgressMeter\n", + "using Plots\n", + "using ScientificTypes" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Generate some data" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "X, y = make_blobs(1000, 2; centers=2, as_table=true, rng=40)\n", + "X = DataFrame(X);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Visualize it" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "X_class0 = X[y .== 1, :]\n", + "X_class1 = X[y .== 2, :]\n", + "\n", + "p = plot()\n", + "\n", + "scatter!(p, X_class0[!, 1], X_class0[!, 2], markercolor=:blue, label=\"Class 0\")\n", + "scatter!(p, X_class1[!, 1], X_class1[!, 2], markercolor=:red, label=\"Class 1\")\n", + "\n", + "title!(p, \"Classes in Different Colors\")\n", + "xlabel!(\"Feature 1\")\n", + "ylabel!(\"Feature 2\")\n", + "\n", + "plot(p)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Let's write a function that creates categorical features C1 and C2 from x1 and x2 in a meaningful way:" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "Random.seed!(40)\n", + "generate_C1(x1) = (x1 > mean(X.x1) ) ? rand(['A', 'B']) : rand(['C', 'D'])\n", + "generate_C2(x2) = (x2 > mean(X.x2) ) ? rand(['X', 'Y']) : rand(['Z'])" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Generate C1 and C2 columns" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "X[!, :C1] = [generate_C1(x) for x in X[!, :x1]]\n", + "X[!, :C2] = [generate_C2(x) for x in X[!, :x2]]\n", + "X[!, :R3] = rand(1000); # A random continuous column." + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Form final dataset using categorical and continuous columns" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "X = X[!, [:C1, :C2, :R3]];" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "It's also necessary to cast the categorical columns to the correct scientific type as the embedding layer\n", + "will have an effect on the model if and only if categorical columns exist." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "X = coerce(X, :C1 =>Multiclass, :C2 =>Multiclass);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Split the data" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "(X_train, X_test), (y_train, y_test) = partition(\n", + "\t(X, y),\n", + "\t0.8,\n", + "\tmulti = true,\n", + "\tshuffle = true,\n", + "\tstratify = y,\n", + "\trng = Random.Xoshiro(41)\n", + ");" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "### Build MLJFlux Model" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "NeuralNetworkClassifier = @load NeuralNetworkClassifier pkg = MLJFlux\n", + "\n", + "\n", + "clf = MLJFlux.NeuralNetworkBinaryClassifier(\n", + " builder = MLJFlux.Short(n_hidden = 5),\n", + " optimiser = Optimisers.Adam(0.01),\n", + " batch_size = 2,\n", + " epochs = 100,\n", + " acceleration = CUDALibs(),\n", + " embedding_dims = Dict(:C1 => 2, :C2 => 2,),\n", + ");" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Notice that we specified to embed each of the columns to 2D columns. By default, it uses `min(numfeats - 1, 10)`\n", + "for the new dimensionality of any categorical feature." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "### Train and evaluate" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "mach = machine(clf, X_train, y_train)\n", + "\n", + "fit!(mach, verbosity = 0)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Get predictions on the training data" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "y_pred = predict_mode(mach, X_test)\n", + "balanced_accuracy(y_pred, y_test)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Notice how the model has learnt to almost perfectly distinguish the classes and all the information\n", + "has been in the categorical variables." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "### Visualize the embedding space" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "mapping_matrices = MLJFlux.get_embedding_matrices(\n", + " fitted_params(mach).chain,\n", + " [1, 2], # feature indices\n", + " [:C1, :C2], # feature names (to assign to the indices)\n", + " )\n", + "\n", + "C1_basis = mapping_matrices[:C1]\n", + "C2_basis = mapping_matrices[:C2]\n", + "\n", + "p1 = scatter(C1_basis[1, :], C1_basis[2, :],\n", + " title = \"C1 Basis Columns\",\n", + " xlabel = \"Column 1\",\n", + " ylabel = \"Column 2\",\n", + " label = \"C1 Columns\",\n", + " legend = :topright)\n", + "\n", + "p2 = scatter(C2_basis[1, :], C2_basis[2, :],\n", + " title = \"C2 Basis Columns\",\n", + " xlabel = \"Column 1\",\n", + " ylabel = \"Column 2\",\n", + " label = \"C2 Columns\",\n", + " legend = :topright)\n", + "\n", + "c1_cats = ['A', 'B', 'C', 'D']\n", + "for (i, col) in enumerate(eachcol(C1_basis))\n", + " annotate!(p1, col[1] + 0.1, col[2] + 0.1, text(c1_cats[i], :black, 8))\n", + "end\n", + "\n", + "c2_cats = ['X', 'Y', 'Z']\n", + "for (i, col) in enumerate(eachcol(C2_basis))\n", + " annotate!(p2, col[1] + 0.1, col[2] + 0.1, text(string(c2_cats[i]), :black, 8))\n", + "end\n", + "\n", + "plot(p1, p2, layout = (1, 2), size = (1000, 400))" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "As we can see, categories that were generated in a similar pattern were assigned similar vectors. In a dataset,\n", + "where some columns have high cardinality, it's expected that some of the categories will exhibit similar patterns." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "### Transform (embed) data" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "X_tr = MLJ.transform(mach, X);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "This will transform each categorical value into its corresponding embedding vector. Continuous value will remain intact." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "---\n", + "\n", + "*This notebook was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).*" + ], + "metadata": {} + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.11.1" + }, + "kernelspec": { + "name": "julia-1.11", + "display_name": "Julia 1.11.1", + "language": "julia" + } + }, + "nbformat": 4 +}