{ "cells": [ { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%run ../../../common_functions/import_all.py\n", "\n", "from common_functions.setup_notebook import set_css_style, setup_matplotlib, config_ipython\n", "from common_functions.class_helpers import do_plot_conf_mat\n", "\n", "from sklearn.datasets import load_iris\n", "from sklearn.ensemble import RandomForestClassifier\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.metrics import accuracy_score, precision_score, recall_score, classification_report\n", "\n", "config_ipython()\n", "setup_matplotlib()\n", "set_css_style()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Classification - performance metrics\n", "\n", "We will use the Iris Dataset to do a little classification with a Random Forest and look at the performance metrics." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Confusion matrix\n", "\n", "This uses a routine we wrote here for the job of computing it and plotting it" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "RandomForestClassifier(bootstrap=True, ccp_alpha=0.0, class_weight=None,\n", " criterion='gini', max_depth=None, max_features='auto',\n", " max_leaf_nodes=None, max_samples=None,\n", " min_impurity_decrease=0.0, min_impurity_split=None,\n", " min_samples_leaf=1, min_samples_split=2,\n", " min_weight_fraction_leaf=0.0, n_estimators=100,\n", " n_jobs=None, oob_score=False, random_state=None,\n", " verbose=0, warm_start=False)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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fD4fL7zwQuzdu9dIM8wBZ511Vhw+fDjOPPPMeOGFF+KCCy6IM888MzKZTLz22mvR0NAQxWIx/vmf/zne/e53+zkGKkLYZd5YsGBBvPnNb45vf/vb8fWvf33CwFuWzWbj0ksvja9+9asxOjoaN9xwQ4KVA+W/cCrfb/+mN71J4IU56NOf/nT09fXFWWedFdddd11ExFinN5PJxJ49e+K2226Ls88+OyIihoeH46WXXopFixYlVjMwdxljZl656KKL4mMf+1hks9l4/PHH4+GHH46Ik0cgM5lMXHvttfGLv/iL8U//9E/GI6FOnLjV0C/8wi/ERz7yESPNMEdceeWV8Vu/9Vtx/fXXxzXXXDPuuWPHjsU555wTr7766rj7dRsaGmLfvn3x85//vNblAimgs8u8c/7558dNN90UTz75ZBQKhRgdHR3r8JZHqSKOj06ef/758Xd/93dx6623xllnnZVw5cAb6fDC3LJ48eK49dZb45JLLhn3eCaTiUWLFsXAwEAsXbp07PfchQsXxuOPPx7Hjh2LK664IomSgTlMZ5d56corr4w/+IM/iAsvvDD+9m//NrZs2RIRx0edX3uehc89AAAMM0lEQVTttYg4vpjG2WefHRdeeGEsWLAgyXKBU3hjh/cLX/hCRBzvCD399NPxzW9+M+EKgRNN9nvqggULIpvNxs9+9rOx7u6+ffviySefjD/6oz+KUqlUyzKBFNDZZd5atGhR3HzzzfG9730vvvGNb8QLL7wQt956azQ0NIwtWHX06NE477zzorm5OelygVMod3i/973vxd69eyObzcaBAweit7c3li1bFo2NjUmXCJzCkSNH4siRI7F3795obW2NxsbG+Na3vhWf/exn45VXXol169bF5ZdfnnSZwByTOWYjM+a5F198MZ544onYvXt3NDQ0xDvf+c5oamqKCy+8MA4cOBBve9vb4uKLL066TGAKXnjhhfjTP/3T+NGPfhTZbDbWrVvnL6tgDigvPveFL3whli9fHj/4wQ/iM5/5TAwPD8fv/d7vjS1mBTAdwi7E8ZHlkZGReOyxx+LIkSPx0ksvxa/92q/F5ZdfHueff37S5QGnceIWYn/+538eTz75ZKxfv14nCOaYL3/5y1EqlWL37t3x4x//WNAFZkXYBSA1nn766ejp6YnVq1fHVVddlXQ5wBSVO7s7duyI7du3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\n", "text/plain": [ "
" ] }, "metadata": { "image/png": { "height": 432, "width": 477 } }, "output_type": "display_data" }, { "data": { "text/plain": [ "array([[18, 0, 0],\n", " [ 0, 14, 0],\n", " [ 0, 1, 12]])" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Load the Iris dataset from sklearn, separating the data matrix and the array of classes\n", "iris = load_iris()\n", "X = iris.data\n", "y = iris.target\n", "\n", "# Initiate the classifier (using default parameters)\n", "rf = RandomForestClassifier()\n", "\n", "# Splitting the dataset into train and test (70%/30%)\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)\n", "\n", "# Fitting model on training set and predict on test set\n", "rf.fit(X_train, y_train)\n", "y_pred = rf.predict(X_test)\n", "\n", "# Plot the confusion matrix\n", "do_plot_conf_mat(y_test, y_pred)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Precision, recall and F1-score" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " 0 1.00 1.00 1.00 18\n", " 1 0.93 1.00 0.97 14\n", " 2 1.00 0.92 0.96 13\n", "\n", " accuracy 0.98 45\n", " macro avg 0.98 0.97 0.98 45\n", "weighted avg 0.98 0.98 0.98 45\n", "\n" ] } ], "source": [ "# sklearn furnishes a report of these metrics for all classes in one go!\n", "print(classification_report(y_test, y_pred))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Accuracy" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.9777777777777777" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# From sklearn\n", "accuracy_score(y_test, y_pred)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 }