diff --git a/tutorials/basicMachineLearning/HowToLearn.ipynb b/tutorials/basicMachineLearning/HowToLearn.ipynb index 8cf7a6a..ea5cac8 100644 --- a/tutorials/basicMachineLearning/HowToLearn.ipynb +++ b/tutorials/basicMachineLearning/HowToLearn.ipynb @@ -1,911 +1,919 @@ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ - "# This is a very short and basic tutorial on non-deep learning machine learning :-)\n", + "# This is a short and basic tutorial on non-deep machine learning :-)\n", "Assumes that you know how to start a jupyter notebook" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# first include the needed python library. If you dont have them already, you can\n", "# install them usually typing:\n", "# sudo pip install library_name\n", "# necessary libaries for this demo are:\n", "# pandas, numpy, scikit-learn, matplotlib\n", "\n", "# pandas is a very nice module for reading, writing, managing and plotting data :-)\n", "import pandas as pd\n", "# numpy is the standard library used for everything numeric (absolute must)\n", "import numpy as np\n", "# sklearn is the by far best machine learning framework that I know (besides deep learning).\n", "# we import the Random Forest\n", "from sklearn.ensemble.forest import RandomForestRegressor\n", "# ... the grid search to find the best parameter values\n", "from sklearn.model_selection import GridSearchCV\n", "# k-fold cross validation to evaluation each grid parameter:\n", "from sklearn.model_selection import KFold\n", "# the standard python plotting library:\n", "import matplotlib.pylab as plt\n", "# the next command tells python to place the graphs inside this notebook:\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# now we read in our data using pandas\n", "# header=[0,1] tells him to take the first two rows in the csv as header\n", "training_dataframe = pd.read_csv(\"train_data.txt\", \n", " header=[0, 1])\n", "testing_dataframe = pd.read_csv(\"test_data.txt\", \n", " header=[0, 1])\n", "\n", "# Note that this is just some data from my (Seb Wirkert) thesis. Sklearn comes with several \n", "# popular toy datasets in sklearn.datasets\n", "# type e.g. \n", "# from sklearn.datasets import load_iris\n", "# iris = load_iris()\n", "# X, y = iris.data, iris.target" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "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", "
Unnamed: 0_level_0layer0layer1...reflectances
Unnamed: 0_level_1vhbsao2a_mieb_miedngvhbsao2...7.0000000000000007e-077.0200000000000001e-077.0400000000000006e-077.06e-077.0800000000000004e-077.1000000000000008e-077.1200000000000002e-077.1400000000000007e-077.1600000000000001e-077.1800000000000005e-07
000.0951370.9953061830.4794861.2860.0009231.360.8256400.0054530.995306...0.4690730.4679150.4669390.4658190.4644780.4630890.4617920.4603330.4592130.458345
110.0385950.645927907.7330441.2860.0007551.360.8987150.0012320.645927...0.4203990.4206720.4212690.4208130.4204970.4207140.4207520.4203450.4200940.419487
220.0816890.089848671.3527481.2860.0006101.360.8145050.0690250.089848...0.3336250.3370230.3393860.3419500.3442640.3469480.3485870.3500850.3528200.354628
330.0298410.7813771231.7897481.2860.0008651.360.9029160.0472240.781377...0.3987750.3979640.3977430.3982280.3979510.3968820.3969720.3966870.3964430.396459
440.0851960.4905012422.8399871.2860.0010061.360.8297960.0781380.490501...0.4741820.4761410.4782580.4799240.4822450.4838010.4846220.4860650.4878050.488339
\n", "

5 rows × 157 columns

