diff --git a/Chapter01/Student performance.ipynb b/Chapter01/Student performance.ipynb
index c2df08d..0d8a9bf 100644
--- a/Chapter01/Student performance.ipynb
+++ b/Chapter01/Student performance.ipynb
@@ -1,1253 +1,1303 @@
{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {},
- "outputs": [
+ "cells": [
{
- "data": {
- "text/plain": [
- "649"
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "view-in-github",
+ "colab_type": "text"
+ },
+ "source": [
+ "
"
]
- },
- "execution_count": 1,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# load dataset (student Portuguese scores)\n",
- "import pandas as pd\n",
- "d = pd.read_csv('student-por.csv', sep=';')\n",
- "len(d)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [
+ },
{
- "data": {
- "text/html": [
- "
\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " school | \n",
- " sex | \n",
- " age | \n",
- " address | \n",
- " famsize | \n",
- " Pstatus | \n",
- " Medu | \n",
- " Fedu | \n",
- " Mjob | \n",
- " Fjob | \n",
- " ... | \n",
- " internet | \n",
- " romantic | \n",
- " famrel | \n",
- " freetime | \n",
- " goout | \n",
- " Dalc | \n",
- " Walc | \n",
- " health | \n",
- " absences | \n",
- " pass | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " | 0 | \n",
- " GP | \n",
- " F | \n",
- " 18 | \n",
- " U | \n",
- " GT3 | \n",
- " A | \n",
- " 4 | \n",
- " 4 | \n",
- " at_home | \n",
- " teacher | \n",
- " ... | \n",
- " no | \n",
- " no | \n",
- " 4 | \n",
- " 3 | \n",
- " 4 | \n",
- " 1 | \n",
- " 1 | \n",
- " 3 | \n",
- " 4 | \n",
- " 0 | \n",
- "
\n",
- " \n",
- " | 1 | \n",
- " GP | \n",
- " F | \n",
- " 17 | \n",
- " U | \n",
- " GT3 | \n",
- " T | \n",
- " 1 | \n",
- " 1 | \n",
- " at_home | \n",
- " other | \n",
- " ... | \n",
- " yes | \n",
- " no | \n",
- " 5 | \n",
- " 3 | \n",
- " 3 | \n",
- " 1 | \n",
- " 1 | \n",
- " 3 | \n",
- " 2 | \n",
- " 0 | \n",
- "
\n",
- " \n",
- " | 2 | \n",
- " GP | \n",
- " F | \n",
- " 15 | \n",
- " U | \n",
- " LE3 | \n",
- " T | \n",
- " 1 | \n",
- " 1 | \n",
- " at_home | \n",
- " other | \n",
- " ... | \n",
- " yes | \n",
- " no | \n",
- " 4 | \n",
- " 3 | \n",
- " 2 | \n",
- " 2 | \n",
- " 3 | \n",
- " 3 | \n",
- " 6 | \n",
- " 1 | \n",
- "
\n",
- " \n",
- " | 3 | \n",
- " GP | \n",
- " F | \n",
- " 15 | \n",
- " U | \n",
- " GT3 | \n",
- " T | \n",
- " 4 | \n",
- " 2 | \n",
- " health | \n",
- " services | \n",
- " ... | \n",
- " yes | \n",
- " yes | \n",
- " 3 | \n",
- " 2 | \n",
- " 2 | \n",
- " 1 | \n",
- " 1 | \n",
- " 5 | \n",
- " 0 | \n",
- " 1 | \n",
- "
\n",
- " \n",
- " | 4 | \n",
- " GP | \n",
- " F | \n",
- " 16 | \n",
- " U | \n",
- " GT3 | \n",
- " T | \n",
- " 3 | \n",
- " 3 | \n",
- " other | \n",
- " other | \n",
- " ... | \n",
- " no | \n",
- " no | \n",
- " 4 | \n",
- " 3 | \n",
- " 2 | \n",
- " 1 | \n",
- " 2 | \n",
- " 5 | \n",
- " 0 | \n",
- " 1 | \n",
- "
\n",
- " \n",
- "
\n",
- "
5 rows × 31 columns
\n",
- "
"
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "5Kj92scfZ3ue",
+ "outputId": "55729bd4-e54a-44e4-ea59-4bb479e6d675"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "649"
+ ]
+ },
+ "execution_count": 1,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
],
- "text/plain": [
- " school sex age address famsize Pstatus Medu Fedu Mjob Fjob ... \\\n",
- "0 GP F 18 U GT3 A 4 4 at_home teacher ... \n",
- "1 GP F 17 U GT3 T 1 1 at_home other ... \n",
- "2 GP F 15 U LE3 T 1 1 at_home other ... \n",
- "3 GP F 15 U GT3 T 4 2 health services ... \n",
- "4 GP F 16 U GT3 T 3 3 other other ... \n",
- "\n",
- " internet romantic famrel freetime goout Dalc Walc health absences pass \n",
- "0 no no 4 3 4 1 1 3 4 0 \n",
- "1 yes no 5 3 3 1 1 3 2 0 \n",
- "2 yes no 4 3 2 2 3 3 6 1 \n",
- "3 yes yes 3 2 2 1 1 5 0 1 \n",
- "4 no no 4 3 2 1 2 5 0 1 \n",
- "\n",
- "[5 rows x 31 columns]"
+ "source": [
+ "# load dataset (student Portuguese scores)\n",
+ "import pandas as pd\n",
+ "d = pd.read_csv('student-por.csv', sep=';')\n",
+ "len(d)"
]
- },
- "execution_count": 2,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# generate binary label (pass/fail) based on G1+G2+G3 (test grades, each 0-20 pts); threshold for passing is sum>=30\n",
- "d['pass'] = d.apply(lambda row: 1 if (row['G1']+row['G2']+row['G3']) >= 35 else 0, axis=1)\n",
- "d = d.drop(['G1', 'G2', 'G3'], axis=1)\n",
- "d.head()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [
+ },
{
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " age | \n",
- " Medu | \n",
- " Fedu | \n",
- " traveltime | \n",
- " studytime | \n",
- " failures | \n",
- " famrel | \n",
- " freetime | \n",
- " goout | \n",
- " Dalc | \n",
- " ... | \n",
- " activities_no | \n",
- " activities_yes | \n",
- " nursery_no | \n",
- " nursery_yes | \n",
- " higher_no | \n",
- " higher_yes | \n",
- " internet_no | \n",
- " internet_yes | \n",
- " romantic_no | \n",
- " romantic_yes | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " | 0 | \n",
- " 18 | \n",
- " 4 | \n",
- " 4 | \n",
- " 2 | \n",
- " 2 | \n",
- " 0 | \n",
- " 4 | \n",
- " 3 | \n",
- " 4 | \n",
- " 1 | \n",
- " ... | \n",
- " 1 | \n",
- " 0 | \n",
- " 0 | \n",
- " 1 | \n",
- " 0 | \n",
- " 1 | \n",
- " 1 | \n",
- " 0 | \n",
- " 1 | \n",
- " 0 | \n",
- "
\n",
- " \n",
- " | 1 | \n",
- " 17 | \n",
- " 1 | \n",
- " 1 | \n",
- " 1 | \n",
- " 2 | \n",
- " 0 | \n",
- " 5 | \n",
- " 3 | \n",
- " 3 | \n",
- " 1 | \n",
- " ... | \n",
- " 1 | \n",
- " 0 | \n",
- " 1 | \n",
- " 0 | \n",
- " 0 | \n",
- " 1 | \n",
- " 0 | \n",
- " 1 | \n",
- " 1 | \n",
- " 0 | \n",
- "
\n",
- " \n",
- " | 2 | \n",
- " 15 | \n",
- " 1 | \n",
- " 1 | \n",
- " 1 | \n",
- " 2 | \n",
- " 0 | \n",
- " 4 | \n",
- " 3 | \n",
- " 2 | \n",
- " 2 | \n",
- " ... | \n",
- " 1 | \n",
- " 0 | \n",
- " 0 | \n",
- " 1 | \n",
- " 0 | \n",
- " 1 | \n",
- " 0 | \n",
- " 1 | \n",
- " 1 | \n",
- " 0 | \n",
- "
\n",
- " \n",
- " | 3 | \n",
- " 15 | \n",
- " 4 | \n",
- " 2 | \n",
- " 1 | \n",
- " 3 | \n",
- " 0 | \n",
- " 3 | \n",
- " 2 | \n",
- " 2 | \n",
- " 1 | \n",
- " ... | \n",
- " 0 | \n",
- " 1 | \n",
- " 0 | \n",
- " 1 | \n",
- " 0 | \n",
- " 1 | \n",
- " 0 | \n",
- " 1 | \n",
- " 0 | \n",
- " 1 | \n",
- "
\n",
- " \n",
- " | 4 | \n",
- " 16 | \n",
- " 3 | \n",
- " 3 | \n",
- " 1 | \n",
- " 2 | \n",
- " 0 | \n",
- " 4 | \n",
- " 3 | \n",
- " 2 | \n",
- " 1 | \n",
- " ... | \n",
- " 1 | \n",
- " 0 | \n",
- " 0 | \n",
- " 1 | \n",
- " 0 | \n",
- " 1 | \n",
- " 1 | \n",
- " 0 | \n",
- " 1 | \n",
- " 0 | \n",
- "
\n",
- " \n",
- "
\n",
- "
5 rows × 57 columns
\n",
- "
"
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "XKoxSqrjZ3ug",
+ "outputId": "5044c44f-efde-47e0-c3ef-d7da36c3c9b2"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " school | \n",
+ " sex | \n",
+ " age | \n",
+ " address | \n",
+ " famsize | \n",
+ " Pstatus | \n",
+ " Medu | \n",
+ " Fedu | \n",
+ " Mjob | \n",
+ " Fjob | \n",
+ " ... | \n",
+ " internet | \n",
+ " romantic | \n",
+ " famrel | \n",
+ " freetime | \n",
+ " goout | \n",
+ " Dalc | \n",
+ " Walc | \n",
+ " health | \n",
+ " absences | \n",
+ " pass | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " GP | \n",
+ " F | \n",
+ " 18 | \n",
+ " U | \n",
+ " GT3 | \n",
+ " A | \n",
+ " 4 | \n",
+ " 4 | \n",
+ " at_home | \n",
+ " teacher | \n",
+ " ... | \n",
+ " no | \n",
+ " no | \n",
+ " 4 | \n",
+ " 3 | \n",
+ " 4 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 3 | \n",
+ " 4 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " GP | \n",
+ " F | \n",
+ " 17 | \n",
+ " U | \n",
+ " GT3 | \n",
+ " T | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " at_home | \n",
+ " other | \n",
+ " ... | \n",
+ " yes | \n",
+ " no | \n",
+ " 5 | \n",
+ " 3 | \n",
+ " 3 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 3 | \n",
+ " 2 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " GP | \n",
+ " F | \n",
+ " 15 | \n",
+ " U | \n",
+ " LE3 | \n",
+ " T | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " at_home | \n",
+ " other | \n",
+ " ... | \n",
+ " yes | \n",
+ " no | \n",
+ " 4 | \n",
+ " 3 | \n",
+ " 2 | \n",
+ " 2 | \n",
+ " 3 | \n",
+ " 3 | \n",
+ " 6 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " GP | \n",
+ " F | \n",
+ " 15 | \n",
+ " U | \n",
+ " GT3 | \n",
+ " T | \n",
+ " 4 | \n",
+ " 2 | \n",
+ " health | \n",
+ " services | \n",
+ " ... | \n",
+ " yes | \n",
+ " yes | \n",
+ " 3 | \n",
+ " 2 | \n",
+ " 2 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 5 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " GP | \n",
+ " F | \n",
+ " 16 | \n",
+ " U | \n",
+ " GT3 | \n",
+ " T | \n",
+ " 3 | \n",
+ " 3 | \n",
+ " other | \n",
+ " other | \n",
+ " ... | \n",
+ " no | \n",
+ " no | \n",
+ " 4 | \n",
+ " 3 | \n",
+ " 2 | \n",
+ " 1 | \n",
+ " 2 | \n",
+ " 5 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
5 rows × 31 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " school sex age address famsize Pstatus Medu Fedu Mjob Fjob ... \\\n",
+ "0 GP F 18 U GT3 A 4 4 at_home teacher ... \n",
+ "1 GP F 17 U GT3 T 1 1 at_home other ... \n",
+ "2 GP F 15 U LE3 T 1 1 at_home other ... \n",
+ "3 GP F 15 U GT3 T 4 2 health services ... \n",
+ "4 GP F 16 U GT3 T 3 3 other other ... \n",
+ "\n",
+ " internet romantic famrel freetime goout Dalc Walc health absences pass \n",
+ "0 no no 4 3 4 1 1 3 4 0 \n",
+ "1 yes no 5 3 3 1 1 3 2 0 \n",
+ "2 yes no 4 3 2 2 3 3 6 1 \n",
+ "3 yes yes 3 2 2 1 1 5 0 1 \n",
+ "4 no no 4 3 2 1 2 5 0 1 \n",
+ "\n",
+ "[5 rows x 31 columns]"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
],
- "text/plain": [
- " age Medu Fedu traveltime studytime failures famrel freetime goout \\\n",
- "0 18 4 4 2 2 0 4 3 4 \n",
- "1 17 1 1 1 2 0 5 3 3 \n",
- "2 15 1 1 1 2 0 4 3 2 \n",
- "3 15 4 2 1 3 0 3 2 2 \n",
- "4 16 3 3 1 2 0 4 3 2 \n",
- "\n",
- " Dalc ... activities_no activities_yes nursery_no nursery_yes \\\n",
- "0 1 ... 1 0 0 1 \n",
- "1 1 ... 1 0 1 0 \n",
- "2 2 ... 1 0 0 1 \n",
- "3 1 ... 0 1 0 1 \n",
- "4 1 ... 1 0 0 1 \n",
- "\n",
- " higher_no higher_yes internet_no internet_yes romantic_no romantic_yes \n",
- "0 0 1 1 0 1 0 \n",
- "1 0 1 0 1 1 0 \n",
- "2 0 1 0 1 1 0 \n",
- "3 0 1 0 1 0 1 \n",
- "4 0 1 1 0 1 0 \n",
- "\n",
- "[5 rows x 57 columns]"
+ "source": [
+ "# generate binary label (pass/fail) based on G1+G2+G3 (test grades, each 0-20 pts); threshold for passing is sum>=30\n",
+ "d['pass'] = d.apply(lambda row: 1 if (row['G1']+row['G2']+row['G3']) >= 35 else 0, axis=1)\n",
+ "d = d.drop(['G1', 'G2', 'G3'], axis=1)\n",
+ "d.head()"
]
- },
- "execution_count": 3,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# use one-hot encoding on categorical columns\n",
- "d = pd.get_dummies(d, columns=['sex', 'school', 'address', 'famsize', 'Pstatus', 'Mjob', 'Fjob', \n",
- " 'reason', 'guardian', 'schoolsup', 'famsup', 'paid', 'activities',\n",
- " 'nursery', 'higher', 'internet', 'romantic'])\n",
- "d.head()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [
+ },
{
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Passing: 328 out of 649 (50.54%)\n"
- ]
- }
- ],
- "source": [
- "# shuffle rows\n",
- "d = d.sample(frac=1)\n",
- "# split training and testing data\n",
- "d_train = d[:500]\n",
- "d_test = d[500:]\n",
- "\n",
- "d_train_att = d_train.drop(['pass'], axis=1)\n",
- "d_train_pass = d_train['pass']\n",
- "\n",
- "d_test_att = d_test.drop(['pass'], axis=1)\n",
- "d_test_pass = d_test['pass']\n",
- "\n",
- "d_att = d.drop(['pass'], axis=1)\n",
- "d_pass = d['pass']\n",
- "\n",
- "# number of passing students in whole dataset:\n",
- "import numpy as np\n",
- "print(\"Passing: %d out of %d (%.2f%%)\" % (np.sum(d_pass), len(d_pass), 100*float(np.sum(d_pass)) / len(d_pass)))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {},
- "outputs": [],
- "source": [
- "# fit a decision tree\n",
- "from sklearn import tree\n",
- "t = tree.DecisionTreeClassifier(criterion=\"entropy\", max_depth=5)\n",
- "t = t.fit(d_train_att, d_train_pass)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "guNu952qZ3ug",
+ "outputId": "3529a196-02f5-4ce1-f2c3-1268d745af00"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " age | \n",
+ " Medu | \n",
+ " Fedu | \n",
+ " traveltime | \n",
+ " studytime | \n",
+ " failures | \n",
+ " famrel | \n",
+ " freetime | \n",
+ " goout | \n",
+ " Dalc | \n",
+ " ... | \n",
+ " activities_no | \n",
+ " activities_yes | \n",
+ " nursery_no | \n",
+ " nursery_yes | \n",
+ " higher_no | \n",
+ " higher_yes | \n",
+ " internet_no | \n",
+ " internet_yes | \n",
+ " romantic_no | \n",
+ " romantic_yes | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 18 | \n",
+ " 4 | \n",
+ " 4 | \n",
+ " 2 | \n",
+ " 2 | \n",
+ " 0 | \n",
+ " 4 | \n",
+ " 3 | \n",
+ " 4 | \n",
+ " 1 | \n",
+ " ... | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 17 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 2 | \n",
+ " 0 | \n",
+ " 5 | \n",
+ " 3 | \n",
+ " 3 | \n",
+ " 1 | \n",
+ " ... | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 15 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 2 | \n",
+ " 0 | \n",
+ " 4 | \n",
+ " 3 | \n",
+ " 2 | \n",
+ " 2 | \n",
+ " ... | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 15 | \n",
+ " 4 | \n",
+ " 2 | \n",
+ " 1 | \n",
+ " 3 | \n",
+ " 0 | \n",
+ " 3 | \n",
+ " 2 | \n",
+ " 2 | \n",
+ " 1 | \n",
+ " ... | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 16 | \n",
+ " 3 | \n",
+ " 3 | \n",
+ " 1 | \n",
+ " 2 | \n",
+ " 0 | \n",
+ " 4 | \n",
+ " 3 | \n",
+ " 2 | \n",
+ " 1 | \n",
+ " ... | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
5 rows × 57 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " age Medu Fedu traveltime studytime failures famrel freetime goout \\\n",
+ "0 18 4 4 2 2 0 4 3 4 \n",
+ "1 17 1 1 1 2 0 5 3 3 \n",
+ "2 15 1 1 1 2 0 4 3 2 \n",
+ "3 15 4 2 1 3 0 3 2 2 \n",
+ "4 16 3 3 1 2 0 4 3 2 \n",
+ "\n",
+ " Dalc ... activities_no activities_yes nursery_no nursery_yes \\\n",
+ "0 1 ... 1 0 0 1 \n",
+ "1 1 ... 1 0 1 0 \n",
+ "2 2 ... 1 0 0 1 \n",
+ "3 1 ... 0 1 0 1 \n",
+ "4 1 ... 1 0 0 1 \n",
+ "\n",
+ " higher_no higher_yes internet_no internet_yes romantic_no romantic_yes \n",
+ "0 0 1 1 0 1 0 \n",
+ "1 0 1 0 1 1 0 \n",
+ "2 0 1 0 1 1 0 \n",
+ "3 0 1 0 1 0 1 \n",
+ "4 0 1 1 0 1 0 \n",
+ "\n",
+ "[5 rows x 57 columns]"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# use one-hot encoding on categorical columns\n",
+ "d = pd.get_dummies(d, columns=['sex', 'school', 'address', 'famsize', 'Pstatus', 'Mjob', 'Fjob',\n",
+ " 'reason', 'guardian', 'schoolsup', 'famsup', 'paid', 'activities',\n",
+ " 'nursery', 'higher', 'internet', 'romantic'])\n",
+ "d.head()"
+ ]
+ },
{
- "data": {
- "image/svg+xml": [
- "\n",
- "\n",
- "\n",
- "\n",
- "\n"
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "UCgcpoaYZ3ug",
+ "outputId": "a1f7fd11-9ecf-49ec-c720-a98853a08ef5"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Passing: 328 out of 649 (50.54%)\n"
+ ]
+ }
],
- "text/plain": [
- ""
+ "source": [
+ "# shuffle rows\n",
+ "d = d.sample(frac=1)\n",
+ "# split training and testing data\n",
+ "d_train = d[:500]\n",
+ "d_test = d[500:]\n",
+ "\n",
+ "d_train_att = d_train.drop(['pass'], axis=1)\n",
+ "d_train_pass = d_train['pass']\n",
+ "\n",
+ "d_test_att = d_test.drop(['pass'], axis=1)\n",
+ "d_test_pass = d_test['pass']\n",
+ "\n",
+ "d_att = d.drop(['pass'], axis=1)\n",
+ "d_pass = d['pass']\n",
+ "\n",
+ "# number of passing students in whole dataset:\n",
+ "import numpy as np\n",
+ "print(\"Passing: %d out of %d (%.2f%%)\" % (np.sum(d_pass), len(d_pass), 100*float(np.sum(d_pass)) / len(d_pass)))"
]
- },
- "execution_count": 6,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# visualize tree\n",
- "import graphviz\n",
- "dot_data = tree.export_graphviz(t, out_file=None, label=\"all\", impurity=False, proportion=True,\n",
- " feature_names=list(d_train_att), class_names=[\"fail\", \"pass\"], \n",
- " filled=True, rounded=True)\n",
- "graph = graphviz.Source(dot_data)\n",
- "graph"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [],
- "source": [
- "# save tree\n",
- "tree.export_graphviz(t, out_file=\"student-performance.dot\", label=\"all\", impurity=False, proportion=True,\n",
- " feature_names=list(d_train_att), class_names=[\"fail\", \"pass\"], \n",
- " filled=True, rounded=True)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {},
- "outputs": [
+ },
{
- "data": {
- "text/plain": [
- "0.59731543624161076"
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "ECY_gKznZ3uh"
+ },
+ "outputs": [],
+ "source": [
+ "# fit a decision tree\n",
+ "from sklearn import tree\n",
+ "t = tree.DecisionTreeClassifier(criterion=\"entropy\", max_depth=5)\n",
+ "t = t.fit(d_train_att, d_train_pass)"
]
- },
- "execution_count": 8,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "t.score(d_test_att, d_test_pass)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {},
- "outputs": [
+ },
{
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Accuracy: 0.67 (+/- 0.06)\n"
- ]
- }
- ],
- "source": [
- "from sklearn.model_selection import cross_val_score\n",
- "scores = cross_val_score(t, d_att, d_pass, cv=5)\n",
- "# show average score and +/- two standard deviations away (covering 95% of scores)\n",
- "print(\"Accuracy: %0.2f (+/- %0.2f)\" % (scores.mean(), scores.std() * 2))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {},
- "outputs": [
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "SFGuUJ9wZ3uh",
+ "outputId": "91c4bf30-e643-448a-9402-a51b146b5536"
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/svg+xml": [
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# visualize tree\n",
+ "import graphviz\n",
+ "dot_data = tree.export_graphviz(t, out_file=None, label=\"all\", impurity=False, proportion=True,\n",
+ " feature_names=list(d_train_att), class_names=[\"fail\", \"pass\"],\n",
+ " filled=True, rounded=True)\n",
+ "graph = graphviz.Source(dot_data)\n",
+ "graph"
+ ]
+ },
{
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Max depth: 1, Accuracy: 0.64 (+/- 0.05)\n",
- "Max depth: 2, Accuracy: 0.69 (+/- 0.08)\n",
- "Max depth: 3, Accuracy: 0.69 (+/- 0.09)\n",
- "Max depth: 4, Accuracy: 0.66 (+/- 0.10)\n",
- "Max depth: 5, Accuracy: 0.67 (+/- 0.06)\n",
- "Max depth: 6, Accuracy: 0.64 (+/- 0.08)\n",
- "Max depth: 7, Accuracy: 0.67 (+/- 0.02)\n",
- "Max depth: 8, Accuracy: 0.67 (+/- 0.07)\n",
- "Max depth: 9, Accuracy: 0.67 (+/- 0.06)\n",
- "Max depth: 10, Accuracy: 0.63 (+/- 0.12)\n",
- "Max depth: 11, Accuracy: 0.65 (+/- 0.07)\n",
- "Max depth: 12, Accuracy: 0.63 (+/- 0.07)\n",
- "Max depth: 13, Accuracy: 0.63 (+/- 0.07)\n",
- "Max depth: 14, Accuracy: 0.63 (+/- 0.08)\n",
- "Max depth: 15, Accuracy: 0.64 (+/- 0.06)\n",
- "Max depth: 16, Accuracy: 0.62 (+/- 0.05)\n",
- "Max depth: 17, Accuracy: 0.64 (+/- 0.09)\n",
- "Max depth: 18, Accuracy: 0.63 (+/- 0.08)\n",
- "Max depth: 19, Accuracy: 0.63 (+/- 0.06)\n"
- ]
- }
- ],
- "source": [
- "for max_depth in range(1, 20):\n",
- " t = tree.DecisionTreeClassifier(criterion=\"entropy\", max_depth=max_depth)\n",
- " scores = cross_val_score(t, d_att, d_pass, cv=5)\n",
- " print(\"Max depth: %d, Accuracy: %0.2f (+/- %0.2f)\" % (max_depth, scores.mean(), scores.std() * 2))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "metadata": {},
- "outputs": [
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "QfN5nwnPZ3uh"
+ },
+ "outputs": [],
+ "source": [
+ "# save tree\n",
+ "tree.export_graphviz(t, out_file=\"student-performance.dot\", label=\"all\", impurity=False, proportion=True,\n",
+ " feature_names=list(d_train_att), class_names=[\"fail\", \"pass\"],\n",
+ " filled=True, rounded=True)"
+ ]
+ },
{
- "data": {
- "text/plain": [
- "array([[ 1. , 0.63790456, 0.04848398],\n",
- " [ 2. , 0.68559869, 0.07148267],\n",
- " [ 3. , 0.68710174, 0.0865951 ],\n",
- " [ 4. , 0.6669467 , 0.10726248],\n",
- " [ 5. , 0.66261518, 0.05307124],\n",
- " [ 6. , 0.65018859, 0.07040891],\n",
- " [ 7. , 0.66564494, 0.02029519],\n",
- " [ 8. , 0.67474598, 0.05984916],\n",
- " [ 9. , 0.6640118 , 0.03746891],\n",
- " [ 10. , 0.6346137 , 0.09657669],\n",
- " [ 11. , 0.6484015 , 0.10475147],\n",
- " [ 12. , 0.64545485, 0.05529647],\n",
- " [ 13. , 0.64544256, 0.08167465],\n",
- " [ 14. , 0.6346614 , 0.07458128],\n",
- " [ 15. , 0.63463773, 0.08162646],\n",
- " [ 16. , 0.62853141, 0.05926906],\n",
- " [ 17. , 0.63622335, 0.05390067],\n",
- " [ 18. , 0.62548936, 0.06050112],\n",
- " [ 19. , 0.63004547, 0.07022296]])"
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "eHUxderrZ3uh",
+ "outputId": "11ca2919-b7a8-4f44-a86d-30efb1458d48"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.59731543624161076"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "t.score(d_test_att, d_test_pass)"
]
- },
- "execution_count": 11,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "depth_acc = np.empty((19,3), float)\n",
- "i = 0\n",
- "for max_depth in range(1, 20):\n",
- " t = tree.DecisionTreeClassifier(criterion=\"entropy\", max_depth=max_depth)\n",
- " scores = cross_val_score(t, d_att, d_pass, cv=5)\n",
- " depth_acc[i,0] = max_depth\n",
- " depth_acc[i,1] = scores.mean()\n",
- " depth_acc[i,2] = scores.std() * 2\n",
- " i += 1\n",
- " \n",
- "depth_acc"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 12,
- "metadata": {},
- "outputs": [
+ },
{
- "data": {
- "image/png": "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\nl7sPk9Y0jooK1+j208iZ1Rj6zrkyM7sdmAdEAzOccxvM7CFgpXNutn/eWDPLBsqBe51z+81sGPCM\nmVXg23/we+dcnZ/0ZOaSbaQkxvLdfu3r+qWkBq/fOjTcJdTKQxN6s2zrfu5+fQ3/d8eIsz6P0LZ9\nR/nZm2tZtb2I8b3b8t/f60OrpvGnQz9QTHQUGa2SyGiVBJUu8nWirJydB46x1f9hsHX/Ueas/Qrn\n+Mb5kxzf7Bmt7riz4yfLyd17lCunLeK+cT24OCtVG0geEVSfvnNuLjC30rQHAu474B7/LbDNYqDv\nuZcZvBMny5mffYBbR9bfOeSl8UhOjOORq/oxZcZyHvsgh19fUbtz71dUOF5Ztp3fzf2S2GjjyWv6\nM6F/+7MO1PiYaLq1bvq1i/5s2ePb2XwuH6hX/+9i9h0ppbjkJDfMWM6wrq34xfgejeL4CzmzRjd4\nvfCw71wq112YHuZKpKEa2T2NH1yUznOLtrI0b3/Qy31VfIwbZizngfc2MDizJfPuvoSJAzpE5Ba0\nmZHWLJ4PfzaSB7/bi5zdh5kw7TN+/MqqOh/BJOHVqEK/osKx9/AJxvRqQ8eUyDufuzQcv7q8J+n+\nc+8fOVF2xrbOOd5elc+4JxeyekcRv53Yh5k3DaZdi8i/Jm98TDQ3Dc/k0/su467RWSzctJexTyzk\n/rfXsftg6K+9IOHXqEJ//9FSyiocUzRMU85RYlwMj1/dj6+Kj/HbM5x7f9+RE9z68ip+9uZaerRt\nxvt3XswPLsqIyK37M2kaH8Ndo7vz6X2XccPQDN5enc/IRz/md+9vpLikNNzlSQg1rNMjnoFzjt2H\njtMkNlqXwpOQGJjRkltHduUvn2xhTK8235j/j/W7+NW76zlyvIxfXd6DW0Z0afBXZTt1TeGbh2fy\nxIJNTF+Yx1+X7eC2S7ty07BMmsRpP1lD12i29LfvL+FYaTltmsc3uK0siVx3jc6iR9tm/OLtLzhZ\nXgH4Lspz9+truO2V1bRPTmDOT0cw9ZKuDT7wA3VqmcjjV/fn/TsvZkhmSx75Rw4jH/2YV5dtP70e\npGFqNKHfOTWJ/p2SSW0aH+5SpBGJj4nmiWv6c/BYKVv3HaW4pJRxTy5k9tqvuHNUFu/+ZDjdG9AF\nZGqrR9vmPDdlMG/eNpT0lon8+t31jH1iIfuPnGjw1yEoLinlpSXbWF9wkNU7ipixaCsnysprXK6h\n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\n",
- "text/plain": [
- ""
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "vEIV4K2rZ3uh",
+ "outputId": "97a78398-3821-4396-a4e0-ff6627924761"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Accuracy: 0.67 (+/- 0.06)\n"
+ ]
+ }
+ ],
+ "source": [
+ "from sklearn.model_selection import cross_val_score\n",
+ "scores = cross_val_score(t, d_att, d_pass, cv=5)\n",
+ "# show average score and +/- two standard deviations away (covering 95% of scores)\n",
+ "print(\"Accuracy: %0.2f (+/- %0.2f)\" % (scores.mean(), scores.std() * 2))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "3giUkyr1Z3ui",
+ "outputId": "d8464658-e15f-43a4-bb0d-0fe8ec270357"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Max depth: 1, Accuracy: 0.64 (+/- 0.05)\n",
+ "Max depth: 2, Accuracy: 0.69 (+/- 0.08)\n",
+ "Max depth: 3, Accuracy: 0.69 (+/- 0.09)\n",
+ "Max depth: 4, Accuracy: 0.66 (+/- 0.10)\n",
+ "Max depth: 5, Accuracy: 0.67 (+/- 0.06)\n",
+ "Max depth: 6, Accuracy: 0.64 (+/- 0.08)\n",
+ "Max depth: 7, Accuracy: 0.67 (+/- 0.02)\n",
+ "Max depth: 8, Accuracy: 0.67 (+/- 0.07)\n",
+ "Max depth: 9, Accuracy: 0.67 (+/- 0.06)\n",
+ "Max depth: 10, Accuracy: 0.63 (+/- 0.12)\n",
+ "Max depth: 11, Accuracy: 0.65 (+/- 0.07)\n",
+ "Max depth: 12, Accuracy: 0.63 (+/- 0.07)\n",
+ "Max depth: 13, Accuracy: 0.63 (+/- 0.07)\n",
+ "Max depth: 14, Accuracy: 0.63 (+/- 0.08)\n",
+ "Max depth: 15, Accuracy: 0.64 (+/- 0.06)\n",
+ "Max depth: 16, Accuracy: 0.62 (+/- 0.05)\n",
+ "Max depth: 17, Accuracy: 0.64 (+/- 0.09)\n",
+ "Max depth: 18, Accuracy: 0.63 (+/- 0.08)\n",
+ "Max depth: 19, Accuracy: 0.63 (+/- 0.06)\n"
+ ]
+ }
+ ],
+ "source": [
+ "for max_depth in range(1, 20):\n",
+ " t = tree.DecisionTreeClassifier(criterion=\"entropy\", max_depth=max_depth)\n",
+ " scores = cross_val_score(t, d_att, d_pass, cv=5)\n",
+ " print(\"Max depth: %d, Accuracy: %0.2f (+/- %0.2f)\" % (max_depth, scores.mean(), scores.std() * 2))"
]
- },
- "metadata": {},
- "output_type": "display_data"
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "lgB4tmHEZ3ui",
+ "outputId": "1ae3eccb-31db-4f2c-da35-5ba100a71a71"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[ 1. , 0.63790456, 0.04848398],\n",
+ " [ 2. , 0.68559869, 0.07148267],\n",
+ " [ 3. , 0.68710174, 0.0865951 ],\n",
+ " [ 4. , 0.6669467 , 0.10726248],\n",
+ " [ 5. , 0.66261518, 0.05307124],\n",
+ " [ 6. , 0.65018859, 0.07040891],\n",
+ " [ 7. , 0.66564494, 0.02029519],\n",
+ " [ 8. , 0.67474598, 0.05984916],\n",
+ " [ 9. , 0.6640118 , 0.03746891],\n",
+ " [ 10. , 0.6346137 , 0.09657669],\n",
+ " [ 11. , 0.6484015 , 0.10475147],\n",
+ " [ 12. , 0.64545485, 0.05529647],\n",
+ " [ 13. , 0.64544256, 0.08167465],\n",
+ " [ 14. , 0.6346614 , 0.07458128],\n",
+ " [ 15. , 0.63463773, 0.08162646],\n",
+ " [ 16. , 0.62853141, 0.05926906],\n",
+ " [ 17. , 0.63622335, 0.05390067],\n",
+ " [ 18. , 0.62548936, 0.06050112],\n",
+ " [ 19. , 0.63004547, 0.07022296]])"
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "depth_acc = np.empty((19,3), float)\n",
+ "i = 0\n",
+ "for max_depth in range(1, 20):\n",
+ " t = tree.DecisionTreeClassifier(criterion=\"entropy\", max_depth=max_depth)\n",
+ " scores = cross_val_score(t, d_att, d_pass, cv=5)\n",
+ " depth_acc[i,0] = max_depth\n",
+ " depth_acc[i,1] = scores.mean()\n",
+ " depth_acc[i,2] = scores.std() * 2\n",
+ " i += 1\n",
+ "\n",
+ "depth_acc"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "uDSxKc7NZ3ui",
+ "outputId": "13ff8a4f-6177-4570-8542-59356b124e1e"
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\nl7sPk9Y0jooK1+j208iZ1Rj6zrkyM7sdmAdEAzOccxvM7CFgpXNutn/eWDPLBsqBe51z+81sGPCM\nmVXg23/we+dcnZ/0ZOaSbaQkxvLdfu3r+qWkBq/fOjTcJdTKQxN6s2zrfu5+fQ3/d8eIsz6P0LZ9\nR/nZm2tZtb2I8b3b8t/f60OrpvGnQz9QTHQUGa2SyGiVBJUu8nWirJydB46x1f9hsHX/Ueas/Qrn\n+Mb5kxzf7Bmt7riz4yfLyd17lCunLeK+cT24OCtVG0geEVSfvnNuLjC30rQHAu474B7/LbDNYqDv\nuZcZvBMny5mffYBbR9bfOeSl8UhOjOORq/oxZcZyHvsgh19fUbtz71dUOF5Ztp3fzf2S2GjjyWv6\nM6F/+7MO1PiYaLq1bvq1i/5s2ePb2XwuH6hX/+9i9h0ppbjkJDfMWM6wrq34xfgejeL4CzmzRjd4\nvfCw71wq112YHuZKpKEa2T2NH1yUznOLtrI0b3/Qy31VfIwbZizngfc2MDizJfPuvoSJAzpE5Ba0\nmZHWLJ4PfzaSB7/bi5zdh5kw7TN+/MqqOh/BJOHVqEK/osKx9/AJxvRqQ8eUyDufuzQcv7q8J+n+\nc+8fOVF2xrbOOd5elc+4JxeyekcRv53Yh5k3DaZdi8i/Jm98TDQ3Dc/k0/su467RWSzctJexTyzk\n/rfXsftg6K+9IOHXqEJ//9FSyiocUzRMU85RYlwMj1/dj6+Kj/HbM5x7f9+RE9z68ip+9uZaerRt\nxvt3XswPLsqIyK37M2kaH8Ndo7vz6X2XccPQDN5enc/IRz/md+9vpLikNNzlSQg1rNMjnoFzjt2H\njtMkNlqXwpOQGJjRkltHduUvn2xhTK8235j/j/W7+NW76zlyvIxfXd6DW0Z0afBXZTt1TeGbh2fy\nxIJNTF+Yx1+X7eC2S7ty07BMmsRpP1lD12i29LfvL+FYaTltmsc3uK0siVx3jc6iR9tm/OLtLzhZ\nXgH4Lspz9+truO2V1bRPTmDOT0cw9ZKuDT7wA3VqmcjjV/fn/TsvZkhmSx75Rw4jH/2YV5dtP70e\npGFqNKHfOTWJ/p2SSW0aH+5SpBGJj4nmiWv6c/BYKVv3HaW4pJRxTy5k9tqvuHNUFu/+ZDjdG9AF\nZGqrR9vmPDdlMG/eNpT0lon8+t31jH1iIfuPnGjw1yEoLinlpSXbWF9wkNU7ipixaCsnysprXK6h\n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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "fig, ax = plt.subplots()\n",
+ "ax.errorbar(depth_acc[:,0], depth_acc[:,1], yerr=depth_acc[:,2])\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "SzXpO23KZ3ui"
+ },
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "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.6.2"
+ },
+ "colab": {
+ "provenance": [],
+ "include_colab_link": true
}
- ],
- "source": [
- "import matplotlib.pyplot as plt\n",
- "fig, ax = plt.subplots()\n",
- "ax.errorbar(depth_acc[:,0], depth_acc[:,1], yerr=depth_acc[:,2])\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "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.6.2"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
\ No newline at end of file
diff --git a/Copy_of_Student_performance.ipynb b/Copy_of_Student_performance.ipynb
new file mode 100644
index 0000000..f9267dc
--- /dev/null
+++ b/Copy_of_Student_performance.ipynb
@@ -0,0 +1,1565 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "view-in-github",
+ "colab_type": "text"
+ },
+ "source": [
+ "
"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "# prompt: clone https://github.com/ArogeG/Python-Artificial-Intelligence-Projects-for-Beginners.git\n",
+ "\n",
+ "!git clone https://github.com/ArogeG/Python-Artificial-Intelligence-Projects-for-Beginners.git\n"
+ ],
+ "metadata": {
+ "id": "h127TImh6sqH",
+ "outputId": "50fbdc99-d11a-4230-f2e9-2dce0d485bd7",
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ }
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Cloning into 'Python-Artificial-Intelligence-Projects-for-Beginners'...\n",
+ "remote: Enumerating objects: 78, done.\u001b[K\n",
+ "remote: Counting objects: 100% (14/14), done.\u001b[K\n",
+ "remote: Compressing objects: 100% (10/10), done.\u001b[K\n",
+ "remote: Total 78 (delta 7), reused 10 (delta 4), pack-reused 64 (from 1)\u001b[K\n",
+ "Receiving objects: 100% (78/78), 3.84 MiB | 5.16 MiB/s, done.\n",
+ "Resolving deltas: 100% (19/19), done.\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "import os\n",
+ "os.chdir('/content/Python-Artificial-Intelligence-Projects-for-Beginners/Chapter01/dataset')\n"
+ ],
+ "metadata": {
+ "id": "NdZJIVC07IdS"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "jsyNjZuw5drC",
+ "outputId": "79adf0bc-0b59-4493-fc45-be42e2fc0c6e",
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ }
+ },
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "649"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 3
+ }
+ ],
+ "source": [
+ "# load dataset (student Portuguese scores)\n",
+ "import pandas as pd\n",
+ "d = pd.read_csv('student-por.csv', sep=';')\n",
+ "len(d)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "# prompt: view top ten rows\n",
+ "\n",
+ "d.head(10)\n"
+ ],
+ "metadata": {
+ "id": "u7pG1_tj7cKn",
+ "outputId": "cbc05dd8-a3db-4084-eb5d-7c5d0408f60d",
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 412
+ }
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ " school sex age address famsize Pstatus Medu Fedu Mjob Fjob \\\n",
+ "0 GP F 18 U GT3 A 4 4 at_home teacher \n",
+ "1 GP F 17 U GT3 T 1 1 at_home other \n",
+ "2 GP F 15 U LE3 T 1 1 at_home other \n",
+ "3 GP F 15 U GT3 T 4 2 health services \n",
+ "4 GP F 16 U GT3 T 3 3 other other \n",
+ "5 GP M 16 U LE3 T 4 3 services other \n",
+ "6 GP M 16 U LE3 T 2 2 other other \n",
+ "7 GP F 17 U GT3 A 4 4 other teacher \n",
+ "8 GP M 15 U LE3 A 3 2 services other \n",
+ "9 GP M 15 U GT3 T 3 4 other other \n",
+ "\n",
+ " ... famrel freetime goout Dalc Walc health absences G1 G2 G3 \n",
+ "0 ... 4 3 4 1 1 3 4 0 11 11 \n",
+ "1 ... 5 3 3 1 1 3 2 9 11 11 \n",
+ "2 ... 4 3 2 2 3 3 6 12 13 12 \n",
+ "3 ... 3 2 2 1 1 5 0 14 14 14 \n",
+ "4 ... 4 3 2 1 2 5 0 11 13 13 \n",
+ "5 ... 5 4 2 1 2 5 6 12 12 13 \n",
+ "6 ... 4 4 4 1 1 3 0 13 12 13 \n",
+ "7 ... 4 1 4 1 1 1 2 10 13 13 \n",
+ "8 ... 4 2 2 1 1 1 0 15 16 17 \n",
+ "9 ... 5 5 1 1 1 5 0 12 12 13 \n",
+ "\n",
+ "[10 rows x 33 columns]"
+ ],
+ "text/html": [
+ "\n",
+ " \n",
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " school | \n",
+ " sex | \n",
+ " age | \n",
+ " address | \n",
+ " famsize | \n",
+ " Pstatus | \n",
+ " Medu | \n",
+ " Fedu | \n",
+ " Mjob | \n",
+ " Fjob | \n",
+ " ... | \n",
+ " famrel | \n",
+ " freetime | \n",
+ " goout | \n",
+ " Dalc | \n",
+ " Walc | \n",
+ " health | \n",
+ " absences | \n",
+ " G1 | \n",
+ " G2 | \n",
+ " G3 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " GP | \n",
+ " F | \n",
+ " 18 | \n",
+ " U | \n",
+ " GT3 | \n",
+ " A | \n",
+ " 4 | \n",
+ " 4 | \n",
+ " at_home | \n",
+ " teacher | \n",
+ " ... | \n",
+ " 4 | \n",
+ " 3 | \n",
+ " 4 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 3 | \n",
+ " 4 | \n",
+ " 0 | \n",
+ " 11 | \n",
+ " 11 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " GP | \n",
+ " F | \n",
+ " 17 | \n",
+ " U | \n",
+ " GT3 | \n",
+ " T | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " at_home | \n",
+ " other | \n",
+ " ... | \n",
+ " 5 | \n",
+ " 3 | \n",
+ " 3 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 3 | \n",
+ " 2 | \n",
+ " 9 | \n",
+ " 11 | \n",
+ " 11 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " GP | \n",
+ " F | \n",
+ " 15 | \n",
+ " U | \n",
+ " LE3 | \n",
+ " T | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " at_home | \n",
+ " other | \n",
+ " ... | \n",
+ " 4 | \n",
+ " 3 | \n",
+ " 2 | \n",
+ " 2 | \n",
+ " 3 | \n",
+ " 3 | \n",
+ " 6 | \n",
+ " 12 | \n",
+ " 13 | \n",
+ " 12 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " GP | \n",
+ " F | \n",
+ " 15 | \n",
+ " U | \n",
+ " GT3 | \n",
+ " T | \n",
+ " 4 | \n",
+ " 2 | \n",
+ " health | \n",
+ " services | \n",
+ " ... | \n",
+ " 3 | \n",
+ " 2 | \n",
+ " 2 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 5 | \n",
+ " 0 | \n",
+ " 14 | \n",
+ " 14 | \n",
+ " 14 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " GP | \n",
+ " F | \n",
+ " 16 | \n",
+ " U | \n",
+ " GT3 | \n",
+ " T | \n",
+ " 3 | \n",
+ " 3 | \n",
+ " other | \n",
+ " other | \n",
+ " ... | \n",
+ " 4 | \n",
+ " 3 | \n",
+ " 2 | \n",
+ " 1 | \n",
+ " 2 | \n",
+ " 5 | \n",
+ " 0 | \n",
+ " 11 | \n",
+ " 13 | \n",
+ " 13 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " GP | \n",
+ " M | \n",
+ " 16 | \n",
+ " U | \n",
+ " LE3 | \n",
+ " T | \n",
+ " 4 | \n",
+ " 3 | \n",
+ " services | \n",
+ " other | \n",
+ " ... | \n",
+ " 5 | \n",
+ " 4 | \n",
+ " 2 | \n",
+ " 1 | \n",
+ " 2 | \n",
+ " 5 | \n",
+ " 6 | \n",
+ " 12 | \n",
+ " 12 | \n",
+ " 13 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " GP | \n",
+ " M | \n",
+ " 16 | \n",
+ " U | \n",
+ " LE3 | \n",
+ " T | \n",
+ " 2 | \n",
+ " 2 | \n",
+ " other | \n",
+ " other | \n",
+ " ... | \n",
+ " 4 | \n",
+ " 4 | \n",
+ " 4 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 3 | \n",
+ " 0 | \n",
+ " 13 | \n",
+ " 12 | \n",
+ " 13 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " GP | \n",
+ " F | \n",
+ " 17 | \n",
+ " U | \n",
+ " GT3 | \n",
+ " A | \n",
+ " 4 | \n",
+ " 4 | \n",
+ " other | \n",
+ " teacher | \n",
+ " ... | \n",
+ " 4 | \n",
+ " 1 | \n",
+ " 4 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 2 | \n",
+ " 10 | \n",
+ " 13 | \n",
+ " 13 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " GP | \n",
+ " M | \n",
+ " 15 | \n",
+ " U | \n",
+ " LE3 | \n",
+ " A | \n",
+ " 3 | \n",
+ " 2 | \n",
+ " services | \n",
+ " other | \n",
+ " ... | \n",
+ " 4 | \n",
+ " 2 | \n",
+ " 2 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 15 | \n",
+ " 16 | \n",
+ " 17 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " GP | \n",
+ " M | \n",
+ " 15 | \n",
+ " U | \n",
+ " GT3 | \n",
+ " T | \n",
+ " 3 | \n",
+ " 4 | \n",
+ " other | \n",
+ " other | \n",
+ " ... | \n",
+ " 5 | \n",
+ " 5 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 5 | \n",
+ " 0 | \n",
+ " 12 | \n",
+ " 12 | \n",
+ " 13 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
10 rows × 33 columns
\n",
+ "
\n",
+ "
\n",
+ "
\n"
+ ],
+ "application/vnd.google.colaboratory.intrinsic+json": {
+ "type": "dataframe",
+ "variable_name": "d"
+ }
+ },
+ "metadata": {},
+ "execution_count": 4
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "vqVmLh8T5drD",
+ "outputId": "92051410-888b-4b74-e21f-aec27c074ffe",
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 256
+ }
+ },
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ " age Medu Fedu traveltime studytime failures famrel freetime \\\n",
+ "283 16 3 3 3 2 1 5 3 \n",
+ "426 15 3 3 2 1 0 5 4 \n",
+ "77 16 2 2 1 4 0 5 2 \n",
+ "34 16 3 2 1 1 0 5 4 \n",
+ "207 16 3 3 1 1 0 4 3 \n",
+ "\n",
+ " goout Dalc ... activities_yes nursery_no nursery_yes higher_no \\\n",
+ "283 3 1 ... False True False False \n",
+ "426 4 2 ... False False True False \n",
+ "77 3 1 ... False False True False \n",
+ "34 3 1 ... False True False False \n",
+ "207 2 3 ... True False True False \n",
+ "\n",
+ " higher_yes internet_no internet_yes romantic_no romantic_yes pass \n",
+ "283 True False True True False 0 \n",
+ "426 True False True True False 0 \n",
+ "77 True False True False True 1 \n",
+ "34 True False True True False 1 \n",
+ "207 True False True True False 0 \n",
+ "\n",
+ "[5 rows x 57 columns]"
+ ],
+ "text/html": [
+ "\n",
+ " \n",
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " age | \n",
+ " Medu | \n",
+ " Fedu | \n",
+ " traveltime | \n",
+ " studytime | \n",
+ " failures | \n",
+ " famrel | \n",
+ " freetime | \n",
+ " goout | \n",
+ " Dalc | \n",
+ " ... | \n",
+ " activities_yes | \n",
+ " nursery_no | \n",
+ " nursery_yes | \n",
+ " higher_no | \n",
+ " higher_yes | \n",
+ " internet_no | \n",
+ " internet_yes | \n",
+ " romantic_no | \n",
+ " romantic_yes | \n",
+ " pass | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 283 | \n",
+ " 16 | \n",
+ " 3 | \n",
+ " 3 | \n",
+ " 3 | \n",
+ " 2 | \n",
+ " 1 | \n",
+ " 5 | \n",
+ " 3 | \n",
+ " 3 | \n",
+ " 1 | \n",
+ " ... | \n",
+ " False | \n",
+ " True | \n",
+ " False | \n",
+ " False | \n",
+ " True | \n",
+ " False | \n",
+ " True | \n",
+ " True | \n",
+ " False | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 426 | \n",
+ " 15 | \n",
+ " 3 | \n",
+ " 3 | \n",
+ " 2 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 5 | \n",
+ " 4 | \n",
+ " 4 | \n",
+ " 2 | \n",
+ " ... | \n",
+ " False | \n",
+ " False | \n",
+ " True | \n",
+ " False | \n",
+ " True | \n",
+ " False | \n",
+ " True | \n",
+ " True | \n",
+ " False | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 77 | \n",
+ " 16 | \n",
+ " 2 | \n",
+ " 2 | \n",
+ " 1 | \n",
+ " 4 | \n",
+ " 0 | \n",
+ " 5 | \n",
+ " 2 | \n",
+ " 3 | \n",
+ " 1 | \n",
+ " ... | \n",
+ " False | \n",
+ " False | \n",
+ " True | \n",
+ " False | \n",
+ " True | \n",
+ " False | \n",
+ " True | \n",
+ " False | \n",
+ " True | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 34 | \n",
+ " 16 | \n",
+ " 3 | \n",
+ " 2 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 5 | \n",
+ " 4 | \n",
+ " 3 | \n",
+ " 1 | \n",
+ " ... | \n",
+ " False | \n",
+ " True | \n",
+ " False | \n",
+ " False | \n",
+ " True | \n",
+ " False | \n",
+ " True | \n",
+ " True | \n",
+ " False | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 207 | \n",
+ " 16 | \n",
+ " 3 | \n",
+ " 3 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " 4 | \n",
+ " 3 | \n",
+ " 2 | \n",
+ " 3 | \n",
+ " ... | \n",
+ " True | \n",
+ " False | \n",
+ " True | \n",
+ " False | \n",
+ " True | \n",
+ " False | \n",
+ " True | \n",
+ " True | \n",
+ " False | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
5 rows × 57 columns
\n",
+ "
\n",
+ "
\n",
+ "
\n"
+ ],
+ "application/vnd.google.colaboratory.intrinsic+json": {
+ "type": "dataframe",
+ "variable_name": "d"
+ }
+ },
+ "metadata": {},
+ "execution_count": 7
+ }
+ ],
+ "source": [
+ "# generate binary label (pass/fail) based on G1+G2+G3 (test grades, each 0-20 pts); threshold for passing is sum>=30\n",
+ "d['pass'] = d.apply(lambda row: 1 if (row['G1']+row['G2']+row['G3']) >= 35 else 0, axis=1)\n",
+ "d = d.drop(['G1', 'G2', 'G3'], axis=1)\n",
+ "d.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true,
+ "id": "WE7DjUrq5drD",
+ "outputId": "e46a5da7-64e4-4258-c961-0cd581de9941",
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ }
+ },
+ "outputs": [
+ {
+ "output_type": "error",
+ "ename": "KeyError",
+ "evalue": "\"None of [Index(['sex', 'school', 'address', 'famsize', 'Pstatus', 'Mjob', 'Fjob',\\n 'reason', 'guardian', 'schoolsup', 'famsup', 'paid', 'activities',\\n 'nursery', 'higher', 'internet', 'romantic'],\\n dtype='object')] are in the [columns]\"",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)",
+ "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# use one-hot encoding on categorical columns\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m d = pd.get_dummies(d, columns=['sex', 'school', 'address', 'famsize', 'Pstatus', 'Mjob', 'Fjob', \n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0;34m'reason'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'guardian'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'schoolsup'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'famsup'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'paid'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'activities'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m 'nursery', 'higher', 'internet', 'romantic'])\n\u001b[1;32m 5\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhead\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/pandas/core/reshape/encoding.py\u001b[0m in \u001b[0;36mget_dummies\u001b[0;34m(data, prefix, prefix_sep, dummy_na, columns, sparse, drop_first, dtype)\u001b[0m\n\u001b[1;32m 162\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Input must be a list-like for parameter `columns`\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 163\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 164\u001b[0;31m \u001b[0mdata_to_encode\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 165\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 166\u001b[0m \u001b[0;31m# validate prefixes and separator to avoid silently dropping cols\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/pandas/core/frame.py\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 3897\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mis_iterator\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3898\u001b[0m \u001b[0mkey\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3899\u001b[0;31m \u001b[0mindexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_indexer_strict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"columns\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3900\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3901\u001b[0m \u001b[0;31m# take() does not accept boolean indexers\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36m_get_indexer_strict\u001b[0;34m(self, key, axis_name)\u001b[0m\n\u001b[1;32m 6113\u001b[0m \u001b[0mkeyarr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindexer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnew_indexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_reindex_non_unique\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkeyarr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6114\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 6115\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_raise_if_missing\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkeyarr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindexer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis_name\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6116\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6117\u001b[0m \u001b[0mkeyarr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtake\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindexer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36m_raise_if_missing\u001b[0;34m(self, key, indexer, axis_name)\u001b[0m\n\u001b[1;32m 6174\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0muse_interval_msg\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6175\u001b[0m \u001b[0mkey\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 6176\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"None of [{key}] are in the [{axis_name}]\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6177\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6178\u001b[0m \u001b[0mnot_found\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mensure_index\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mmissing_mask\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnonzero\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0munique\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;31mKeyError\u001b[0m: \"None of [Index(['sex', 'school', 'address', 'famsize', 'Pstatus', 'Mjob', 'Fjob',\\n 'reason', 'guardian', 'schoolsup', 'famsup', 'paid', 'activities',\\n 'nursery', 'higher', 'internet', 'romantic'],\\n dtype='object')] are in the [columns]\""
+ ]
+ }
+ ],
+ "source": [
+ "# use one-hot encoding on categorical columns\n",
+ "d = pd.get_dummies(d, columns=['sex', 'school', 'address', 'famsize', 'Pstatus', 'Mjob', 'Fjob',\n",
+ " 'reason', 'guardian', 'schoolsup', 'famsup', 'paid', 'activities',\n",
+ " 'nursery', 'higher', 'internet', 'romantic'])\n",
+ "d.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "ilHI4_sS5drE",
+ "outputId": "79d5365d-65b6-4284-9d46-ff8b638ca4e9",
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ }
+ },
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Passing: 328 out of 649 (50.54%)\n"
+ ]
+ }
+ ],
+ "source": [
+ "# shuffle rows\n",
+ "d = d.sample(frac=1)\n",
+ "# split training and testing data\n",
+ "d_train = d[:500]\n",
+ "d_test = d[500:]\n",
+ "\n",
+ "d_train_att = d_train.drop(['pass'], axis=1)\n",
+ "d_train_pass = d_train['pass']\n",
+ "\n",
+ "d_test_att = d_test.drop(['pass'], axis=1)\n",
+ "d_test_pass = d_test['pass']\n",
+ "\n",
+ "d_att = d.drop(['pass'], axis=1)\n",
+ "d_pass = d['pass']\n",
+ "\n",
+ "# number of passing students in whole dataset:\n",
+ "import numpy as np\n",
+ "print(\"Passing: %d out of %d (%.2f%%)\" % (np.sum(d_pass), len(d_pass), 100*float(np.sum(d_pass)) / len(d_pass)))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "yq-gcN4E5drE"
+ },
+ "outputs": [],
+ "source": [
+ "# fit a decision tree\n",
+ "from sklearn import tree\n",
+ "t = tree.DecisionTreeClassifier(criterion=\"entropy\", max_depth=5)\n",
+ "t = t.fit(d_train_att, d_train_pass)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "_0hXcS945drE",
+ "outputId": "d523cbe0-d692-4e8c-8c97-5d49097c5959",
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 817
+ }
+ },
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "image/svg+xml": "\n\n\n\n\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "execution_count": 11
+ }
+ ],
+ "source": [
+ "# visualize tree\n",
+ "import graphviz\n",
+ "dot_data = tree.export_graphviz(t, out_file=None, label=\"all\", impurity=False, proportion=True,\n",
+ " feature_names=list(d_train_att), class_names=[\"fail\", \"pass\"],\n",
+ " filled=True, rounded=True)\n",
+ "graph = graphviz.Source(dot_data)\n",
+ "graph"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "lHCyPiXf5drE"
+ },
+ "outputs": [],
+ "source": [
+ "# save tree\n",
+ "tree.export_graphviz(t, out_file=\"student-performance.dot\", label=\"all\", impurity=False, proportion=True,\n",
+ " feature_names=list(d_train_att), class_names=[\"fail\", \"pass\"],\n",
+ " filled=True, rounded=True)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "RzKU7iKV5drE",
+ "outputId": "b992b355-1dde-4c93-e38a-4ad0d11013ff"
+ },
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "0.7315436241610739"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 13
+ }
+ ],
+ "source": [
+ "t.score(d_test_att, d_test_pass)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "g-WJCveK5drE",
+ "outputId": "f3d4d6f4-1e14-4834-8dcb-0d332f129b25"
+ },
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Accuracy: 0.69 (+/- 0.06)\n"
+ ]
+ }
+ ],
+ "source": [
+ "from sklearn.model_selection import cross_val_score\n",
+ "scores = cross_val_score(t, d_att, d_pass, cv=5)\n",
+ "# show average score and +/- two standard deviations away (covering 95% of scores)\n",
+ "print(\"Accuracy: %0.2f (+/- %0.2f)\" % (scores.mean(), scores.std() * 2))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "BMvyOvRR5drE",
+ "outputId": "30db1fba-534d-4697-b515-0ee918cc68a6",
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 430
+ }
+ },
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ ""
+ ],
+ "image/png": "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q6UBAAAP5XIPy+zZszVp0iRNnDhRffv21bx58xQQEKCFCxeedxuLxaLIyEjnIyIi4px1rFZrjXXat2/vamkAAMBDuRRYbDabNm3apKSkpDM78PJSUlKS1q9ff97tSkpK1KVLF8XGxmrs2LHatWvXOeusXLlS4eHh6tWrlyZPnqy8vLzz7q+iokJFRUU1HgAAwHO5FFhyc3Nlt9vP6SGJiIhQZmZmrdv06tVLCxcu1Geffab33ntPDodDw4cP19GjR53rjB49Wu+++66Sk5P14osvatWqVRozZozsdnut+5w1a5aCg4Odj9jYWFeaAQAAWhiXpuY/fvy4YmJitG7dOg0bNsy5/PHHH9eqVau0cePGevdRWVmpPn366M4779Rzzz1X6zoZGRnq1q2bvvnmG1133XXnvF5RUaGKigrn86KiIsXGxjI1PwAALUiTTc0fGhoqb29vZWVl1VielZWlyMjIC9qHr6+vBg0apPT09POuEx8fr9DQ0POuY7VaFRQUVOMBAAA8l0uBxc/PT0OGDFFycrJzmcPhUHJyco0el7rY7Xbt2LFDUVFR513n6NGjysvLq3MdAADQerh8ldC0adM0f/58LVq0SHv27NHkyZNVWlqqiRMnSpImTJig6dOnO9d/9tln9fXXXysjI0ObN2/W3XffrUOHDun++++XVD0g97HHHtOGDRt08OBBJScna+zYserevbtGjRrVSM0EAAAtmcvzsIwfP145OTmaMWOGMjMzNXDgQC1btsw5EPfw4cPy8jqTg3766SdNmjRJmZmZat++vYYMGaJ169apb9++kiRvb29t375dixYtUkFBgaKjo3XDDTfoueeeYy4WAAAgycVBt2ZVWFiokJAQHTlyhPEsAAC0EKcvmikoKFBwcHCd67rcw2JGxcXFksTlzQAAtEDFxcX1BhaP6GFxOBw6fvy4AgMDa5323xOdTqWtrVeptbZbar1tb63tlmh7a2x7a2u3YRgqLi5WdHR0jeEktfGIHhYvLy916tTJ3WW4RWu9rLu1tltqvW1vre2WaHtrbHtrand9PSunNehuzQAAAM2JwAIAAEyPwNJCWa1WzZw5s9Vd+t1a2y213ra31nZLtL01tr21tvtCeMSgWwAA4NnoYQEAAKZHYAEAAKZHYAEAAKZHYAEAAKZHYDGhWbNm6bLLLlNgYKDCw8M1btw4paam1rnNO++8I4vFUuPh7+/fTBU3jqeffvqcNvTu3bvObT766CP17t1b/v7+6t+/v7766qtmqrZxxcXFndN2i8WiKVOm1Lp+Sz7e33//vW6++WZFR0fLYrFoyZIlNV43DEMzZsxQVFSU2rRpo6SkJKWlpdW73zlz5iguLk7+/v5KTExUSkpKE7WgYepqd2VlpZ544gn1799fbdu2VXR0tCZMmKDjx4/Xuc+GvGfcob5jfu+9957TjtGjR9e7X7Mfc6n+ttf2vrdYLHr55ZfPu8+WctwbG4HFhFatWqUpU6Zow4YNWrFihSorK3XDDTeotLS0zu2CgoJ04sQJ5+PQoUPNVHHjueSSS2q0Yc2aNeddd926dbrzzjt13333acuWLRo3bpzGjRunnTt3NmPFjeOHH36o0e4VK1ZIkm677bbzbtNSj3dpaakSEhI0Z86cWl9/6aWX9Nprr2nevHnauHGj2rZtq1GjRqm8vPy8+1y8eLGmTZummTNnavPmzUpISNCoUaOUnZ3dVM1wWV3tLisr0+bNm/XUU09p8+bN+uSTT5Samqpbbrml3v268p5xl/qOuSSNHj26Rjvef//9OvfZEo65VH/bz27ziRMntHDhQlksFv3iF7+oc78t4bg3OgOml52dbUgyVq1add513n77bSM4OLj5imoCM2fONBISEi54/dtvv9246aabaixLTEw0HnzwwUaurPk99NBDRrdu3QyHw1Hr655wvA3DMCQZn376qfO5w+EwIiMjjZdfftm5rKCgwLBarcb7779/3v0MHTrUmDJlivO53W43oqOjjVmzZjVJ3Rfrv9tdm5SUFEOScejQofOu4+p7xgxqa/uvf/1rY+zYsS7tp6Udc8O4sOM+duxY49prr61znZZ43BsDPSwtQGFhoSSpQ4cOda5XUlKiLl26KDY2VmPHjtWuXbuao7xGlZaWpujoaMXHx+uuu+7S4cOHz7vu+vXrlZSUVGPZqFGjtH79+qYus0nZbDa99957+s1vflPnzTw94Xj/twMHDigzM7PGcQ0ODlZiYuJ5j6vNZtOmTZtqbOPl5aWkpKQW/bNQWFgoi8WikJCQOtdz5T1jZitXrlR4eLh69eqlyZMnKy8v77zreuoxz8rK0tKlS3XffffVu66nHHdXEFhMzuFw6OGHH9aIESPUr1+/867Xq1cvLVy4UJ999pnee+89ORwODR8+XEePHm3Gai9OYmKi3nnnHS1btkxz587VgQMHNHLkSBUXF9e6fmZmpiIiImosi4iIUGZmZnOU22SWLFmigoIC3XvvveddxxOOd21OHztXjmtubq7sdrtH/SyUl5friSee0J133lnnDfBcfc+Y1ejRo/Xuu+8qOTlZL774olatWqUxY8bIbrfXur4nHnNJWrRokQIDA/Xzn/+8zvU85bi7yiPu1uzJpkyZop07d9Z7fnLYsGEaNmyY8/nw4cPVp08fvfnmm3ruueeausxGMWbMGOfXAwYMUGJiorp06aIPP/zwgv7i8BQLFizQmDFjFB0dfd51POF4o3aVlZW6/fbbZRiG5s6dW+e6nvKeueOOO5xf9+/fXwMGDFC3bt20cuVKXXfddW6srHktXLhQd911V70D6D3luLuKHhYTmzp1qr788kt999136tSpk0vb+vr6atCgQUpPT2+i6ppeSEiIevbsed42REZGKisrq8ayrKwsRUZGNkd5TeLQoUP65ptvdP/997u0nSccb0nOY+fKcQ0NDZW3t7dH/CycDiuHDh3SihUr6uxdqU1975mWIj4+XqGhoedthycd89NWr16t1NRUl9/7kucc9/oQWEzIMAxNnTpVn376qb799lt17drV5X3Y7Xbt2LFDUVFRTVBh8ygpKdH+/fvP24Zhw4YpOTm5xrIVK1bU6Hload5++22Fh4frpptucmk7TzjektS1a1dFRkbWOK5FRUXauHHjeY+rn5+fhgwZUmMbh8Oh5OTkFvWzcDqspKWl6ZtvvlHHjh1d3kd975mW4ujRo8rLyztvOzzlmJ9twYIFGjJkiBISElze1lOOe73cPeoX55o8ebIRHBxsrFy50jhx4oTzUVZW5lznnnvuMZ588knn82eeecZYvny5sX//fmPTpk3GHXfcYfj7+xu7du1yRxMa5I9//KOxcuVK48CBA8batWuNpKQkIzQ01MjOzjYM49w2r1271vDx8TH++te/Gnv27DFmzpxp+Pr6Gjt27HBXEy6K3W43OnfubDzxxBPnvOZJx7u4uNjYsmWLsWXLFkOSMXv2bGPLli3Oq2H+8pe/GCEhIcZnn31mbN++3Rg7dqzRtWtX4+TJk859XHvttcbrr7/ufP7BBx8YVqvVeOedd4zdu3cbDzzwgBESEmJkZmY2e/vOp65222w245ZbbjE6depkbN26tcb7vqKiwrmP/253fe8Zs6ir7cXFxcajjz5qrF+/3jhw4IDxzTffGIMHDzZ69OhhlJeXO/fREo+5YdT/824YhlFYWGgEBAQYc+fOrXUfLfW4NzYCiwlJqvXx9ttvO9e56qqrjF//+tfO5w8//LDRuXNnw8/Pz4iIiDBuvPFGY/Pmzc1f/EUYP368ERUVZfj5+RkxMTHG+PHjjfT0dOfr/91mwzCMDz/80OjZs6fh5+dnXHLJJcbSpUubuerGs3z5ckOSkZqaes5rnnS8v/vuu1p/vk+3z+FwGE899ZQRERFhWK1W47rrrjvn/6RLly7GzJkzayx7/fXXnf8nQ4cONTZs2NBMLbowdbX7wIED533ff/fdd859/He763vPmEVdbS8rKzNuuOEGIywszPD19TW6dOliTJo06Zzg0RKPuWHU//NuGIbx5ptvGm3atDEKCgpq3UdLPe6NzWIYhtGkXTgAAAAXiTEsAADA9AgsAADA9AgsAADA9AgsAADA9AgsAADA9AgsAADA9AgsAADA9AgsAADA9AgsAADA9AgsAADA9AgsAADA9AgsAADA9P4/d+T1fimY/k0AAAAASUVORK5CYII=\n"
+ },
+ "metadata": {}
+ }
+ ],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "fig, ax = plt.subplots()\n",
+ "ax.errorbar(depth_acc[:,0], depth_acc[:,1], yerr=depth_acc[:,2])\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "# prompt: print classification report\n",
+ "\n",
+ "from sklearn.metrics import classification_report\n",
+ "t.fit(d_train_att, d_train_pass)\n",
+ "y_pred = t.predict(d_test_att)\n",
+ "y_test = d_test_pass\n",
+ "\n",
+ "print(classification_report(y_test, y_pred))\n"
+ ],
+ "metadata": {
+ "id": "ZEPcumB7JERR",
+ "outputId": "b308c7c6-3ffd-4bfa-8cd7-01303566962c",
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ }
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ " precision recall f1-score support\n",
+ "\n",
+ " 0 0.63 0.79 0.70 68\n",
+ " 1 0.78 0.60 0.68 81\n",
+ "\n",
+ " accuracy 0.69 149\n",
+ " macro avg 0.70 0.70 0.69 149\n",
+ "weighted avg 0.71 0.69 0.69 149\n",
+ "\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "# prompt: print the confusion matrix\n",
+ "\n",
+ "from sklearn.metrics import confusion_matrix\n",
+ "\n",
+ "cm = confusion_matrix(y_test, y_pred)\n",
+ "print(cm)\n"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "lEM2H3HNJuSh",
+ "outputId": "da94ec7d-ef8e-4198-bc56-b5017fda2ab2"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "[[54 14]\n",
+ " [32 49]]\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "2d6VzWz55drE",
+ "outputId": "38b1fddd-2697-4297-f98d-ecf407194c3e",
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ }
+ },
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "array([[ 1. , 0.62257603, 0.06582266],\n",
+ " [ 2. , 0.68728682, 0.06067724],\n",
+ " [ 3. , 0.71036374, 0.07389675],\n",
+ " [ 4. , 0.70422182, 0.07859402],\n",
+ " [ 5. , 0.6687418 , 0.02820843],\n",
+ " [ 6. , 0.64719141, 0.09086315],\n",
+ " [ 7. , 0.6718545 , 0.06098184],\n",
+ " [ 8. , 0.6718068 , 0.03568044],\n",
+ " [ 9. , 0.68103757, 0.04223098],\n",
+ " [10. , 0.68565295, 0.03202528],\n",
+ " [11. , 0.6718068 , 0.06188139],\n",
+ " [12. , 0.6656768 , 0.05202111],\n",
+ " [13. , 0.66412642, 0.0565803 ],\n",
+ " [14. , 0.65943948, 0.05876299],\n",
+ " [15. , 0.65946333, 0.05650805],\n",
+ " [16. , 0.65791294, 0.03796156],\n",
+ " [17. , 0.66101371, 0.04463823],\n",
+ " [18. , 0.65635063, 0.03758446],\n",
+ " [19. , 0.65793679, 0.03154424]])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 15
+ }
+ ],
+ "source": [
+ "depth_acc = np.empty((19,3), float)\n",
+ "i = 0\n",
+ "for max_depth in range(1, 20):\n",
+ " t = tree.DecisionTreeClassifier(criterion=\"entropy\", max_depth=max_depth)\n",
+ " scores = cross_val_score(t, d_att, d_pass, cv=5)\n",
+ " depth_acc[i,0] = max_depth\n",
+ " depth_acc[i,1] = scores.mean()\n",
+ " depth_acc[i,2] = scores.std() * 2\n",
+ " i += 1\n",
+ "\n",
+ "depth_acc"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "Jy8u68fQ5drE",
+ "outputId": "307529f8-00f2-4b6c-fa30-c2f0a9837881",
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ }
+ },
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Max depth: 1, Accuracy: 0.62 (+/- 0.07)\n",
+ "Max depth: 2, Accuracy: 0.69 (+/- 0.06)\n",
+ "Max depth: 3, Accuracy: 0.71 (+/- 0.07)\n",
+ "Max depth: 4, Accuracy: 0.70 (+/- 0.09)\n",
+ "Max depth: 5, Accuracy: 0.68 (+/- 0.04)\n",
+ "Max depth: 6, Accuracy: 0.65 (+/- 0.08)\n",
+ "Max depth: 7, Accuracy: 0.66 (+/- 0.04)\n",
+ "Max depth: 8, Accuracy: 0.68 (+/- 0.05)\n",
+ "Max depth: 9, Accuracy: 0.68 (+/- 0.02)\n",
+ "Max depth: 10, Accuracy: 0.68 (+/- 0.05)\n",
+ "Max depth: 11, Accuracy: 0.67 (+/- 0.06)\n",
+ "Max depth: 12, Accuracy: 0.65 (+/- 0.07)\n",
+ "Max depth: 13, Accuracy: 0.65 (+/- 0.04)\n",
+ "Max depth: 14, Accuracy: 0.67 (+/- 0.06)\n",
+ "Max depth: 15, Accuracy: 0.66 (+/- 0.05)\n",
+ "Max depth: 16, Accuracy: 0.67 (+/- 0.04)\n",
+ "Max depth: 17, Accuracy: 0.66 (+/- 0.05)\n",
+ "Max depth: 18, Accuracy: 0.65 (+/- 0.04)\n",
+ "Max depth: 19, Accuracy: 0.66 (+/- 0.03)\n"
+ ]
+ }
+ ],
+ "source": [
+ "for max_depth in range(1, 20):\n",
+ " t = tree.DecisionTreeClassifier(criterion=\"entropy\", max_depth=max_depth)\n",
+ " scores = cross_val_score(t, d_att, d_pass, cv=5)\n",
+ " print(\"Max depth: %d, Accuracy: %0.2f (+/- %0.2f)\" % (max_depth, scores.mean(), scores.std() * 2))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "qHHRkNad5drE"
+ },
+ "outputs": [],
+ "source": [
+ "print(classification_report(y_test, y_pred))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "!git config --global user.email \"your_email@example.com\"\n",
+ "!git config --global user.name \"Your Name\"\n",
+ "!git add .\n",
+ "!git commit -m \"Commit message\"\n",
+ "!git push origin your_branch_name"
+ ],
+ "metadata": {
+ "id": "jTlbevi9LQOy",
+ "outputId": "0308a566-9ba1-4f0b-c294-9b14164fb7dc",
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ }
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Author identity unknown\n",
+ "\n",
+ "*** Please tell me who you are.\n",
+ "\n",
+ "Run\n",
+ "\n",
+ " git config --global user.email \"you@example.com\"\n",
+ " git config --global user.name \"Your Name\"\n",
+ "\n",
+ "to set your account's default identity.\n",
+ "Omit --global to set the identity only in this repository.\n",
+ "\n",
+ "fatal: unable to auto-detect email address (got 'root@ec078c4b9cd8.(none)')\n",
+ "error: src refspec your_branch_name does not match any\n",
+ "\u001b[31merror: failed to push some refs to 'https://github.com/ArogeG/Python-Artificial-Intelligence-Projects-for-Beginners.git'\n",
+ "\u001b[m"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "!git branch\n",
+ "!git checkout -b Project-1"
+ ],
+ "metadata": {
+ "id": "gWn9lphtOWvU",
+ "outputId": "342b9164-8444-469a-d891-966bce23a001",
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ }
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "* \u001b[32mmaster\u001b[m\n",
+ "Switched to a new branch 'Project-1'\n"
+ ]
+ }
+ ]
+ }
+ ],
+ "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.6.2"
+ },
+ "colab": {
+ "provenance": [],
+ "toc_visible": true,
+ "include_colab_link": true
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
\ No newline at end of file
|