{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Classify iris dataset with random forest classifier" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Written by: Men Vuthy, 2022*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "markdown", "metadata": { "id": "KHPUHilCZRA6" }, "source": [ "### Objective\n", "\n", "* Classify iris dataset using supervised learning method with random forest classifier\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "gmAWuVVWZ_XE" }, "source": [ "### Code" ] }, { "cell_type": "markdown", "metadata": { "id": "sbD0DzKSQ762" }, "source": [ "Import necessary modules" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "id": "NOUzuKEVRXMW" }, "outputs": [], "source": [ "from sklearn.datasets import load_iris\n", "\n", "from sklearn.ensemble import RandomForestClassifier\n", "\n", "from sklearn.metrics import accuracy_score, confusion_matrix, classification_report\n", "\n", "import pandas as pd\n", "import numpy as np\n", "np.random.seed(0)\n", "\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "id": "bdk4CMcURdAG" }, "outputs": [], "source": [ "# Creating an object called iris with the iris data\n", "iris = load_iris()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 206 }, "id": "cbdC9st_R_Qo", "outputId": "83d4f972-3181-42dd-bbfc-22541e0251ef" }, "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", "
sepal length (cm)sepal width (cm)petal length (cm)petal width (cm)
05.13.51.40.2
14.93.01.40.2
24.73.21.30.2
34.63.11.50.2
45.03.61.40.2
\n", "
\n", " \n", " \n", " \n", "\n", " \n", "
\n", "
\n", " " ], "text/plain": [ " sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)\n", "0 5.1 3.5 1.4 0.2\n", "1 4.9 3.0 1.4 0.2\n", "2 4.7 3.2 1.3 0.2\n", "3 4.6 3.1 1.5 0.2\n", "4 5.0 3.6 1.4 0.2" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Create a dataframe with the four feature variables\n", "df = pd.DataFrame(iris.data, columns = iris.feature_names)\n", "df.head()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 206 }, "id": "CNDwsiseSEMV", "outputId": "2351a395-78fa-440c-c52d-7df1698135b1" }, "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", "
sepal length (cm)sepal width (cm)petal length (cm)petal width (cm)species
05.13.51.40.2setosa
14.93.01.40.2setosa
24.73.21.30.2setosa
34.63.11.50.2setosa
45.03.61.40.2setosa
\n", "
\n", " \n", " \n", " \n", "\n", " \n", "
\n", "
\n", " " ], "text/plain": [ " sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) \\\n", "0 5.1 3.5 1.4 0.2 \n", "1 4.9 3.0 1.4 0.2 \n", "2 4.7 3.2 1.3 0.2 \n", "3 4.6 3.1 1.5 0.2 \n", "4 5.0 3.6 1.4 0.2 \n", "\n", " species \n", "0 setosa \n", "1 setosa \n", "2 setosa \n", "3 setosa \n", "4 setosa " ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Add a new column for the species name\n", "df['species'] = pd.Categorical.from_codes(iris.target, iris.target_names)\n", "\n", "df.head()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 206 }, "id": "dJNz1fi8SV8R", "outputId": "92bda13f-0a32-4023-ba3e-5aa9fbf0faf3" }, "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", "
sepal length (cm)sepal width (cm)petal length (cm)petal width (cm)speciesis_train
05.13.51.40.2setosaTrue
14.93.01.40.2setosaTrue
24.73.21.30.2setosaTrue
34.63.11.50.2setosaTrue
45.03.61.40.2setosaTrue
\n", "
\n", " \n", " \n", " \n", "\n", " \n", "
\n", "
\n", " " ], "text/plain": [ " sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) \\\n", "0 5.1 3.5 1.4 0.2 \n", "1 4.9 3.0 1.4 0.2 \n", "2 4.7 3.2 1.3 0.2 \n", "3 4.6 3.1 1.5 0.2 \n", "4 5.0 3.6 1.4 0.2 \n", "\n", " species is_train \n", "0 setosa True \n", "1 setosa True \n", "2 setosa True \n", "3 setosa True \n", "4 setosa True " ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Create Test and Train Data\n", "df['is_train'] = np.random.uniform(0, 1, len(df)) <= .75\n", "\n", "df.head()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "vXoo66GfS8up", "outputId": "3cbad256-da5d-494e-fd50-1fd3437d085b" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Training data: 118\n", "Testing data: 32\n" ] } ], "source": [ "# Create dataframes with test rows and training rows\n", "train, test = df[df['is_train']==True], df[df['is_train']==False]\n", "\n", "# show the number of observations for test and train dataframe\n", "print('Training data:', len(train))\n", "print('Testing data:', len(test))" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "ubzagAgoTxD6", "outputId": "e0feb031-4328-4e83-9eb1-78595dcdd754" }, "outputs": [ { "data": { "text/plain": [ "Index(['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)',\n", " 'petal width (cm)'],\n", " dtype='object')" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Create a list of the feature column's names\n", "features = df.columns[:4]\n", "\n", "features" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "S8VtxFxbWA8Z", "outputId": "41aca9e6-dde9-4454-9679-9a4cec33d0aa" }, "outputs": [ { "data": { "text/plain": [ "array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2,\n", " 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n", " 2, 2, 2, 2, 2, 2, 2, 2])" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Converting each species name into digits\n", "y = pd.factorize(train['species'])[0]\n", "\n", "y" ] }, { "cell_type": "markdown", "metadata": { "id": "YpLKPbGNX06g" }, "source": [ "Train Classifier" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "UnrPcbduWHge", "outputId": "8aab543f-8a52-4e99-f295-4437f1cfa491" }, "outputs": [ { "data": { "text/plain": [ "RandomForestClassifier(n_jobs=-1, random_state=0)" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Creating a random forest classifier\n", "clf = RandomForestClassifier(n_jobs=-1, random_state=0)\n", "\n", "# Training the classifier\n", "clf.fit(train[features], y)" ] }, { "cell_type": "markdown", "metadata": { "id": "u0HMstE2X4te" }, "source": [ "Test Classifier" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "3cKeZyw-XLV6", "outputId": "970a50e5-fc21-4615-9c2d-d1007943df2b" }, "outputs": [ { "data": { "text/plain": [ "array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 1, 1, 2, 2,\n", " 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Apply the trained Classifier to the test\n", "clf.predict(test[features])" ] }, { "cell_type": "markdown", "metadata": { "id": "q_c2yfH2ZdMc" }, "source": [ "View Probability" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "nAEGx_8XXLhp", "outputId": "8a10d53f-1bfb-4dc5-999e-4c119399b50a" }, "outputs": [ { "data": { "text/plain": [ "array([[1. , 0. , 0. ],\n", " [0.99, 0.01, 0. ],\n", " [1. , 0. , 0. ],\n", " [0. , 0.67, 0.33],\n", " [0. , 1. , 0. ],\n", " [0. , 0.82, 0.18],\n", " [0. , 0.03, 0.97],\n", " [0. , 0.42, 0.58],\n", " [0. , 0.99, 0.01],\n", " [0. , 0.96, 0.04]])" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Viewing the predicted probabilities of the first 10 observation\n", "clf.predict_proba(test[features])[10:20]" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "5pU0C3aXZKje", "outputId": "0be296bd-a3d3-48fe-8f9c-0aa946e5837e" }, "outputs": [ { "data": { "text/plain": [ "array(['setosa', 'setosa', 'setosa', 'setosa', 'setosa'], dtype='\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Predicted Speciessetosaversicolorvirginica
Actual Species
setosa1300
versicolor052
virginica0012
\n", "
\n", " \n", " \n", " \n", "\n", " \n", "
\n", " \n", " " ], "text/plain": [ "Predicted Species setosa versicolor virginica\n", "Actual Species \n", "setosa 13 0 0\n", "versicolor 0 5 2\n", "virginica 0 0 12" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Create confusion matrix\n", "pd.crosstab(test['species'], preds, rownames=['Actual Species'], colnames=['Predicted Species'])" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "vPP2cYdBeFyT", "outputId": "4aa014d3-9a4f-4428-c978-41f6bc9156b9" }, "outputs": [ { "data": { "text/plain": [ "0.9375" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# View accuracy score\n", "accuracy_score(test['species'], preds)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "FeY0UKsueA1F", "outputId": "9487f63d-94f9-42da-d1b3-5645ce93174d" }, "outputs": [ { "data": { "text/plain": [ "array([[1. , 0. , 0. ],\n", " [0. , 0.71428571, 0.28571429],\n", " [0. , 0. , 1. ]])" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Get and reshape confusion matrix data\n", "matrix = confusion_matrix(test['species'], preds)\n", "matrix = matrix.astype('float') / matrix.sum(axis=1)[:, np.newaxis]\n", "matrix" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 400 }, "id": "bQl2-DbweXKD", "outputId": "aa2979dd-ca47-4de3-9742-c6d694f1301b" }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Build the plot\n", "plt.figure(figsize=(10,5))\n", "sns.set(font_scale=1.4)\n", "sns.heatmap(matrix, annot=True, annot_kws={'size':10},\n", " cmap=plt.cm.Greens, linewidths=0.2)\n", "\n", "# Add labels to the plot\n", "class_names = ['setosa', 'versicolor', 'virginica']\n", "tick_marks = np.arange(len(class_names))\n", "tick_marks2 = tick_marks + 0.5\n", "plt.xticks(tick_marks, class_names, rotation=25)\n", "plt.yticks(tick_marks2, class_names, rotation=0)\n", "plt.xlabel('Predicted label')\n", "plt.ylabel('True label')\n", "plt.title('Confusion Matrix for Random Forest Model')\n", "plt.show()\n", "\n" ] } ], "metadata": { "colab": { "collapsed_sections": [], "name": "RandomForest.ipynb", "provenance": [] }, "kernelspec": { "display_name": "Python 3", "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.10" } }, "nbformat": 4, "nbformat_minor": 0 }