{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Classification of Iris" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Package imports" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Using TensorFlow backend.\n" ] } ], "source": [ "# For building neural networks.\n", "import keras as kr\n", "\n", "# For interacting with data sets.\n", "import pandas as pd\n", "\n", "# For encoding categorical variables.\n", "import sklearn.preprocessing as pre\n", "\n", "# For splitting into training and test sets.\n", "import sklearn.model_selection as mod" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Load data" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Load the iris data set from a URL.\n", "df = pd.read_csv(\"https://raw.githubusercontent.com/ianmcloughlin/datasets/master/iris.csv\")" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", " | sepal_length | \n", "sepal_width | \n", "petal_length | \n", "petal_width | \n", "class | \n", "
---|---|---|---|---|---|
0 | \n", "5.1 | \n", "3.5 | \n", "1.4 | \n", "0.2 | \n", "setosa | \n", "
1 | \n", "4.9 | \n", "3.0 | \n", "1.4 | \n", "0.2 | \n", "setosa | \n", "
2 | \n", "4.7 | \n", "3.2 | \n", "1.3 | \n", "0.2 | \n", "setosa | \n", "
3 | \n", "4.6 | \n", "3.1 | \n", "1.5 | \n", "0.2 | \n", "setosa | \n", "
4 | \n", "5.0 | \n", "3.6 | \n", "1.4 | \n", "0.2 | \n", "setosa | \n", "
... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
145 | \n", "6.7 | \n", "3.0 | \n", "5.2 | \n", "2.3 | \n", "virginica | \n", "
146 | \n", "6.3 | \n", "2.5 | \n", "5.0 | \n", "1.9 | \n", "virginica | \n", "
147 | \n", "6.5 | \n", "3.0 | \n", "5.2 | \n", "2.0 | \n", "virginica | \n", "
148 | \n", "6.2 | \n", "3.4 | \n", "5.4 | \n", "2.3 | \n", "virginica | \n", "
149 | \n", "5.9 | \n", "3.0 | \n", "5.1 | \n", "1.8 | \n", "virginica | \n", "
150 rows × 5 columns
\n", "\n", " | petal_length | \n", "petal_width | \n", "sepal_length | \n", "sepal_width | \n", "
---|---|---|---|---|
0 | \n", "1.4 | \n", "0.2 | \n", "5.1 | \n", "3.5 | \n", "
1 | \n", "1.4 | \n", "0.2 | \n", "4.9 | \n", "3.0 | \n", "
2 | \n", "1.3 | \n", "0.2 | \n", "4.7 | \n", "3.2 | \n", "
3 | \n", "1.5 | \n", "0.2 | \n", "4.6 | \n", "3.1 | \n", "
4 | \n", "1.4 | \n", "0.2 | \n", "5.0 | \n", "3.6 | \n", "
... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
145 | \n", "5.2 | \n", "2.3 | \n", "6.7 | \n", "3.0 | \n", "
146 | \n", "5.0 | \n", "1.9 | \n", "6.3 | \n", "2.5 | \n", "
147 | \n", "5.2 | \n", "2.0 | \n", "6.5 | \n", "3.0 | \n", "
148 | \n", "5.4 | \n", "2.3 | \n", "6.2 | \n", "3.4 | \n", "
149 | \n", "5.1 | \n", "1.8 | \n", "5.9 | \n", "3.0 | \n", "
150 rows × 4 columns
\n", "\n", " | petal_length | \n", "petal_width | \n", "sepal_length | \n", "sepal_width | \n", "
---|---|---|---|---|
0 | \n", "0.387221 | \n", "0.484604 | \n", "1.353335 | \n", "0.761078 | \n", "
1 | \n", "0.394136 | \n", "-0.687376 | \n", "-2.114471 | \n", "-0.958366 | \n", "
2 | \n", "0.925573 | \n", "0.351229 | \n", "2.526484 | \n", "-0.225238 | \n", "
3 | \n", "0.675388 | \n", "-0.325813 | \n", "-0.203693 | \n", "-0.997615 | \n", "
4 | \n", "0.221818 | \n", "-1.285400 | \n", "-0.049826 | \n", "1.718668 | \n", "
... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
115 | \n", "0.015610 | \n", "-1.118584 | \n", "-0.788006 | \n", "0.266962 | \n", "
116 | \n", "-1.387309 | \n", "0.580464 | \n", "0.304557 | \n", "1.042104 | \n", "
117 | \n", "1.109262 | \n", "0.787130 | \n", "0.996607 | \n", "0.446290 | \n", "
118 | \n", "0.611141 | \n", "-0.274729 | \n", "0.178736 | \n", "-0.899852 | \n", "
119 | \n", "1.388267 | \n", "0.856468 | \n", "-1.735097 | \n", "0.208429 | \n", "
120 rows × 4 columns
\n", "" ], "text/plain": [ " petal_length petal_width sepal_length sepal_width\n", "0 0.387221 0.484604 1.353335 0.761078\n", "1 0.394136 -0.687376 -2.114471 -0.958366\n", "2 0.925573 0.351229 2.526484 -0.225238\n", "3 0.675388 -0.325813 -0.203693 -0.997615\n", "4 0.221818 -1.285400 -0.049826 1.718668\n", ".. ... ... ... ...\n", "115 0.015610 -1.118584 -0.788006 0.266962\n", "116 -1.387309 0.580464 0.304557 1.042104\n", "117 1.109262 0.787130 0.996607 0.446290\n", "118 0.611141 -0.274729 0.178736 -0.899852\n", "119 1.388267 0.856468 -1.735097 0.208429\n", "\n", "[120 rows x 4 columns]" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pca = dec.PCA(n_components=4, whiten=True)\n", "pca.fit(inputs_train)\n", "inputs_train_white = pd.DataFrame(pca.transform(inputs_train), columns=inputs_train.columns)\n", "inputs_train_white" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "# Start a neural network, building it by layers.\n", "model = kr.models.Sequential()\n", "\n", "# Add a hidden layer with x neurons and an input layer with 4.\n", "model.add(kr.layers.Dense(units=30, activation='relu', input_dim=4))\n", "# Add a three neuron output layer.\n", "model.add(kr.layers.Dense(units=3, activation='softmax'))\n", "\n", "# Build the graph.\n", "model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/15\n", "120/120 [==============================] - 1s 8ms/step - loss: 1.0737 - acc: 0.4500\n", "Epoch 2/15\n", "120/120 [==============================] - 0s 283us/step - loss: 1.0342 - acc: 0.5667\n", "Epoch 3/15\n", "120/120 [==============================] - 0s 392us/step - loss: 0.9963 - acc: 0.6083\n", "Epoch 4/15\n", "120/120 [==============================] - 0s 291us/step - loss: 0.9618 - acc: 0.6333\n", "Epoch 5/15\n", "120/120 [==============================] - 0s 417us/step - loss: 0.9288 - acc: 0.6500\n", "Epoch 6/15\n", "120/120 [==============================] - 0s 325us/step - loss: 0.8977 - acc: 0.6667\n", "Epoch 7/15\n", "120/120 [==============================] - 0s 496us/step - loss: 0.8687 - acc: 0.6833\n", "Epoch 8/15\n", "120/120 [==============================] - 0s 881us/step - loss: 0.8403 - acc: 0.6917\n", "Epoch 9/15\n", "120/120 [==============================] - 0s 792us/step - loss: 0.8140 - acc: 0.7333\n", "Epoch 10/15\n", "120/120 [==============================] - 0s 933us/step - loss: 0.7887 - acc: 0.7333\n", "Epoch 11/15\n", "120/120 [==============================] - 0s 325us/step - loss: 0.7646 - acc: 0.7583\n", "Epoch 12/15\n", "120/120 [==============================] - 0s 342us/step - loss: 0.7417 - acc: 0.7500\n", "Epoch 13/15\n", "120/120 [==============================] - 0s 267us/step - loss: 0.7200 - acc: 0.7917\n", "Epoch 14/15\n", "120/120 [==============================] - 0s 375us/step - loss: 0.6999 - acc: 0.8000\n", "Epoch 15/15\n", "120/120 [==============================] - 0s 292us/step - loss: 0.6800 - acc: 0.8000\n" ] }, { "data": { "text/plain": [ "