machinelearning

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit 3a3a8c9762789ed0645454cdd8ff06c6caec3701
parent 0f032ea4bd7948aa203143d9f464b8aeb311ca42
Author: Andrew <andrewlaack1@gmail.com>
Date:   Wed, 26 Jun 2024 11:50:48 -0500

Wrote the code to do a correct split using gini impurity. Next, I will write the code to create the entire tree. I also need to think of a way to compress the representation for prediction.

Diffstat:
AirisClassification/CustomDecisionTree.ipynb | 247+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 247 insertions(+), 0 deletions(-)

diff --git a/irisClassification/CustomDecisionTree.ipynb b/irisClassification/CustomDecisionTree.ipynb @@ -0,0 +1,247 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1695, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.datasets import load_iris\n", + "\n", + "iris = load_iris(as_frame=True)\n", + "X = iris.data.values\n", + "y = iris.target" + ] + }, + { + "cell_type": "code", + "execution_count": 1696, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(112, 4)\n", + "(38, 4)\n" + ] + } + ], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "\n", + "X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=10)\n", + "\n", + "print(X_train.shape)\n", + "print(X_test.shape)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1. Load Data\n", + "2. Define node class for tree\n", + "3. Create " + ] + }, + { + "cell_type": "code", + "execution_count": 1697, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "class Node:\n", + " def __init__(self, splitOn,colName, splitVal):\n", + " self.splitVal = splitVal\n", + " self.splitOn = splitOn\n", + " self.colName = colName\n", + " \n", + " def setLeft(self, left):\n", + " self.left = left\n", + "\n", + " def setLeft(self, right):\n", + " self.right = right\n", + "\n", + "\n", + "# Pass in a list of the class membership for each element in the list\n", + "def giniImpurity(classList):\n", + " \n", + " # Get counts\n", + " counts = {}\n", + " for i in classList:\n", + " if i in counts:\n", + " counts[i] += 1\n", + " else:\n", + " counts[i] = 1\n", + " \n", + " # Calculate impurity\n", + " sumProbabilities = 0\n", + " totalElements = len(classList)\n", + "\n", + " for i in counts:\n", + " sumProbabilities += (counts[i] / totalElements)**2\n", + " \n", + " impurity = 1 - sumProbabilities\n", + " return impurity\n", + "\n", + "\n", + "# Pass in x values (one feature only) and classes\n", + "def bestSplit(x_vals, classes):\n", + "\n", + " sorted = np.sort(x_vals)\n", + " count = 1\n", + "\n", + " # Find pivot values (average between adjacent values)\n", + " pivots = []\n", + " while count < len(sorted):\n", + "\n", + " if sorted[count - 1] != sorted[count]: \n", + " pivots.append((sorted[count - 1] + sorted[count])/2)\n", + " count += 1\n", + "\n", + " optimalSplit = None\n", + " minWeightedImpurity = 10\n", + "\n", + " # Iterate through keys\n", + " for pivot in pivots:\n", + "\n", + " left = []\n", + " right = []\n", + "\n", + " # Create left and right lists\n", + "\n", + " itr = 0\n", + " for x in x_vals:\n", + " if x <= pivot:\n", + " left.append(classes[itr])\n", + " else:\n", + " right.append(classes[itr]) \n", + " itr += 1\n", + "\n", + " weightedLeft = giniImpurity(left) * (len(left) / len(x_vals))\n", + " weightedRight = giniImpurity(right) * (len(right) / len(x_vals))\n", + "\n", + " weightedImpurity = weightedLeft + weightedRight\n", + " \n", + " if weightedImpurity < minWeightedImpurity:\n", + " minWeightedImpurity = weightedImpurity\n", + " optimalSplit = pivot\n", + "\n", + " return optimalSplit, minWeightedImpurity" + ] + }, + { + "cell_type": "code", + "execution_count": 1698, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "# Iterate through the columns and find the best one to minimize impurity\n", + "def createTree(x_vals, classes, columnNames, depth):\n", + " count = 0\n", + " optimalImpurity = 1\n", + " optimalSplitVal = None\n", + " optimalIndex = None\n", + "\n", + " while count < len(x_vals[0]):\n", + " split, impurity = bestSplit(x_vals[:,count], y)\n", + " if impurity < optimalImpurity:\n", + " optimalImpurity = impurity\n", + " optimalIndex = count\n", + " optimalSplitVal = split\n", + " count += 1\n", + " \n", + " print(optimalSplitVal, optimalIndex, optimalImpurity)\n", + " print(columnNames[optimalIndex])\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1699, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4.5 0 0.4571428571428571\n", + "Age\n" + ] + }, + { + "data": { + "text/plain": [ + "[Text(0.5, 0.75, 'Age <= 4.5\\ngini = 0.735\\nsamples = 7\\nvalue = [1, 2, 2, 2]'),\n", + " Text(0.25, 0.25, 'gini = 0.64\\nsamples = 5\\nvalue = [1, 2, 2, 0]'),\n", + " Text(0.375, 0.5, 'True '),\n", + " Text(0.75, 0.25, 'gini = 0.0\\nsamples = 2\\nvalue = [0, 0, 0, 2]'),\n", + " Text(0.625, 0.5, ' False')]" + ] + }, + "execution_count": 1699, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "<Figure size 640x480 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from sklearn.tree import DecisionTreeClassifier, plot_tree\n", + "model = DecisionTreeClassifier(max_leaf_nodes=2)\n", + "\n", + "ls = np.array([\n", + " [10,2,3,2],\n", + " [3,5,8,2], \n", + " [1,10,3,5],\n", + " [3,5,1,1], \n", + " [1,10,3,5],\n", + " [3,5,1,1], \n", + " [1,1,2,1],\n", + " [6,5,2,1], \n", + " [3,10,1,3]])\n", + "\n", + "columnNames = ['Age' , 'Weight', 'Height', 'Date']\n", + "\n", + "y = [3,2,0,1,2,3,1,10,3]\n", + "createTree(ls, y, columnNames, 1)\n", + "model.fit(ls,y)\n", + "plot_tree(model, feature_names=columnNames)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "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.11.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}