{ "cells": [ { "cell_type": "markdown", "id": "65a280c6-168a-4b92-92b3-e402e2104e99", "metadata": {}, "source": [ "# Data Preparation and Cleaning\n", "\n", "This notebook showcases a few general methods to clean up your training data. The better the data, the more accurate the model. While \"good data\" is highly subjective to your application, but some general guidelines could include\n", "- keeping your data formatting consistent. (binary boolean values, integers vs. floats, case-sensitivity)\n", "- Clearing duplicates\n", "- Filtering non applicable outliers\n", "- etc.\n", "***" ] }, { "cell_type": "code", "execution_count": 3, "id": "160c85aa-26e5-4d4c-a502-7eddc8734ac6", "metadata": {}, "outputs": [], "source": [ "##### Imports packages\n", "\n", "import pandas as pd\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 4, "id": "bd9e76ff-2ab0-4f6e-89cf-a9bbd92870b0", "metadata": {}, "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", "
RGBcolour
081.042.0173.0PURPLE
1222.09.073.0RED
259.0188.0227.0BLUE
314.0158.029.0GREEN
4222.0222.082.0YELLOW
...............
504139.0140.0122.0Grey
505189.0236.0182.0Light Green
506198.0166.0100.0Brown
50759.0131.0189.0Blue
508130.0137.0143.0Grey
\n", "

509 rows × 4 columns

\n", "
" ], "text/plain": [ " R G B colour\n", "0 81.0 42.0 173.0 PURPLE\n", "1 222.0 9.0 73.0 RED\n", "2 59.0 188.0 227.0 BLUE\n", "3 14.0 158.0 29.0 GREEN\n", "4 222.0 222.0 82.0 YELLOW\n", ".. ... ... ... ...\n", "504 139.0 140.0 122.0 Grey\n", "505 189.0 236.0 182.0 Light Green\n", "506 198.0 166.0 100.0 Brown\n", "507 59.0 131.0 189.0 Blue\n", "508 130.0 137.0 143.0 Grey\n", "\n", "[509 rows x 4 columns]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "##### Imports dataset from partially cleaned csv file\n", "# The pandas dataframe is easier to work with than a pure csv file. \n", "\n", "dataset = pd.read_csv(\"combined_data.csv\")\n", "dataset" ] }, { "cell_type": "code", "execution_count": 5, "id": "b7dc68aa-5060-4a9c-a1b5-c503a58d22ec", "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "colour\n", "green 17\n", "BLUE 15\n", "blue 15\n", "Green 13\n", "PURPLE 12\n", " ..\n", "pastel green 1\n", "Aphroditean Fuchsia 1\n", "Gorgonzola Blue 1\n", "Whiskey Sour 1\n", "Light Green 1\n", "Name: count, Length: 256, dtype: int64" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "##### Check number of occurences of each color in dataset\n", "# This helps us identify how we want to start cleaning our dataset\n", "\n", "dataset[\"colour\"].value_counts()" ] }, { "cell_type": "markdown", "id": "0a3dc818-f5b9-4770-8cdc-a8e344fa0573", "metadata": {}, "source": [ "We first notice colors are double counted due to case discrepancies. Let's standardize our color names by making them all lowercase " ] }, { "cell_type": "code", "execution_count": 6, "id": "fd81ad6c-2075-44f9-8f26-46223d0379cc", "metadata": {}, "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", "
RGBcolour
081.042.0173.0purple
1222.09.073.0red
259.0188.0227.0blue
314.0158.029.0green
4222.0222.082.0yellow
...............
504139.0140.0122.0grey
505189.0236.0182.0light green
506198.0166.0100.0brown
50759.0131.0189.0blue
508130.0137.0143.0grey
\n", "

509 rows × 4 columns

\n", "
" ], "text/plain": [ " R G B colour\n", "0 81.0 42.0 173.0 purple\n", "1 222.0 9.0 73.0 red\n", "2 59.0 188.0 227.0 blue\n", "3 14.0 158.0 29.0 green\n", "4 222.0 222.0 82.0 yellow\n", ".. ... ... ... ...\n", "504 139.0 140.0 122.0 grey\n", "505 189.0 236.0 182.0 light green\n", "506 198.0 166.0 100.0 brown\n", "507 59.0 131.0 189.0 blue\n", "508 130.0 137.0 143.0 grey\n", "\n", "[509 rows x 4 columns]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "##### Case Folding -> to lowercase\n", "# We select the 'colour' column and apply Panda's lower() method.\n", "# This serves to standardize the format of our color names.\n", "\n", "dataset['colour'] = dataset['colour'].str.lower()\n", "dataset" ] }, { "cell_type": "markdown", "id": "54c8d336-fbe7-4c43-882f-2df55afe1b15", "metadata": {}, "source": [ "***\n", "We have an issue: some of our data is in **floating point RGB (0-1)** notation and not **integer RGB (1-255)**! Although these entries are in the wrong format, we don't want to simply discard them. As you may know, the former is a *normalized* RGB color-vector, which can be converted by multiplying each floating point value by 255 to get them to scale.\n", "\n", "It's nice to pick transformations independent of the rows, these are magic numbers. As an exercise, try to implement a cleaning algorithm that converts normalized RGB values without knowing the rows.\n" ] }, { "cell_type": "code", "execution_count": 7, "id": "44c94de2-059f-42b0-b2a6-16384411d3a7", "metadata": {}, "outputs": [], "source": [ "##### Denormalize the RGB value across the selected rows\n", "# This keeps our RGB values consistent throughout the whole dataset.\n", "\n", "dataset.loc[221:261, ['R','G','B'] ] = dataset[221:261][ ['R','G','B'] ].apply(lambda x: x * 255)" ] }, { "cell_type": "code", "execution_count": 8, "id": "81ef46b8-8c92-47e4-b828-ad9e6dd1bb2e", "metadata": {}, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
RGBcolour
221153.000151.98080.070moss green
222171.105109.90560.945browny orange
223255.000186.91533.915mustard yellow
22495.115255.00033.915flashy green
22532.89583.89513.005lime green
22658.90582.11049.980navy
227173.910225.930236.895light blue
228204.000176.970236.895light purple
229235.1104.080186.915flashy pink
23054.06031.11048.960dark purple
231134.895236.895213.945cyan
232255.000150.96088.995light orange
233255.000183.090198.900light pink
234236.89587.975121.125watermelon pink
235168.04532.89560.945maroon
236172.890250.92082.110lime green
237255.00088.995235.110magenta
23831.110166.00582.110dark green
23931.11026.010147.900dark blue
240241.995185.8950.000yellow
241241.99513.00537.995red
24283.895198.900255.000light blue
243255.000232.050194.055light tan
24447.94045.90041.055black
245255.000255.000160.905light yellow
246255.000255.000255.000white
247251.940249.900245.055white
248160.905166.005162.945grey
24945.90098.94029.070conifer green
25037.9956.885172.890deep purple
251186.1500.0000.000blood red
25293.075198.900255.000sky blue
253205.020237.915255.000ice blue
254255.000122.4000.000cheeto orange
2550.00058.905109.905marine blue
25692.055103.020111.945dark gray
257222.105208.080175.950sand color
25864.00552.02046.920dark brown
259224.910186.915255.000lavender
260255.0000.000158.100fuschiar
\n", "
" ], "text/plain": [ " R G B colour\n", "221 153.000 151.980 80.070 moss green\n", "222 171.105 109.905 60.945 browny orange \n", "223 255.000 186.915 33.915 mustard yellow \n", "224 95.115 255.000 33.915 flashy green \n", "225 32.895 83.895 13.005 lime green \n", "226 58.905 82.110 49.980 navy \n", "227 173.910 225.930 236.895 light blue \n", "228 204.000 176.970 236.895 light purple \n", "229 235.110 4.080 186.915 flashy pink \n", "230 54.060 31.110 48.960 dark purple \n", "231 134.895 236.895 213.945 cyan \n", "232 255.000 150.960 88.995 light orange \n", "233 255.000 183.090 198.900 light pink \n", "234 236.895 87.975 121.125 watermelon pink \n", "235 168.045 32.895 60.945 maroon\n", "236 172.890 250.920 82.110 lime green\n", "237 255.000 88.995 235.110 magenta\n", "238 31.110 166.005 82.110 dark green\n", "239 31.110 26.010 147.900 dark blue\n", "240 241.995 185.895 0.000 yellow\n", "241 241.995 13.005 37.995 red\n", "242 83.895 198.900 255.000 light blue\n", "243 255.000 232.050 194.055 light tan\n", "244 47.940 45.900 41.055 black\n", "245 255.000 255.000 160.905 light yellow\n", "246 255.000 255.000 255.000 white\n", "247 251.940 249.900 245.055 white\n", "248 160.905 166.005 162.945 grey\n", "249 45.900 98.940 29.070 conifer green\n", "250 37.995 6.885 172.890 deep purple\n", "251 186.150 0.000 0.000 blood red\n", "252 93.075 198.900 255.000 sky blue\n", "253 205.020 237.915 255.000 ice blue\n", "254 255.000 122.400 0.000 cheeto orange\n", "255 0.000 58.905 109.905 marine blue\n", "256 92.055 103.020 111.945 dark gray\n", "257 222.105 208.080 175.950 sand color\n", "258 64.005 52.020 46.920 dark brown\n", "259 224.910 186.915 255.000 lavender\n", "260 255.000 0.000 158.100 fuschiar" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dataset[221:261]" ] }, { "cell_type": "markdown", "id": "41a2afd4-1dbc-4e99-84ca-61b1e4ad3190", "metadata": {}, "source": [ "***\n", "We want to decrease the number of possible classes.\n", "-> Notice the pattern in our dataset: composite colors often have a basic color as its second word (i.e Cheeto ***Orange***).\n", "We can therefore truncate every composite color name to *only* the last one." ] }, { "cell_type": "code", "execution_count": 9, "id": "7b1dd4c2-36ca-4871-849d-5d1a4a897557", "metadata": {}, "outputs": [], "source": [ "##### Keep last word of every color\n", "# This simplifies the composite names\n", "# We overwrite the column colour with the corrected entries\n", "\n", "dataset.loc[:, ['colour']] = dataset.loc[:, ['colour']].apply(lambda name: name.str.split().str[-1], axis=1)" ] }, { "cell_type": "markdown", "id": "8b0d4da3-86d2-4447-8f5d-56cb16d5d540", "metadata": {}, "source": [ "***\n", "Let's take a look at the amount of unique colors now!" ] }, { "cell_type": "code", "execution_count": 10, "id": "9c82d26b-15b4-40a0-954a-4e0f0fabb230", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "colour\n", "green 75\n", "blue 73\n", "pink 36\n", "purple 35\n", "red 35\n", " ..\n", "drab 1\n", "peru 1\n", "sunflower 1\n", "whip 1\n", "gurgundy 1\n", "Name: count, Length: 92, dtype: int64" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dataset[\"colour\"].value_counts()" ] }, { "cell_type": "markdown", "id": "15d38bf7-5146-4343-9ba9-f721babe4e33", "metadata": {}, "source": [ "92 unique colours, but we can do better. It could be beneficial to remove all the colors with only a count of one... because some of these singletons are quite meaningless.\n", "\n", "We can select only the colors that appear more than **7** times to keep only the 'recognizable' colors." ] }, { "cell_type": "code", "execution_count": 11, "id": "695ec114-17cb-4f45-8e82-a719e862cb5c", "metadata": {}, "outputs": [], "source": [ "##### Get the Pandas Series of every color in our database\n", "# We can work with the series to select our desired colors\n", "\n", "value_counts = dataset['colour'].value_counts()" ] }, { "cell_type": "code", "execution_count": 12, "id": "3e603bed-9a3e-434b-b83e-fb3af4893479", "metadata": {}, "outputs": [], "source": [ "##### Keep every color in the Series that appears >7 times\n", "# Now we only have our desired colours in the Series\n", "\n", "valid_values = value_counts[value_counts >7].index" ] }, { "cell_type": "code", "execution_count": 13, "id": "01c35880-e214-4233-b759-1d5393e2fac9", "metadata": {}, "outputs": [], "source": [ "##### Get the newly filtered dataset\n", "# we obtain it by keeping the entries that appear both in the full the list/series of valid colors.\n", "\n", "filtered_dataset = dataset[dataset['colour'].isin(valid_values)]" ] }, { "cell_type": "code", "execution_count": 14, "id": "6a2c5862-344d-4cc5-aeaf-e30d6e820a09", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " R G B colour\n", "0 81.000 42.000 173.000 purple\n", "1 222.000 9.000 73.000 red\n", "2 59.000 188.000 227.000 blue\n", "3 14.000 158.000 29.000 green\n", "4 222.000 222.000 82.000 yellow\n", "5 222.000 154.000 82.000 orange\n", "6 240.000 137.000 26.000 orange\n", "7 54.000 181.000 126.000 green\n", "8 16.000 115.000 130.000 blue\n", "9 96.000 126.000 181.000 blue\n", "10 222.000 160.000 194.000 pink\n", "11 205.000 143.000 219.000 purple\n", "12 143.000 219.000 177.000 green\n", "13 143.000 176.000 219.000 blue\n", "14 215.000 219.000 143.000 yellow\n", "15 135.000 206.000 235.000 blue\n", "16 255.000 97.000 56.000 orange\n", "17 255.000 99.000 71.000 red\n", "18 120.000 81.000 169.000 purple\n", "19 255.000 20.000 147.000 pink\n", "20 199.000 77.000 222.000 pink\n", "21 222.000 200.000 77.000 yellow\n", "22 133.000 266.000 233.000 blue\n", "23 52.000 29.000 107.000 purple\n", "24 50.000 20.000 100.000 purple\n", "25 100.000 20.000 70.000 pink\n", "26 89.000 102.000 201.000 purple\n", "27 3.000 61.000 252.000 blue\n", "28 30.000 77.000 2.000 green\n", "29 176.000 125.000 174.000 pink\n", "30 57.000 77.000 11.000 green\n", "31 44.000 33.000 88.000 purple\n", "32 88.000 11.000 333.000 purple\n", "33 123.000 45.000 67.000 red\n", "34 89.000 156.000 233.000 blue\n", "35 210.000 85.000 30.000 orange\n", "36 255.000 165.000 0.000 orange\n", "37 255.000 192.000 203.000 pink\n", "38 60.000 179.000 113.000 green\n", "39 72.000 61.000 139.000 blue\n", "40 48.000 160.000 99.000 green\n", "41 16.000 201.000 100.000 green\n", "42 23.000 204.000 218.000 blue\n", "43 76.000 34.000 106.000 purple\n", "44 132.000 43.000 195.000 purple\n", "45 43.000 195.000 190.000 turquoise\n", "46 81.000 216.000 211.000 turquoise\n", "47 9.000 104.000 101.000 turquoise\n", "48 128.000 210.000 207.000 turquoise\n", "49 128.000 155.000 210.000 blue\n", "50 16.000 56.000 133.000 blue\n", "51 151.000 172.000 212.000 blue\n", "52 162.000 207.000 0.000 green\n", "53 174.000 197.000 90.000 green\n", "54 207.000 202.000 13.000 yellow\n", "55 224.000 221.000 116.000 yellow\n", "56 220.000 228.000 18.000 yellow\n", "57 228.000 67.000 18.000 red\n", "58 243.000 136.000 104.000 red\n", "59 245.000 148.000 240.000 pink\n", "60 169.000 252.000 3.000 green\n", "61 3.000 198.000 252.000 blue\n", "62 177.000 3.000 252.000 violet\n", "63 186.000 58.000 154.000 pink\n", "64 186.000 133.000 58.000 brown\n", "65 181.000 68.000 51.000 red\n", "66 181.000 131.000 51.000 brown\n", "67 181.000 51.000 177.000 purple\n", "68 181.000 51.000 51.000 red\n", "69 51.000 151.000 181.000 blue\n", "70 146.000 181.000 51.000 green\n", "71 181.000 181.000 51.000 yellow\n", "72 250.000 151.000 2.000 orange\n", "73 250.000 68.000 2.000 orange\n", "74 250.000 19.000 2.000 red\n", "75 2.000 250.000 11.000 green\n", "76 2.000 159.000 250.000 blue\n", "77 2.000 93.000 250.000 blue\n", "78 130.000 2.000 250.000 violet\n", "79 221.000 2.000 250.000 purple\n", "80 154.000 161.000 18.000 green\n", "81 67.000 98.000 94.000 green\n", "82 123.000 172.000 196.000 blue\n", "83 117.000 117.000 111.000 grey\n", "84 211.000 108.000 75.000 orange\n", "85 220.000 20.000 16.000 red\n", "86 43.000 76.000 112.000 blue\n", "87 237.000 210.000 87.000 yellow\n", "88 112.000 62.000 43.000 brown\n", "89 130.000 103.000 137.000 purple\n", "90 133.000 8.000 138.000 purple\n", "91 79.000 79.000 79.000 grey\n", "93 65.000 105.000 225.000 blue\n", "94 233.000 240.000 105.000 yellow\n", "95 223.000 210.000 214.000 pink\n", "96 252.000 140.000 3.000 orange\n", "97 240.000 252.000 3.000 yellow\n", "98 20.000 162.000 69.000 green\n", "99 192.000 208.000 174.000 green\n", "100 176.000 81.000 81.000 red\n", "101 57.000 27.000 112.000 violet\n", "102 223.000 52.000 224.000 pink\n", "103 58.000 51.000 71.000 grey\n", "104 76.000 55.000 139.000 blue\n", "105 124.000 22.000 17.000 red\n", "106 52.000 144.000 135.000 green\n", "107 116.000 93.000 86.000 brown\n", "108 39.000 249.000 108.000 green\n", "109 56.000 149.000 161.000 blue\n", "110 6.000 6.000 6.000 black\n", "111 249.000 249.000 249.000 white\n", "112 157.000 237.000 236.000 blue\n", "115 50.000 205.000 50.000 green\n", "116 255.000 20.000 147.000 pink\n", "117 70.000 130.000 180.000 blue\n", "118 186.000 85.000 211.000 purple\n", "120 64.000 224.000 208.000 turquoise\n", "123 218.000 112.000 214.000 purple\n", "124 46.000 139.000 87.000 green\n", "125 30.000 144.000 255.000 blue\n", "126 205.000 133.000 63.000 yellow\n", "128 138.000 68.000 46.000 brown\n", "129 225.000 99.000 255.000 purple\n", "130 187.000 117.000 9.000 brown\n", "131 66.000 168.000 78.000 green\n", "132 25.000 235.000 79.000 green\n", "133 224.000 49.000 234.000 purple\n", "134 169.000 175.000 255.000 blue\n", "135 126.000 136.000 171.000 blue\n", "136 250.000 2.000 242.000 pink\n", "137 7.000 218.000 1.000 green\n", "139 114.000 0.000 47.000 red\n", "140 40.000 114.000 51.000 green\n", "141 32.000 33.000 79.000 blue\n", "142 115.000 66.000 34.000 brown\n", "143 110.000 28.000 52.000 violet\n", "145 198.000 166.000 100.000 yellow\n", "146 137.000 172.000 118.000 green\n", "147 202.000 196.000 176.000 grey\n", "148 27.000 85.000 131.000 blue\n", "149 250.000 139.000 55.000 orange\n", "150 235.000 86.000 73.000 red\n", "151 57.000 250.000 115.000 green\n", "152 225.000 79.000 155.000 pink\n", "153 135.000 73.000 23.000 brown\n", "155 125.000 132.000 113.000 grey\n", "156 105.000 73.000 47.000 brown\n", "157 195.000 88.000 49.000 orange\n", "158 228.000 160.000 16.000 yellow\n", "160 165.000 32.000 25.000 red\n", "161 52.000 59.000 41.000 green\n", "162 0.000 143.000 57.000 green\n", "163 32.000 96.000 61.000 green\n", "164 229.000 190.000 1.000 yellow\n", "165 110.000 28.000 52.000 violet\n", "166 237.000 239.000 240.000 white\n", "167 2.000 14.000 20.000 black\n", "168 241.000 64.000 26.000 red\n", "172 70.000 223.000 195.000 turquoise\n", "173 80.000 142.000 131.000 blue\n", "175 132.000 117.000 247.000 blue\n", "177 186.000 232.000 255.000 blue\n", "178 203.000 208.000 204.000 grey\n", "179 203.000 50.000 52.000 red\n", "180 216.000 75.000 32.000 orange\n", "182 144.000 70.000 132.000 violet\n", "183 33.000 33.000 33.000 brown\n", "184 236.000 124.000 38.000 orange\n", "185 65.000 34.000 39.000 red\n", "186 76.000 81.000 74.000 grey\n", "187 127.000 181.000 181.000 turquoise\n", "189 139.000 140.000 122.000 grey\n", "191 217.000 80.000 48.000 pink\n", "192 202.000 18.000 167.000 violet\n", "196 79.000 36.000 40.000 red\n", "197 255.000 35.000 1.000 orange\n", "198 162.000 35.000 29.000 red\n", "199 149.000 95.000 32.000 brown\n", "206 31.000 161.000 60.000 green\n", "207 88.000 227.000 119.000 green\n", "209 70.000 77.000 211.000 blue\n", "211 74.000 206.000 133.000 green\n", "213 255.000 140.000 174.000 pink\n", "216 69.000 70.000 108.000 green\n", "217 89.000 198.000 174.000 blue\n", "218 15.000 206.000 164.000 green\n", "219 211.000 110.000 112.000 pink\n", "220 229.000 190.000 1.000 yellow\n", "221 153.000 151.980 80.070 green\n", "222 171.105 109.905 60.945 orange\n", "223 255.000 186.915 33.915 yellow\n", "224 95.115 255.000 33.915 green\n", "225 32.895 83.895 13.005 green\n", "227 173.910 225.930 236.895 blue\n", "228 204.000 176.970 236.895 purple\n", "229 235.110 4.080 186.915 pink\n", "230 54.060 31.110 48.960 purple\n", "232 255.000 150.960 88.995 orange\n", "233 255.000 183.090 198.900 pink\n", "234 236.895 87.975 121.125 pink\n", "236 172.890 250.920 82.110 green\n", "238 31.110 166.005 82.110 green\n", "239 31.110 26.010 147.900 blue\n", "240 241.995 185.895 0.000 yellow\n", "241 241.995 13.005 37.995 red\n", "242 83.895 198.900 255.000 blue\n", "244 47.940 45.900 41.055 black\n", "245 255.000 255.000 160.905 yellow\n", "246 255.000 255.000 255.000 white\n", "247 251.940 249.900 245.055 white\n", "248 160.905 166.005 162.945 grey\n", "249 45.900 98.940 29.070 green\n", "250 37.995 6.885 172.890 purple\n", "251 186.150 0.000 0.000 red\n", "252 93.075 198.900 255.000 blue\n", "253 205.020 237.915 255.000 blue\n", "254 255.000 122.400 0.000 orange\n", "255 0.000 58.905 109.905 blue\n", "258 64.005 52.020 46.920 brown\n", "261 NaN NaN NaN green\n", "265 0.000 208.000 20.000 green\n", "266 61.000 82.000 255.000 blue\n", "267 79.000 0.000 129.000 purple\n", "270 106.000 90.000 205.000 blue\n", "273 65.000 105.000 225.000 blue\n", "275 255.000 140.000 0.000 orange\n", "276 70.000 130.000 180.000 blue\n", "277 60.000 179.000 113.000 green\n", "279 255.000 105.000 180.000 pink\n", "280 139.000 69.000 19.000 brown\n", "281 135.000 206.000 250.000 blue\n", "282 50.000 205.000 50.000 green\n", "283 255.000 20.000 147.000 pink\n", "284 148.000 0.000 211.000 violet\n", "288 255.000 78.000 245.000 pink\n", "289 0.000 145.000 186.000 blue\n", "290 135.000 206.000 235.000 blue\n", "291 255.000 69.000 0.000 orange\n", "292 219.000 112.000 147.000 red\n", "294 30.000 144.000 255.000 blue\n", "295 250.000 250.000 210.000 yellow\n", "296 95.000 158.000 160.000 blue\n", "299 255.000 182.000 193.000 pink\n", "304 128.000 0.000 128.000 purple\n", "305 244.000 164.000 96.000 brown\n", "308 139.000 0.000 0.000 red\n", "310 141.000 84.000 0.000 brown\n", "311 255.000 31.000 128.000 pink\n", "312 197.000 134.000 0.000 orange\n", "314 146.000 221.000 24.000 green\n", "315 211.000 255.000 252.000 blue\n", "316 192.000 94.000 255.000 purple\n", "317 16.000 94.000 255.000 blue\n", "319 242.000 207.000 255.000 pink\n", "320 0.000 66.000 37.000 green\n", "323 234.000 255.000 180.000 yellow\n", "325 209.000 216.000 143.000 green\n", "328 178.000 225.000 222.000 blue\n", "330 186.000 104.000 147.000 pink\n", "332 255.000 244.000 179.000 yellow\n", "333 89.000 104.000 160.000 blue\n", "334 250.000 144.000 127.000 orange\n", "335 126.000 61.000 113.000 purple\n", "337 67.000 90.000 56.000 green\n", "338 165.000 196.000 213.000 blue\n", "339 190.000 177.000 225.000 purple\n", "340 56.000 79.000 64.000 green\n", "341 255.000 195.000 160.000 pink\n", "342 37.000 45.000 55.000 blue\n", "344 121.000 135.000 145.000 blue\n", "345 246.000 243.000 228.000 white\n", "346 211.000 124.000 92.000 orange\n", "347 143.000 102.000 189.000 violet\n", "348 252.000 169.000 205.000 pink\n", "350 130.000 41.000 0.000 red\n", "351 217.000 235.000 145.000 green\n", "352 145.000 230.000 235.000 blue\n", "353 166.000 145.000 235.000 purple\n", "354 133.000 48.000 124.000 pink\n", "355 111.000 133.000 48.000 green\n", "356 15.000 99.000 46.000 green\n", "357 65.000 27.000 117.000 purple\n", "358 130.000 8.000 47.000 red\n", "359 163.000 189.000 128.000 green\n", "360 128.000 177.000 189.000 blue\n", "361 50.000 97.000 115.000 blue\n", "363 159.000 163.000 206.000 blue\n", "365 32.000 35.000 24.000 green\n", "368 255.000 0.000 0.000 red\n", "369 255.000 255.000 0.000 yellow\n", "375 76.000 145.000 58.000 green\n", "376 110.000 41.000 50.000 purple\n", "377 41.000 74.000 150.000 blue\n", "378 207.000 204.000 52.000 yellow\n", "379 135.000 128.000 128.000 grey\n", "382 26.000 25.000 31.000 black\n", "385 239.000 138.000 23.000 orange\n", "391 63.000 97.000 45.000 green\n", "392 175.000 208.000 191.000 grey\n", "394 246.000 121.000 229.000 violet\n", "395 3.000 121.000 113.000 green\n", "400 38.000 94.000 28.000 green\n", "403 255.000 210.000 117.000 yellow\n", "404 219.000 90.000 66.000 red\n", "405 237.000 37.000 78.000 red\n", "406 1.000 25.000 54.000 blue\n", "407 70.000 83.000 98.000 grey\n", "408 107.000 170.000 117.000 green\n", "410 117.000 70.000 104.000 purple\n", "411 77.000 170.000 87.000 green\n", "412 88.000 125.000 113.000 green\n", "413 248.000 243.000 43.000 yellow\n", "414 255.000 237.000 223.000 pink\n", "415 197.000 216.000 109.000 green\n", "416 161.000 124.000 107.000 brown\n", "417 60.000 136.000 126.000 green\n", "418 72.000 77.000 109.000 purple\n", "419 238.000 99.000 82.000 red\n", "420 8.000 178.000 227.000 blue\n", "422 117.000 185.000 190.000 blue\n", "424 13.000 240.000 10.000 green\n", "426 237.000 14.000 200.000 pink\n", "427 9.000 188.000 138.000 green\n", "429 21.000 122.000 110.000 green\n", "431 152.000 159.000 206.000 purple\n", "432 135.000 61.000 72.000 red\n", "433 70.000 69.000 49.000 brown\n", "434 120.000 133.000 139.000 grey\n", "435 37.000 34.000 27.000 black\n", "436 195.000 195.000 195.000 grey\n", "438 139.000 140.000 122.000 grey\n", "439 10.000 10.000 13.000 black\n", "440 164.000 125.000 144.000 purple\n", "441 71.000 64.000 46.000 brown\n", "442 49.000 102.000 80.000 green\n", "443 25.000 26.000 36.000 purple\n", "444 29.000 30.000 51.000 blue\n", "446 166.000 94.000 46.000 brown\n", "447 248.000 243.000 53.000 yellow\n", "448 162.000 35.000 29.000 red\n", "449 127.000 181.000 181.000 turquoise\n", "450 69.000 50.000 46.000 brown\n", "451 104.000 108.000 94.000 grey\n", "452 228.000 160.000 16.000 yellow\n", "453 180.000 76.000 67.000 pink\n", "455 169.000 131.000 7.000 yellow\n", "456 16.000 44.000 84.000 blue\n", "457 47.000 69.000 56.000 green\n", "458 246.000 246.000 246.000 white\n", "459 234.000 137.000 154.000 pink\n", "460 213.000 48.000 50.000 red\n", "461 125.000 132.000 113.000 grey\n", "462 66.000 70.000 50.000 green\n", "464 189.000 236.000 182.000 pink\n", "465 236.000 124.000 38.000 orange\n", "466 109.000 101.000 82.000 grey\n", "467 45.000 87.000 44.000 green\n", "468 207.000 211.000 205.000 white\n", "469 37.000 109.000 123.000 blue\n", "471 237.000 255.000 33.000 yellow\n", "472 42.000 100.000 120.000 blue\n", "473 40.000 40.000 40.000 black\n", "475 228.000 160.000 16.000 yellow\n", "476 134.000 115.000 161.000 violet\n", "477 2.000 86.000 105.000 blue\n", "478 93.000 155.000 155.000 blue\n", "479 237.000 118.000 14.000 orange\n", "480 74.000 25.000 44.000 violet\n", "481 237.000 255.000 33.000 yellow\n", "482 204.000 6.000 5.000 red\n", "483 138.000 149.000 151.000 grey\n", "484 112.000 83.000 53.000 brown\n", "485 165.000 32.000 25.000 red\n", "486 35.000 26.000 36.000 blue\n", "487 217.000 80.000 48.000 pink\n", "488 40.000 114.000 51.000 green\n", "489 160.000 52.000 114.000 purple\n", "490 89.000 53.000 31.000 brown\n", "492 250.000 244.000 227.000 white\n", "494 222.000 76.000 138.000 pink\n", "495 236.000 124.000 38.000 orange\n", "496 48.000 132.000 70.000 green\n", "497 162.000 35.000 29.000 red\n", "498 255.000 164.000 32.000 yellow\n", "499 42.000 46.000 75.000 blue\n", "500 203.000 208.000 204.000 white\n", "501 62.000 59.000 50.000 black\n", "502 77.000 86.000 69.000 grey\n", "503 44.000 85.000 69.000 green\n", "504 139.000 140.000 122.000 grey\n", "505 189.000 236.000 182.000 green\n", "506 198.000 166.000 100.000 brown\n", "507 59.000 131.000 189.000 blue\n", "508 130.000 137.000 143.000 grey\n" ] } ], "source": [ "print(filtered_dataset.to_string())" ] }, { "cell_type": "markdown", "id": "b946e5f4-ecae-4a95-9359-a163fd4633fd", "metadata": {}, "source": [ "And here we have our fully cleaned dataset!\n", "\n", "To summarize, we:\n", "- made the color names lowercase\n", "- only kept the relevant part of compound names\n", "- filtered unpopular outliers\n", "- standardized our RGB values\n", "- etc.\n", "\n", "However, the accuracy of our model isn't all that good. This is because we made lots of oversimplifications in our data.\n" ] }, { "cell_type": "markdown", "id": "58f1551b-5bee-4415-83da-29e33a63a1df", "metadata": {}, "source": [ "\n", "***\n", ">\n", "# Exercise: training a KNN classififer for color names\n", "\n", "Input: R, G, B,\n", "Output (prediciton): color name\n", "\n", "- do a train test split on the diltered_dataset\n", "- train a KNN (choose whatever you want to start with)\n", "- make predictions on the test set\n", "- compute accuracy score\n", "- repeat for different K if necessary" ] }, { "cell_type": "code", "execution_count": 35, "id": "a1518e0d-112e-41ea-9e2d-e921258970a8", "metadata": {}, "outputs": [], "source": [ "\n", "from sklearn.neighbors import KNeighborsClassifier\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.metrics import accuracy_score" ] }, { "cell_type": "code", "execution_count": 16, "id": "5129fb88-b47c-4f18-8ed5-155b065bdae5", "metadata": {}, "outputs": [], "source": [ "filtered_dataset = filtered_dataset.drop(index=261)" ] }, { "cell_type": "code", "execution_count": 17, "id": "9ec42c3c-baf9-4f03-9cc2-41ac470980c2", "metadata": {}, "outputs": [], "source": [ "X_train, X_test, y_train, y_test = \\\n", " train_test_split(filtered_dataset[['R','G','B']], filtered_dataset['colour'], test_size=0.2)" ] }, { "cell_type": "code", "execution_count": 18, "id": "e4289601-5c08-4800-9ef6-cdab9be8fde1", "metadata": {}, "outputs": [], "source": [ "knn = KNeighborsClassifier(n_neighbors=3)" ] }, { "cell_type": "code", "execution_count": 19, "id": "19e137a3-580a-446d-97e6-915d339aabb4", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
KNeighborsClassifier(n_neighbors=3)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "KNeighborsClassifier(n_neighbors=3)" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "knn.fit(X_train, y_train)\n", "\n", "# Remove NaN" ] }, { "cell_type": "code", "execution_count": 20, "id": "60751884-c502-44f4-8a15-ea2253cfd17e", "metadata": {}, "outputs": [], "source": [ "y_predicted = knn.predict(X_test)" ] }, { "cell_type": "code", "execution_count": 21, "id": "29be4004-4088-4c79-b675-45273d53c738", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.6582278481012658" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# KNN accuracy score\n", "accuracy_score(y_test, y_predicted)" ] }, { "cell_type": "code", "execution_count": 22, "id": "6155783e-d46a-411f-b48b-cde57c7565d9", "metadata": {}, "outputs": [], "source": [ "from sklearn.tree import DecisionTreeClassifier" ] }, { "cell_type": "code", "execution_count": 23, "id": "80a94642-3886-4711-8a2a-bd3ad21a4243", "metadata": {}, "outputs": [], "source": [ "dt = DecisionTreeClassifier(max_depth=7)" ] }, { "cell_type": "code", "execution_count": 24, "id": "9137287b-28f8-4e36-9741-d39787ef895f", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
DecisionTreeClassifier(max_depth=7)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "DecisionTreeClassifier(max_depth=7)" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dt.fit(X_train, y_train)" ] }, { "cell_type": "code", "execution_count": 25, "id": "495049c4-78de-4b01-a419-5d4c8da2fdd1", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.6329113924050633" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Decision Tree accuracy score\n", "y_predicted = dt.predict(X_test)\n", "accuracy_score(y_test, y_predicted)" ] }, { "cell_type": "code", "execution_count": 26, "id": "1ff56166-1eb6-45b5-84e6-3933d9366d0c", "metadata": {}, "outputs": [], "source": [ "from sklearn import tree\n" ] }, { "cell_type": "code", "execution_count": 27, "id": "80856df0-ca78-49f7-9157-5e373f9545a9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[Text(0.5528846153846154, 0.9375, 'x[0] <= 175.5\\ngini = 0.888\\nsamples = 314\\nvalue = [7.0, 55.0, 20.0, 60.0, 20.0, 20.0, 29.0, 27.0, 27.0\\n5.0, 10.0, 7.0, 27.0]'),\n", " Text(0.32967032967032966, 0.8125, 'x[2] <= 138.5\\ngini = 0.812\\nsamples = 194\\nvalue = [7.0, 54.0, 15.0, 55.0, 17.0, 1.0, 1.0, 20.0, 9.0\\n5.0, 9.0, 0.0, 1.0]'),\n", " Text(0.4412774725274725, 0.875, 'True '),\n", " Text(0.18681318681318682, 0.6875, 'x[1] <= 141.5\\ngini = 0.788\\nsamples = 135\\nvalue = [7, 13, 15, 54, 13, 1, 1, 15, 9, 1, 5, 0, 1]'),\n", " Text(0.17582417582417584, 0.5625, 'x[0] <= 69.5\\ngini = 0.86\\nsamples = 106\\nvalue = [7, 13, 15, 25, 13, 1, 1, 15, 9, 1, 5, 0, 1]'),\n", " Text(0.08791208791208792, 0.4375, 'x[1] <= 58.952\\ngini = 0.717\\nsamples = 54\\nvalue = [7, 13, 1, 24, 1, 0, 0, 5, 1, 1, 1, 0, 0]'),\n", " Text(0.04395604395604396, 0.3125, 'x[2] <= 33.5\\ngini = 0.783\\nsamples = 23\\nvalue = [6, 7, 1, 1, 1, 0, 0, 5, 1, 0, 1, 0, 0]'),\n", " Text(0.02197802197802198, 0.1875, 'x[1] <= 34.5\\ngini = 0.278\\nsamples = 6\\nvalue = [5, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]'),\n", " Text(0.01098901098901099, 0.0625, 'gini = 0.0\\nsamples = 5\\nvalue = [5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]'),\n", " Text(0.03296703296703297, 0.0625, 'gini = 0.0\\nsamples = 1\\nvalue = [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]'),\n", " Text(0.06593406593406594, 0.1875, 'x[0] <= 43.0\\ngini = 0.727\\nsamples = 17\\nvalue = [1, 7, 1, 0, 1, 0, 0, 5, 1, 0, 1, 0, 0]'),\n", " Text(0.054945054945054944, 0.0625, 'gini = 0.219\\nsamples = 8\\nvalue = [0, 7, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]'),\n", " Text(0.07692307692307693, 0.0625, 'gini = 0.741\\nsamples = 9\\nvalue = [1, 0, 1, 0, 1, 0, 0, 4, 1, 0, 1, 0, 0]'),\n", " Text(0.13186813186813187, 0.3125, 'x[2] <= 97.5\\ngini = 0.41\\nsamples = 31\\nvalue = [1, 6, 0, 23, 0, 0, 0, 0, 0, 1, 0, 0, 0]'),\n", " Text(0.10989010989010989, 0.1875, 'x[1] <= 64.0\\ngini = 0.095\\nsamples = 20\\nvalue = [1, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0]'),\n", " Text(0.0989010989010989, 0.0625, 'gini = 0.5\\nsamples = 2\\nvalue = [1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]'),\n", " Text(0.12087912087912088, 0.0625, 'gini = 0.0\\nsamples = 18\\nvalue = [0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0]'),\n", " Text(0.15384615384615385, 0.1875, 'x[1] <= 118.0\\ngini = 0.562\\nsamples = 11\\nvalue = [0, 6, 0, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0]'),\n", " Text(0.14285714285714285, 0.0625, 'gini = 0.406\\nsamples = 8\\nvalue = [0, 6, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0]'),\n", " Text(0.16483516483516483, 0.0625, 'gini = 0.0\\nsamples = 3\\nvalue = [0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0]'),\n", " Text(0.26373626373626374, 0.4375, 'x[2] <= 49.5\\ngini = 0.806\\nsamples = 52\\nvalue = [0, 0, 14, 1, 12, 1, 1, 10, 8, 0, 4, 0, 1]'),\n", " Text(0.21978021978021978, 0.3125, 'x[1] <= 44.5\\ngini = 0.57\\nsamples = 20\\nvalue = [0, 0, 11, 0, 0, 0, 0, 0, 7, 0, 1, 0, 1]'),\n", " Text(0.1978021978021978, 0.1875, 'x[0] <= 76.5\\ngini = 0.219\\nsamples = 8\\nvalue = [0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 1, 0, 0]'),\n", " Text(0.18681318681318682, 0.0625, 'gini = 0.0\\nsamples = 1\\nvalue = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0]'),\n", " Text(0.2087912087912088, 0.0625, 'gini = 0.0\\nsamples = 7\\nvalue = [0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0]'),\n", " Text(0.24175824175824176, 0.1875, 'x[1] <= 113.0\\ngini = 0.153\\nsamples = 12\\nvalue = [0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]'),\n", " Text(0.23076923076923078, 0.0625, 'gini = 0.0\\nsamples = 11\\nvalue = [0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]'),\n", " Text(0.25274725274725274, 0.0625, 'gini = 0.0\\nsamples = 1\\nvalue = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]'),\n", " Text(0.3076923076923077, 0.3125, 'x[1] <= 79.0\\ngini = 0.74\\nsamples = 32\\nvalue = [0, 0, 3, 1, 12, 1, 1, 10, 1, 0, 3, 0, 0]'),\n", " Text(0.2857142857142857, 0.1875, 'x[2] <= 88.0\\ngini = 0.531\\nsamples = 14\\nvalue = [0, 0, 0, 0, 0, 0, 1, 9, 1, 0, 3, 0, 0]'),\n", " Text(0.27472527472527475, 0.0625, 'gini = 0.625\\nsamples = 4\\nvalue = [0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 2, 0, 0]'),\n", " Text(0.2967032967032967, 0.0625, 'gini = 0.34\\nsamples = 10\\nvalue = [0, 0, 0, 0, 0, 0, 1, 8, 0, 0, 1, 0, 0]'),\n", " Text(0.32967032967032966, 0.1875, 'x[0] <= 150.0\\ngini = 0.519\\nsamples = 18\\nvalue = [0, 0, 3, 1, 12, 1, 0, 1, 0, 0, 0, 0, 0]'),\n", " Text(0.31868131868131866, 0.0625, 'gini = 0.414\\nsamples = 16\\nvalue = [0, 0, 2, 1, 12, 0, 0, 1, 0, 0, 0, 0, 0]'),\n", " Text(0.34065934065934067, 0.0625, 'gini = 0.5\\nsamples = 2\\nvalue = [0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]'),\n", " Text(0.1978021978021978, 0.5625, 'gini = 0.0\\nsamples = 29\\nvalue = [0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0]'),\n", " Text(0.4725274725274725, 0.6875, 'x[1] <= 14.005\\ngini = 0.496\\nsamples = 59\\nvalue = [0, 41, 0, 1, 4, 0, 0, 5, 0, 4, 4, 0, 0]'),\n", " Text(0.46153846153846156, 0.5625, 'gini = 0.0\\nsamples = 2\\nvalue = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0]'),\n", " Text(0.4835164835164835, 0.5625, 'x[2] <= 211.5\\ngini = 0.464\\nsamples = 57\\nvalue = [0, 41, 0, 1, 4, 0, 0, 5, 0, 4, 2, 0, 0]'),\n", " Text(0.43956043956043955, 0.4375, 'x[0] <= 129.0\\ngini = 0.642\\nsamples = 34\\nvalue = [0, 19, 0, 1, 4, 0, 0, 4, 0, 4, 2, 0, 0]'),\n", " Text(0.3956043956043956, 0.3125, 'x[1] <= 190.0\\ngini = 0.448\\nsamples = 25\\nvalue = [0, 18, 0, 1, 0, 0, 0, 2, 0, 4, 0, 0, 0]'),\n", " Text(0.37362637362637363, 0.1875, 'x[1] <= 103.0\\ngini = 0.188\\nsamples = 19\\nvalue = [0, 17, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0]'),\n", " Text(0.3626373626373626, 0.0625, 'gini = 0.48\\nsamples = 5\\nvalue = [0, 3, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0]'),\n", " Text(0.38461538461538464, 0.0625, 'gini = 0.0\\nsamples = 14\\nvalue = [0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]'),\n", " Text(0.4175824175824176, 0.1875, 'x[2] <= 182.0\\ngini = 0.5\\nsamples = 6\\nvalue = [0, 1, 0, 1, 0, 0, 0, 0, 0, 4, 0, 0, 0]'),\n", " Text(0.4065934065934066, 0.0625, 'gini = 0.5\\nsamples = 2\\nvalue = [0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]'),\n", " Text(0.42857142857142855, 0.0625, 'gini = 0.0\\nsamples = 4\\nvalue = [0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0]'),\n", " Text(0.4835164835164835, 0.3125, 'x[1] <= 131.0\\ngini = 0.691\\nsamples = 9\\nvalue = [0, 1, 0, 0, 4, 0, 0, 2, 0, 0, 2, 0, 0]'),\n", " Text(0.46153846153846156, 0.1875, 'x[2] <= 152.5\\ngini = 0.5\\nsamples = 4\\nvalue = [0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0]'),\n", " Text(0.45054945054945056, 0.0625, 'gini = 0.0\\nsamples = 1\\nvalue = [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]'),\n", " Text(0.4725274725274725, 0.0625, 'gini = 0.444\\nsamples = 3\\nvalue = [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0]'),\n", " Text(0.5054945054945055, 0.1875, 'x[2] <= 198.5\\ngini = 0.32\\nsamples = 5\\nvalue = [0, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0]'),\n", " Text(0.4945054945054945, 0.0625, 'gini = 0.0\\nsamples = 4\\nvalue = [0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0]'),\n", " Text(0.5164835164835165, 0.0625, 'gini = 0.0\\nsamples = 1\\nvalue = [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]'),\n", " Text(0.5274725274725275, 0.4375, 'x[0] <= 165.5\\ngini = 0.083\\nsamples = 23\\nvalue = [0, 22, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]'),\n", " Text(0.5164835164835165, 0.3125, 'gini = 0.0\\nsamples = 20\\nvalue = [0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]'),\n", " Text(0.5384615384615384, 0.3125, 'x[2] <= 235.948\\ngini = 0.444\\nsamples = 3\\nvalue = [0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]'),\n", " Text(0.5274725274725275, 0.1875, 'gini = 0.0\\nsamples = 1\\nvalue = [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]'),\n", " Text(0.5494505494505495, 0.1875, 'gini = 0.0\\nsamples = 2\\nvalue = [0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]'),\n", " Text(0.7760989010989011, 0.8125, 'x[2] <= 107.0\\ngini = 0.84\\nsamples = 120\\nvalue = [0, 1, 5, 5, 3, 19, 28, 7, 18, 0, 1, 7, 26]'),\n", " Text(0.6644917582417582, 0.875, ' False'),\n", " Text(0.6648351648351648, 0.6875, 'x[1] <= 157.0\\ngini = 0.729\\nsamples = 62\\nvalue = [0, 0, 5, 0, 0, 19, 2, 0, 17, 0, 0, 0, 19]'),\n", " Text(0.6153846153846154, 0.5625, 'x[1] <= 103.5\\ngini = 0.627\\nsamples = 41\\nvalue = [0, 0, 3, 0, 0, 18, 2, 0, 17, 0, 0, 0, 1]'),\n", " Text(0.5934065934065934, 0.4375, 'x[0] <= 252.5\\ngini = 0.461\\nsamples = 23\\nvalue = [0, 0, 0, 0, 0, 5, 2, 0, 16, 0, 0, 0, 0]'),\n", " Text(0.5824175824175825, 0.3125, 'x[1] <= 67.5\\ngini = 0.39\\nsamples = 21\\nvalue = [0, 0, 0, 0, 0, 3, 2, 0, 16, 0, 0, 0, 0]'),\n", " Text(0.5714285714285714, 0.1875, 'gini = 0.0\\nsamples = 11\\nvalue = [0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0]'),\n", " Text(0.5934065934065934, 0.1875, 'x[2] <= 40.0\\ngini = 0.62\\nsamples = 10\\nvalue = [0, 0, 0, 0, 0, 3, 2, 0, 5, 0, 0, 0, 0]'),\n", " Text(0.5824175824175825, 0.0625, 'gini = 0.0\\nsamples = 3\\nvalue = [0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0]'),\n", " Text(0.6043956043956044, 0.0625, 'gini = 0.408\\nsamples = 7\\nvalue = [0, 0, 0, 0, 0, 0, 2, 0, 5, 0, 0, 0, 0]'),\n", " Text(0.6043956043956044, 0.3125, 'gini = 0.0\\nsamples = 2\\nvalue = [0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0]'),\n", " Text(0.6373626373626373, 0.4375, 'x[0] <= 192.0\\ngini = 0.444\\nsamples = 18\\nvalue = [0, 0, 3, 0, 0, 13, 0, 0, 1, 0, 0, 0, 1]'),\n", " Text(0.6263736263736264, 0.3125, 'gini = 0.0\\nsamples = 3\\nvalue = [0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]'),\n", " Text(0.6483516483516484, 0.3125, 'x[2] <= 96.498\\ngini = 0.24\\nsamples = 15\\nvalue = [0, 0, 0, 0, 0, 13, 0, 0, 1, 0, 0, 0, 1]'),\n", " Text(0.6373626373626373, 0.1875, 'x[0] <= 208.0\\ngini = 0.133\\nsamples = 14\\nvalue = [0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 1]'),\n", " Text(0.6263736263736264, 0.0625, 'gini = 0.5\\nsamples = 2\\nvalue = [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1]'),\n", " Text(0.6483516483516484, 0.0625, 'gini = 0.0\\nsamples = 12\\nvalue = [0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0]'),\n", " Text(0.6593406593406593, 0.1875, 'gini = 0.0\\nsamples = 1\\nvalue = [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]'),\n", " Text(0.7142857142857143, 0.5625, 'x[2] <= 89.0\\ngini = 0.254\\nsamples = 21\\nvalue = [0, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 18]'),\n", " Text(0.6813186813186813, 0.4375, 'x[0] <= 251.5\\ngini = 0.111\\nsamples = 17\\nvalue = [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 16]'),\n", " Text(0.6703296703296703, 0.3125, 'gini = 0.0\\nsamples = 14\\nvalue = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14]'),\n", " Text(0.6923076923076923, 0.3125, 'x[2] <= 16.0\\ngini = 0.444\\nsamples = 3\\nvalue = [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2]'),\n", " Text(0.6813186813186813, 0.1875, 'x[1] <= 210.0\\ngini = 0.5\\nsamples = 2\\nvalue = [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1]'),\n", " Text(0.6703296703296703, 0.0625, 'gini = 0.0\\nsamples = 1\\nvalue = [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]'),\n", " Text(0.6923076923076923, 0.0625, 'gini = 0.0\\nsamples = 1\\nvalue = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]'),\n", " Text(0.7032967032967034, 0.1875, 'gini = 0.0\\nsamples = 1\\nvalue = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]'),\n", " Text(0.7472527472527473, 0.4375, 'x[0] <= 238.5\\ngini = 0.5\\nsamples = 4\\nvalue = [0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2]'),\n", " Text(0.7362637362637363, 0.3125, 'x[0] <= 215.5\\ngini = 0.444\\nsamples = 3\\nvalue = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2]'),\n", " Text(0.7252747252747253, 0.1875, 'gini = 0.5\\nsamples = 2\\nvalue = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]'),\n", " Text(0.7472527472527473, 0.1875, 'gini = 0.0\\nsamples = 1\\nvalue = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]'),\n", " Text(0.7582417582417582, 0.3125, 'gini = 0.0\\nsamples = 1\\nvalue = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]'),\n", " Text(0.8873626373626373, 0.6875, 'x[1] <= 207.5\\ngini = 0.744\\nsamples = 58\\nvalue = [0, 1, 0, 5, 3, 0, 26, 7, 1, 0, 1, 7, 7]'),\n", " Text(0.8296703296703297, 0.5625, 'x[0] <= 221.5\\ngini = 0.485\\nsamples = 35\\nvalue = [0, 0, 0, 0, 2, 0, 24, 7, 1, 0, 1, 0, 0]'),\n", " Text(0.8021978021978022, 0.4375, 'x[2] <= 176.5\\ngini = 0.627\\nsamples = 13\\nvalue = [0, 0, 0, 0, 2, 0, 3, 7, 1, 0, 0, 0, 0]'),\n", " Text(0.7802197802197802, 0.3125, 'x[0] <= 215.0\\ngini = 0.56\\nsamples = 5\\nvalue = [0, 0, 0, 0, 1, 0, 3, 0, 1, 0, 0, 0, 0]'),\n", " Text(0.7692307692307693, 0.1875, 'x[2] <= 175.0\\ngini = 0.375\\nsamples = 4\\nvalue = [0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0]'),\n", " Text(0.7582417582417582, 0.0625, 'gini = 0.0\\nsamples = 3\\nvalue = [0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0]'),\n", " Text(0.7802197802197802, 0.0625, 'gini = 0.0\\nsamples = 1\\nvalue = [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]'),\n", " Text(0.7912087912087912, 0.1875, 'gini = 0.0\\nsamples = 1\\nvalue = [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]'),\n", " Text(0.8241758241758241, 0.3125, 'x[1] <= 186.0\\ngini = 0.219\\nsamples = 8\\nvalue = [0, 0, 0, 0, 1, 0, 0, 7, 0, 0, 0, 0, 0]'),\n", " Text(0.8131868131868132, 0.1875, 'gini = 0.0\\nsamples = 7\\nvalue = [0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0]'),\n", " Text(0.8351648351648352, 0.1875, 'gini = 0.0\\nsamples = 1\\nvalue = [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]'),\n", " Text(0.8571428571428571, 0.4375, 'x[2] <= 226.5\\ngini = 0.087\\nsamples = 22\\nvalue = [0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 1, 0, 0]'),\n", " Text(0.8461538461538461, 0.3125, 'gini = 0.0\\nsamples = 18\\nvalue = [0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0]'),\n", " Text(0.8681318681318682, 0.3125, 'x[2] <= 235.5\\ngini = 0.375\\nsamples = 4\\nvalue = [0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0]'),\n", " Text(0.8571428571428571, 0.1875, 'gini = 0.0\\nsamples = 1\\nvalue = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0]'),\n", " Text(0.8791208791208791, 0.1875, 'gini = 0.0\\nsamples = 3\\nvalue = [0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0]'),\n", " Text(0.945054945054945, 0.5625, 'x[2] <= 193.0\\ngini = 0.756\\nsamples = 23\\nvalue = [0, 1, 0, 5, 1, 0, 2, 0, 0, 0, 0, 7, 7]'),\n", " Text(0.9230769230769231, 0.4375, 'x[0] <= 220.5\\ngini = 0.569\\nsamples = 12\\nvalue = [0, 0, 0, 5, 0, 0, 1, 0, 0, 0, 0, 0, 6]'),\n", " Text(0.9120879120879121, 0.3125, 'x[1] <= 217.5\\ngini = 0.449\\nsamples = 7\\nvalue = [0, 0, 0, 5, 0, 0, 1, 0, 0, 0, 0, 0, 1]'),\n", " Text(0.9010989010989011, 0.1875, 'gini = 0.0\\nsamples = 3\\nvalue = [0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0]'),\n", " Text(0.9230769230769231, 0.1875, 'x[1] <= 227.0\\ngini = 0.625\\nsamples = 4\\nvalue = [0, 0, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 1]'),\n", " Text(0.9120879120879121, 0.0625, 'gini = 0.0\\nsamples = 1\\nvalue = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]'),\n", " Text(0.9340659340659341, 0.0625, 'gini = 0.444\\nsamples = 3\\nvalue = [0, 0, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0]'),\n", " Text(0.9340659340659341, 0.3125, 'gini = 0.0\\nsamples = 5\\nvalue = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5]'),\n", " Text(0.967032967032967, 0.4375, 'x[0] <= 194.5\\ngini = 0.562\\nsamples = 11\\nvalue = [0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 7, 1]'),\n", " Text(0.9560439560439561, 0.3125, 'gini = 0.0\\nsamples = 1\\nvalue = [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]'),\n", " Text(0.978021978021978, 0.3125, 'x[2] <= 220.5\\ngini = 0.48\\nsamples = 10\\nvalue = [0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 7, 1]'),\n", " Text(0.967032967032967, 0.1875, 'x[2] <= 207.5\\ngini = 0.72\\nsamples = 5\\nvalue = [0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 2, 1]'),\n", " Text(0.9560439560439561, 0.0625, 'gini = 0.444\\nsamples = 3\\nvalue = [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 0]'),\n", " Text(0.978021978021978, 0.0625, 'gini = 0.5\\nsamples = 2\\nvalue = [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1]'),\n", " Text(0.989010989010989, 0.1875, 'gini = 0.0\\nsamples = 5\\nvalue = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0]')]" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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MdfZV8Cfz3QxPj7ualt5ym4p7exuZmxszNVewFb/TN2PyrytivpBlAEAotijRkdHBQCRTCY9aa6vrwsAor29XfnZZq5evSoAiEceecSxTCaTEQBEd3e3Z91XX31VABDnzp1zLPP1118LAOJ///ufZ9177rlHABATExOOZV5++WUBQJw/f96zrhe77d27VwAQk5OTnjRv374tAIjW1lblZ5v54YcfBADx0EMPOZZZW1sTAERHR4dn3ddff10AEB9++KFjmStXrggA4tFHH/Wse+jQIQFA3Lx507GMl/pixYvd9u3bV7S+mNnY2BAARCgUUn52OXjjjTcEAPHee+85lvnuu+8EAPHwww971j1y5IgAIP755x/HMl7qixUvdjtw4EDR+lIOrl27JgCIkydPOpbJ5XICgGhubi7jmwUXL/7t7e0VAMTKyoonzXQ6LQCISCSi/GydlOXJTz31lHjyySddy5w7d07s3btXbG5uetY9cuSIePvtt13LvPjii66DjpV0Oi2i0aj46quvHMvk83lx4sQJ8dprr3nW/eabb0Q0GnUdiFdWVsSuXbvExYsXPeuePXtWHDp0SORyOccy165dE+Fw2LVjtPL000+LJ554wrXMRx99JPbs2eP6bCv33nuveOutt1zLnDlzRpw+fdqz5sLCgojFYuLy5cuOZfL5vDh58qR45ZVXPOt+++23IhqNug7Eq6urYnR0VFy4cMGz7jvvvCMOHjzoardff/1VhMNh8eeff3rWffbZZ8Xjjz/uWub8+fNi9+7dYmNjw7Pu8ePHxZtvvula5qWXXhKnTp3yrKmL77//XkQiEZFIJBzLZLNZsXv3bvHJJ5941n333XfFgQMHXO32+++/i3A4LK5fv+5Z97nnnhOPPfaYa5lPP/1UjI6OivX1dc+6OlhaWhLDw8Pi888/dy13+vRpcebMmTK9VbB59NFHxQsvvOBa5uzZs+LgwYMin8970szn82Lfvn3igw8+cC33zDPPFO0PdFIjBO8ZYhiGYRiGjrIdosUwDMMwzH8DDi4YhmEYhiHFefuGCcMwPN/2Nz09jcXFRU9lU6kUlpeXi5Zrb28HgP902fb2dvT19XmyWaXftRrL5nI5191MZs1S/OC1bKnvAFTetk6noVrp6upy3YZuRmpWqr9h296hFNt6xev79vX1Fd1lUQ6qbezTVW/8+KJoT2YYBvbv349MJuNJsLa21vOBQlxWX9lKP7/aypaiGYR3CEJZHYRCIdTU1Hjeznm3+kEHOm1LTUtLC65fv17RAKMaxz4d+PVF0eAilUohk8ngwoUL2L9/v2vZ69ev4/nnn+eyFS5b6edXW9lSNIPwDkEoK7l8+TKWlpZw4sQJNDY2Ip/PY3V1FXNzc7j//vs9aVifD6Aq6oJu2wJ09tVpW13vmkqlKhpcVNvYJ3Hyw8zMDB544AFPGtbn+/GFp2URANi/fz+OHTvGZauobKWfX21lS9EMwjtUuuylS5dw6tQppNNprK2twTAMHD58GCdPnkR9fT1+++23kgMMne9bStlKPx/QZ99qqwuVJgh1gcoPP/74Ix588EFPz1TFc3Bx6dIlXLx4EaOjo8hmszh+/HjhxMOBgQGk0+nCDWxOZWdmZtDc3IyFhQXPZVdWVgrrTU5l//77b+zZswcTExNFde3Kvv/++7jvvvsc37W3txdXrlwpWjaZTCISiXgqW4puqWV1+KEcZb3Y4OrVq6S68/PzhXXSYpqpVArZbLaQF+Gmm0qlsGvXLnz55Zd3nc/k/21qagr9/f0wDANHjx7F7Ows6uvr8fHHH+Pw4cMYHx9HOp3G6uoq6uvrt/lxbGwMR44cwS+//IKjR4/i559/xtraWqG/+S+3HSf7HDt2DD/99BM2NzcxPj6OwcFBfPbZZ0Vt+9dff227SEzH+1rrgvS5n7rwxRdf2A9CFaIa2qSTH8xt8sSJE7hx4wYymYwnP1jrTakUPeeiGteduGzln19tZTnnovSyOuCcC31UU85Fc3Mz/vjjD865KLGsDvzmXHg6RKvaMmbvxrK8W0RvWd4tEpzMdIB3i1Sbbb3Cu0W2+C/sFuETOhmGYRiGIYUP0WIYhmEYhhQOLhiGYRiGIYWDC4ZhGIZhSOHggmEYhmEYUji4YBiGYRiGFA4uGIZhGIYhhYMLhmEYhmFI4eCCYRiGYRhSOLhgGIZhGIYUDi4YhmEYhiGFgwuGYRiGYUjh4IJhGIZhGFI4uGAYhmEYhhQOLhiGYRiGIYWDC4ZhGIZhSOHggmEYhmEYUji4YBiGYRiGFA4uGIZhGIYhhYMLhmEYhmFI4eCCYRiGYRhSOLhgGIZhGIYUDi4YhmEYhiGFgwuGYRiGYUjh4IJhGIZhGFI4uGAYhmEYhhQOLhiGYRiGIYWDC4ZhGIZhSOHggmEYhmEYUv4PmRacy/kZxCYAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "tree.plot_tree(dt)\n" ] }, { "cell_type": "markdown", "id": "063e0a3b", "metadata": {}, "source": [ "# Wednesday - Day 3: Unsupervised learning and model validation" ] }, { "cell_type": "code", "execution_count": 29, "id": "08437bee-8af0-42b6-b14a-13923eca3d77", "metadata": {}, "outputs": [], "source": [ "X = filtered_dataset[['R', 'G', 'B']] #make a new matrix with just a few columns \n", "y = filtered_dataset['colour'] #one dimensional so use colour " ] }, { "cell_type": "code", "execution_count": 36, "id": "1bef2f7a", "metadata": {}, "outputs": [], "source": [ "# Split the dataset into training and testing sets\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25)" ] }, { "cell_type": "code", "execution_count": 30, "id": "31933a0c", "metadata": {}, "outputs": [], "source": [ "from sklearn.ensemble import RandomForestClassifier" ] }, { "cell_type": "code", "execution_count": 31, "id": "91557abe", "metadata": {}, "outputs": [], "source": [ "rf = RandomForestClassifier(n_estimators = 100) # passing through the parameterhow many trees to use\n", "# Optional: can test it out with different depths\n", "# Setting max_depth limits the growth of each tree, helping to prevent overfitting\n", "rf = RandomForestClassifier(n_estimators = 500, max_depth=5) " ] }, { "cell_type": "code", "execution_count": 32, "id": "c5b6bace", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
RandomForestClassifier(max_depth=5, n_estimators=500)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "RandomForestClassifier(max_depth=5, n_estimators=500)" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Fit the model to the training data\n", "rf.fit(X_train, y_train)" ] }, { "cell_type": "code", "execution_count": 33, "id": "f57f13c4", "metadata": {}, "outputs": [], "source": [ "# Use the trained model to make predictions on the test data\n", "y_predicted = dt.predict(X_test)" ] }, { "cell_type": "code", "execution_count": 34, "id": "d8f14df5", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.6329113924050633" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Measure how well the model performs on the test data\n", "accuracy_score(y_test, y_predicted)" ] }, { "cell_type": "code", "execution_count": null, "id": "b9eff482", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.12.4" } }, "nbformat": 4, "nbformat_minor": 5 }