1542 lines
216 KiB
Plaintext
1542 lines
216 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Decision trees, overarching aims\n",
|
||
"\n",
|
||
"\n",
|
||
"We start here with the most basic algorithm, the so-called decision\n",
|
||
"tree. With this basic algorithm we can in turn build more complex\n",
|
||
"networks, spanning from homogeneous and heterogenous forests (bagging,\n",
|
||
"random forests and more) to one of the most popular supervised\n",
|
||
"algorithms nowadays, the extreme gradient boosting, or just\n",
|
||
"XGBoost. But let us start with the simplest possible ingredient.\n",
|
||
"\n",
|
||
"Decision trees are supervised learning algorithms used for both,\n",
|
||
"classification and regression tasks.\n",
|
||
"\n",
|
||
"\n",
|
||
"The main idea of decision trees\n",
|
||
"is to find those descriptive features which contain the most\n",
|
||
"**information** regarding the target feature and then split the dataset\n",
|
||
"along the values of these features such that the target feature values\n",
|
||
"for the resulting underlying datasets are as pure as possible.\n",
|
||
"\n",
|
||
"The descriptive features which reproduce best the target/output features are normally said\n",
|
||
"to be the most informative ones. The process of finding the **most\n",
|
||
"informative** feature is done until we accomplish a stopping criteria\n",
|
||
"where we then finally end up in so called **leaf nodes**. \n",
|
||
"\n",
|
||
"## Basics of a tree\n",
|
||
"\n",
|
||
"A decision tree is typically divided into a **root node**, the **interior nodes**,\n",
|
||
"and the final **leaf nodes** or just **leaves**. These entities are then connected by so-called **branches**.\n",
|
||
"\n",
|
||
"The leaf nodes\n",
|
||
"contain the predictions we will make for new query instances presented\n",
|
||
"to our trained model. This is possible since the model has \n",
|
||
"learned the underlying structure of the training data and hence can,\n",
|
||
"given some assumptions, make predictions about the target feature value\n",
|
||
"(class) of unseen query instances.\n",
|
||
"\n",
|
||
"\n",
|
||
"## General Features\n",
|
||
"\n",
|
||
"The overarching approach to decision trees is a top-down approach.\n",
|
||
"\n",
|
||
"* A leaf provides the classification of a given instance.\n",
|
||
"\n",
|
||
"* A node specifies a test of some attribute of the instance.\n",
|
||
"\n",
|
||
"* A branch corresponds to a possible values of an attribute.\n",
|
||
"\n",
|
||
"* An instance is classified by starting at the root node of the tree, testing the attribute specified by this node, then moving down the tree branch corresponding to the value of the attribute in the given example.\n",
|
||
"\n",
|
||
"This process is then repeated for the subtree rooted at the new\n",
|
||
"node.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"In simplified terms, the process of training a decision tree and\n",
|
||
"predicting the target features of query instances is as follows:\n",
|
||
"\n",
|
||
"1. Present a dataset containing of a number of training instances characterized by a number of descriptive features and a target feature\n",
|
||
"\n",
|
||
"2. Train the decision tree model by continuously splitting the target feature along the values of the descriptive features using a measure of information gain during the training process\n",
|
||
"\n",
|
||
"3. Grow the tree until we accomplish a stopping criteria create leaf nodes which represent the *predictions* we want to make for new query instances\n",
|
||
"\n",
|
||
"4. Show query instances to the tree and run down the tree until we arrive at leaf nodes\n",
|
||
"\n",
|
||
"Then we are essentially done!"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"2nd degree coefficients:\n",
|
||
"zero power: -0.2774877574815404\n",
|
||
"first power: 0.11112589053037751\n",
|
||
"second power: -0.00033136014047192484\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 640x480 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter6_1_1.png"
|
||
}
|
||
},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjUAAAHFCAYAAAAKbwgcAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAACUmUlEQVR4nOzdd3zU9P/A8Veue/da6IICLSijzBaVoQxxoaiI4h6IXxXBAe6tqF9QHF9coAg/QUEZCm6GKCAiCLTMsls2Vwqlgxbouvz+KE1z7XXf9e7a99MHDy/JJ8knaZJ732dFUVVVRQghhBDCxRkcnQEhhBBCCFuQoEYIIYQQjYIENUIIIYRoFCSoEUIIIUSjIEGNEEIIIRoFCWqEEEII0ShIUCOEEEKIRkGCGiGEEEI0ChLUCCGEEKJRkKBGiFqaOXMmiqJo/7y9vYmIiGDgwIFMnDiR9PR0u+7/wIEDKIrCzJkza7XeiBEjaNOmjV3yVNU+9eeqsn8jRoxo0HyVVz4/gYGB9OnTh2+//dah+WpIdb2uhHAmirwmQYjamTlzJvfffz9ffvklHTp0oLCwkPT0dP7++2++/PJL3NzcmDdvHldccYVd9p+fn8+mTZto27YtzZs3r/F6KSkp5OTk0KNHD7vkq7J9njhxQptOSkpizJgxTJgwgYEDB2rzmzdvTtu2bRssX+UpisItt9zCU089haqq7N+/nwkTJpCcnMycOXO48847HZa3hlLX60oIZyJBjRC1VBrUbNiwgZ49e1osO3ToEJdeeilZWVns3buX8PBwB+XSOa1cuZKBAweyYMECbrnllkrTnT17Fm9vbxRFaZB8KYrCmDFj+OSTT7R5Bw8epE2bNvTr149Vq1Y1SD5KnTlzBl9f3wbdpxCNgVQ/CWFDrVq14v333+f06dN8/vnnFss2btzIDTfcQEhICN7e3vTo0YP58+dX2MbRo0d56KGHiI6OxtPTk6ioKG655RaOHz8OWK8mOHHihLaOl5cXzZs3p2/fvixfvlxLY6366dy5c7zwwgvExMTg6elJixYtGDNmDFlZWRbp2rRpw5AhQ1iyZAnx8fH4+PjQoUMH/u///q9+J4yy6rxly5YxcuRImjdvjq+vL/n5+QDMmzeP3r174+fnh7+/P1dffTWbNm2qsJ2ant+aat26Nc2bN9fOe6mcnByefvppi3M2duxY8vLyLNJlZWXxwAMPEBISgr+/P9dddx2pqakoisLrr7+upXv99ddRFIWkpCRuueUWjEajVmqlqipTpkyhe/fu+Pj4YDQaueWWW0hNTbXY16ZNmxgyZAhhYWF4eXkRFRXFddddx5EjR7Q0CxYs4JJLLiEoKAhfX19iY2MZOXKktryy6qe///6bQYMGERAQgK+vL3369OHXX3+1SFP6N1yxYgWPPPIIzZo1IzQ0lGHDhnHs2LFan3sh6kqCGiFs7Nprr8XNzY2//vpLm7dixQr69u1LVlYWn332GT/++CPdu3fntttus/gSOXr0KBdddBGLFi3iySefZPHixUyePJmgoCAyMzMr3ec999zDDz/8wKuvvsqyZcuYPn06V1xxBRkZGZWuo6oqQ4cO5b333uOee+7h119/5cknn2TWrFlcfvnlWlBRasuWLTz11FOMGzeOH3/8ka5du/LAAw9YHGd9jBw5Eg8PD77++mu+++47PDw8mDBhAnfccQedOnVi/vz5fP3115w+fZrLLruMHTt2aOvW9PzWRnZ2NqdOneLCCy/U5p05c4b+/fsza9YsHn/8cRYvXsxzzz3HzJkzueGGGygt+DabzVx//fV88803PPfccyxatIhLLrmEa665ptL9DRs2jHbt2rFgwQI+++wzAB5++GHGjh3LFVdcwQ8//MCUKVNITk6mT58+WrCVl5fHlVdeyfHjx/n000/5/fffmTx5Mq1ateL06dMArF27lttuu43Y2Fjmzp3Lr7/+yquvvkpRUVGV52DVqlVcfvnlZGdnM2PGDL799lsCAgK4/vrrmTdvXoX0//nPf/Dw8OCbb75h0qRJrFy5krvvvrt2J16I+lCFELXy5ZdfqoC6YcOGStOEh4erHTt21KY7dOig9ujRQy0sLLRIN2TIEDUyMlItLi5WVVVVR44cqXp4eKg7duyodNv79+9XAfXLL7/U5vn7+6tjx46tMt/33Xef2rp1a216yZIlKqBOmjTJIt28efNUQJ02bZo2r3Xr1qq3t7d68OBBbd7Zs2fVkJAQ9eGHH65yv3orVqxQAXXBggXavNLzee+991qkPXTokOru7q4+9thjFvNPnz6tRkREqLfeeqs2r6bntzKAOnr0aLWwsFAtKChQ9+zZo95www1qQECAunHjRi3dxIkTVYPBUOFv/91336mA+ttvv6mqqqq//vqr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bt268cknn1hdXpPzOnbsWBYtWsTcuXP5+++/yc3NZciQIRQXFzfUYTi96s4zwDXXXGNxff/2228Wy+U8V2/VqlWMGTOGdevW8fvvv1NUVMRVV11FXl6elkau6fqryXkGJ7qmVVEvF198sTpq1CiLeR06dFCff/55B+XI9b322mtqt27drC4zm81qRESE+vbbb2vzzp07pwYFBamfffZZA+XQ9QHqokWLtOmanNesrCzVw8NDnTt3rpbm6NGjqsFgUJcsWdJgeXcl5c+zqqrqfffdp954442VriPnuW7S09NVQF21apWqqnJN20v586yqznVNS0lNPRQUFJCYmMhVV11lMf+qq67in3/+cVCuGoe9e/cSFRVFTEwMt99+O6mpqQDs37+ftLQ0i3Pu5eVF//795ZzXQ03Oa2JiIoWFhRZpoqKi6Ny5s5z7Wlq5ciVhYWFceOGFPPjgg6Snp2vL5DzXTXZ2NgAhISGAXNP2Uv48l3KWa1qCmno4efIkxcXFhIeHW8wPDw8nLS3NQblyfZdccglfffUVS5cu5YsvviAtLY0+ffqQkZGhnVc557ZVk/OalpaGp6cnRqOx0jSieoMHD2bOnDn8+eefvP/++2zYsIHLL7+c/Px8QM5zXaiqypNPPsmll15K586dAbmm7cHaeQbnuqab1Fu67UVRFItpVVUrzBM1N3jwYO1zly5d6N27N23btmXWrFla4zM55/ZRl/Mq5752brvtNu1z586d6dmzJ61bt+bXX39l2LBhla4n57lyjz76KFu3buXvv/+usEyuadup7Dw70zUtJTX10KxZM9zc3CpEmunp6RV+HYi68/Pzo0uXLuzdu1frBSXn3LZqcl4jIiIoKCggMzOz0jSi9iIjI2ndujV79+4F5DzX1mOPPcZPP/3EihUraNmypTZfrmnbquw8W+PIa1qCmnrw9PQkISGB33//3WL+77//Tp8+fRyUq8YnPz+fnTt3EhkZSUxMDBERERbnvKCggFWrVsk5r4eanNeEhAQ8PDws0phMJrZv3y7nvh4yMjI4fPgwkZGRgJznmlJVlUcffZSFCxfy559/EhMTY7FcrmnbqO48W+PQa9qmzY6boLlz56oeHh7qjBkz1B07dqhjx45V/fz81AMHDjg6ay7rqaeeUleuXKmmpqaq69atU4cMGaIGBARo5/Ttt99Wg4KC1IULF6rbtm1T77jjDjUyMlLNyclxcM6d2+nTp9VNmzapmzZtUgH1gw8+UDdt2qQePHhQVdWanddRo0apLVu2VJcvX64mJSWpl19+udqtWze1qKjIUYfldKo6z6dPn1afeuop9Z9//lH379+vrlixQu3du7faokULOc+19Mgjj6hBQUHqypUrVZPJpP07c+aMlkau6fqr7jw72zUtQY0NfPrpp2rr1q1VT09PNT4+3qKrm6i92267TY2MjFQ9PDzUqKgoddiwYWpycrK23Gw2q6+99poaERGhenl5qf369VO3bdvmwBy7hhUrVqhAhX/33Xefqqo1O69nz55VH330UTUkJET18fFRhwwZoh46dMgBR+O8qjrPZ86cUa+66iq1efPmqoeHh9qqVSv1vvvuq3AO5TxXz9o5BtQvv/xSSyPXdP1Vd56d7ZpWzmdaCCGEEMKlSZsaIYQQQjQKEtQIIYQQolGQoEYIIYQQjYIENUIIIYRoFCSoEUIIIUSjIEGNEEIIIRoFCWqEEEII0ShIUCOEEEKIRkGCGiGE0xgxYgSKoqAoCh4eHoSHh3PllVfyf//3f5jN5hpvZ+bMmQQHB9svo0IIpyRBjRDCqVxzzTWYTCYOHDjA4sWLGThwIE888QRDhgyhqKjI0dkTQjgxCWqEEE7Fy8uLiIgIWrRoQXx8PC+++CI//vgjixcvZubMmQB88MEHdOnSBT8/P6Kjoxk9ejS5ubkArFy5kvvvv5/s7Gyt1Of1118HYPbs2fTs2ZOAgAAiIiK48847SU9Pd9CRCiFsTYIaIYTTu/zyy+nWrRsLFy4EwGAw8NFHH7F9+3ZmzZrFn3/+ybPPPgtAnz59mDx5MoGBgZhMJkwmE08//TQABQUFvPnmm2zZsoUffviB/fv3M2LECEcdlhDCxtwdnQEhhKiJDh06sHXrVgDGjh2rzY+JieHNN9/kkUceYcqUKXh6ehIUFISiKERERFhsY+TIkdrn2NhYPvroIy6++GJyc3Px9/dvkOMQQtiPlNQIIVyCqqooigLAihUruPLKK2nRogUBAQHce++9ZGRkkJeXV+U2Nm3axI033kjr1q0JCAhgwIABABw6dMje2RdCNAAJaoQQLmHnzp3ExMRw8OBBrr32Wjp37sz3339PYmIin376KQCFhYWVrp+Xl8dVV12Fv78/s2fPZsOGDSxatAgoqZYSQrg+qX4SQji9P//8k23btjFu3Dg2btxIUVER77//PgZDye+y+fPnW6T39PSkuLjYYt6uXbs4efIkb7/9NtHR0QBs3LixYQ5ACNEgpKRGCOFU8vPzSUtL4+jRoyQlJTFhwgRuvPFGhgwZwr333kvbtm0pKiri448/JjU1la+//prPPvvMYhtt2rQhNzeXP/74g5MnT3LmzBlatWqFp6entt5PP/3Em2++6aCjFELYgwQ1QginsmTJEiIjI2nTpg3XXHMNK1as4KOPPuLHH3/Ezc2N7t2788EHH/DOO+/QuXNn5syZw8SJEy220ef/27GDGghCIIqCvSIwgYQxggWkEIII7ohkRWw2k3SqFPy+vfTzRO89WmtRSok5Z5RSYu8d55yotcYYI9ZaL10J/MPn3nvfHgEA8CufGgAgBVEDAKQgagCAFEQNAJCCqAEAUhA1AEAKogYASEHUAAApiBoAIAVRAwCkIGoAgBREDQCQwhdT2gEzfzJLfQAAAABJRU5ErkJggg==\n",
|
||
"text/plain": [
|
||
"<Figure size 640x480 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter6_1_2.png"
|
||
}
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"%matplotlib inline\n",
|
||
"\n",
|
||
"import numpy as np\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"from sklearn.preprocessing import PolynomialFeatures\n",
|
||
"from sklearn.linear_model import LinearRegression\n",
|
||
"\n",
|
||
"steps=250\n",
|
||
"\n",
|
||
"distance=0\n",
|
||
"x=0\n",
|
||
"distance_list=[]\n",
|
||
"steps_list=[]\n",
|
||
"while x<steps:\n",
|
||
" distance+=np.random.randint(-1,2)\n",
|
||
" distance_list.append(distance)\n",
|
||
" x+=1\n",
|
||
" steps_list.append(x)\n",
|
||
"plt.plot(steps_list,distance_list, color='green', label=\"Random Walk Data\")\n",
|
||
"\n",
|
||
"steps_list=np.asarray(steps_list)\n",
|
||
"distance_list=np.asarray(distance_list)\n",
|
||
"\n",
|
||
"X=steps_list[:,np.newaxis]\n",
|
||
"\n",
|
||
"#Polynomial fits\n",
|
||
"\n",
|
||
"#Degree 2\n",
|
||
"poly_features=PolynomialFeatures(degree=2, include_bias=False)\n",
|
||
"X_poly=poly_features.fit_transform(X)\n",
|
||
"\n",
|
||
"lin_reg=LinearRegression()\n",
|
||
"poly_fit=lin_reg.fit(X_poly,distance_list)\n",
|
||
"b=lin_reg.coef_\n",
|
||
"c=lin_reg.intercept_\n",
|
||
"print (\"2nd degree coefficients:\")\n",
|
||
"print (\"zero power: \",c)\n",
|
||
"print (\"first power: \", b[0])\n",
|
||
"print (\"second power: \",b[1])\n",
|
||
"\n",
|
||
"z = np.arange(0, steps, .01)\n",
|
||
"z_mod=b[1]*z**2+b[0]*z+c\n",
|
||
"\n",
|
||
"fit_mod=b[1]*X**2+b[0]*X+c\n",
|
||
"plt.plot(z, z_mod, color='r', label=\"2nd Degree Fit\")\n",
|
||
"plt.title(\"Polynomial Regression\")\n",
|
||
"\n",
|
||
"plt.xlabel(\"Steps\")\n",
|
||
"plt.ylabel(\"Distance\")\n",
|
||
"\n",
|
||
"#Degree 10\n",
|
||
"poly_features10=PolynomialFeatures(degree=10, include_bias=False)\n",
|
||
"X_poly10=poly_features10.fit_transform(X)\n",
|
||
"\n",
|
||
"poly_fit10=lin_reg.fit(X_poly10,distance_list)\n",
|
||
"\n",
|
||
"y_plot=poly_fit10.predict(X_poly10)\n",
|
||
"plt.plot(X, y_plot, color='black', label=\"10th Degree Fit\")\n",
|
||
"\n",
|
||
"plt.legend()\n",
|
||
"plt.show()\n",
|
||
"\n",
|
||
"\n",
|
||
"#Decision Tree Regression\n",
|
||
"from sklearn.tree import DecisionTreeRegressor\n",
|
||
"regr_1=DecisionTreeRegressor(max_depth=2)\n",
|
||
"regr_2=DecisionTreeRegressor(max_depth=5)\n",
|
||
"regr_3=DecisionTreeRegressor(max_depth=7)\n",
|
||
"regr_1.fit(X, distance_list)\n",
|
||
"regr_2.fit(X, distance_list)\n",
|
||
"regr_3.fit(X, distance_list)\n",
|
||
"\n",
|
||
"X_test = np.arange(0.0, steps, 0.01)[:, np.newaxis]\n",
|
||
"y_1 = regr_1.predict(X_test)\n",
|
||
"y_2 = regr_2.predict(X_test)\n",
|
||
"y_3=regr_3.predict(X_test)\n",
|
||
"\n",
|
||
"# Plot the results\n",
|
||
"plt.figure()\n",
|
||
"plt.scatter(X, distance_list, s=2.5, c=\"black\", label=\"data\")\n",
|
||
"plt.plot(X_test, y_1, color=\"red\",\n",
|
||
" label=\"max_depth=2\", linewidth=2)\n",
|
||
"plt.plot(X_test, y_2, color=\"green\", label=\"max_depth=5\", linewidth=2)\n",
|
||
"plt.plot(X_test, y_3, color=\"m\", label=\"max_depth=7\", linewidth=2)\n",
|
||
"\n",
|
||
"plt.xlabel(\"Data\")\n",
|
||
"plt.ylabel(\"Darget\")\n",
|
||
"plt.title(\"Decision Tree Regression\")\n",
|
||
"plt.legend()\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Building a tree, regression\n",
|
||
"\n",
|
||
"There are mainly two steps\n",
|
||
"1. We split the predictor space (the set of possible values $x_1,x_2,\\dots, x_p$) into $J$ distinct and non-non-overlapping regions, $R_1,R_2,\\dots,R_J$. \n",
|
||
"\n",
|
||
"2. For every observation that falls into the region $R_j$ , we make the same prediction, which is simply the mean of the response values for the training observations in $R_j$.\n",
|
||
"\n",
|
||
"How do we construct the regions $R_1,\\dots,R_J$? In theory, the\n",
|
||
"regions could have any shape. However, we choose to divide the\n",
|
||
"predictor space into high-dimensional rectangles, or boxes, for\n",
|
||
"simplicity and for ease of interpretation of the resulting predictive\n",
|
||
"model. The goal is to find boxes $R_1,\\dots,R_J$ that minimize the\n",
|
||
"MSE, given by"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\sum_{j=1}^J\\sum_{i\\in R_j}(y_i-\\overline{y}_{R_j})^2,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $\\overline{y}_{R_j}$ is the mean response for the training observations \n",
|
||
"within box $j$. \n",
|
||
"\n",
|
||
"\n",
|
||
"Unfortunately, it is computationally infeasible to consider every\n",
|
||
"possible partition of the feature space into $J$ boxes. The common\n",
|
||
"strategy is to take a top-down approach\n",
|
||
"\n",
|
||
"The approach is top-down because it begins at the top of the tree (all\n",
|
||
"observations belong to a single region) and then successively splits\n",
|
||
"the predictor space; each split is indicated via two new branches\n",
|
||
"further down on the tree. It is greedy because at each step of the\n",
|
||
"tree-building process, the best split is made at that particular step,\n",
|
||
"rather than looking ahead and picking a split that will lead to a\n",
|
||
"better tree in some future step.\n",
|
||
"\n",
|
||
"\n",
|
||
"### Making a tree\n",
|
||
"\n",
|
||
"In order to implement the recursive binary splitting we start by selecting\n",
|
||
"the predictor $x_j$ and a cutpoint $s$ that splits the predictor space into two regions $R_1$ and $R_2$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\left\\{X\\vert x_j < s\\right\\},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\left\\{X\\vert x_j \\geq s\\right\\},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"so that we obtain the lowest MSE, that is"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\sum_{i:x_i\\in R_j}(y_i-\\overline{y}_{R_1})^2+\\sum_{i:x_i\\in R_2}(y_i-\\overline{y}_{R_2})^2,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"which we want to minimize by considering all predictors\n",
|
||
"$x_1,x_2,\\dots,x_p$. We consider also all possible values of $s$ for\n",
|
||
"each predictor. These values could be determined by randomly assigned\n",
|
||
"numbers or by starting at the midpoint and then proceed till we find\n",
|
||
"an optimal value.\n",
|
||
"\n",
|
||
"For any $j$ and $s$, we define the pair of half-planes where\n",
|
||
"$\\overline{y}_{R_1}$ is the mean response for the training\n",
|
||
"observations in $R_1(j,s)$, and $\\overline{y}_{R_2}$ is the mean\n",
|
||
"response for the training observations in $R_2(j,s)$.\n",
|
||
"\n",
|
||
"Finding the values of $j$ and $s$ that minimize the above equation can be\n",
|
||
"done quite quickly, especially when the number of features $p$ is not\n",
|
||
"too large.\n",
|
||
"\n",
|
||
"Next, we repeat the process, looking\n",
|
||
"for the best predictor and best cutpoint in order to split the data\n",
|
||
"further so as to minimize the MSE within each of the resulting\n",
|
||
"regions. However, this time, instead of splitting the entire predictor\n",
|
||
"space, we split one of the two previously identified regions. We now\n",
|
||
"have three regions. Again, we look to split one of these three regions\n",
|
||
"further, so as to minimize the MSE. The process continues until a\n",
|
||
"stopping criterion is reached; for instance, we may continue until no\n",
|
||
"region contains more than five observations.\n",
|
||
"\n",
|
||
"\n",
|
||
"The above procedure is rather straightforward, but leads often to\n",
|
||
"overfitting and unnecessarily large and complicated trees. The basic\n",
|
||
"idea is to grow a large tree $T_0$ and then prune it back in order to\n",
|
||
"obtain a subtree. A smaller tree with fewer splits (fewer regions) can\n",
|
||
"lead to smaller variance and better interpretation at the cost of a\n",
|
||
"little more bias.\n",
|
||
"\n",
|
||
"The so-called Cost complexity pruning algorithm gives us a\n",
|
||
"way to do just this. Rather than considering every possible subtree,\n",
|
||
"we consider a sequence of trees indexed by a nonnegative tuning\n",
|
||
"parameter $\\alpha$.\n",
|
||
"\n",
|
||
"Read more at the following [Scikit-Learn link on pruning](https://scikit-learn.org/stable/auto_examples/tree/plot_cost_complexity_pruning.html#sphx-glr-auto-examples-tree-plot-cost-complexity-pruning-py).\n",
|
||
"\n",
|
||
"\n",
|
||
"For each value of $\\alpha$ there corresponds a subtree $T \\in T_0$ such that"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\sum_{m=1}^{\\overline{T}}\\sum_{i:x_i\\in R_m}(y_i-\\overline{y}_{R_m})^2+\\alpha\\overline{T},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"is as small as possible. Here $\\overline{T}$ is \n",
|
||
"the number of terminal nodes of the tree $T$ , $R_m$ is the\n",
|
||
"rectangle (i.e. the subset of predictor space) corresponding to the $m$-th terminal node.\n",
|
||
"\n",
|
||
"The tuning parameter $\\alpha$ controls a trade-off between the subtree’s\n",
|
||
"complexity and its fit to the training data. When $\\alpha = 0$, then the\n",
|
||
"subtree $T$ will simply equal $T_0$, \n",
|
||
"because then the above equation just measures the\n",
|
||
"training error. \n",
|
||
"However, as $\\alpha$ increases, there is a price to pay for\n",
|
||
"having a tree with many terminal nodes. The above equation will\n",
|
||
"tend to be minimized for a smaller subtree. \n",
|
||
"\n",
|
||
"\n",
|
||
"It turns out that as we increase $\\alpha$ from zero\n",
|
||
"branches get pruned from the tree in a nested and predictable fashion,\n",
|
||
"so obtaining the whole sequence of subtrees as a function of $\\alpha$ is\n",
|
||
"easy. We can select a value of $\\alpha$ using a validation set or using\n",
|
||
"cross-validation. We then return to the full data set and obtain the\n",
|
||
"subtree corresponding to $\\alpha$. \n",
|
||
"\n",
|
||
"\n",
|
||
"### Schematic Regression Procedure\n",
|
||
"\n",
|
||
"Building a Regression Tree\n",
|
||
"\n",
|
||
"1. Use recursive binary splitting to grow a large tree on the training data, stopping only when each terminal node has fewer than some minimum number of observations.\n",
|
||
"\n",
|
||
"2. Apply cost complexity pruning to the large tree in order to obtain a sequence of best subtrees, as a function of $\\alpha$.\n",
|
||
"\n",
|
||
"3. Use for example $K$-fold cross-validation to choose $\\alpha$. Divide the training observations into $K$ folds. For each $k=1,2,\\dots,K$ we: \n",
|
||
"\n",
|
||
" * repeat steps 1 and 2 on all but the $k$-th fold of the training data. \n",
|
||
"\n",
|
||
" * Then we valuate the mean squared prediction error on the data in the left-out $k$-th fold, as a function of $\\alpha$.\n",
|
||
"\n",
|
||
" * Finally we average the results for each value of $\\alpha$, and pick $\\alpha$ to minimize the average error.\n",
|
||
"\n",
|
||
"\n",
|
||
"4. Return the subtree from Step 2 that corresponds to the chosen value of $\\alpha$. \n",
|
||
"\n",
|
||
"!eblock\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"## A Classification Tree\n",
|
||
"\n",
|
||
"A classification tree is very similar to a regression tree, except\n",
|
||
"that it is used to predict a qualitative response rather than a\n",
|
||
"quantitative one. Recall that for a regression tree, the predicted\n",
|
||
"response for an observation is given by the mean response of the\n",
|
||
"training observations that belong to the same terminal node. In\n",
|
||
"contrast, for a classification tree, we predict that each observation\n",
|
||
"belongs to the most commonly occurring class of training observations\n",
|
||
"in the region to which it belongs. In interpreting the results of a\n",
|
||
"classification tree, we are often interested not only in the class\n",
|
||
"prediction corresponding to a particular terminal node region, but\n",
|
||
"also in the class proportions among the training observations that\n",
|
||
"fall into that region. \n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"The task of growing a\n",
|
||
"classification tree is quite similar to the task of growing a\n",
|
||
"regression tree. Just as in the regression setting, we use recursive\n",
|
||
"binary splitting to grow a classification tree. However, in the\n",
|
||
"classification setting, the MSE cannot be used as a criterion for making\n",
|
||
"the binary splits. A natural alternative to MSE is the **classification\n",
|
||
"error rate**. Since we plan to assign an observation in a given region\n",
|
||
"to the most commonly occurring error rate class of training\n",
|
||
"observations in that region, the classification error rate is simply\n",
|
||
"the fraction of the training observations in that region that do not\n",
|
||
"belong to the most common class. \n",
|
||
"\n",
|
||
"When building a classification tree, either the Gini index or the\n",
|
||
"entropy are typically used to evaluate the quality of a particular\n",
|
||
"split, since these two approaches are more sensitive to node purity\n",
|
||
"than is the classification error rate. \n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"If our targets are the outcome of a classification process that takes\n",
|
||
"for example $k=1,2,\\dots,K$ values, the only thing we need to think of\n",
|
||
"is to set up the splitting criteria for each node.\n",
|
||
"\n",
|
||
"We define a PDF $p_{mk}$ that represents the number of observations of\n",
|
||
"a class $k$ in a region $R_m$ with $N_m$ observations. We represent\n",
|
||
"this likelihood function in terms of the proportion $I(y_i=k)$ of\n",
|
||
"observations of this class in the region $R_m$ as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"p_{mk} = \\frac{1}{N_m}\\sum_{x_i\\in R_m}I(y_i=k).\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We let $p_{mk}$ represent the majority class of observations in region\n",
|
||
"$m$. The three most common ways of splitting a node are given by\n",
|
||
"\n",
|
||
"* Misclassification error"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"p_{mk} = \\frac{1}{N_m}\\sum_{x_i\\in R_m}I(y_i\\ne k) = 1-p_{mk}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"* Gini index $g$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"g = \\sum_{k=1}^K p_{mk}(1-p_{mk}).\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"* Information entropy or just entropy $s$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"s = -\\sum_{k=1}^K p_{mk}\\log{p_{mk}}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Visualizing the Tree, Classification"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
" mean radius mean texture mean perimeter mean area mean smoothness \\\n",
|
||
"0 17.99 10.38 122.80 1001.0 0.11840 \n",
|
||
"1 20.57 17.77 132.90 1326.0 0.08474 \n",
|
||
"2 19.69 21.25 130.00 1203.0 0.10960 \n",
|
||
"3 11.42 20.38 77.58 386.1 0.14250 \n",
|
||
"4 20.29 14.34 135.10 1297.0 0.10030 \n",
|
||
".. ... ... ... ... ... \n",
|
||
"564 21.56 22.39 142.00 1479.0 0.11100 \n",
|
||
"565 20.13 28.25 131.20 1261.0 0.09780 \n",
|
||
"566 16.60 28.08 108.30 858.1 0.08455 \n",
|
||
"567 20.60 29.33 140.10 1265.0 0.11780 \n",
|
||
"568 7.76 24.54 47.92 181.0 0.05263 \n",
|
||
"\n",
|
||
" mean compactness mean concavity mean concave points mean symmetry \\\n",
|
||
"0 0.27760 0.30010 0.14710 0.2419 \n",
|
||
"1 0.07864 0.08690 0.07017 0.1812 \n",
|
||
"2 0.15990 0.19740 0.12790 0.2069 \n",
|
||
"3 0.28390 0.24140 0.10520 0.2597 \n",
|
||
"4 0.13280 0.19800 0.10430 0.1809 \n",
|
||
".. ... ... ... ... \n",
|
||
"564 0.11590 0.24390 0.13890 0.1726 \n",
|
||
"565 0.10340 0.14400 0.09791 0.1752 \n",
|
||
"566 0.10230 0.09251 0.05302 0.1590 \n",
|
||
"567 0.27700 0.35140 0.15200 0.2397 \n",
|
||
"568 0.04362 0.00000 0.00000 0.1587 \n",
|
||
"\n",
|
||
" mean fractal dimension ... worst radius worst texture \\\n",
|
||
"0 0.07871 ... 25.380 17.33 \n",
|
||
"1 0.05667 ... 24.990 23.41 \n",
|
||
"2 0.05999 ... 23.570 25.53 \n",
|
||
"3 0.09744 ... 14.910 26.50 \n",
|
||
"4 0.05883 ... 22.540 16.67 \n",
|
||
".. ... ... ... ... \n",
|
||
"564 0.05623 ... 25.450 26.40 \n",
|
||
"565 0.05533 ... 23.690 38.25 \n",
|
||
"566 0.05648 ... 18.980 34.12 \n",
|
||
"567 0.07016 ... 25.740 39.42 \n",
|
||
"568 0.05884 ... 9.456 30.37 \n",
|
||
"\n",
|
||
" worst perimeter worst area worst smoothness worst compactness \\\n",
|
||
"0 184.60 2019.0 0.16220 0.66560 \n",
|
||
"1 158.80 1956.0 0.12380 0.18660 \n",
|
||
"2 152.50 1709.0 0.14440 0.42450 \n",
|
||
"3 98.87 567.7 0.20980 0.86630 \n",
|
||
"4 152.20 1575.0 0.13740 0.20500 \n",
|
||
".. ... ... ... ... \n",
|
||
"564 166.10 2027.0 0.14100 0.21130 \n",
|
||
"565 155.00 1731.0 0.11660 0.19220 \n",
|
||
"566 126.70 1124.0 0.11390 0.30940 \n",
|
||
"567 184.60 1821.0 0.16500 0.86810 \n",
|
||
"568 59.16 268.6 0.08996 0.06444 \n",
|
||
"\n",
|
||
" worst concavity worst concave points worst symmetry \\\n",
|
||
"0 0.7119 0.2654 0.4601 \n",
|
||
"1 0.2416 0.1860 0.2750 \n",
|
||
"2 0.4504 0.2430 0.3613 \n",
|
||
"3 0.6869 0.2575 0.6638 \n",
|
||
"4 0.4000 0.1625 0.2364 \n",
|
||
".. ... ... ... \n",
|
||
"564 0.4107 0.2216 0.2060 \n",
|
||
"565 0.3215 0.1628 0.2572 \n",
|
||
"566 0.3403 0.1418 0.2218 \n",
|
||
"567 0.9387 0.2650 0.4087 \n",
|
||
"568 0.0000 0.0000 0.2871 \n",
|
||
"\n",
|
||
" worst fractal dimension \n",
|
||
"0 0.11890 \n",
|
||
"1 0.08902 \n",
|
||
"2 0.08758 \n",
|
||
"3 0.17300 \n",
|
||
"4 0.07678 \n",
|
||
".. ... \n",
|
||
"564 0.07115 \n",
|
||
"565 0.06637 \n",
|
||
"566 0.07820 \n",
|
||
"567 0.12400 \n",
|
||
"568 0.07039 \n",
|
||
"\n",
|
||
"[569 rows x 30 columns]\n",
|
||
" malignant benign\n",
|
||
"0 1 0\n",
|
||
"1 1 0\n",
|
||
"2 1 0\n",
|
||
"3 1 0\n",
|
||
"4 1 0\n",
|
||
".. ... ...\n",
|
||
"564 1 0\n",
|
||
"565 1 0\n",
|
||
"566 1 0\n",
|
||
"567 1 0\n",
|
||
"568 0 1\n",
|
||
"\n",
|
||
"[569 rows x 2 columns]\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"0"
|
||
]
|
||
},
|
||
"execution_count": 2,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"import os\n",
|
||
"from sklearn.datasets import load_breast_cancer\n",
|
||
"from sklearn.tree import DecisionTreeClassifier\n",
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"from sklearn.metrics import confusion_matrix\n",
|
||
"from sklearn.tree import export_graphviz\n",
|
||
"\n",
|
||
"from IPython.display import Image \n",
|
||
"from pydot import graph_from_dot_data\n",
|
||
"import pandas as pd\n",
|
||
"import numpy as np\n",
|
||
"\n",
|
||
"\n",
|
||
"cancer = load_breast_cancer()\n",
|
||
"X = pd.DataFrame(cancer.data, columns=cancer.feature_names)\n",
|
||
"print(X)\n",
|
||
"y = pd.Categorical.from_codes(cancer.target, cancer.target_names)\n",
|
||
"y = pd.get_dummies(y)\n",
|
||
"print(y)\n",
|
||
"X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)\n",
|
||
"tree_clf = DecisionTreeClassifier(max_depth=5)\n",
|
||
"tree_clf.fit(X_train, y_train)\n",
|
||
"\n",
|
||
"export_graphviz(\n",
|
||
" tree_clf,\n",
|
||
" out_file=\"DataFiles/cancer.dot\",\n",
|
||
" feature_names=cancer.feature_names,\n",
|
||
" class_names=cancer.target_names,\n",
|
||
" rounded=True,\n",
|
||
" filled=True\n",
|
||
")\n",
|
||
"cmd = 'dot -Tpng DataFiles/cancer.dot -o DataFiles/cancer.png'\n",
|
||
"os.system(cmd)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 3,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"0"
|
||
]
|
||
},
|
||
"execution_count": 3,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# Common imports\n",
|
||
"import numpy as np\n",
|
||
"from sklearn.model_selection import train_test_split \n",
|
||
"from sklearn.tree import DecisionTreeClassifier\n",
|
||
"from sklearn.datasets import make_moons\n",
|
||
"from sklearn.tree import export_graphviz\n",
|
||
"from pydot import graph_from_dot_data\n",
|
||
"import pandas as pd\n",
|
||
"import os\n",
|
||
"\n",
|
||
"np.random.seed(42)\n",
|
||
"X, y = make_moons(n_samples=100, noise=0.25, random_state=53)\n",
|
||
"X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=0)\n",
|
||
"tree_clf = DecisionTreeClassifier(max_depth=5)\n",
|
||
"tree_clf.fit(X_train, y_train)\n",
|
||
"\n",
|
||
"export_graphviz(\n",
|
||
" tree_clf,\n",
|
||
" out_file=\"DataFiles/moons.dot\",\n",
|
||
" rounded=True,\n",
|
||
" filled=True\n",
|
||
")\n",
|
||
"cmd = 'dot -Tpng DataFiles/moons.dot -o DataFiles/moons.png'\n",
|
||
"os.system(cmd)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Other ways of visualizing the trees\n",
|
||
"\n",
|
||
"**Scikit-Learn** has also another way to visualize the trees which is very useful, here with the Iris data."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"[Text(0.5, 0.9166666666666666, 'X[2] <= 2.45\\ngini = 0.667\\nsamples = 150\\nvalue = [50, 50, 50]'),\n",
|
||
" Text(0.4230769230769231, 0.75, 'gini = 0.0\\nsamples = 50\\nvalue = [50, 0, 0]'),\n",
|
||
" Text(0.5769230769230769, 0.75, 'X[3] <= 1.75\\ngini = 0.5\\nsamples = 100\\nvalue = [0, 50, 50]'),\n",
|
||
" Text(0.3076923076923077, 0.5833333333333334, 'X[2] <= 4.95\\ngini = 0.168\\nsamples = 54\\nvalue = [0, 49, 5]'),\n",
|
||
" Text(0.15384615384615385, 0.4166666666666667, 'X[3] <= 1.65\\ngini = 0.041\\nsamples = 48\\nvalue = [0, 47, 1]'),\n",
|
||
" Text(0.07692307692307693, 0.25, 'gini = 0.0\\nsamples = 47\\nvalue = [0, 47, 0]'),\n",
|
||
" Text(0.23076923076923078, 0.25, 'gini = 0.0\\nsamples = 1\\nvalue = [0, 0, 1]'),\n",
|
||
" Text(0.46153846153846156, 0.4166666666666667, 'X[3] <= 1.55\\ngini = 0.444\\nsamples = 6\\nvalue = [0, 2, 4]'),\n",
|
||
" Text(0.38461538461538464, 0.25, 'gini = 0.0\\nsamples = 3\\nvalue = [0, 0, 3]'),\n",
|
||
" Text(0.5384615384615384, 0.25, 'X[2] <= 5.45\\ngini = 0.444\\nsamples = 3\\nvalue = [0, 2, 1]'),\n",
|
||
" Text(0.46153846153846156, 0.08333333333333333, 'gini = 0.0\\nsamples = 2\\nvalue = [0, 2, 0]'),\n",
|
||
" Text(0.6153846153846154, 0.08333333333333333, 'gini = 0.0\\nsamples = 1\\nvalue = [0, 0, 1]'),\n",
|
||
" Text(0.8461538461538461, 0.5833333333333334, 'X[2] <= 4.85\\ngini = 0.043\\nsamples = 46\\nvalue = [0, 1, 45]'),\n",
|
||
" Text(0.7692307692307693, 0.4166666666666667, 'X[1] <= 3.1\\ngini = 0.444\\nsamples = 3\\nvalue = [0, 1, 2]'),\n",
|
||
" Text(0.6923076923076923, 0.25, 'gini = 0.0\\nsamples = 2\\nvalue = [0, 0, 2]'),\n",
|
||
" Text(0.8461538461538461, 0.25, 'gini = 0.0\\nsamples = 1\\nvalue = [0, 1, 0]'),\n",
|
||
" Text(0.9230769230769231, 0.4166666666666667, 'gini = 0.0\\nsamples = 43\\nvalue = [0, 0, 43]')]"
|
||
]
|
||
},
|
||
"execution_count": 4,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 640x480 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter6_24_1.png"
|
||
}
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"from sklearn.datasets import load_iris\n",
|
||
"from sklearn import tree\n",
|
||
"X, y = load_iris(return_X_y=True)\n",
|
||
"tree_clf = tree.DecisionTreeClassifier()\n",
|
||
"tree_clf = tree_clf.fit(X, y)\n",
|
||
"# and then plot the tree\n",
|
||
"tree.plot_tree(tree_clf)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Alternatively, the tree can also be exported in textual format with the function exporttext.\n",
|
||
"This method doesn’t require the installation of external libraries and is more compact:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 5,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"|--- petal width (cm) <= 0.80\n",
|
||
"| |--- class: 0\n",
|
||
"|--- petal width (cm) > 0.80\n",
|
||
"| |--- petal width (cm) <= 1.75\n",
|
||
"| | |--- class: 1\n",
|
||
"| |--- petal width (cm) > 1.75\n",
|
||
"| | |--- class: 2\n",
|
||
"\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"from sklearn.datasets import load_iris\n",
|
||
"from sklearn.tree import DecisionTreeClassifier\n",
|
||
"from sklearn.tree import export_text\n",
|
||
"iris = load_iris()\n",
|
||
"decision_tree = DecisionTreeClassifier(random_state=0, max_depth=2)\n",
|
||
"decision_tree = decision_tree.fit(iris.data, iris.target)\n",
|
||
"r = export_text(decision_tree, feature_names=iris['feature_names'])\n",
|
||
"print(r)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Algorithms for Setting up Decision Trees\n",
|
||
"\n",
|
||
"Two algorithms stand out in the set up of decision trees:\n",
|
||
"1. The CART (Classification And Regression Tree) algorithm for both classification and regression\n",
|
||
"\n",
|
||
"2. The ID3 algorithm based on the computation of the information gain for classification\n",
|
||
"\n",
|
||
"We discuss both algorithms with applications here. The popular library\n",
|
||
"**Scikit-Learn** uses the CART algorithm. For classification problems\n",
|
||
"you can use either the **gini** index or the **entropy** to split a tree\n",
|
||
"in two branches.\n",
|
||
"\n",
|
||
"### The CART algorithm for Classification\n",
|
||
"\n",
|
||
"For classification, the CART algorithm splits the data set in two subsets using a single feature $k$ and a threshold $t_k$.\n",
|
||
"This could be for example a threshold set by a number below a certain circumference of a malign tumor.\n",
|
||
"\n",
|
||
"How do we find these two quantities?\n",
|
||
"We search for the pair $(k,t_k)$ that produces the purest subset using for example the **gini** factor $G$.\n",
|
||
"The cost function it tries to minimize is then"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"C(k,t_k) = \\frac{m_{\\mathrm{left}}}{m}G_{\\mathrm{left}}+ \\frac{m_{\\mathrm{right}}}{m}G_{\\mathrm{right}},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $G_{\\mathrm{left/right}}$ measures the impurity of the left/right subset and $m_{\\mathrm{left/right}}$\n",
|
||
" is the number of instances in the left/right subset\n",
|
||
"\n",
|
||
"Once it has successfully split the training set in two, it splits the subsets using the same logic, then the subsubsets\n",
|
||
"and so on, recursively. It stops recursing once it reaches the maximum depth (defined by the\n",
|
||
"$max\\_depth$ hyperparameter), or if it cannot find a split that will reduce impurity. A few other\n",
|
||
"hyperparameters control additional stopping conditions such as the $min\\_samples\\_split$,\n",
|
||
"$min\\_samples\\_leaf$, $min\\_weight\\_fraction\\_leaf$, and $max\\_leaf\\_nodes$.\n",
|
||
"\n",
|
||
"\n",
|
||
"### The CART algorithm for Regression\n",
|
||
"\n",
|
||
"The CART algorithm for regression works is similar to the one for classification except that instead of trying to split the\n",
|
||
"training set in a way that minimizes say the **gini** or **entropy** impurity, it now tries to split the training set in a way that minimizes our well-known mean-squared error (MSE). The cost function is now"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"C(k,t_k) = \\frac{m_{\\mathrm{left}}}{m}\\mathrm{MSE}_{\\mathrm{left}}+ \\frac{m_{\\mathrm{right}}}{m}\\mathrm{MSE}_{\\mathrm{right}}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Here the MSE for a specific node is defined as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\mathrm{MSE}_{\\mathrm{node}}=\\frac{1}{m_\\mathrm{node}}\\sum_{i\\in \\mathrm{node}}(\\overline{y}_{\\mathrm{node}}-y_i)^2,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"with"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\overline{y}_{\\mathrm{node}}=\\frac{1}{m_\\mathrm{node}}\\sum_{i\\in \\mathrm{node}}y_i,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"the mean value of all observations in a specific node.\n",
|
||
"\n",
|
||
"Without any regularization, the regression task for decision trees, \n",
|
||
"just like for classification tasks, is prone to overfitting.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"### Computing the Gini index\n",
|
||
"\n",
|
||
"The example we will look at is a classical one in many Machine\n",
|
||
"Learning applications. Based on various meteorological features, we\n",
|
||
"have several so-called attributes which decide whether we at the end\n",
|
||
"will do some outdoor activity like skiing, going for a bike ride etc\n",
|
||
"etc. The table here contains the feautures **outlook**, **temperature**,\n",
|
||
"**humidity** and **wind**. The target or output is whether we ride\n",
|
||
"(True=1) or whether we do something else that day (False=0). The\n",
|
||
"attributes for each feature are then sunny, overcast and rain for the\n",
|
||
"outlook, hot, cold and mild for temperature, high and normal for\n",
|
||
"humidity and weak and strong for wind.\n",
|
||
"\n",
|
||
"The table here summarizes the various attributes and\n",
|
||
"<table border=\"1\">\n",
|
||
"<thead>\n",
|
||
"<tr><th align=\"center\">Day</th> <th align=\"center\">Outlook </th> <th align=\"center\">Temperature</th> <th align=\"center\">Humidity</th> <th align=\"center\"> Wind </th> <th align=\"center\">Ride</th> </tr>\n",
|
||
"</thead>\n",
|
||
"<tbody>\n",
|
||
"<tr><td align=\"center\"> 1 </td> <td align=\"center\"> Sunny </td> <td align=\"center\"> Hot </td> <td align=\"center\"> High </td> <td align=\"center\"> Weak </td> <td align=\"center\"> 0 </td> </tr>\n",
|
||
"<tr><td align=\"center\"> 2 </td> <td align=\"center\"> Sunny </td> <td align=\"center\"> Hot </td> <td align=\"center\"> High </td> <td align=\"center\"> Strong </td> <td align=\"center\"> 1 </td> </tr>\n",
|
||
"<tr><td align=\"center\"> 3 </td> <td align=\"center\"> Overcast </td> <td align=\"center\"> Hot </td> <td align=\"center\"> High </td> <td align=\"center\"> Weak </td> <td align=\"center\"> 1 </td> </tr>\n",
|
||
"<tr><td align=\"center\"> 4 </td> <td align=\"center\"> Rain </td> <td align=\"center\"> Mild </td> <td align=\"center\"> High </td> <td align=\"center\"> Weak </td> <td align=\"center\"> 1 </td> </tr>\n",
|
||
"<tr><td align=\"center\"> 5 </td> <td align=\"center\"> Rain </td> <td align=\"center\"> Cool </td> <td align=\"center\"> Normal </td> <td align=\"center\"> Weak </td> <td align=\"center\"> 1 </td> </tr>\n",
|
||
"<tr><td align=\"center\"> 6 </td> <td align=\"center\"> Rain </td> <td align=\"center\"> Cool </td> <td align=\"center\"> Normal </td> <td align=\"center\"> Strong </td> <td align=\"center\"> 0 </td> </tr>\n",
|
||
"<tr><td align=\"center\"> 7 </td> <td align=\"center\"> Overcast </td> <td align=\"center\"> Cool </td> <td align=\"center\"> Normal </td> <td align=\"center\"> Strong </td> <td align=\"center\"> 1 </td> </tr>\n",
|
||
"<tr><td align=\"center\"> 8 </td> <td align=\"center\"> Sunny </td> <td align=\"center\"> Mild </td> <td align=\"center\"> High </td> <td align=\"center\"> Weak </td> <td align=\"center\"> 0 </td> </tr>\n",
|
||
"<tr><td align=\"center\"> 9 </td> <td align=\"center\"> Sunny </td> <td align=\"center\"> Cool </td> <td align=\"center\"> Normal </td> <td align=\"center\"> Weak </td> <td align=\"center\"> 1 </td> </tr>\n",
|
||
"<tr><td align=\"center\"> 10 </td> <td align=\"center\"> Rain </td> <td align=\"center\"> Mild </td> <td align=\"center\"> Normal </td> <td align=\"center\"> Weak </td> <td align=\"center\"> 1 </td> </tr>\n",
|
||
"<tr><td align=\"center\"> 11 </td> <td align=\"center\"> Sunny </td> <td align=\"center\"> Mild </td> <td align=\"center\"> Normal </td> <td align=\"center\"> Strong </td> <td align=\"center\"> 1 </td> </tr>\n",
|
||
"<tr><td align=\"center\"> 12 </td> <td align=\"center\"> Overcast </td> <td align=\"center\"> Mild </td> <td align=\"center\"> High </td> <td align=\"center\"> Strong </td> <td align=\"center\"> 1 </td> </tr>\n",
|
||
"<tr><td align=\"center\"> 13 </td> <td align=\"center\"> Overcast </td> <td align=\"center\"> Hot </td> <td align=\"center\"> Normal </td> <td align=\"center\"> Weak </td> <td align=\"center\"> 1 </td> </tr>\n",
|
||
"<tr><td align=\"center\"> 14 </td> <td align=\"center\"> Rain </td> <td align=\"center\"> Mild </td> <td align=\"center\"> High </td> <td align=\"center\"> Strong </td> <td align=\"center\"> 0 </td> </tr>\n",
|
||
"</tbody>\n",
|
||
"</table>\n",
|
||
"\n",
|
||
"### Simple Python Code to read in Data and perform Classification"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 6,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"ename": "FileNotFoundError",
|
||
"evalue": "[Errno 2] No such file or directory: 'DataFiles/rideclass.csv'",
|
||
"output_type": "error",
|
||
"traceback": [
|
||
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
||
"\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)",
|
||
"Input \u001b[0;32mIn [6]\u001b[0m, in \u001b[0;36m<cell line: 37>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 34\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21msave_fig\u001b[39m(fig_id):\n\u001b[1;32m 35\u001b[0m plt\u001b[38;5;241m.\u001b[39msavefig(image_path(fig_id) \u001b[38;5;241m+\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m.png\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28mformat\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mpng\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m---> 37\u001b[0m infile \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mopen\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mdata_path\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mrideclass.csv\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mr\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 39\u001b[0m \u001b[38;5;66;03m# Read the experimental data with Pandas\u001b[39;00m\n\u001b[1;32m 40\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mIPython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdisplay\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m display\n",
|
||
"\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'DataFiles/rideclass.csv'"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# Common imports\n",
|
||
"import numpy as np\n",
|
||
"import pandas as pd\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"from sklearn.tree import DecisionTreeClassifier\n",
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"from sklearn.tree import export_graphviz\n",
|
||
"from sklearn.preprocessing import StandardScaler, OneHotEncoder\n",
|
||
"from sklearn.compose import ColumnTransformer\n",
|
||
"from IPython.display import Image \n",
|
||
"from pydot import graph_from_dot_data\n",
|
||
"import os\n",
|
||
"\n",
|
||
"# Where to save the figures and data files\n",
|
||
"PROJECT_ROOT_DIR = \"Results\"\n",
|
||
"FIGURE_ID = \"Results/FigureFiles\"\n",
|
||
"DATA_ID = \"DataFiles/\"\n",
|
||
"\n",
|
||
"if not os.path.exists(PROJECT_ROOT_DIR):\n",
|
||
" os.mkdir(PROJECT_ROOT_DIR)\n",
|
||
"\n",
|
||
"if not os.path.exists(FIGURE_ID):\n",
|
||
" os.makedirs(FIGURE_ID)\n",
|
||
"\n",
|
||
"if not os.path.exists(DATA_ID):\n",
|
||
" os.makedirs(DATA_ID)\n",
|
||
"\n",
|
||
"def image_path(fig_id):\n",
|
||
" return os.path.join(FIGURE_ID, fig_id)\n",
|
||
"\n",
|
||
"def data_path(dat_id):\n",
|
||
" return os.path.join(DATA_ID, dat_id)\n",
|
||
"\n",
|
||
"def save_fig(fig_id):\n",
|
||
" plt.savefig(image_path(fig_id) + \".png\", format='png')\n",
|
||
"\n",
|
||
"infile = open(data_path(\"rideclass.csv\"),'r')\n",
|
||
"\n",
|
||
"# Read the experimental data with Pandas\n",
|
||
"from IPython.display import display\n",
|
||
"ridedata = pd.read_csv(infile,names = ('Outlook','Temperature','Humidity','Wind','Ride'))\n",
|
||
"ridedata = pd.DataFrame(ridedata)\n",
|
||
"\n",
|
||
"# Features and targets\n",
|
||
"X = ridedata.loc[:, ridedata.columns != 'Ride'].values\n",
|
||
"y = ridedata.loc[:, ridedata.columns == 'Ride'].values\n",
|
||
"\n",
|
||
"# Create the encoder.\n",
|
||
"encoder = OneHotEncoder(handle_unknown=\"ignore\")\n",
|
||
"# Assume for simplicity all features are categorical.\n",
|
||
"encoder.fit(X) \n",
|
||
"# Apply the encoder.\n",
|
||
"X = encoder.transform(X)\n",
|
||
"print(X)\n",
|
||
"# Then do a Classification tree\n",
|
||
"tree_clf = DecisionTreeClassifier(max_depth=2)\n",
|
||
"tree_clf.fit(X, y)\n",
|
||
"print(\"Train set accuracy with Decision Tree: {:.2f}\".format(tree_clf.score(X,y)))\n",
|
||
"#transfer to a decision tree graph\n",
|
||
"export_graphviz(\n",
|
||
" tree_clf,\n",
|
||
" out_file=\"DataFiles/ride.dot\",\n",
|
||
" rounded=True,\n",
|
||
" filled=True\n",
|
||
")\n",
|
||
"cmd = 'dot -Tpng DataFiles/cancer.dot -o DataFiles/cancer.png'\n",
|
||
"os.system(cmd)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The above functions (gini, entropy and misclassification error) are\n",
|
||
"important components of the so-called CART algorithm. We will discuss\n",
|
||
"this algorithm below after we have discussed the information gain\n",
|
||
"algorithm ID3.\n",
|
||
"\n",
|
||
"In the example here we have converted all our attributes into numerical values $0,1,2$ etc."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Split a dataset based on an attribute and an attribute value\n",
|
||
"def test_split(index, value, dataset):\n",
|
||
"\tleft, right = list(), list()\n",
|
||
"\tfor row in dataset:\n",
|
||
"\t\tif row[index] < value:\n",
|
||
"\t\t\tleft.append(row)\n",
|
||
"\t\telse:\n",
|
||
"\t\t\tright.append(row)\n",
|
||
"\treturn left, right\n",
|
||
" \n",
|
||
"# Calculate the Gini index for a split dataset\n",
|
||
"def gini_index(groups, classes):\n",
|
||
"\t# count all samples at split point\n",
|
||
"\tn_instances = float(sum([len(group) for group in groups]))\n",
|
||
"\t# sum weighted Gini index for each group\n",
|
||
"\tgini = 0.0\n",
|
||
"\tfor group in groups:\n",
|
||
"\t\tsize = float(len(group))\n",
|
||
"\t\t# avoid divide by zero\n",
|
||
"\t\tif size == 0:\n",
|
||
"\t\t\tcontinue\n",
|
||
"\t\tscore = 0.0\n",
|
||
"\t\t# score the group based on the score for each class\n",
|
||
"\t\tfor class_val in classes:\n",
|
||
"\t\t\tp = [row[-1] for row in group].count(class_val) / size\n",
|
||
"\t\t\tscore += p * p\n",
|
||
"\t\t# weight the group score by its relative size\n",
|
||
"\t\tgini += (1.0 - score) * (size / n_instances)\n",
|
||
"\treturn gini\n",
|
||
"\n",
|
||
"# Select the best split point for a dataset\n",
|
||
"def get_split(dataset):\n",
|
||
"\tclass_values = list(set(row[-1] for row in dataset))\n",
|
||
"\tb_index, b_value, b_score, b_groups = 999, 999, 999, None\n",
|
||
"\tfor index in range(len(dataset[0])-1):\n",
|
||
"\t\tfor row in dataset:\n",
|
||
"\t\t\tgroups = test_split(index, row[index], dataset)\n",
|
||
"\t\t\tgini = gini_index(groups, class_values)\n",
|
||
"\t\t\tprint('X%d < %.3f Gini=%.3f' % ((index+1), row[index], gini))\n",
|
||
"\t\t\tif gini < b_score:\n",
|
||
"\t\t\t\tb_index, b_value, b_score, b_groups = index, row[index], gini, groups\n",
|
||
"\treturn {'index':b_index, 'value':b_value, 'groups':b_groups}\n",
|
||
" \n",
|
||
"dataset = [[0,0,0,0,0],\n",
|
||
" [0,0,0,1,1],\n",
|
||
" [1,0,0,0,1],\n",
|
||
" [2,1,0,0,1],\n",
|
||
" [2,2,1,0,1],\n",
|
||
" [2,2,1,1,0],\n",
|
||
" [1,2,1,1,1],\n",
|
||
" [0,1,0,0,0],\n",
|
||
" [0,2,1,0,1],\n",
|
||
" [2,1,1,0,1],\n",
|
||
" [0,1,1,1,1],\n",
|
||
" [1,1,0,1,1],\n",
|
||
" [1,0,1,0,1],\n",
|
||
" [2,1,0,1,0]]\n",
|
||
"\n",
|
||
"split = get_split(dataset)\n",
|
||
"print('Split: [X%d < %.3f]' % ((split['index']+1), split['value']))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Entropy and the ID3 algorithm\n",
|
||
"\n",
|
||
"The ID3 algorithm learns decision trees by constructing\n",
|
||
"them in a top down way, beginning with the question **which attribute should be tested at the root of the tree**?\n",
|
||
"\n",
|
||
"1. Each instance attribute is evaluated using a statistical test to determine how well it alone classifies the training examples.\n",
|
||
"\n",
|
||
"2. The best attribute is selected and used as the test at the root node of the tree.\n",
|
||
"\n",
|
||
"3. A descendant of the root node is then created for each possible value of this attribute.\n",
|
||
"\n",
|
||
"4. Training examples are sorted to the appropriate descendant node.\n",
|
||
"\n",
|
||
"5. The entire process is then repeated using the training examples associated with each descendant node to select the best attribute to test at that point in the tree.\n",
|
||
"\n",
|
||
"6. This forms a greedy search for an acceptable decision tree, in which the algorithm never backtracks to reconsider earlier choices. \n",
|
||
"\n",
|
||
"The ID3 algorithm selects which attribute to test at each node in the\n",
|
||
"tree.\n",
|
||
"\n",
|
||
"We would like to select the attribute that is most useful for classifying\n",
|
||
"examples.\n",
|
||
"\n",
|
||
"What is a good quantitative measure of the worth of an attribute?\n",
|
||
"\n",
|
||
"Information gain measures how well a given attribute separates the\n",
|
||
"training examples according to their target classification.\n",
|
||
"\n",
|
||
"The ID3 algorithm uses this information gain measure to select among the candidate\n",
|
||
"attributes at each step while growing the tree.\n",
|
||
"\n",
|
||
"\n",
|
||
"### Cancer Data again now with Decision Trees and other Methods"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"import matplotlib.pyplot as plt\n",
|
||
"import numpy as np\n",
|
||
"from sklearn.model_selection import train_test_split \n",
|
||
"from sklearn.datasets import load_breast_cancer\n",
|
||
"from sklearn.svm import SVC\n",
|
||
"from sklearn.linear_model import LogisticRegression\n",
|
||
"from sklearn.tree import DecisionTreeClassifier\n",
|
||
"\n",
|
||
"# Load the data\n",
|
||
"cancer = load_breast_cancer()\n",
|
||
"\n",
|
||
"X_train, X_test, y_train, y_test = train_test_split(cancer.data,cancer.target,random_state=0)\n",
|
||
"print(X_train.shape)\n",
|
||
"print(X_test.shape)\n",
|
||
"# Logistic Regression\n",
|
||
"logreg = LogisticRegression(solver='lbfgs')\n",
|
||
"logreg.fit(X_train, y_train)\n",
|
||
"print(\"Test set accuracy with Logistic Regression: {:.2f}\".format(logreg.score(X_test,y_test)))\n",
|
||
"# Support vector machine\n",
|
||
"svm = SVC(gamma='auto', C=100)\n",
|
||
"svm.fit(X_train, y_train)\n",
|
||
"print(\"Test set accuracy with SVM: {:.2f}\".format(svm.score(X_test,y_test)))\n",
|
||
"# Decision Trees\n",
|
||
"deep_tree_clf = DecisionTreeClassifier(max_depth=None)\n",
|
||
"deep_tree_clf.fit(X_train, y_train)\n",
|
||
"print(\"Test set accuracy with Decision Trees: {:.2f}\".format(deep_tree_clf.score(X_test,y_test)))\n",
|
||
"#now scale the data\n",
|
||
"from sklearn.preprocessing import StandardScaler\n",
|
||
"scaler = StandardScaler()\n",
|
||
"scaler.fit(X_train)\n",
|
||
"X_train_scaled = scaler.transform(X_train)\n",
|
||
"X_test_scaled = scaler.transform(X_test)\n",
|
||
"# Logistic Regression\n",
|
||
"logreg.fit(X_train_scaled, y_train)\n",
|
||
"print(\"Test set accuracy Logistic Regression with scaled data: {:.2f}\".format(logreg.score(X_test_scaled,y_test)))\n",
|
||
"# Support Vector Machine\n",
|
||
"svm.fit(X_train_scaled, y_train)\n",
|
||
"print(\"Test set accuracy SVM with scaled data: {:.2f}\".format(logreg.score(X_test_scaled,y_test)))\n",
|
||
"# Decision Trees\n",
|
||
"deep_tree_clf.fit(X_train_scaled, y_train)\n",
|
||
"print(\"Test set accuracy with Decision Trees and scaled data: {:.2f}\".format(deep_tree_clf.score(X_test_scaled,y_test)))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Another example, the moons again"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"from __future__ import division, print_function, unicode_literals\n",
|
||
"\n",
|
||
"# Common imports\n",
|
||
"import numpy as np\n",
|
||
"import os\n",
|
||
"\n",
|
||
"# to make this notebook's output stable across runs\n",
|
||
"np.random.seed(42)\n",
|
||
"\n",
|
||
"# To plot pretty figures\n",
|
||
"import matplotlib\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"from matplotlib.colors import ListedColormap\n",
|
||
"plt.rcParams['axes.labelsize'] = 14\n",
|
||
"plt.rcParams['xtick.labelsize'] = 12\n",
|
||
"plt.rcParams['ytick.labelsize'] = 12\n",
|
||
"\n",
|
||
"\n",
|
||
"from sklearn.svm import SVC\n",
|
||
"from sklearn import datasets\n",
|
||
"from sklearn.tree import DecisionTreeClassifier\n",
|
||
"from sklearn.datasets import make_moons\n",
|
||
"from sklearn.tree import export_graphviz\n",
|
||
"\n",
|
||
"Xm, ym = make_moons(n_samples=100, noise=0.25, random_state=53)\n",
|
||
"\n",
|
||
"deep_tree_clf1 = DecisionTreeClassifier(random_state=42)\n",
|
||
"deep_tree_clf2 = DecisionTreeClassifier(min_samples_leaf=4, random_state=42)\n",
|
||
"deep_tree_clf1.fit(Xm, ym)\n",
|
||
"deep_tree_clf2.fit(Xm, ym)\n",
|
||
"\n",
|
||
"\n",
|
||
"def plot_decision_boundary(clf, X, y, axes=[0, 7.5, 0, 3], iris=True, legend=False, plot_training=True):\n",
|
||
" x1s = np.linspace(axes[0], axes[1], 100)\n",
|
||
" x2s = np.linspace(axes[2], axes[3], 100)\n",
|
||
" x1, x2 = np.meshgrid(x1s, x2s)\n",
|
||
" X_new = np.c_[x1.ravel(), x2.ravel()]\n",
|
||
" y_pred = clf.predict(X_new).reshape(x1.shape)\n",
|
||
" custom_cmap = ListedColormap(['#fafab0','#9898ff','#a0faa0'])\n",
|
||
" plt.contourf(x1, x2, y_pred, alpha=0.3, cmap=custom_cmap)\n",
|
||
" if not iris:\n",
|
||
" custom_cmap2 = ListedColormap(['#7d7d58','#4c4c7f','#507d50'])\n",
|
||
" plt.contour(x1, x2, y_pred, cmap=custom_cmap2, alpha=0.8)\n",
|
||
" if plot_training:\n",
|
||
" plt.plot(X[:, 0][y==0], X[:, 1][y==0], \"yo\", label=\"Iris-Setosa\")\n",
|
||
" plt.plot(X[:, 0][y==1], X[:, 1][y==1], \"bs\", label=\"Iris-Versicolor\")\n",
|
||
" plt.plot(X[:, 0][y==2], X[:, 1][y==2], \"g^\", label=\"Iris-Virginica\")\n",
|
||
" plt.axis(axes)\n",
|
||
" if iris:\n",
|
||
" plt.xlabel(\"Petal length\", fontsize=14)\n",
|
||
" plt.ylabel(\"Petal width\", fontsize=14)\n",
|
||
" else:\n",
|
||
" plt.xlabel(r\"$x_1$\", fontsize=18)\n",
|
||
" plt.ylabel(r\"$x_2$\", fontsize=18, rotation=0)\n",
|
||
" if legend:\n",
|
||
" plt.legend(loc=\"lower right\", fontsize=14)\n",
|
||
"plt.figure(figsize=(11, 4))\n",
|
||
"plt.subplot(121)\n",
|
||
"plot_decision_boundary(deep_tree_clf1, Xm, ym, axes=[-1.5, 2.5, -1, 1.5], iris=False)\n",
|
||
"plt.title(\"No restrictions\", fontsize=16)\n",
|
||
"plt.subplot(122)\n",
|
||
"plot_decision_boundary(deep_tree_clf2, Xm, ym, axes=[-1.5, 2.5, -1, 1.5], iris=False)\n",
|
||
"plt.title(\"min_samples_leaf = {}\".format(deep_tree_clf2.min_samples_leaf), fontsize=14)\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"np.random.seed(6)\n",
|
||
"Xs = np.random.rand(100, 2) - 0.5\n",
|
||
"ys = (Xs[:, 0] > 0).astype(np.float32) * 2\n",
|
||
"\n",
|
||
"angle = np.pi/4\n",
|
||
"rotation_matrix = np.array([[np.cos(angle), -np.sin(angle)], [np.sin(angle), np.cos(angle)]])\n",
|
||
"Xsr = Xs.dot(rotation_matrix)\n",
|
||
"\n",
|
||
"tree_clf_s = DecisionTreeClassifier(random_state=42)\n",
|
||
"tree_clf_s.fit(Xs, ys)\n",
|
||
"tree_clf_sr = DecisionTreeClassifier(random_state=42)\n",
|
||
"tree_clf_sr.fit(Xsr, ys)\n",
|
||
"\n",
|
||
"plt.figure(figsize=(11, 4))\n",
|
||
"plt.subplot(121)\n",
|
||
"plot_decision_boundary(tree_clf_s, Xs, ys, axes=[-0.7, 0.7, -0.7, 0.7], iris=False)\n",
|
||
"plt.subplot(122)\n",
|
||
"plot_decision_boundary(tree_clf_sr, Xsr, ys, axes=[-0.7, 0.7, -0.7, 0.7], iris=False)\n",
|
||
"\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Quadratic training set + noise\n",
|
||
"np.random.seed(42)\n",
|
||
"m = 200\n",
|
||
"X = np.random.rand(m, 1)\n",
|
||
"y = 4 * (X - 0.5) ** 2\n",
|
||
"y = y + np.random.randn(m, 1) / 10"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"from sklearn.tree import DecisionTreeRegressor\n",
|
||
"\n",
|
||
"tree_reg = DecisionTreeRegressor(max_depth=2, random_state=42)\n",
|
||
"tree_reg.fit(X, y)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"from sklearn.tree import DecisionTreeRegressor\n",
|
||
"\n",
|
||
"tree_reg1 = DecisionTreeRegressor(random_state=42, max_depth=2)\n",
|
||
"tree_reg2 = DecisionTreeRegressor(random_state=42, max_depth=3)\n",
|
||
"tree_reg1.fit(X, y)\n",
|
||
"tree_reg2.fit(X, y)\n",
|
||
"\n",
|
||
"def plot_regression_predictions(tree_reg, X, y, axes=[0, 1, -0.2, 1], ylabel=\"$y$\"):\n",
|
||
" x1 = np.linspace(axes[0], axes[1], 500).reshape(-1, 1)\n",
|
||
" y_pred = tree_reg.predict(x1)\n",
|
||
" plt.axis(axes)\n",
|
||
" plt.xlabel(\"$x_1$\", fontsize=18)\n",
|
||
" if ylabel:\n",
|
||
" plt.ylabel(ylabel, fontsize=18, rotation=0)\n",
|
||
" plt.plot(X, y, \"b.\")\n",
|
||
" plt.plot(x1, y_pred, \"r.-\", linewidth=2, label=r\"$\\hat{y}$\")\n",
|
||
"\n",
|
||
"plt.figure(figsize=(11, 4))\n",
|
||
"plt.subplot(121)\n",
|
||
"plot_regression_predictions(tree_reg1, X, y)\n",
|
||
"for split, style in ((0.1973, \"k-\"), (0.0917, \"k--\"), (0.7718, \"k--\")):\n",
|
||
" plt.plot([split, split], [-0.2, 1], style, linewidth=2)\n",
|
||
"plt.text(0.21, 0.65, \"Depth=0\", fontsize=15)\n",
|
||
"plt.text(0.01, 0.2, \"Depth=1\", fontsize=13)\n",
|
||
"plt.text(0.65, 0.8, \"Depth=1\", fontsize=13)\n",
|
||
"plt.legend(loc=\"upper center\", fontsize=18)\n",
|
||
"plt.title(\"max_depth=2\", fontsize=14)\n",
|
||
"\n",
|
||
"plt.subplot(122)\n",
|
||
"plot_regression_predictions(tree_reg2, X, y, ylabel=None)\n",
|
||
"for split, style in ((0.1973, \"k-\"), (0.0917, \"k--\"), (0.7718, \"k--\")):\n",
|
||
" plt.plot([split, split], [-0.2, 1], style, linewidth=2)\n",
|
||
"for split in (0.0458, 0.1298, 0.2873, 0.9040):\n",
|
||
" plt.plot([split, split], [-0.2, 1], \"k:\", linewidth=1)\n",
|
||
"plt.text(0.3, 0.5, \"Depth=2\", fontsize=13)\n",
|
||
"plt.title(\"max_depth=3\", fontsize=14)\n",
|
||
"\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"tree_reg1 = DecisionTreeRegressor(random_state=42)\n",
|
||
"tree_reg2 = DecisionTreeRegressor(random_state=42, min_samples_leaf=10)\n",
|
||
"tree_reg1.fit(X, y)\n",
|
||
"tree_reg2.fit(X, y)\n",
|
||
"\n",
|
||
"x1 = np.linspace(0, 1, 500).reshape(-1, 1)\n",
|
||
"y_pred1 = tree_reg1.predict(x1)\n",
|
||
"y_pred2 = tree_reg2.predict(x1)\n",
|
||
"\n",
|
||
"plt.figure(figsize=(11, 4))\n",
|
||
"\n",
|
||
"plt.subplot(121)\n",
|
||
"plt.plot(X, y, \"b.\")\n",
|
||
"plt.plot(x1, y_pred1, \"r.-\", linewidth=2, label=r\"$\\hat{y}$\")\n",
|
||
"plt.axis([0, 1, -0.2, 1.1])\n",
|
||
"plt.xlabel(\"$x_1$\", fontsize=18)\n",
|
||
"plt.ylabel(\"$y$\", fontsize=18, rotation=0)\n",
|
||
"plt.legend(loc=\"upper center\", fontsize=18)\n",
|
||
"plt.title(\"No restrictions\", fontsize=14)\n",
|
||
"\n",
|
||
"plt.subplot(122)\n",
|
||
"plt.plot(X, y, \"b.\")\n",
|
||
"plt.plot(x1, y_pred2, \"r.-\", linewidth=2, label=r\"$\\hat{y}$\")\n",
|
||
"plt.axis([0, 1, -0.2, 1.1])\n",
|
||
"plt.xlabel(\"$x_1$\", fontsize=18)\n",
|
||
"plt.title(\"min_samples_leaf={}\".format(tree_reg2.min_samples_leaf), fontsize=14)\n",
|
||
"\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Pros and cons of trees, pros\n",
|
||
"\n",
|
||
"* White box, easy to interpret model. Some people believe that decision trees more closely mirror human decision-making than do the regression and classification approaches discussed earlier (think of support vector machines)\n",
|
||
"\n",
|
||
"* Trees are very easy to explain to people. In fact, they are even easier to explain than linear regression!\n",
|
||
"\n",
|
||
"* No feature normalization needed\n",
|
||
"\n",
|
||
"* Tree models can handle both continuous and categorical data (Classification and Regression Trees)\n",
|
||
"\n",
|
||
"* Can model nonlinear relationships\n",
|
||
"\n",
|
||
"* Can model interactions between the different descriptive features\n",
|
||
"\n",
|
||
"* Trees can be displayed graphically, and are easily interpreted even by a non-expert (especially if they are small)\n",
|
||
"\n",
|
||
"### Disadvantages\n",
|
||
"\n",
|
||
"* Unfortunately, trees generally do not have the same level of predictive accuracy as some of the other regression and classification approaches\n",
|
||
"\n",
|
||
"* If continuous features are used the tree may become quite large and hence less interpretable\n",
|
||
"\n",
|
||
"* Decision trees are prone to overfit the training data and hence do not well generalize the data if no stopping criteria or improvements like pruning, boosting or bagging are implemented\n",
|
||
"\n",
|
||
"* Small changes in the data may lead to a completely different tree. This issue can be addressed by using ensemble methods like bagging, boosting or random forests\n",
|
||
"\n",
|
||
"* Unbalanced datasets where some target feature values occur much more frequently than others may lead to biased trees since the frequently occurring feature values are preferred over the less frequently occurring ones. \n",
|
||
"\n",
|
||
"* If the number of features is relatively large (high dimensional) and the number of instances is relatively low, the tree might overfit the data\n",
|
||
"\n",
|
||
"* Features with many levels may be preferred over features with less levels since for them it is *more easy* to split the dataset such that the sub datasets only contain pure target feature values. This issue can be addressed by preferring for instance the information gain ratio as splitting criteria over information gain\n",
|
||
"\n",
|
||
"However, by aggregating many decision trees, using methods like\n",
|
||
"bagging, random forests, and boosting, the predictive performance of\n",
|
||
"trees can be substantially improved."
|
||
]
|
||
}
|
||
],
|
||
"metadata": {
|
||
"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.9.10"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 4
|
||
} |