{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\"Julia\"\n", "\n", "[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/darenasc/mlj-tutorials/master?filepath=README.ipynb)\n", "\n", "## Lightning encounter with Julia programming language\n", "\n", "###### Julia related content prepared by [@ablaom](https://github.com/ablaom)\n", "\n", "Interacting with Julia at the REPL, or in a notebook, feels very much\n", "\n", "the same as python, MATLAB or R:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hello world!" ] } ], "source": [ "print(\"Hello world!\")" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "2 + 2" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Float64" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "typeof(42.0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Just-in-time compilation\n", "\n", "Here's a function used in generating the famous Mandelbrot set,\n", "\n", "which looks pretty much the same in python, MATLAB or R:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "mandel (generic function with 1 method)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "function mandel(z)\n", " c = z\n", " maxiter = 80\n", " for n in 1:maxiter\n", " if abs(z) > 2\n", " return n-1\n", " end\n", " z = z^2 + c\n", " end\n", " return maxiter\n", "end" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In particular, notice the absence of type annotations. The crucial difference is what happens when you call this function:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 0.012019 seconds (29.06 k allocations: 1.662 MiB)\n" ] }, { "data": { "text/plain": [ "1" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "@time mandel(1.2) # time call on a Float64" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is actually pretty lousy, slower than python. However, trying again:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 0.000003 seconds (4 allocations: 160 bytes)\n" ] }, { "data": { "text/plain": [ "0" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "@time mandel(3.4) # time on another Float64" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Thousands of times faster, second time around! What happenend?\n", "\n", "When you call `mandel(1.2)` in python, say, then the defining code\n", "is interpreted each time. When you call `mandel(1.2)` in Julia for\n", "the first time Julia inspects the of the argument, namely `Float64`,\n", "and using this information *compiles* an efficient type-specfic\n", "version of `mandel`, which it caches for use in any subsequent call\n", "*on the same type*. Indeed if we call `mandel` on a new type, a new\n", "compilation will be needed:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 0.041186 seconds (75.59 k allocations: 4.152 MiB)\n" ] }, { "data": { "text/plain": [ "0" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "@time mandel(1.0 + 5.0im)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 0.000009 seconds (6 allocations: 224 bytes)\n" ] }, { "data": { "text/plain": [ "0" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "@time mandel(2.0 + 0.5im)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Since plotting the Mandelbrot set means calling `mandel` millions of\n", "times on the same type, the advantage of just-in-time compilation is\n", "obvious." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "Figure(PyObject
)" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "PyObject " ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "using PyPlot\n", "\n", "plt.imshow([mandel(x + y * im) for y = -1:0.001:1, x = -2:0.001:1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Multiple dispatch\n", "\n", "You will never see anything like `A.add(B)` in Julia because Julia\n", "is not a traditional object-oriented language. In Julia, function and\n", "structure are kept separate, with the help of abstract types and\n", "multiple dispatch, as we explain next\n", "In addition to regular concrete types, such as `Float64` and\n", "`String`, Julia has a built-in heirarchy of *abstract* types. These\n", "generally have subtypes but no instances:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Int64" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "typeof(42)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Signed" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "supertype(Int64)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Integer" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "supertype(Signed)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3-element Array{Any,1}:\n", " Bool \n", " Signed \n", " Unsigned" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "subtypes(Integer)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "true" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Bool <: Integer # is Bool a subtype of Integer?" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "false" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Bool <: String" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In Julia, which is optionally typed, one uses type annotations to\n", "adapt the behaviour of functions to their types. If we define" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "divide (generic function with 1 method)" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "divide(x, y) = x / y" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "then `divide(x, y)` will make sense whenever `x / y` makes sense (for\n", "the built-in function `/`). For example, we can use it to divide two\n", "integers, or two matrices:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.5" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "divide(1, 2)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2×2 Array{Float64,2}:\n", " 1.0 0.0\n", " 9.0 -2.0" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "divide([1 2; 3 4], [1 2; 3 7])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To vary the behaviour for specific types we make type annotatations:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.0" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "divide(x::Integer, y::Integer) = floor(x/y)\n", "divide(x::String, y::String) = join([x, y], \" / \")\n", "divide(1, 2)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\"Hello / World!\"" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "divide(\"Hello\", \"World!\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the case of `Float64` the original \"fallback\" method still\n", "applies:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.5" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "divide(1.0, 2.0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## User-defined types\n", "\n", "Users can define their own abstract types and composite types:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "describe (generic function with 2 methods)" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "abstract type Organism end\n", "\n", "struct Animal <: Organism\n", " name::String\n", " is_hervibore::Bool\n", "end\n", "\n", "struct Plant <: Organism\n", " name::String\n", " is_flowering::Bool\n", "end\n", "\n", "describe(o::Organism) = string(o.name) # fall-back method\n", "function describe(p::Plant)\n", "\n", " if p.is_flowering\n", " text = \" is a flowering plant.\"\n", " else\n", " text = \" is a non-flowering plant.\"\n", " end\n", " return p.name*text\n", "\n", "end" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\"Elephant\"" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "describe(Animal(\"Elephant\", true))" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\"Fern is a non-flowering plant.\"" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "describe(Plant(\"Fern\", false))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Type inference and multiple dispatch\n", "\n", "*Type inference* is the process of identifying the types of the arguments to dispatch the right method.\n", "\n", "Blogpost about [type dispatch](http://www.stochasticlifestyle.com/type-dispatch-design-post-object-oriented-programming-julia/) by [Christopher Rackauckas](http://www.chrisrackauckas.com/)." ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "function_x (generic function with 2 methods)" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "function function_x(x::String)\n", " println(\"this is a string: $x\")\n", "end\n", "\n", "function function_x(x::Int)\n", " println(\"$(x^2) is the square of $x\")\n", "end" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "this is a string: a string\n", "4 is the square of 2\n" ] } ], "source": [ "# each call to the function_x() will dispatch the corresponding method depending on the parameter's type\n", "function_x(\"a string\")\n", "function_x(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Automatic differentiation\n", "\n", "Differentiation of almost arbitrary programs with respect to their input. ([source]( https://render.githubusercontent.com/view/ipynb?commit=89317894e2e5370a80e45d52db8a4055a4fdecd6&enc_url=68747470733a2f2f7261772e67697468756275736572636f6e74656e742e636f6d2f6d6174626573616e636f6e2f454d455f4a756c69615f776f726b73686f702f383933313738393465326535333730613830653435643532646238613430353561346664656364362f315f496e74726f64756374696f6e2e6970796e62&nwo=matbesancon%2FEME_Julia_workshop&path=1_Introduction.ipynb&repository_id=270611906&repository_type=Repository#Automatic-differentiation) by [@matbesancon](https://github.com/matbesancon))" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "sqrt_babylonian (generic function with 1 method)" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "using ForwardDiff\n", "\n", "function sqrt_babylonian(s)\n", " x = s / 2\n", " while abs(x^2 - s) > 0.001\n", " x = (x + s/x) / 2\n", " end\n", " x\n", "end" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2.123901414519125e-6" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sqrt_babylonian(2) - sqrt(2)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ForwardDiff.derivative(sqrt_babylonian, 2) = 0.353541906958862\n", "ForwardDiff.derivative(sqrt, 2) = 0.35355339059327373\n" ] } ], "source": [ "@show ForwardDiff.derivative(sqrt_babylonian, 2);\n", "@show ForwardDiff.derivative(sqrt, 2);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Unitful computations\n", "Physicists' dreams finally made true. ([soure](https://render.githubusercontent.com/view/ipynb?commit=89317894e2e5370a80e45d52db8a4055a4fdecd6&enc_url=68747470733a2f2f7261772e67697468756275736572636f6e74656e742e636f6d2f6d6174626573616e636f6e2f454d455f4a756c69615f776f726b73686f702f383933313738393465326535333730613830653435643532646238613430353561346664656364362f315f496e74726f64756374696f6e2e6970796e62&nwo=matbesancon%2FEME_Julia_workshop&path=1_Introduction.ipynb&repository_id=270611906&repository_type=Repository#Unitful-computations) by [@matbesancon](https://github.com/matbesancon))" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "using Unitful\n", "using Unitful: J, kg, m, s" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4.0 kg m² s⁻²" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "3J + 1kg * (1m / 1s)^2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\"MLJ\"\n", "\n", "# MLJ\n", "\n", "MLJ (Machine Learning in Julia) is a toolbox written in Julia providing a common interface and meta-algorithms for selecting, tuning, evaluating, composing and comparing machine learning models written in Julia and other languages. MLJ is released under the MIT licensed and sponsored by the [Alan Turing Institute](https://www.turing.ac.uk/)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### The MLJ Universe\n", "\n", "The functionality of MLJ is distributed over a number of repositories\n", "illustrated in the dependency chart below.\n", "\n", "[MLJ](https://github.com/alan-turing-institute/MLJ) * [MLJBase](https://github.com/alan-turing-institute/MLJBase.jl) * [MLJModelInterface](https://github.com/alan-turing-institute/MLJModelInterface.jl) * [MLJModels](https://github.com/alan-turing-institute/MLJModels.jl) * [MLJTuning](https://github.com/alan-turing-institute/MLJTuning.jl) * [MLJLinearModels](https://github.com/alan-turing-institute/MLJLinearModels.jl) * [MLJFlux](https://github.com/alan-turing-institute/MLJFlux.jl) * [MLJTutorials](https://github.com/alan-turing-institute/MLJTutorials) * [MLJScientificTypes](https://github.com/alan-turing-institute/MLJScientificTypes.jl) * [ScientificTypes](https://github.com/alan-turing-institute/ScientificTypes.jl)\n", "\n", "\n", "
\n", " \"Dependency\n", "
\n", "\n", "*Dependency chart for MLJ repositories. Repositories with dashed\n", "connections do not currently exist but are planned/proposed.*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "MLJ provides access to to a wide variety of machine learning models. For the most up-to-date list of available models `models()`." ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "┌ Info: Recompiling stale cache file /Users/darenasc/.julia/compiled/v1.2/MLJ/rAU56.ji for MLJ [add582a8-e3ab-11e8-2d5e-e98b27df1bc7]\n", "└ @ Base loading.jl:1240\n" ] }, { "data": { "text/plain": [ "132-element Array{NamedTuple{(:name, :package_name, :is_supervised, :docstring, :hyperparameter_ranges, :hyperparameter_types, :hyperparameters, :implemented_methods, :is_pure_julia, :is_wrapper, :load_path, :package_license, :package_url, :package_uuid, :prediction_type, :supports_online, :supports_weights, :input_scitype, :target_scitype, :output_scitype),T} where T<:Tuple,1}:\n", " (name = ARDRegressor, package_name = ScikitLearn, ... ) \n", " (name = AdaBoostClassifier, package_name = ScikitLearn, ... ) \n", " (name = AdaBoostRegressor, package_name = ScikitLearn, ... ) \n", " (name = AdaBoostStumpClassifier, package_name = DecisionTree, ... ) \n", " (name = AffinityPropagation, package_name = ScikitLearn, ... ) \n", " (name = AgglomerativeClustering, package_name = ScikitLearn, ... ) \n", " (name = BaggingClassifier, package_name = ScikitLearn, ... ) \n", " (name = BaggingRegressor, package_name = ScikitLearn, ... ) \n", " (name = BayesianLDA, package_name = MultivariateStats, ... ) \n", " (name = BayesianLDA, package_name = ScikitLearn, ... ) \n", " (name = BayesianQDA, package_name = ScikitLearn, ... ) \n", " (name = BayesianRidgeRegressor, package_name = ScikitLearn, ... ) \n", " (name = BayesianSubspaceLDA, package_name = MultivariateStats, ... )\n", " ⋮ \n", " (name = SVMRegressor, package_name = ScikitLearn, ... ) \n", " (name = SpectralClustering, package_name = ScikitLearn, ... ) \n", " (name = Standardizer, package_name = MLJModels, ... ) \n", " (name = StaticTransformer, package_name = MLJBase, ... ) \n", " (name = SubspaceLDA, package_name = MultivariateStats, ... ) \n", " (name = TheilSenRegressor, package_name = ScikitLearn, ... ) \n", " (name = UnivariateBoxCoxTransformer, package_name = MLJModels, ... )\n", " (name = UnivariateDiscretizer, package_name = MLJModels, ... ) \n", " (name = UnivariateStandardizer, package_name = MLJModels, ... ) \n", " (name = XGBoostClassifier, package_name = XGBoost, ... ) \n", " (name = XGBoostCount, package_name = XGBoost, ... ) \n", " (name = XGBoostRegressor, package_name = XGBoost, ... ) " ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "using MLJ\n", "models()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fit, predict, transform\n", "\n", "The following example is using the `fit()`, `predict()`, and `transform()` functions of MLJ." ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "scrolled": true }, "outputs": [], "source": [ "import Statistics\n", "using PrettyPrinting\n", "using StableRNGs" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "X, y = @load_iris;" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "let's also load the DecisionTreeClassifier:" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DecisionTreeClassifier(\n", " max_depth = -1,\n", " min_samples_leaf = 1,\n", " min_samples_split = 2,\n", " min_purity_increase = 0.0,\n", " n_subfeatures = 0,\n", " post_prune = false,\n", " merge_purity_threshold = 1.0,\n", " pdf_smoothing = 0.0,\n", " display_depth = 5)\u001b[34m @ 1…27\u001b[39m" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "@load DecisionTreeClassifier\n", "tree_model = DecisionTreeClassifier()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## MLJ Machine\n", "\n", "In MLJ, a *model* is an object that only serves as a container for the hyperparameters of the model. A *machine* is an object wrapping both a model and data and can contain information on the *trained* model; it does *not* fit the model by itself. However, it does check that the model is compatible with the scientific type of the data and will warn you otherwise." ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\u001b[34mMachine{DecisionTreeClassifier} @ 1…24\u001b[39m\n" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tree = machine(tree_model, X, y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A machine is used both for supervised and unsupervised model. In this tutorial we give an example for the supervised model first and then go on with the unsupervised case.\n", "\n", "## Training and testing a supervised model\n", "\n", "Now that you've declared the model you'd like to consider and the data, we are left with the standard training and testing step for a supervised learning algorithm.\n", "\n", "## Splitting the data\n", "\n", "To split the data into a training and testing set, you can use the function `partition` to obtain indices for data points that should be considered either as training or testing data:" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3-element Array{Int64,1}:\n", " 39\n", " 54\n", " 9" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rng = StableRNG(566)\n", "train, test = partition(eachindex(y), 0.7, shuffle=true, rng=rng)\n", "test[1:3]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fitting and testing the machine\n", "\n", "To fit the machine, you can use the function `fit!` specifying the rows to be used for the training:" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "┌ Info: Training \u001b[34mMachine{DecisionTreeClassifier} @ 1…24\u001b[39m.\n", "└ @ MLJBase /Users/darenasc/.julia/packages/MLJBase/Cb9AY/src/machines.jl:187\n" ] }, { "data": { "text/plain": [ "\u001b[34mMachine{DecisionTreeClassifier} @ 1…24\u001b[39m\n" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fit!(tree, rows=train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that this **modifies** the machine which now contains the trained parameters of the decision tree. You can inspect the result of the fitting with the `fitted_params` method:" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(tree = Decision Tree\n", "Leaves: 5\n", "Depth: 4,\n", " encoding = Dict(\"virginica\" => 0x00000003,\n", " \"setosa\" => 0x00000001,\n", " \"versicolor\" => 0x00000002))" ] } ], "source": [ "fitted_params(tree) |> pprint" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This `fitresult` will vary from model to model though classifiers will usually give out a tuple with the first element corresponding to the fitting and the second one keeping track of how classes are named (so that predictions can be appropriately named).\n", "\n", "You can now use the machine to make predictions with the `predict` function specifying rows to be used for the prediction:" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ŷ[1] = UnivariateFinite{Multiclass{3}}(setosa=>1.0, versicolor=>0.0, virginica=>0.0)\n" ] }, { "data": { "text/plain": [ "UnivariateFinite{Multiclass{3}}(setosa=>1.0, versicolor=>0.0, virginica=>0.0)" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ŷ = predict(tree, rows=test)\n", "@show ŷ[1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that the output is probabilistic, effectively a vector with a score for each class. You could get the mode by using the `mode` function on `ŷ` or using `predict_mode`:" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ȳ[1] = \"setosa\"\n", "mode(ŷ[1]) = \"setosa\"\n" ] }, { "data": { "text/plain": [ "CategoricalArrays.CategoricalValue{String,UInt32} \"setosa\"" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ȳ = predict_mode(tree, rows=test)\n", "@show ȳ[1]\n", "@show mode(ŷ[1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To measure the discrepancy between ŷ and y you could use the average cross entropy:" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2.4029" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mce = cross_entropy(ŷ, y[test]) |> mean\n", "round(mce, digits=4)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# [Check out MLJ example with TreeParzen.jl](TreeParzen_example.ipynb)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# A more advanced example" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "┌ Info: Recompiling stale cache file /Users/darenasc/.julia/compiled/v1.2/MultivariateStats/l7I74.ji for MultivariateStats [6f286f6a-111f-5878-ab1e-185364afe411]\n", "└ @ Base loading.jl:1240\n" ] }, { "data": { "text/plain": [ "RidgeRegressor(\n", " lambda = 1.0)\u001b[34m @ 1…26\u001b[39m" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "using MLJ\n", "using StableRNGs\n", "import DataFrames\n", "@load RidgeRegressor pkg=MultivariateStats" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this example we will show how to generate a model from a network; there are two approaches:\n", "\n", "* using the `@from_network` macro\n", "* writing the model in full\n", "\n", "the first approach should usually be the one considered as it's simpler.\n", "\n", "Generating a model from a network allows subsequent composition of that network with other tasks and tuning of that network.\n", "\n", "### Using the @from_network macro\n", "\n", "Let's define a simple network\n", "\n", "*Input layer*" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\u001b[34mSource{:target} @ 1…62\u001b[39m\n" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rng = StableRNG(6616) # for reproducibility\n", "x1 = rand(rng, 300)\n", "x2 = rand(rng, 300)\n", "x3 = rand(rng, 300)\n", "y = exp.(x1 - x2 -2x3 + 0.1*rand(rng, 300))\n", "X = DataFrames.DataFrame(x1=x1, x2=x2, x3=x3)\n", "test, train = partition(eachindex(y), 0.8);\n", "\n", "Xs = source(X)\n", "ys = source(y, kind=:target)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*First layer*" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\u001b[34mNode @ 5…77\u001b[39m = transform(\u001b[0m\u001b[1m5…00\u001b[22m, \u001b[34m1…62\u001b[39m)" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "std_model = Standardizer()\n", "stand = machine(std_model, Xs)\n", "W = MLJ.transform(stand, Xs)\n", "\n", "box_model = UnivariateBoxCoxTransformer()\n", "box = machine(box_model, ys)\n", "z = MLJ.transform(box, ys)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Second layer*" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\u001b[34mNode @ 1…44\u001b[39m = predict(\u001b[0m\u001b[1m4…03\u001b[22m, transform(\u001b[0m\u001b[1m7…37\u001b[22m, \u001b[34m6…82\u001b[39m))" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ridge_model = RidgeRegressor(lambda=0.1)\n", "ridge = machine(ridge_model, W, z)\n", "ẑ = predict(ridge, W)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Output*" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\u001b[34mNode @ 2…37\u001b[39m = inverse_transform(\u001b[0m\u001b[1m5…00\u001b[22m, predict(\u001b[0m\u001b[1m4…03\u001b[22m, transform(\u001b[0m\u001b[1m7…37\u001b[22m, \u001b[34m6…82\u001b[39m)))" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ŷ = inverse_transform(box, ẑ)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "No fitting has been done thus far, we have just defined a sequence of operations.\n", "\n", "To form a model out of that network is easy using the `@from_network` macro:" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [], "source": [ "@from_network CompositeModel(std=std_model, box=box_model,\n", " ridge=ridge_model) <= ŷ;" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The macro defines a constructor CompositeModel and attributes a name to the different models; the ordering / connection between the nodes is inferred from `ŷ` via the `<= ŷ`.\n", "\n", "**Note**: had the model been probabilistic (e.g. `RidgeClassifier`) you would have needed to add `is_probabilistic=true` at the end." ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.0136" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cm = machine(CompositeModel(), X, y)\n", "res = evaluate!(cm, resampling=Holdout(fraction_train=0.8, rng=51),\n", " measure=rms)\n", "round(res.measurement[1], sigdigits=3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Check out more [Data Science tutorials in Julia](https://alan-turing-institute.github.io/DataScienceTutorials.jl/)." ] } ], "metadata": { "kernelspec": { "display_name": "Julia 1.2.0", "language": "julia", "name": "julia-1.2" }, "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.2.0" } }, "nbformat": 4, "nbformat_minor": 4 }