\n", "
" ], "text/plain": [ " Unnamed: 0_level_0 layer0 \\\n", " Unnamed: 0_level_1 vhb sao2 a_mie b_mie d n \n", "0 0 0.095137 0.995306 1830.479486 1.286 0.000923 1.36 \n", "1 1 0.038595 0.645927 907.733044 1.286 0.000755 1.36 \n", "2 2 0.081689 0.089848 671.352748 1.286 0.000610 1.36 \n", "3 3 0.029841 0.781377 1231.789748 1.286 0.000865 1.36 \n", "4 4 0.085196 0.490501 2422.839987 1.286 0.001006 1.36 \n", "\n", " layer1 ... reflectances \\\n", " g vhb sao2 ... 7.0000000000000007e-07 \n", "0 0.825640 0.005453 0.995306 ... 0.469073 \n", "1 0.898715 0.001232 0.645927 ... 0.420399 \n", "2 0.814505 0.069025 0.089848 ... 0.333625 \n", "3 0.902916 0.047224 0.781377 ... 0.398775 \n", "4 0.829796 0.078138 0.490501 ... 0.474182 \n", "\n", " \\\n", " 7.0200000000000001e-07 7.0400000000000006e-07 7.06e-07 \n", "0 0.467915 0.466939 0.465819 \n", "1 0.420672 0.421269 0.420813 \n", "2 0.337023 0.339386 0.341950 \n", "3 0.397964 0.397743 0.398228 \n", "4 0.476141 0.478258 0.479924 \n", "\n", " \\\n", " 7.0800000000000004e-07 7.1000000000000008e-07 7.1200000000000002e-07 \n", "0 0.464478 0.463089 0.461792 \n", "1 0.420497 0.420714 0.420752 \n", "2 0.344264 0.346948 0.348587 \n", "3 0.397951 0.396882 0.396972 \n", "4 0.482245 0.483801 0.484622 \n", "\n", " \n", " 7.1400000000000007e-07 7.1600000000000001e-07 7.1800000000000005e-07 \n", "0 0.460333 0.459213 0.458345 \n", "1 0.420345 0.420094 0.419487 \n", "2 0.350085 0.352820 0.354628 \n", "3 0.396687 0.396443 0.396459 \n", "4 0.486065 0.487805 0.488339 \n", "\n", "[5 rows x 157 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# let's have a brief look at the data. It contains lots of specific information about my application.\n", "# Every row describes \n", "# 1. an artificial tissue's parameters in layer0, layer1, layer2 and\n", "# 2. the corresponding reflectance value of this tissue.\n", "\n", "# you don't need to know the specifics of this, just think of each line as one training example. \n", "# Let me show you the first 5 lines.\n", "training_dataframe.head(5)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(15000, 157)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# total number of examples is 15,000:\n", "training_dataframe.shape" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# let's have a look at the first five reflectances. These are measurements.\n", "# In a different area such as MIC, the measurements might be CT-scans of the brain\n", "training_reflectances = training_dataframe[\"reflectances\"]\n", "# pandas makes lineplots from each column by default, thus we transpose (.T) the dataframe \n", "# and select only the first 5 (0:4)\n", "training_reflectances.T.loc[:, 0:4].plot.line()\n", "plt.ylabel(\"reflectance\")\n", "# unfortunately the y-axis is not really visible because I save wavelength in [m] and not in [nm]\n", "plt.xlabel(\"wavelengths [m]\")\n", "plt.grid()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# now for the learning.\n", "# in this example we want to learn oxygenation from the above reflectance curves. \n", "# In the above example of brain scans, one could for example want to learn if the patient has a tumor\n", "\n", "# machine learning nomenclature: X is the matrix with examples of things we want to use to predict (reflectances, brain scans, ...),\n", "# one example per row\n", "X_train = training_reflectances.values\n", "# .values creates a numpy array from the pandas dataframe, which is the format expected by sklearn\n", "X_test = testing_dataframe[\"reflectances\"].values\n", "# y is the thing we want to estimate (oxygenation, tumor, ...). \n", "# In this example the oxygenation of the first layer:\n", "y_train = training_dataframe[\"layer0\"][\"sao2\"].values\n", "y_test = testing_dataframe[\"layer0\"][\"sao2\"].values\n", "\n", "# we build a random forest regressor to estimate this:\n", "rf = RandomForestRegressor()\n", "\n", "\n", "# More optional information follows in the rest of this box :-)\n", "\n", "# We just created a so called regressior, beacause for each reflectance curve, we want to calculate \n", "# a continuous oxygenation value between 0 and 1. \n", "# If we wanted to distinguish tumors v non-tumor from brains,\n", "# it would be a classification problem with labels 0 and 1.\n", "# In this case, one would simply switch\n", "# RandomForestRegressor() with RandomForestClassifier()\n", "\n", "# If you would like to use another machine learning technique such as Support Vector Machines, switch\n", "# RandomForestRegressor() with SVR() (or SVC for classification)\n", "# The neat thing about sklearn is that the interface stays the same, so it is as simple as that.\n", "# However, it is still advisable to read the excellent documentation. For example, if SVMs should be used,\n", "# the documentation http://scikit-learn.org/stable/modules/svm.html\n", "# will point out that each feature dimension should be standardized (e.g. features lie between 0 an 1), \n", "# before passing them to the SVM.\n", "# Luckily, sklearn has tools which do this (http://scikit-learn.org/stable/modules/preprocessing.html) \n", "# and many other tasks (like imputing missing values) for you\n", "\n", "# information about decision trees: http://scikit-learn.org/stable/modules/tree.html\n", "# more information on the forests here: http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html\n", "# even more information here: http://scikit-learn.org/stable/modules/ensemble.html" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "RandomForestRegressor(bootstrap=True, criterion='mse', max_depth=None,\n", " max_features='auto', max_leaf_nodes=None,\n", " min_impurity_split=1e-07, min_samples_leaf=1,\n", " min_samples_split=2, min_weight_fraction_leaf=0.0,\n", " n_estimators=10, n_jobs=1, oob_score=False, random_state=None,\n", " verbose=0, warm_start=False)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# now use the random forest to learn from the data:\n", "rf.fit(X_train, y_train)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "first five predictions: [ 0.48123466 0.96895537 0.54489861 0.79914957 0.79603868]\n" ] } ], "source": [ "# we can now use this random forest to predict unseen data:\n", "y_test_predicted = rf.predict(X_test)\n", "# show the first five values\n", "print(\"first five predictions: \" + str(y_test_predicted[0:5]))" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "true first five oxygenations: [ 0.4745257 0.97163053 0.52378714 0.78498926 0.73633619]\n" ] } ], "source": [ "# compare to the real values:\n", "print(\"true first five oxygenations: \" + str(y_test[0:5]))" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Not bad!\n", "# Now every time you get a new measurement x_new, you can simply call rf.predict(x_new)\n", "# and the corresponding oxygenation estimate will appear" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "RandomForestRegressor(bootstrap=True, criterion='mse', max_depth=13,\n", " max_features='auto', max_leaf_nodes=None,\n", " min_impurity_split=1e-07, min_samples_leaf=1,\n", " min_samples_split=2, min_weight_fraction_leaf=0.0,\n", " n_estimators=20, n_jobs=-1, oob_score=False, random_state=None,\n", " verbose=0, warm_start=False)" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# You might have noticed that we didn't set any parameters in this example.\n", "# This means Python used standard parameter settings to train the random forest.\n", "# to find optimal parameters, a standard method is cross validation in combination\n", "# with grid search. A great introduction can be found here:\n", "# http://scikit-learn.org/stable/modules/grid_search.html\n", "\n", "# create a 5-fold cross validation which arbitraily shuffels data\n", "kf = KFold(5, shuffle=True)\n", "# Note that we do this on the training data, we do not touch the testing data until the very end!\n", "# Otherwise, we would tune the parameters to the test dataset, which is not ok and leads to \n", "# rejected papers :-)\n", "\n", "# span a parameter grid\n", "param_grid = [\n", " {\"n_estimators\": np.array([10, 20]),\n", " \"max_depth\": np.arange(5, 15, 2),\n", " \"min_samples_leaf\": np.array([1, 10, 15, 20])}]\n", "# set up forest with grid search\n", "rf_grid_search = GridSearchCV(RandomForestRegressor(50, max_depth=8, n_jobs=-1),\n", " param_grid, cv=kf, n_jobs=-1)\n", "# train forest using grid search, this might take a while \n", "# (because for each parameter combination, five regressors are trained and evaluated, one for each fold)\n", - "# This means, 2*3*4 (from the param grid) *5 random forests are trained with the next line:\n", + "# This means, 2*len(np.arange(5, 15, 2))*4 (from the param grid) \n", + "# *5 (nr folds per parametercombination) random forests are trained with the next line:\n", "rf_grid_search.fit(X_train, y_train)\n", "# output the best parameter combination\n", "rf_grid_search.best_estimator_\n", "\n", "\n", "# More optional information follows in the rest of this box :-)\n", "\n", "# The above KFold cross validation makes 5 random splits of the data. \n", "# You might have to use more sophisticated approaches. \n", "# Say you have 20 patients with brain tumor scans and several scans per person.\n", "# In this case, you could do leave one group out cross validation:\n", "# http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.LeaveOneGroupOut.html#sklearn.model_selection.LeaveOneGroupOut\n", "# This will train 20 random forests which train on 19 patients and test on the remaining patient" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 0.46910907, 0.97678792, 0.54957975, 0.81173177, 0.77350885])" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# use this optimized random forest to predict oxygenations\n", "y_test_predicted_grid_search = rf_grid_search.predict(X_test)\n", "# and show again first five oxygenation estimates\n", "y_test_predicted_grid_search[0:5]" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "data": { "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", "
true oxygenationspredicted oxygenationspredicted oxygenations (grid search)absolute error [%]absolute error using grid search [%]
00.4745260.4812350.4691090.6708950.541663
10.9716310.9689550.9767880.2675160.515739
20.5237870.5448990.5495802.1111472.579261
30.7849890.7991500.8117321.4160312.674251
40.7363360.7960390.7735095.9702493.717266
\n", "
" ], "text/plain": [ " true oxygenations predicted oxygenations \\\n", "0 0.474526 0.481235 \n", "1 0.971631 0.968955 \n", "2 0.523787 0.544899 \n", "3 0.784989 0.799150 \n", "4 0.736336 0.796039 \n", "\n", " predicted oxygenations (grid search) absolute error [%] \\\n", "0 0.469109 0.670895 \n", "1 0.976788 0.267516 \n", "2 0.549580 2.111147 \n", "3 0.811732 1.416031 \n", "4 0.773509 5.970249 \n", "\n", " absolute error using grid search [%] \n", "0 0.541663 \n", "1 0.515739 \n", "2 2.579261 \n", "3 2.674251 \n", "4 3.717266 " ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# because this problem is very simple, they do not differ to much. However, especially for SVMs,\n", "# parameter selection is very important and can lead to very different results!\n", "\n", "# Let's get a more quantitative feel for our performance:\n", "\n", "# store our great results:\n", "results_dataframe = pd.DataFrame()\n", "results_dataframe[\"true oxygenations\"] = y_test\n", "results_dataframe[\"predicted oxygenations\"] = y_test_predicted\n", "results_dataframe[\"predicted oxygenations (grid search)\"] = y_test_predicted_grid_search\n", "\n", "# we easily create arbitrary measures from this:\n", "results_dataframe[\"absolute error [%]\"] = np.abs(results_dataframe[\"true oxygenations\"] - \n", " results_dataframe[\"predicted oxygenations\"]) * 100\n", "results_dataframe[\"absolute error using grid search [%]\"] = \\\n", " np.abs(results_dataframe[\"true oxygenations\"] - \n", " results_dataframe[\"predicted oxygenations (grid search)\"]) * 100\n", "\n", "# show first five elemets in this dataframe:\n", - "results_dataframe.head(5)" + "results_dataframe.head(5)\n", + "\n", + "\n", + "# More optional information follows in the rest of this box :-)\n", + "\n", + "# the absolute [%] error above is quite problem specific. A lot of standard error metrics\n", + "# like f1, r2, ..., can be computed by sklearn:\n", + "# http://scikit-learn.org/stable/modules/model_evaluation.html" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "data": { "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", "
true oxygenationspredicted oxygenationspredicted oxygenations (grid search)absolute error [%]absolute error using grid search [%]
count5000.0000005000.0000005000.0000005000.0000005000.000000
mean0.5046870.5051360.5053662.0018171.880441
std0.2878250.2830990.2825062.3328962.213930
min0.0001560.0084320.0040130.0000630.000368
25%0.2540920.2611140.2598930.5351460.510667
50%0.5084840.5102150.5104561.2837871.167834
75%0.7567690.7565830.7564922.5668602.401834
max0.9998770.9895830.98507028.59995229.266934
\n", "
" ], "text/plain": [ " true oxygenations predicted oxygenations \\\n", "count 5000.000000 5000.000000 \n", "mean 0.504687 0.505136 \n", "std 0.287825 0.283099 \n", "min 0.000156 0.008432 \n", "25% 0.254092 0.261114 \n", "50% 0.508484 0.510215 \n", "75% 0.756769 0.756583 \n", "max 0.999877 0.989583 \n", "\n", " predicted oxygenations (grid search) absolute error [%] \\\n", "count 5000.000000 5000.000000 \n", "mean 0.505366 2.001817 \n", "std 0.282506 2.332896 \n", "min 0.004013 0.000063 \n", "25% 0.259893 0.535146 \n", "50% 0.510456 1.283787 \n", "75% 0.756492 2.566860 \n", "max 0.985070 28.599952 \n", "\n", " absolute error using grid search [%] \n", "count 5000.000000 \n", "mean 1.880441 \n", "std 2.213930 \n", "min 0.000368 \n", "25% 0.510667 \n", "50% 1.167834 \n", "75% 2.401834 \n", "max 29.266934 " ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# also very easy to get statistics on this:\n", "results_dataframe.describe()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(0, 10)" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# or a nice kernel density estimate of our errors\n", "results_dataframe.plot(kind='kde', y= [\"absolute error [%]\", \n", " \"absolute error using grid search [%]\"])\n", "plt.xlim((0,10))" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# save the results\n", "results_dataframe.to_csv(\"results.csv\", index=False)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# that's it folks!" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.6" } }, "nbformat": 4, "nbformat_minor": 0 }