{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true, "hide_input": false }, "outputs": [], "source": [ "from preamble import *\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5. Model Evaluation and Improvement" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "X.shape: (100, 2)\n", "y.shape: (100,)\n", "Test set score: 0.88\n" ] } ], "source": [ "from sklearn.datasets import make_blobs\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn.model_selection import train_test_split\n", "\n", "# create a synthetic dataset\n", "X, y = make_blobs(random_state=0)\n", "print(\"X.shape:\", X.shape)\n", "print(\"y.shape:\", y.shape)\n", "\n", "# split data and labels into a training and a test set\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)\n", "\n", "# instantiate a model and fit it to the training set\n", "logreg = LogisticRegression().fit(X_train, y_train)\n", "\n", "# evaluate the model on the test set\n", "print(\"Test set score: {:.2f}\".format(logreg.score(X_test, y_test)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.1 Cross-Validation\n", "- 교차 검증\n", " - 데이터를 여러 번 반복해서 나누어 모델 학습\n", "- K-Fold cross-vailidation\n", " - Fold: 원본 데이터에 대한 부분 집합\n", " - K로는 5나 10을 주로 사용\n", " - 첫번째 모델은 첫번째 fold를 테스트 데이터로 사용하고 나머지를 훈련 데이터로 사용\n", " - 두번째 모델은 두번째 fold를 테스트 데이터로 사용하고 나머지를 훈련 데이터로 사용\n", " - 세번째 모델은..." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false, "hide_input": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2.1.2\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA2gAAACqCAYAAADY3mwfAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzt3X+cXHV97/HXm2zILgZJIfIjChIB8SJgChGKtZKtqFcL1LZGBGqDLeVqtRpa1La2sFKt+ONaLiDFWPlhQcCgvZdCUWrdSEHEBgjhh0BTAiLkB4EiCdlNsuFz/zhn6GHZ2Tm7e2bmO8z7+XjMY8/Mec+Zz2a+j3Py2fNLEYGZmZmZmZm13w7tLsDMzMzMzMwybtDMzMzMzMwS4QbNzMzMzMwsEW7QzMzMzMzMEuEGzczMzMzMLBFu0MzMzMzMzBLhBs3MzMzMzCwRbtDMzGzCJC2TdGo+fbKkG8tkJ/E5+0jaJGnaZGs1MzPrJG7QzMxsSiLiioh4exXLkvSwpGMKy/5ZRMyMiO1VLN/MzCx1btDMzBIiqafdNZiZmVn7uEEzM2sRSXtL+o6kJyQ9KekCSadIukXS30p6ChiQtIOkv5T0iKT1kr4haZd8Gb2SLs/f/7Skf5e0Rz7vFEkPSdooabWkk8epZUb+/oMLr71C0pCk3SX9kqTr8lr/K59+VZ1lnSLp5sLzt0m6X9IvJF0AqDBvP0k/yOvfIOkKSbPyef8A7AP8U35Y4yck7Sspao2rpDmSrpX0lKRVkv6wsOwBSd/K/702SrpX0vzJfVtmZmbt4QbNzKwF8nOorgMeAfYFXglclc8+EngI2B34LHBK/ugHXgPMBC7Is4uAXYC9gd2ADwJDkl4GnAe8MyJ2Bt4ErKhXT0RsAb4DnFh4+b3ADyNiPdn24RLg1WRN01ChhvF+z9nAt4G/BGYD/wn8ajECfA6YA/yP/PcYyGt6P/Az4Lj8sMYvjPERVwI/z9//HuBvJL21MP94sn/XWcC1ZWo2MzNLiRs0M7PWOIKsqfh4RDwbEcMRUdvr9HhEnB8RIxExBJwMfDkiHoqITcCfA+/L9yJtI2vM9o+I7RFxe0Q8ky/nOeBgSX0RsSYi7m1Q0zd5YYN2Uv4aEfFkRHw7IjZHxEayxvHoEr/nu4D7IuKaiNgGnAusrc2MiFUR8S8RsSUingC+XHK5SNobeDPwyfzfbwXw98D7C7GbI+Kf83PW/gF4Q5llm5mZpcINmplZa+wNPBIRI2PMe3TU8zlke9pqHgF6gD3Imo7vAVdJelzSFyRNj4hngRPI9qitkXS9pNc1qOkHQJ+kIyW9GpgH/COApJ0kfTU/zPIZ4CZgVomrKc4p/j4REcXn+eGTV0l6LF/u5WR72sqYAzyVN4w1j5DtjaxZW5jeDPT6vD4zM+skbtDMzFrjUWCfOs1CjHr+ONmhhTX7ACPAuojYFhGfjoiDyA5jPBb4PYCI+F5EvA3YC7gf+Np4BUXEc8C3yPainQRcV2h+/hQ4EDgyIl4OvCV/XS9a0AutIWtGs7Ck4nOywxsDODRf7u+OWubof4uix4FdJe1ceG0f4LEGNZmZmXUMN2hmZq3xE7Lm5RxJL8sv9vGrdbJXAqdLmitpJvA3wNURMSKpX9Ih+Z6sZ8gOedwuaQ9Jx+fnom0BNgFlLk3/TbI9byfn0zU7k5139rSkXYGzSv6e1wOvl/TbeTP6UWDPUcvdlC/3lcDHR71/Hdl5dy8SEY8CPwI+l//7HQr8AXBFydrMzMyS5wbNzKwF8nOijgP2J7sQxs/JGqOxXEx2KONNwGpgGPjjfN6ewDVkzdlPgR+SHSa4A9ler8eBp8jO6/qjEnXdBjxLdvjgDYVZ5wJ9wAbgx8B3S/6eG4CFwDnAk8ABwC2FyKeBw4BfkDVz3xm1iM8Bf5lfYfKMMT7iRLKLrDxOdjjmWRHxL2VqMzMz6wTKTg8wMzMzMzOzdvMeNDMzMzMzs0S4QTMzewmTdFF+0+fRj4vaXZuZmZm9mA9xNDMzMzMzS4T3oJmZmZmZmSXCDZqZmZmZmVki3KCZmZmZmZklwg2amZmZmZlZItygmZmZmZmZJcINmpmZmZmZWSJ62l1Aq02fPn3tyMjIHu2uw1qrp6dn/bZt2/YA6OvrWzs8POwx0GV6e3vXDQ0N7envv3t5DHS33t7e9UNDQ94OdLHaOqDddZg10nX3QZMUAwMDL3ht9erVLF26lIULFzJ37tyGy3C+8/KXXXYZESHIxsB4437ZsmUsXLiQpUuXsmDBgobLd74z8pKICEmK2bNnt70e51ufL46B2jqgk+p3fmr5/v7+htuBlOt3fur52jqgYdCszbr+EMcUmwnnq8+XldrGxPlq8zWp1OO8884773zr8madomkNmqRPSbpX0kpJKyQd2SA/IOmMfPpsScfk04sl7VTnPR+RtEpSSJo90RpTbSacrz5fRoobE+eryxelUI/zzjvvvPOtzZt1iqY0aJKOAo4FDouIQ4FjgEfLvj8izoyI7+dPFwNjNmjALfmyH5lojSk3E863Pp/qxsT56vITkWL9zleXB5Kqx3nnnW9N3qxTNOsiIXsBGyJiC0BEbKjNkPQwcDXQn790UkSsKr5Z0qXAdcCc/DEoaUNE9BdzEXFnnp9Qcak1B863N5/yxsT56vJlpVq/89Xka1Kpx3nnnU8nb5aKZh3ieCOwt6QHJV0o6ehR85+JiCOAC4Bz6y0kIs4DHgf6RzdnEyHpNEnLJS0HkmoOnG9vPrWNg/PNy5eRcv3OTz1flEI9zjvvfDp5s5Q0pUGLiE3A4cBpwBPA1ZJOKUSuLPw8qhk1jKpnSUTMj4j5QDLNgfPtzae2cXDeeeebm5+IFOt3vro8kFQ9zrc3b5aapt0HLSK2A8uAZZLuBhYBl9ZmF6PNqqGeFJoD59ubT23j4Lzzzjc/X1aq9TtfTb4mlXqcb2/eLEVN2YMm6UBJBxRemscLL+RxQuHnrQ0WtxHYucLyGkqtmXC+2jz4L6fOO9+N+TJSrt/5qeeLUqjH+fbmzVLVrD1oM4HzJc0CRoBVZIc71syQdBtZg3hig2UtAW6QtGb0eWiSPgp8AtgTWCnpnyPi1KkUnloz4Xy1+ZpUNg7OO++88863Jj9RqdXvfLV5s5QporVHGOZXcZxfvLJjiz8/BgYGxpyXWjPhfHX5gYEBIkKQjYEy4z61jYnzU8tLIiJU+/7bXY/zrc+PHgPtrsf51ub7+/tLbwdSrN/5qedr64CGCzRrs6Yc4tiJUmomnG/enrOyUtmYOO+88847X02+rFTrd76avFknaPketHabPn362pGRkT3aXYe11rRp054aGRnZDaCvr2/t8PCwx0CX6e3tXTc0NLRnX1/fuuHh4d3bXY+1XmEMeB3QhWrfP3g70K16e3vXDw0N+Xu35HVdg2ZmZmZmZpYqH+JoZmZmZmaWCDdoZmZmZmZmiXCDZmZmZmZmlgg3aGZmZmZmZolo2KBJ+piklyvzdUl3SHp7K4ozMzMzMzPrJmX2oP1+RDwDvB14BfAB4JymVmVmZmZmZtaFyjRotTuuvwu4JCLuKrxmZmZmZmZmFekpkbld0o3AXODPJe0MPNfcsprHN6fsTsUblPb09Dy5ffv2Xdtdk7VWT0/Pum3btvkmxV3MN6rubsWbFHsMdKfi/wXMUtbwRtWSdgDmAQ9FxNOSdgNeGRErW1Fg1SRFvd952bJlLFy4kKVLl7JgwYKGy3K+c/KSiAjl0zEwMNBw+atXr2bp0qUsXLiQuXPnOt/h+YGBASJCtXVASuPT+dbka+uBsbYDnVC/81PL9/f3v2A7MN7/f1Ks3/mp54v/FzBLWcNDHCPiOWAdcJCktwCvB2Y1ep+kT0m6V9JKSSskHdkgPyDpjHz6bEnH5NOLJe1U5z1XSHpA0j2SLpY0vVFd9aSy8nC+OfmJancz4Xxz86mNT+edd775+bJSrd/5avJmnaDhIY6SPg+cANwHbM9fDuCmcd5zFHAscFhEbJE0G9ixbFERcWbh6WLgcmDzGNErgN/Np78JnAr8XdnPqUlt5eF89fmJSK2ZcL7aPJDc+HTeeeebn+/v70+qHudbnzfrFGXOQXs3cGBEbJnAcvcCNtTeExEbajMkPQxcDdTWlCdFxKrimyVdClwHzMkfg5I2RMQL1q4R8c+F9/wEeNUEagTSW3k435x8Wak1E85Xm69JbXw677zzzjuf1h9rzdqp4SGOwEPARA8dvBHYW9KDki6UdPSo+c9ExBHABcC59RYSEecBjwP9o5uzovzQxvcD351IkSmuPJxvTr6M1JoJ56vNF6U2Pp133nnnnU/nj7Vm7VamQdsMrJD0VUnn1R7jvSEiNgGHA6cBTwBXSzqlELmy8POoiZf9IhcCN0XEv401U9JpkpZLWl57LdWVh/PtyafWTDhffX4iUhufzlebB5Kqx3nnnU/nj7VmKShziOO1+WNCImI7sAxYJuluYBFwaW12MTrRZRdJOovsBtr/a5xalgBL8nykvPJwvvX5FJsJ56vPl5Xa+HS+2nxNKvU477zz6eTNUtFwD1pEXEa2p+v2/PHN/LW6JB0o6YDCS/OARwrPTyj8vLVBCRuBnet8zqnAO4AT86tNlpLSysD59uZTbSacrz5fRmrj0/lq80Up1OO8886nkzdLSZmrOC4ALgMeBkR2btmiiLhpnLfNBM6XNAsYAVaRHe5YM0PSbWQN4okNSlgC3CBpzRjnoV1E1vjdKgngOxFxdqPfKZWVgfPtzafcTDjf+nxq49P56vMTkWL9zleXB/+x1nlrlfweyv+aP92T7KrwT+TPj4iIrSWWcQlwTkQ8ME7mw8DTEXHFFEsevdxjgI9ExLvHyRwG7B4RE7oeRt3llbhR9e1kV1p8IH/+WuDKiDh8Uh+YXcVxfvHKjq3U6OaUNamtPJyfWn70jaoXLVqUVHPgfPPzo29UXdTu8el8a/IbNmyoOwY6oX7np5YfvR0YHBzsqPqdn3reN6rOzJgx48mtW7fuWtXyent71w0NDe1ZJitpANgUEV8a9brI+pLSR8S1SskG7VTg4IhYXMVn7lAiM73YrUbEg0z8qo4dpZNWNs5P7i9lqTcTzrcun9r4dL55+TJSrt/5qeeLUqjH+fbmu9XWrVt3jQgaPQYHB5k9ezaDg4Pj5oaHh/eYTB2S9pd0j6SLgDuAvSQtyS/sd6+kMwvZmyXNk9Qj6WlJ50i6S9KtknbPM5+RtLiQP0fSTyQ9IOlN+esvk/Tt/L1X5p81b4zafiN/383AbxZe/5X8M++UdIukAyT1AWcCJ0taIek9Y+Um9I/T6MsBLga+DizIH18DLinzxab46O3tXUt2YRI/uujR29u7tjYGpk2b9mS76/Gj9Y+enp61Xgd096O2HvAY6M5Hb2/vOv9foLsfxf8LdPMDiEYGBwdj9uzZMTg42DCbL6/sZw8AZ+TT+wPPAW8szN81/9kD/BtwUP78ZrJrWvTk3+c789e/DPxZPv0ZYHEh//l8+njgu/n0nwFfyaffQHa45bxRNe4E/BzYj+z0rm8D/zeftwswLZ/+n8DV+fSpwLmFZYyZK/socxXHDwEfBj6aF3kT2WXtO1LZXbD20jUyMrJbu2uw9vE6wDwGzGPArL4W74n8z4j498LzEyX9AVkjNgc4CLhv1HuGIuKGfPp24NfqLPs7hcy++fSbgc8DRMRdku4d430HAQ9GxH8CSLoC+L183izgG5L2a/B7lc2NqWGDFhFbyLrTL0/mA8zMzMzMLH2TOax0ip6tTeSHAX6M7MIhT0u6HOgd4z3Fi4psp34/s2WMTNlzEKPO658FvhcRF0raH6h3UZCyuTHVPQdN0rfyn3dLWjn6MZEPMTMzMzOzdE32nL8KvZzs9lrPSNqL7FZaVbsZeC+ApEPI9paNdh/wWklz84uXFK84vwvwWD59SuH10bcFq5crZbyLhHws/3kscNwYDzMzMzMz63DNvgBTSXeQNUf3kF3z4pYqF547H3hlvrPpT/PP+kUxEBGbgQ8CN5CdB/dQYfbngS9KGl3bD4A35BcFec84uVLKXGb/8xHxyUavmZmZmZlZ2vr6+tZO9sqLY5nIZfbbTVIP0BMRw/khlTcCB0TESJtLe4EyDdodEXHYqNdWRsShTa3MzMzMzMysIpJmkd00u4fsfLQzIuLG9lb1YnUvEiLpQ8AfAa8Zdc7ZzjRnl6OZmZmZmVlTRMTTwOHtrqORunvQJO0C/BLwObJ7BtRsjIinWlCbmZmZmZlZV2l4iOPzwewu3c9f6jIiftasopppxowZT27dunXXdtdhrVU8PrrqY6+tM9TGwPTp09eOjIz4++9C06ZNe2pkZGQ3rwO606jtwLrh4eHd212TtVYnnStl3a3MOWjHkd0DbQ6wHng18NOIeH3zy6uepCjTlE7lajbOp5eXREQon47BwcGOqt/5qedrY0BSDAwMvCC/evVqli5dysKFC5k7d27D5TvfmfnNmzc/PwbG2w50wnh2fuL5sbYDnVS/81PPF8eAWcrGu8x+zWeAXyG7o/Zc4K28xM9B66SVjfOTu+N9SvU43958qs2E89Xny0htfDpfbb4ohXqcb2/eLFVlGrRtEfEksIOkHSJiEJjX6E2SPiXp3vzG1iskHdkgPyDpjHz6bEnH5NOLJe1U5z1fl3RX/hnXSJpZ4vcZV2orD+erzdekUo/z7c2n3Ew43/p8auPT+WrzE5Va/c5Xm7fWkbRb3guskLRW0mOF5ztOYDm/L6nhIaqS9pe0okHmNZLeV/azW63uVRwLns4bn5uAKyStB8a9V4Cko8hucH1YRGyRNBso/QVExJmFp4uBy4HNY0RPj4hn8s/8MvAR4JyynzNaaisP56vNF6VQj/PtzafWHDjf3nxq49P56vMTkWL9zleX73ZVn4vd09Ozftu2bXWXl+/omQfZDhlgU0R8aRIf9ftkN7NeO5k6R3kN8D7gqgqWVbkyDdpvAkPA6cDJwC7A2Q3esxewISK2AETEhtoMSQ8DVwP9+UsnRcSq4pslXQpcR3be2xxgUNKGiOgv5grNmYA+oNwVT8aQ2srD+WrzE5Va/c5Xm0+tOXC+vfnUxqfzzcmXlWr9zleTNxgZGdlj9LnYNZNZ31522WWTvuCOpEXAh8l25PyIbGfLDsAlZE2dgCXAuvz51ZKGgCMiYmthOW8Evg48S+FULEn7AZcCM4HngD+KiNvIdugckO9puxi4vk6uLcY9xFHSNOD/RcRzETESEZdFxHl5JzyeG4G9JT0o6UJJR4+a/0xEHAFcAJxbbyERcR7wONA/ujkr1HgJWSf9OuD8OpnTJC2XtHys+amtPJyvPj8RKdbvfHV5IKnmwPn25lMbn843L19GyvU7P/W8jW+y69vJknQw8FvAmyJiHtmOo/eR3adsdkQcEhEHA9+IiKuBFcAJETGv2JzlLgU+FBFHAdMKr68B3hYRv0y2o+m8/PU/AwbzZZ03Tq4txm3QImI7sDm/J1ppEbGJ7B/3NOAJsm73lELkysLPoyay7DE+6wNke9l+CpxQJ7MkIuZHxPzR81JbeTjfnHxZqdbvfDX5mlSaA+fbm09tfDrvvPPp/LG22zT7Akx1HAO8EVie78k6GtgPWAUcKOn/SHoH8IvxFpKfStUXEbU9Z/9QmD0D+Lqke8gOZzyozmLK5lpi3AYtNwzcnV+Q47zao9GbImJ7RCyLiLPIdlf+TnF2nelJyRvJq0d9RkMprjycb06+jJTrd37q+aIUmgPn25tPbXw677zz6fyxtts0e307DgEX53ux5kXEgRHx1/mReocCNwMfBb5aYln1+ok/BR4FDgGOIGvEppJriTIN2vXAX5FdJOT2wqMuSQdKOqDw0jzgkcLzEwo/b23w+RuBncf4DEnavzYNHAfc32BZz0t15eG88843Jz8RqTUTzlebB5Ibn84773waf6ztNm1szgC+D7w33wNWu9rjPpJeASgilgJnAYfl+TF7gvxaF8P5RQohO0SxZhdgTX7zy0VkTeFYy6qXa4uGFwmJiMsk9QH7RMQDJZc7Ezhf0iyyKz6uIjvcsWaGpNvIGsQTGyxrCXCDpDWjzkMTcJmkl+fTdwEfKlNcyisP5513vjn5slJrJpyvNl+T2vh03nnn25/vNm1uzoiIuyV9Gvi+pB2AbcAHge1khxuKbM/YJ/O3XAL8/VgXCQE+kM97luxaGDUXANdIOpGsIdySv34nME3SXWQXF6mXawtljeI4Aek44EvAjhExV9I84OyIOH5SH5hdxXF+8cqOrSQpZs+enczKwPnW5CUREcqnozbuO6V+56ee7+/vJyIkKaq8epXznZMfGBh4fgw02vZB2uPZ+YnnR28HBgcHO6p+56eeL46BbtaEy+yv27ZtW8P7k1l5ZS6zP0B2LOYygIhYIWnqbXMbpbzycN5559uTT62ZcL76/ESkNj6drzYPJFWP8+3Ndxs3U+krswfttog4UtKd+aUnkbQyIg5tSYUV6+vrWzc8PDzp+zVYZ+rt7V03NDS0J0BfX9/a4eHhyv5yZJ2hNgaq/suhdY7azVS9DuhOxe3AjBkznty6deuu7a7JWqs4BsxSVmYP2j2STiI7TvMAsqup/Ki5ZTXP0NCQN8pdzivn7ua/HJrXAbZly5bd2l2DmVk9O5TI/DHwerKT5b5Jdi+CjzWzKDMzMzMzs25U5hDHhfllLsd9zczMzMzMzKamTIN2R0Qc1ug1MzMzMzMzm5q656BJeifwLuCVks4rzHo52b3NzMzMzMzMrELjXSTkcWA5cDxwe+H1jcDpzSzKzMzMzMysG5U5xLEnIrzHzMzMzMzMrMnqNmiSvhUR75V0N/CiUAffB833v+lCvg+a7bjjjk9t2bJlN3//3atwL7x1IyMjvh9ml+np6VlXu82G1wPdyfdBs04xXoO2V0SskfTqseZHxCNNraxJJMXg4GBSd7B3vvl5SUSE8ukojvtOqN/5qec3bNhARGj0998p9Ts/9XxtPSApFi1axNy5cxsuf/Xq1SxdupSFCxc63+H5gYGBF20HUhqfzjc/X/y/gFnK6t4HLSLW5D8fGevRuhKrl/LKw3nnnW9OvoyU63d+6vmi1JsJ55ufT218Ot/evFlKytyoelIkfUrSvZJWSloh6cgG+QFJZ+TTZ0s6Jp9eLGmnBu89X9KmsrWlsjJw3nnnnXe+dfmJSK2ZcL7aPPiPtc6bpWu8qzhOmqSjgGOBwyJii6TZwI5l3x8RZxaeLgYuBzbX+az5wKyJ1JfCysB555133vnW5stKrZlwvtp8TWrj0/n25M1SVHcPmqQzJO09yeXuBWyIiC0AEbEhIh7Pl/uwpM9L+kn+2H+Mz75U0nskfRSYAwxKGhwjNw34IvCJSdY5ptRWHs5Xmwf/5dR557sxX0ZqzYTz1eaLUhufzrc+b5aqug0a8ErgR5JukvShfC9YWTcCe0t6UNKFko4eNf+ZiDgCuAA4t95CIuI8svux9UdE/xiRjwDX1s6Xq0JqKw/nq83XpFKP8847n04+tWbC+WrzE5Xa+HS+2rxZyuo2aBFxOrAP8FfAocBKSTdI+j1JO4+30IjYBBwOnAY8AVwt6ZRC5MrCz6MmU7ikOcBC4PwS2dMkLZe0fLxcaisP56vNF6VQj/POO59OPrVmwvnq8xOR2vh0vtq8WerG24NGZH4YER8C9ibb23U6sK7RgiNie0Qsi4izyPZ0/U5xdp3pifhlYH9glaSHgZ0krapTy5KImB8R8+stLLWVh/PV5icqtfqdd955N2fOTy1fVmrj0/lq82adYNwGrUbSIcDZwFeArcBfNMgfKOmAwkvzgOKl+U8o/Ly1wcdvBF60xy4iro+IPSNi34jYF9gcES86n62M1FYezlefn4gU63e+ujyQVD3OtzefajPhfPX5MlIbn85XmzfrFHWv4pg3WCcC7wO2A1cBb4+Ih0osdyZwvqRZwAiwiuxwx5oZkm4jaxBPbLCsJcANktbUOQ9tSlJbeTjfnHxZqdbvfDX5mlTqcb69+ZSbCedbn09tfDpffd6sUyhi7CMMJT1Edo7YVRFxd2UfmB2OOD8iNlS1zAl+ftR+5xRXHs43J9/f309ECF44BjqlfuennpdERKje9596/c5PPV8cA4sWLUqqOXC++fmBgYG624EUxqfzzc9v2LDh+TFglrLxDnF8B3DD6OZM0q9J2q+5ZTVfqisP5513vjn5iUixfuerywPJNxPOty6f2vh0vnl5s04x3h6064C/iIiVo16fD5wVEce1oL7K9fX1rR0eHt6j3XVYa/X29q4bGhraEzwGulVvb+/6oaGhPfz9d6/aeqCnp+fJ7du379rueqy1enp61m3bts3bgS5W/L+AWcrGa9DuiYiD68y7OyIOaWplZmZmZmZmXWa8Qxx7x5nXV3UhZmZmZmZm3W68Bu3fJf3h6Bcl/QFwe/NKMjMzMzMz607jHeK4B/CPZPc9qzVk84Edgd+KiLUtqdDMzMzMzKxL1G3Qng9I/UDtXLR7I+IHTa/KzMzMzMysCzVs0MzMzMzMzKw1xjsHzczMzMzMzFrIDZqZmZmZmVkietpdQKv55pTdqXaTYvAY6Fa1G5TOmDHjya1bt/omxV2oNga8DuhOxZsUT58+fe3IyIjHQJeZNm3aUyMjI7u1uw6zRrruHDRJUfudly1bxsKFC1m6dCkLFixo+F7nOzff399PRAheOAY6pX7np56XRESo3vefev3OTz1fHAODg4Ntr8f51uZr338+HQMDA8/nV69ezdKlS1m4cCFz585tuHznOzO/efPm58eAWcq69hDHTtiYOO+889XlJyLF+p2vLg8kVY/z7c2n2kw4X33erFM0rUGT9ClJ90paKWmFpCMb5AcknZFPny3pmHx6saSd6rznUkmr8+WvkDSvTG2pbRycd9755ufLSrV+56vJ16RSj/PtzafcTDjf+rxZKprSoEk6CjgWOCwiDgWOAR4t+/6IODMivp8/XQyM2aDlPh4R8/LHijLLT2nj4LzzzrcmX0bK9Ts/9XxRCvU43958as2B8+3Nm6WkWRcJ2QvYEBFbACJiQ22GpIeBq4H+/KWTImJV8c2ZID/8AAAI+klEQVSSLgWuA+bkj0FJGyKinwqksnFw3nnnnXe+dfmJSLF+56vLA0k1B863N2+WmmYd4ngjsLekByVdKOnoUfOfiYgjgAuAc+stJCLOAx4H+sdpzj6bH0b5t5JmjBWQdJqk5ZKWg/9y6rzzzjvfjfmyUq3f+WryNak0B863N2+WoqY0aBGxCTgcOA14Arha0imFyJWFn0dN4aP+HHgd8EZgV+CTdepZEhHzI2J+mYWmtjFxvto8kFQ9zjvvfGvyZaRcv/NTzxel0Bw43968WaqatQeNiNgeEcsi4izgI8DvFGfXmZ7oZ6yJzBbgEuCIyS6rJrWNifPV5mtSqcd555133vnW5CcqtWbC+WrzZilrSoMm6UBJBxRemgc8Unh+QuHnrQ0WtxHYuc7n7JX/FPBu4J5JFZxLbWPifLX5ohTqcd555513vnX5iUitmXC+2rxZ6pp1kZCZwPmSZgEjwCqywx1rZki6jaxBPLHBspYAN0haM8Z5aFdIegUgYAXwwckWnOLGxPnq8hOVWv3OO++8885PLV9Was2E89XmzTpBUxq0iLgdeNM4ka9ExKdHvWegMH1KYfp84Pw6n/PrUyo0l+rGxPnq8hORYv3OV5cHkqrHeeedb02+v7/xhaBTayacrzZv1imacohjJ0l5Y+J8dfmyUq3f+WryNanU47zzzqeTT62ZcL76vFmnUMSkr9HRkfr6+tYODw/v0e46rLV6e3vXDQ0N7QkeA92qt7d3/dDQ0B59fX3rhoeHd293PdZ6tfWA1wHdqbgdmD59+tqRkRGPgS7T09Ozftu2bf7eLXld16CZmZmZmZmlqusPcTQzMzMzM0uFGzQzMzMzM7NEuEEzMzMzMzNLhBu0LiPptMYpeynzGDCPAfMY6G7+/s3S5gat+3ilbB4D5jFgHgPdzd+/WcLcoJmZmZmZmSXCDZqZmZmZmVki3KB1nyXtLsDazmPAPAbMY6C7+fs3S5hvVG1mZmZmZpYI70EzMzMzMzNLhBu0DiVpu6QVhce+42QXSLquzryHJc0e4/XPSnpU0qbqqrYqNXMMSNpJ0vWS7pd0r6Rzqq3eqtCC9cB3Jd2Vj4GLJE2rrnqbqmZ//4X510q6Z+oVW9VasA5YJumBwvJ3r656M6unp90F2KQNRcS8Ji7/n4ALgP9o4mfY1DR7DHwpIgYl7Qj8q6R3RsQNTfw8m7hmj4H3RsQzkgRcAywErmri59nENPv7R9JvA/5DXbqaPgaAkyNieZM/w8wKvAftJURSr6RLJN0t6U5J/WNkdpN0Yz7/q4DGWlZE/Dgi1jS9aKtUVWMgIjZHxGA+vRW4A3hV038Bm7KK1wPP5JM9wI6AT1pOXJXfv6SZwJ8An2ly2VahKseAmbWHG7TO1Vc45OAf89c+DBARhwAnApdJ6h31vrOAmyPil4FrgX1aVrFVrSVjQNIs4DjgXyut3qrQ9DEg6XvAemAj2V40S0ezv/+/Bv43sLn60q0irdgOXJIv/6/yvelm1mQ+xLFzjXVYw5uB8wEi4n5JjwCvHZV5C/DbeeZ6Sf/V9EqtWZo+BiT1AFcC50XEQ5VVblVp+hiIiHfk/7m7Avh14F+qKt6mrGnfv6R5wP4Rcfp45zVZ2zV7HXByRDwmaWfg28D7gW9UVr2Zjcl70F5ayv5ly4cpvXRVPQaWAP8REedOsh5rvcrXAxExTPZX9t+cVEXWSlV9/0cBh0t6GLgZeK2kZVOoy1qnsnVARDyW/9wIfBM4Ygp1mVlJbtBeWm4CTgaQ9FqyQxYeGCfzTuCXWlmgNV1lY0DSZ4BdgMXNKtaaopIxIGmmpL3y6R7gXcD9zSvbKlLJ9x8RfxcRcyJiX7I9Mg9GxILmlW0Vqmod0FO7sqOk6cCxgK/madYCbtBeWi4Epkm6G7gaOCUitozKfBp4i6Q7gLcDPxtrQZK+IOnnwE6Sfi5poIl1W3UqGQOSXgV8CjgIuCM//+DU5pZuFalqPfAy4FpJK4G7yM5Du6h5ZVtFKtsOWMeqagzMAL6XrwNWAI8BX2te2WZWowgf7WZmZmZmZpYC70EzMzMzMzNLhBs0MzMzMzOzRLhBMzMzMzMzS4QbNDMzMzMzs0S4QTMzMzMzM0uEGzQzsw4kaXt++4N7Jd0l6U8kjbtOl7SvpJNaUNvfSzqoQebdjTJmZmbdyA2amVlnGoqIeRHxeuBtZDeSPqvBe/YFmt6gRcSpEXFfg9i7ye6zZ2ZmZgVu0MzMOlxErAdOAz6izL6S/k3SHfnjTXn0HODX8j1vp4+Te16euV/SZZJWSrpG0k75vLdKulPS3ZIuljQjf32ZpPn59CZJn8338v1Y0h755xwPfDGvZT9JH5V0X/4ZV7Xi383MzCxFvlG1mVkHkrQpImaOeu2/gNcBG4HnImJY0gHAlRExX9IC4IyIODbP7zRWbtQy9wVWA2+OiFskXQzcB1wA/Afw1oh4UNI3gDsi4lxJy/LPWS4pgOMj4p8kfQF4JiI+I+lS4LqIuCb/nMeBuRGxRdKsiHi6+n81MzOz9HkPmpnZS4fyn9OBr0m6G1hK/UMJy+YejYhb8unLgTcDBwKrI+LB/PXLgLeM8d6twHX59O1kh1mOZSVwhaTfBUbqZMzMzF7y3KCZmb0ESHoNsB1YD5wOrAPeAMwHdqzztrK50YdaBP/dDDayLf77UI3tQE+d3G8AXwEOB26XVC9nZmb2kuYGzcysw0l6BXARcEHeDO0CrImI54D3A9Py6EZg58Jb6+VG20fSUfn0icDNwP3AvpL2z19/P/DDCZT9fC351Sf3johB4BPALGDmOO81MzN7yXKDZmbWmfpql9kHvg/cCHw6n3chsEjSj4HXAs/mr68ERvILdpw+Tm60n+a5lcCuwN9FxDDwAWBpfojkc2RNYllXAR+XdCdwAHB5vpw7gb/1OWhmZtatfJEQMzOrK79IyHURcXCbSzEzM+sK3oNmZmZmZmaWCO9BMzMzMzMzS4T3oJmZmZmZmSXCDZqZmZmZmVki3KCZmZmZmZklwg2amZmZmZlZItygmZmZmZmZJcINmpmZmZmZWSL+PxQ4V9um/EliAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib\n", "print(matplotlib.__version__)\n", "\n", "mglearn.plots.plot_cross_validation()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 5.1.1 Cross-Validation in scikit-learn\n", "- scikit-learn의 교차 검증\n", " - model_selection.cross_val_score(estimator, X, y=None, cv=None) 함수 사용\n", " - estimator\n", " - estimator object implementing ‘fit’\n", " - The object to use to fit the data.\n", " - X\n", " - The data to fit.\n", " - y\n", " - The target variable to try to predict in the case of supervised learning.\n", " - cv\n", " - K-Fold의 K값 (기본 값: 3)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "iris.data.shape: (150, 4)\n", "iris.target.shape: (150,)\n", "Cross-validation scores: [0.961 0.922 0.958]\n" ] } ], "source": [ "from sklearn.model_selection import cross_val_score\n", "from sklearn.datasets import load_iris\n", "from sklearn.linear_model import LogisticRegression\n", "\n", "iris = load_iris()\n", "print(\"iris.data.shape:\", iris.data.shape)\n", "print(\"iris.target.shape:\", iris.target.shape)\n", "\n", "logreg = LogisticRegression()\n", "\n", "scores = cross_val_score(logreg, iris.data, iris.target)\n", "print(\"Cross-validation scores: {}\".format(scores))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Cross-validation scores: [1. 0.967 0.933 0.9 1. ]\n" ] } ], "source": [ "scores = cross_val_score(logreg, iris.data, iris.target, cv=5)\n", "print(\"Cross-validation scores: {}\".format(scores))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 교차 검증의 정확도: 각 교차 검증 정확도의 평균값 사용" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Average cross-validation score: 0.96\n" ] } ], "source": [ "print(\"Average cross-validation score: {:.2f}\".format(scores.mean()))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.1.2 Benefits of Cross-Validation\n", "- 기존 train_test_split 방법만 사용하는 경우\n", " - 확보한 원본 데이터 중 일부의 데이터는 훈련 데이터로 활용하지 않으면서 모델을 구성함.\n", "- cross_val_score 함수를 사용하는 경우\n", " - 데이터를 고르게 사용하여 fit을 하고 score를 구하기 때문에 모델의 성능을 좀 더 정확히 측정할 수 있음\n", " - 새로은 테스트 데이터의 예측 정확도에 대하여 최악과 최선의 경우를 짐작할 수 있음 \n", " - [주의] **cross_val_score가 직접 모델을 구성하는 방법은 아님!**\n", " - 즉, 이 함수를 호출하면 내부적으로 K번 모델을 구성하지만, 그러한 모델들은 평가의 목적으로만 활용됨." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.1.3 Stratified K-Fold cross-validation and other strategies\n", "- 계층별 K-Fold 교차 검증\n", " - 각 Fold안의 클래스 비율이 전체 원본 데이터셋에 있는 클래스 비율과 동일하도록 맞춤\n", " - 즉, 원본 데이터셋에서 클래스 A가 90%, 클래스 B가 10% 비율이라면, 계층별 K-Fold 교차 검증에서 각 K개의 Fold안에는 클래스 A가 90%, 클래스 B가 10% 비율이 됨.\n", "- scikit-learn의 cross_val_score 기본 설정\n", " - 분류모델: StratifiedKFold를 사용하여 기본적으로 계층별 K-Fold 교차 검증 수행\n", " - 회귀모델: 단순한 KFold를 사용하여 계층별이 아닌 기본 K-Fold 교차 검증 수행\n", " - 대신 회귀모델에서는 KFold를 사용할 때 shuffle 매개변수를 True로 지정하여 폴드를 나누기 전에 무작위로 데이터를 섞는 작업 추천" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Iris labels:\n", "[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n", " 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2\n", " 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2\n", " 2 2]\n" ] } ], "source": [ "from sklearn.datasets import load_iris\n", "iris = load_iris()\n", "print(\"Iris labels:\\n{}\".format(iris.target))" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false, "hide_input": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+IAAAFgCAYAAAA//cOxAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzs3XmYXGWZ/vHvDd2hG9mJhJ2E1WEzIsvgCCSKKIsOjkQWlwADqDOI4L7MD1vHBccFBHQQRImy2oyOjIrgkgACKgGSEJA9QSQkEBACpDukw/P747wNlU6t6VpOVe7PdfXVVefc55y3Tp23qp46SykiMDMzMzMzM7PmWKvVDTAzMzMzMzNbk7gQNzMzMzMzM2siF+JmZmZmZmZmTeRC3MzMzMzMzKyJXIibmZmZmZmZNZELcTMzMzMzM7MmciFuZtZgkiZJ+lsd5zdeUkjqqtc880jS8ZL+UHD/eUnbV5NdjWVdK2nq6k4/WpWWL+kSSV9qZpvqYXW31dE+n7WSNF/SwVVmQ9KOq7mc1Z7WzMw6iwtxM1sjSHqjpFskPSvpaUk3S9onjWvqh35bPRGxXkQ8PNr5SOqTdOmIeR8aEdNGO+/VVbj8PG2PxdaVmZmZjV5H700xMwOQtAHwC+BDwE+AMcABwLJWtqsakroiYqjd5m3tr9OPuDAzM2sl7xE3szXBzgARcUVErIiIgYi4PiLmSPoH4AJg/3To8zMAkg6XdKekJZIeldQ3PLOCw22nSvqrpMWSPlcwvjcdSvx3SfcA+xQ2RtKnJT0k6TlJ90h6Z8G449Pe+rMlPQ30SVpb0jfSch4GDi/3YCVtI+mnkp6U9JSk88vMey1J/yHpEUlPSPqRpA1TvkfSpWkez0i6TdK4gnk9nB7DPEnvKdGWCyR9Y8Swn0v6aKV1UWReLx/WK2lTSdek5+fPwA4jst9Oz9sSSbdLOiANfxvwWeDo9HzPTsNnSDop3S63Tso+9yPaMCGtt7XS/e9LeqJg/KWSTi9cfqntMdlY0i/TuvqTpJUec8F8yz1vW6b19rSkByWdXDBdn6Sr07RLgA+WWFcbSrpY0uOSHpP0JUlrp3F12VaL5Io+n2ncvpJmpnGLJH2r0nqo0KZ9Jd2apnlc0vmSxoyIHZa2/8WSvj78HKfpT5T0F2X9/zpJ25VYzmFpm38urcePV2qbmZl1DhfiZrYmuB9YIWmapEMlbTw8IiL+QlZw3JoOfd4ojXoBeD+wEVkx8SFJR46Y7xuBXYA3A2emIgrg82SF4Q7AW4GR5/4+RLZHfkPgC8ClkrYoGL8f8DCwGfBl4GTgCOB1wN7AUaUeaCqIfgE8AowHtgKuLDPv49PfZGB7YD1guBiamtq4DbBpWk8Dkl4FnAscGhHrA28AZpVo0uVkhZxS+zYGDiloU6V1Ucp3gEFgC+DE9FfoNmAisElqQ7+knoj4NfAV4Kr0fL+2yLyPp/Q6GVbquX9ZRMwDlpA9b6TH+XxB9kDghhHTlNoeAY4lW0cbAw+SPX/FFH3e0rgrgL8BW5JtR1+R9OaCaf8ZuJpsu7+Y4utqGjAE7Jge2yHASWlcPbfVQkWfzzTu28C3I2IDsj73kyrWQzkrgDOAscD+ZM/xv43IvDM9vr3I1tmJ6TEdSfblxb8ArwZuIlvnxVwMfCD1od2B31fRNjMz6xAuxM2s40XEErLCKYCLgCfTXsGSe8ciYkZE3BURL0XEHLIP0weNiH0h7V2fDcwGhguVdwNfjoinI+JRsqK1cN79EbEgzfsq4AFg34LIgog4LyKGImIgze+ciHg0Ip4Gvlrm4e5LVmR9IiJeiIjBiCg833jkvN8DfCsiHo6I54HPAMcoOyx5OVkBs2M6kuD2tC4BXgJ2l9QbEY9HxN0l2nMT2Xof3oN5FFmRuaDKdbGKVMC9CzgzPca5ZMXhyyLi0oh4Kj3ObwLrkBXO1Si3ToaVeu5HugE4SNLm6f7V6f4EYIM0bbV+GhF/TqcTXEZWmBZT9HmTtA1ZP/hU2i5mAd8H3lcw7a0R8b/p+VilaE195lDg9LTunwDOBo5JkXpuqy+r8HwuB3aUNDYino+IP5ZbD2XaM7ys2yPij2lZ84HvsWrf/1rq338FziH7kgTgA8BXI+Iv6Xn6CjCxxF7x5cCukjaIiL9HxB2V2mZmZp3DhbiZrRHSB+PjI2Jrsr1PW5J9gC5K0n6SpqdDZp8l25s2dkRsYcHtpWR7TknzfrRg3CMj5v1+SbPSoa/PpPYUzrtw2orzG2Eb4JEy534Xm3fh/B4hu37IOODHwHXAlZIWSPovSd0R8QJwNNk6eTwdLv2a9NjuTocxPy/pgIgIsr2cw4XKcWRFZLXrophXpzaWW8cfS4cHP5vmu2EV861mnQwr9dyPdAMwiWzv943ADLKi7iDgpoh4qco21bLMos8b2eN6OiKeK8g+QrYnetjI7WOk7YBusud9+Dn7HtkRFlDfbfVlFZ7PfyU7/eTedPj5EWl4qfVQaVk7S/qFpIXKDtH/CqtuOyMf45bp9nbAtwvWzdOAWHkdD3sXcBjwiKQbJO1fqW1mZtY5XIib2RonIu4FLiEr+iDbYzvS5cA1wDYRsSHZebuqchGPkxUZw7YdvpH2jF0EnApsmg49njti3iPbU3J+RTwKbKvSF9oaOe8FZMVD4byHgEURsTwivhARu5Idfn4E2eH6RMR1EfEWskPD702PiYjYLR3GvF5E3JTmeQVwVHrs+wH/A1Wvi2KeTG0stY4PAD5Ftnd24zTfZwvmW+z5rmqdVJiumBvIjgaYlG7/AfgnskL8hhLTVGpfWWWetwXAJpLWL4hvCzxWZtkj7z9KdpHDsRGxUfrbICJ2S+Prua0ClZ/PiHggIo4l+zLga8DVkl5Vbvut4L/Jtumd0uHun2XVbXLkY1xQ8Jg+ULBuNoqI3oi4ZeRCIuK2iPjn1O7/5ZVD6s3MbA3gQtzMOp6k16Q9alun+9uQ7aEdPoR1EbD1iAsyrU+293BQ0r5ke3Kr9RPgM5I2Tsv8cMG4V5EVN0+mtpzAK18IlJvfaZK2TudYf7pM9s9kxdBZkl6l7IJV/1QmfwVwhrILi63HK+cED0maLGmPdCj4ErJDaVdIGifpHelc8WXA82Tn1RYVEXemx/t94LqIGL4A2eqsCyJiBfBTsovNrStpV1Y+D399ssL5SaBL0plkh4EPWwSMV8EFtqpdJ5XaVqStD5Cdl/xe4MZ0aPQisr2hpQrxYttj1Uo9b+k0iVuAr6btYk+yvcmXlZndSusqIh4Hrge+KWkDZRe220HS8KHbjdhWyz6fkt4r6dXp6ILhbWtFqfVQpj2Fy1tCdj7/a8h+bWGkT6T+vQ3wEeCqNPwCsr6/W2rbhpKmjJxY0hhJ75G0YUQsT8urpm1mZtYhXIib2ZrgObI9sX+S9AJZAT4X+Fga/3vgbmChpMVp2L8BX5T0HHAmte2t+gLZ4arzyIqWHw+PiIh7gG8Ct5IVOXsAN1eY30Vkh9jOBu4gK0KLSkXq28kupPVXsgtzHV1m3j9I7bsxtXeQV7442JzsnOYlwF/ICsdLyd47Pka2F/Bpsr27Iy9mNdIVwMFkRxoMt3V11sWwU8kOzV5IdnTDDwvGXQdcS3aRvkfSYyo8lLg//X9KUrHzcsutk9VxA/BUOp94+L6AO0vki22PtSj1vEH2BdR4sufuZ8DnI+I3ZeZVbF29n+wnAO8B/p6WNXyBvUZsq5Wez7cBd0t6nuzCbcdExGCF9VDOx8m+eHsuPZ6rimR+DtxOdpHCX5JdeI2I+BnZXvkr02Htc8nOqS/mfcB8vXKF+vdW0TYzM+sQyk7fMzMzMzMzM7Nm8B5xMzMzMzMzsyZyIW5mZmZmZmbWRC7EzczMzMzMzJrIhbiZmZmZmZlZE7kQNzMzMzMzM2siF+JmZmZmZmZmTeRC3MzMzMzMzKyJXIibmZmZmZmZNZELcTMzMzMzM7MmciFuZmZmZmZm1kRdrW5Ap+ju7l44NDQ0rtXtMLP66+rqemL58uUr9e/e3t6Fg4OD7vNmHWjMmDFPL1u2bNPCYe7zZp2rp6fniYGBAfdvaypFRKvb0BEkRV9fX9Fx8+bNo7+/nylTpjBhwoSK83LeeefzlZ82bRoRocLhkqLY6+eMGTOYMmUK/f39TJo0qeL8nXfe+fzlFy9eXFWfz2v7nXfe+drykydPXqXPmzWaD01vsDwWFc4773xt+Wrl+UOG8847X32+Gnluv/POO1/fvFkjuBBvoLwWFc4773xt+Wrk7UOD884777zzzjs/+rxZo7gQb5A8FxXOO+98ffN5+9DgvPPOO++8886PPm/WSG1XiEv6nKS7Jc2RNEvSfhXyfZI+nm5/UdLB6fbpktYtMc2pkh6UFJLG1trGvBUJzjvvvItw55133nnnnXfeRbjlR1tdNV3S/sARwF4RsSwVyWOqnT4iziy4ezpwKbC0SPRm4BfAjFrbmLciwXnnnXcR7rzzzo8+D+SqPc4777yLcGtvbVWIA1sAiyNiGUBELB4eIWk+cBUwOQ06LiIeLJxY0iVkBfaW6W+6pMURMbkwFxF3pnxNjctbkeC88843Lg/+UO6882tKflhe2uO88867CLf2126Hpl8PbCPpfknflXTQiPFLImJf4HzgnFIziYhzgQXA5JFF+GjkqUhw3nnnG1uEgz+UO+/8mpAvlIf2OO+88y7CrTO0VSEeEc8DrwdOAZ4ErpJ0fEHkioL/+ze6PZJOkTRT0kwgN0WC88473/giHPyh3HnnOz1fq7y133nnnXcRbvnVboemExErgBnADEl3AVOBS4ZHF0ab0JYLgQsBJEUeigTnnXe+OUV4NfL2IcN55513Ee68886b5UNb7RGXtIuknQoGTQQeKbh/dMH/WyvM7jlg/To2r6K8FRXOO++8i3DnnXd+9PLWfuedd762vFkrtNse8fWA8yRtBAwBD5Idpj5sHUl/IvuC4dgK87oQuFbS4yPPE5d0GvBJYHNgjqRfRcRJo2l43ooK55133kW48847Xzxfizy233nnna8tb9YKimj4EdxNka6avnfhldSbvPzo6+srOi5vRYXzzjtfW37atGlEhAqHS4pir595/ZDhvPPOV59fvHhxVX0+r+133nnna8tPnjx5lT5v1mhtdWh6O8pjUeG8887Xlq9Wnj9kOO+889Xnq5Hn9jvvvPP1zZs1QscU4hExvlV7w0vJa1HhvPPO15avRt4+NDjvvPPOO++886PPmzVKxxTieZPnosJ5552vbz5vHxqcd95555133vnR580aqWPOEW+17u7uhUNDQ+Na3Q4zq7+urq5Fy5cv37xwWG9v78LBwUH3ebMO1NPTs2hgYMB93mwNUazPmzWaC3EzMzMzMzOzJvKh6WZmZmZmZmZN5ELczMzMzMzMrIlciJuZmZmZmZk1kQtxMzMzMzMzsyaqWIhL+oikDZS5WNIdkg5pRuPMzMzMzMzMOk01e8RPjIglwCHAq4ETgLMa2iozMzMzMzOzDlVNIa70/zDghxExu2CYmZmZmZmZmdWgmkL8dknXkxXi10laH3ipsc0yMzMzMzMz60yKiPIBaS1gIvBwRDwjaVNgq4iY04wGmpmZmZmZmXWSrkqBiHhJ0iJgV0kV82ZmZmZmZmZWWsXCWtLXgKOBe4AVaXAANzawXW2nt7d34eDg4LhWt8PM6q+np2fRwMDA5oXDuru7Fw4NDbnPm3Wgrq6uRcuXL1+pz/t93qxzFXufN2u0ag5Nvw/YMyKWNadJ7UlSRAQzZsxgypQp9Pf3M2nSpIrTOe+88/nPSyIiVrpIpaSYOnUq/f39TJkyhQkTJlSc/7x585x33vk2yPf19RXt82PHjs3965Xzzjtfe77Y+7xZo1VzsbaHge5GN6QTtPpFxHnnnW9eHmibosJ5550fXX5YXl5/nHfe+ca+v5s1QzXnfC8FZkn6HfDyXvGIOK1hrWpTeXoRcd555xv/Jp2XIsF5551vfBEO5OL1x3nnnXcRbp2hmkL8mvRnFeTlRcR5551vzpt0HooE5513vjlFeDXy9nrlvPPOuwi3/KrmqunTJI0Bdk6D7ouI5Y1tVnvKw4uI8847n5836bwVFc4777yLcOedd94sH9aqFJA0CXgA+A7wXeB+SQc2uF3l2vM5SXdLmiNplqT9KuT7JH083f6ipIPT7dMlrVtimssk3SdprqQfSKrLOfJ5e9Fx3nnnXYQ777zzo5e31yvnnXe+trxZK1QsxIFvAodExEERcSDwVuDsxjarOEn7A0cAe0XEnsDBwKPVTh8RZ0bEb9Pd04GihThwGfAaYA+gFzhptRud5PFFx3nnnXcR7rzzzq+ar0XeXq+cd9752vNmrVBNId4dEfcN34mI+2ndVdS3ABYP/5RaRCyOiAUAkuZL+pqkP6e/HUdOLOkSSUdJOg3YEpguafrIXET8KhLgz8DWo2l0Xl90nHfe+erytchjUeG8887Xlq9WHl+vnHfe+drzZq1QTSE+U9LFkialv4uA2xvdsBKuB7aRdL+k70o6aMT4JRGxL3A+cE6pmUTEucACYHJETC6VS4ekvw/4dYnxp0iaKWlmqXnk+UXHeeedry5frbwWFc4773xt+Wrk9fXKeeedr3/erBGqKcQ/BNwNnAZ8BLgH+GAjG1VKRDwPvB44BXgSuErS8QWRKwr+71+HRX4XuDEibirRngsjYu+I2LvY+Ly9iDjvvPON+6Y8z0WF8847X998nl+vnHfe+frmzRqlmqumLwO+lf5aLiJWADOAGZLuAqYClwyPLoyOZjmSPg+8GvjA6kyftxcR5513vnH5vBUJzjvvvItw5513fvR5s0YquUdc0k/S/7vSFcpX+mteE1dq0y6SdioYNBF4pOD+0QX/b60wu+eA9Uss5ySyi9IdGxEv1drOvL2IOO+88y7CnXfe+dHn8/b647zzzrsIt/ZVbo/4R9L/I5rRkCqtB5wnaSNgCHiQ7DD1YetI+hPZFwzHVpjXhcC1kh4vcp74BWQF/q2SAH4aEV+spoF5exFx3nnnXYQ777zzo88DuXr9cd55512EW3tTdmHwMgHpaxHxqUrDWk3SfGDviFjcouXH9OnTc/Ui4rzzztcnL4mI0Ihhse666+amSHDeeefrl+/r6yva56dPn5771yvnnXe+9nyx93mzRlurisxbigw7tN4N6QStfhFx3nnnm5Mf1i5FhfPOO7/6+UJ5eP1x3nnnvSfcOkPJQ9MlfQj4N2D7EeeErw/c3OiG1Soixre6DXl5EXHeeeeb8yadhyLBeeedb04RXo28vV4577zzLsItv8qdI345cC3wVeDTBcOfi4inG9qqNpWHFxHnnXc+P2/SeSsqnHfeeRfhzjvvvFk+VDxH/OWgtBnQM3w/Iv7aqEa1o97e3oWDg4PjWt0OM6u/np6eRQMDA5sXDuvu7l44NDTkPm/Wgbq6up5Yvnz5Sv3b7/NmnWvMmDFPL1u2bNNWt8PWLNVcrO3tZL8hviXwBLAd8JeI2K3xzTMzMzMzMzPrLNVcrO1LwD8C90fEBODN5PAccTMzMzMzM7N2UE0hvjwingLWkrRWREwHJja4XWZmZmZmZmYdqdzF2oY9I2k94EbgMklPAEONbZaZmZmZmZlZZ6rmHPFXAQNke8/fA2wIXJb2kpuZmZmZmZlZDcoW4pLWBq6LiIOb1yQzMzMzMzOzzlX2HPGIWAEslbRhk9pjZmZmZmZm1tGqOUd8ELhL0m+AF4YHRsRpDWuVmZmZmZmZWYeqphD/ZfozMzMzMzMzs1GqeLE2AEm9wLYRcV/jm2RmZmZmZmbWuSr+jriktwOzgF+n+xMlXdPohpmZmZmZmZl1omoOTe8D9gVmAETELEkTGtimttTb27twcHBwXKvbYWb119PTs2hgYGDzwmHu82adq6en54mBgYGV+nd3d/fCoaEh93mzDrT22ms/PTQ0tGmr22FrlmoK8aGIeFZS4bDKx7OvYQYHB8eVO8x/xowZTJkyhf7+fiZNmlRxfs4773x+8pJW+fBdrs/nrf3OO+98bfnJkydvNnL40NDQuL6+vlXy8+bNo7+/nylTpjBhQuX9FM4773z+8kuXLt2kYtiszioemg7MlXQcsLaknSSdB9zS4HZ1lDx+yHDeeeerz9cij+133nnna8tXK69FhfPOO19b3qwVqinEPwzsBiwDLgeeBT7SyEZ1krx+yHDeeeerz1crr+133nnna8tXI89FhfPOO1/fvFkjVFOIHx4Rn4uIfdLffwDvaHTDOkGeP2Q477zz1eerkef2O++88/XN561IcN55512EW/upphD/TJXDmkLS5yTdLWmOpFmS9quQ75P08XT7i5IOTrdPl7RuiWkuljQ7LeNqSevV2s68fWhw3nnnnXfeeedHn89bkeC88867CLf2VPJibZIOBQ4DtpJ0bsGoDYChRjesRJv2B44A9oqIZZLGAmOqnT4iziy4ezpwKbC0SPSMiFiSlvkt4FTgrGqXk7cPDc4777zzzjvv/OjzeSsSnHfeeRfh1r7KXTV9ATCT7DD02wuGPwec0chGlbEFsDgilgFExOLhEZLmA1cBk9Og4yLiwcKJJV0C/ALYMv1Nl7Q4IiYX5gqKcAG91HCV+Lx9aHDeeeedd95550efB3JVJDjvvPMuwq29lSzEI2I2MFvSZRHRkj3gRVwPnCnpfuC3wFURcUPB+CURsa+k9wPnkO09X0VEnCvpo8DkwmK+kKQfkh0RcA/wsWoal7cPDc4773xjP5TnqT3OO+98Y/s7kJsiwXnnnXcRbu1vrVIjJP0k3bwznSu90l+T2reSiHgeeD1wCvAkcJWk4wsiVxT833+UyzqBbK/5X4Cji2UknSJppqSZ4A/lzju/puSH5aU9zjvvfOP7O5CLIsF55513EW6dodyh6cM/UVZ0r3KrRMQKYAYwQ9JdwFTgkuHRhdF6LEvSVcAngB8WGX8hcCGApMjLhwbnnXe+OR/K89Ae5513vjn9vRp5Kyqcd955F+GWXyX3iEfE4+n/I8X+mtfEV0jaRdJOBYMmAoVtObrg/60VZvccsH6RZUjSjsO3gbcD91bTvjx8aHDeeefz86E8b+133nnnXYQ777zzZvlQbo94Hq0HnCdpI7Irtz9Idpj6sHUk/YnsC4ZjK8zrQuBaSY+PuFibgGmSNki3ZwMfqkfj8/Yhw3nnnXcR7rzzzo9e3ooK5513vra8WSsoYtRHcOdCumr63qUuvtaE5Ue5dZm3DxnOO+989XlJRIRGDCvZ5/PWfuedd762/OTJk4v2+b6+vlXyeSwqnHfe+dryS5cuXaXPmzVayUPTJX1c0jbNbEynyuOHDOedd776fC3y2H7nnXe+tny18lpUOO+887XlzVqhZCEObAXcIulGSR+SNLZZjVodETG+VXvDy8nrhwznnXe++ny18tp+5513vrZ8NfJcVDjvvPP1zZs1QslCPCLOALYF/h+wJzBH0rWS3i9plYuc2ary/CHDeeedrz5fjTy333nnna9vPm9FgvPOO+8i3NpP1eeIS1obOBg4C9glItZtZMPaTW9v78LBwcFxrW6HmdVfT0/PooGBgc0Lh7nPm3WuYn2+u7t74dDQkPu8WQfq6upatHz58s0rJ83qp6pCXNIewDFkPwv2FHBFRJzT4LaZmZmZmZmZdZySP1+Wfq/7WLICfAVwJXBIRDzcpLaZmZmZmZmZdZySe8QlPQxcAVwZEXc1tVVmZmZmZmZmHapcIb4TMC4i/jBi+AHAgoh4qAntMzMzMzMzM+so5X6+7GxgSZHhA4DPDzczMzMzMzNbDeUK8fERMWfkwIiYCYxvWIvMzMzMzMzMOli5QrynzLjeejfEzMzMzMzMbE1QrhC/TdLJIwdK+lfg9sY1yczMzMzMzKxzlbtY2zjgZ8CLvFJ47w2MAd4ZEQub0kIzMzMzMzOzDlKyEH85IE0Gdk93746I3ze8VWZmZmZmZmYdqmIhbmZmZmZmZmb109XqBnSK3t7ehYODg+Na3Q4zq7+enp5FAwMDmxcOc58361zu82ZrlmJ93qzRvEe8TiSF16VZZ5JERGjEMPd5sw7lPm+2ZinW580ardxV083MzMzMzMyszlyIm5mZmZmZmTWRC3EzMzMzMzOzJnIhbmZmZmZmZtZEDSvEJW0u6UpJD0m6R9KvJO0sabykuQ1aZp+kj1fIXCLpqBrm2bD2mpmZmZmZ2ZqnIT9fJknAz4BpEXFMGjYRGAc82ohlmpmZmZmZmbWDRu0Rnwwsj4gLhgdExKyIuKkwlPY23yTpjvT3hjR8C0k3Spolaa6kAyStnfZmz5V0l6QzyjVA0smSbpM0W9L/SFq3YPTBabn3Szoi5deW9PU0zRxJH6jf6rC8WrhwIccccww77LADu+66K4cddhj3338/8+fPZ/fdd2/IMpctW8bRRx/NjjvuyH777cf8+fMbshwzW1Ur+vyNN97IXnvtRVdXF1dffXVDlmFmxbWiz3/rW99i1113Zc899+TNb34zjzzySEOWY2btrVGF+O7A7VXkngDeEhF7AUcD56bhxwHXRcRE4LXALGAisFVE7B4RewA/rDDvn0bEPhHxWuAvwL8WjBsPHAQcDlwgqSeNfzYi9gH2AU6WNKHcAiSdImmmpJlVPFbLmYjgne98J5MmTeKhhx7innvu4Stf+QqLFi1q6HIvvvhiNt54Yx588EHOOOMMPvWpTzV0eWaWaVWf33bbbbnkkks47rjjGrocM1tZq/r86173OmbOnMmcOXM46qij+OQnP9nQ5ZlZe2r1xdq6gYsk3QX0A7um4bcBJ0jqA/aIiOeAh4HtJZ0n6W3Akgrz3j3t9b4LeA+wW8G4n0TESxHxQJrva4BDgPdLmgX8CdgU2KncAiLiwojYOyL2ruExW05Mnz6d7u5uPvjBD748bOLEiRxwwAEr5ebPn88BBxzAXnvtxV577cUtt9wCwOOPP86BBx7IxIkT2X333bnppptYsWIFxx9/PLvvvjt77LEHZ5999irL/fnPf87UqVMBOOqoo/jd735HRDTwkZoZtK7Pjx8/nj333JO11mr1W67ZmqVVfX7y5Mmsu252IOY//uM/8rcZqgskAAAgAElEQVS//a2Bj9LM2lVDzhEH7gaquSDaGcAisr3eawGDABFxo6QDyfZY/1jS1yPiR5JeC7wV+Hfg3cCJZeZ9CXBkRMyWdDwwqWDcyKonAAEfjojrCkdIGl/F47A2NHfuXF7/+tdXzG222Wb85je/oaenhwceeIBjjz2WmTNncvnll/PWt76Vz33uc6xYsYKlS5cya9YsHnvsMebOza7v98wzz6wyv8cee4xtttkGgK6uLjbccEOeeuopxo4dW98HaGYraVWfN7PWyEOfv/jiizn00EPr8njMrLM0qhD/PfAVSSdHxEUAkvYB1gUKT5TZEPhbRLwkaSqwdspuBzwWERdJehWwl6RfAS9GxP9Ieois0C5nfeBxSd1ke8QfKxg3RdI0YAKwPXAfcB3wIUm/j4jlknYeMY2toZYvX86pp57KrFmzWHvttbn//vsB2GeffTjxxBNZvnw5Rx55JBMnTmT77bfn4Ycf5sMf/jCHH344hxxyyCrzK7b3O7u+oZnlQb37vJnlW6P6/KWXXsrMmTO54YYbmvVQzKyNNOQ4ucgqjXcCb0k/X3Y30AcsGBH9LjBV0h+BnYEX0vBJwCxJdwLvAr4NbAXMSIeOXwJ8pkIz/h/ZIea/Ae4dMe4+4AbgWuCDETEIfB+4B7gj/VzZ92jcFxWWA7vtthu33175UgZnn30248aNY/bs2cycOZMXX3wRgAMPPJAbb7yRrbbaive973386Ec/YuONN2b27NlMmjSJ73znO5x00kmrzG/rrbfm0UezHw8YGhri2WefZZNNNqnvgzOzVbSqz5tZa7Syz//2t7/ly1/+Mtdccw3rrLNOXR+XmXWGhhWaEbGA7PDxYnZPmQeAPQuGfyYNnwZMKzLdXhWW2Vdw+7+B/y6SOb7EtC8Bn01/hZ4dbq91lje96U189rOf5aKLLuLkk08G4LbbbmPp0qVst912L+eeffZZtt56a9Zaay2mTZvGihUrAHjkkUfYaqutOPnkk3nhhRe44447OOywwxgzZgzvete72GGHHTj++ONXWe473vEOpk2bxv7778/VV1/Nm970Ju8RN2uCVvV5M2uNVvX5O++8kw984AP8+te/ZrPNNmvKYzWz9iNfJKo+JIXXZftZsGABp59+Orfffjs9PT2MHz+ec845h+7ubo444gjmzp3LAw88wLve9S7WXXddJk+ezHnnncfzzz/PtGnT+PrXv053dzfrrbceP/rRj1iyZAknnHACL730EgBf/epXVzk3bHBwkPe9733ceeedbLLJJlx55ZVsv/32rXj4ViVJRIRGDHOfb0Ot6PO33XYb73znO/n73/9OT08Pm2++OXfffXcrHr5VyX2+c7Sizx988MHcddddbLHFFkD2ywnXXHNN0x+7Va9YnzdrNBfideI3aLPO5Q/lZmsW93mzNYsLcWsF/5aKmZmZmZmZWRP5YmR10tPTs0jSuFa3w8zqr6enZ1GxYe7zZp3Jfd5szVKsz5s1mg9NNzMzMzMzM2siH5puZmZmZmZm1kQuxM3MzMzMzMyayIW4mZmZmZmZWRO5EDcbBUmntLoNZtY87vNmax73ezNrBBfiZqPjN2ezNYv7vNmax/3ezOrOhbiZmZmZmZlZE7kQNzMzMzMzM2siF+Jmo3NhqxtgZk3lPm+25nG/N7O6U0S0ug1mZmZmZmZmawzvETczMzMzMzNrIhfiZmZmZmZmZk3kQtwMkLRC0qyCv/FlspMk/aLEuPmSxhYZ/mVJj0p6vn6tNrPV1cg+L2ldSb+UdK+kuyWdVd/Wm1mtmvA+/2tJs1Ofv0DS2vVrvZl1oq5WN8AsJwYiYmID5/9/wPnAAw1chplVr9F9/hsRMV3SGOB3kg6NiGsbuDwzK6/Rff7dEbFEkoCrgSnAlQ1cnpm1ORfiZiVI6gH+G9gbGAI+GhHTR2Q2Ba4AXg38GVCxeUXEH1O+kU02s1GoV5+PiKXA9HT7RUl3AFs3tvVmVqs6v88vSTe7gDGAr4ZsZmX50HSzTG/B4Wo/S8P+HSAi9gCOBaalN+1Cnwf+EBGvA64Btm1ai81sNJrS5yVtBLwd+F1dW29mtWp4n5d0HfAE8BzZXnEzs5K8R9wsU+yQtTcC5wFExL2SHgF2HpE5EPiXlPmlpL83vKVmVg8N7/OSusj2pJ0bEQ/XreVmtjoa3ucj4q2pkL8MeBPwm3o13sw6j/eIm5VW7XHkPvzMrDPUu89fCDwQEeesZnvMrLHq/j4fEYNke87/ebVaZGZrDBfiZqXdCLwHQNLOZIej3VcmcyiwcTMbaGZ1Vbc+L+lLwIbA6Y1qrJmNWl36vKT1JG2RbncBhwH3Nq7ZZtYJXIiblfZdYG1JdwFXAcdHxLIRmS8AB6aLMR0C/LXYjCT9l6S/AetK+pukvga228xWT136vKStgc8BuwJ3pHNST2ps081sNdTrff5VwDWS5gCzyc4Tv6BxzTazTqAIH1VrZmZmZmZm1izeI25mZmZmZmbWRC7EzczMzMzMzJrIhbiZmZmZmZlZE7kQNzMzMzMzM2siF+JmZmZmZmZmTeRC3MzMOoKkFemnwu6WNFvSRyWVfZ+TNF7ScU1o2/cl7Vohc2SljJmZmXUGF+JmZtYpBiJiYkTsBrwFOAz4fIVpxgMNL8Qj4qSIuKdC7Eiy3x43MzOzDudC3MzMOk5EPAGcApyqzHhJN0m6I/29IUXPAg5Ie9LPKJN7WcrcK2mapDmSrpa0bhr3Zkl3SrpL0g8krZOGz5C0d7r9vKQvp732f5Q0Li3nHcDXU1t2kHSapHvSMq5sxnozMzOz5lBEtLoNZmZmoybp+YhYb8SwvwOvAZ4DXoqIQUk7AVdExN6SJgEfj4gjUn7dYrkR8xwPzAPeGBE3S/oBcA9wPvAA8OaIuF/Sj4A7IuIcSTPScmZKCuAdEfF/kv4LWBIRX5J0CfCLiLg6LWcBMCEilknaKCKeqf9aMzMzs1bwHnEzM+tkSv+7gYsk3QX0U/oQ8Gpzj0bEzen2pcAbgV2AeRFxfxo+DTiwyLQvAr9It28nOzy+mDnAZZLeCwyVyJiZmVkbciFuZmYdSdL2wArgCeAMYBHwWmBvYEyJyarNjTycLHil6K9kebxyONoKoKtE7nDgO8DrgdsllcqZmZlZm3EhbmZmHUfSq4ELgPNT0bsh8HhEvAS8D1g7RZ8D1i+YtFRupG0l7Z9uHwv8AbgXGC9pxzT8fcANNTT75bakq71vExHTgU8CGwHrlZnWzMzM2ogLcTMz6xS9wz9fBvwWuB74Qhr3XWCqpD8COwMvpOFzgKF04bQzyuRG+kvKzQE2Af47IgaBE4D+dGj7S2RfBlTrSuATku4EdgIuTfO5Ezjb54ibmZl1Dl+szczMrAbpYm2/iIjdW9wUMzOzVfT29i4cHBwcV6/59fT0LBoYGNi81HhJmwK/S3c3Jzvt6sl0f9+IeLHSMiT9EDgrIu4rk/l34JmIuKzqxldB0sHAqRFxZJnMXsBmEfHrei3Xe8TNzMzMzMw6xODg4LiIoNTf9OnTGTt2LNOnTy+ZKfyrVNRHxFMRMTEiJpIdCXb28P3hIjz9lGjJ2jMiTihXhKfMd+pdhNdgL+Bt9ZyhC3EzM7MaRMR87w03M7N2NGPGDKZMmUJ/fz+TJk2qKr+6JO0oaa6kC4A7gC0kXShppqS7JZ1ZkP2DpImSuiQ9I+msdNrYrZI2S5kvSTq9IH+WpD9Luk/SG9LwV0n6nzTtFWlZE4u07fA03R+Afy4Y/o9pmXdKulnSTpJ6gTOB96RT4I4qlqt1/bgQNzMzMzMz63CrU4RPmTJltIvdFbg4Il4XEY8Bn46Ivcl+neQtkor9TOiGwA0R8VrgVuDEEvNWROwLfIKsUAb4MLAwTXsW8LpVJpLWBb4HHAYcAGxZMPovwBsj4nXAfwJfiogB4IvAZWkv/9XFclWuj5e5EDczMzMzM+tgq1uE9/f3j3bRD0XEbQX3j5V0B9ke8n8gK9RHGoiIa9Pt24HxJeb90yKZN5Jd/JSImA3cXWS6XYH7I+Kh9MsqhYe7bwT8VNJc4BvAbiWWXW2uJBfiZmZmZmZmHWo0RXg1+Qpe/vWRdPj2R4A3RcSewK+BniLTFF7cbQXQVWLey4pkVGW7Sl2x/MvAdekUtCNLtK+WXEkuxM3MzMzMzDpQi4vwkTYAngOWSNoCeGu9FwD8AXg3gKQ9KL7H/R5gZ0kTJAk4tmDchsBj6fbxBcOfA9avIle1Ut8umJmZmZmZWZvp6elZJGmlK51Pnjy5pnkU5nt6ehbVp2XcQVYEzwUeBm6u03wLnQf8SNKctLy5wLOFgYhYKumDwLXA4tSOXdLorwE/kPRJYHrBZL8HPiHpTrK94aVyVfPviJuZmZmZmVnbk9QFdEXEYDoU/npgp4gYanHTVuE94mZmZmZmZtYJ1gN+lwpyAR/IYxEO3iNuZmZmZmZm1lS+WJuZmZmZmZlZE7kQNzMzMzMzM2siF+JmZtYSkt4j6fqC+/8k6QFJz0s6UtK1kqau5rxnSDqpfq3NL0njJUU6H45y621kdjWW9VlJ3x9Ne83MzMyFuJmZAZLeKOkWSc9KelrSzZL2SeOOl/SHUc5/lQIwIi6LiEMKYl8Ezo+I9SLifyPi0IiYNprllmnPzpL6JS1Oj3mOpI9KWrsRy2umeq03SZMk/W3EvL8SEWvEFxxmZmaN5ELczGwNJ2kD4Bdkv725CbAV8AVgWQ3zqEcBux1wdx3mU5akHYA/AY8Ce0TEhsAUYG9g/SJ5/8KImZm1je7u7oXpy++6/HV3d5f9HXFJm0qalf4WSnqs4P6Yatst6URJm1eR21HSrAqZ7SUdU+2yW8EfLszMbGeAiLgi3R8g+91NJP0DcAHQLel5YCgiNpJ0ScptBxwE/LOkdYAvATsAzwIXR0RfmueN6f8zkgDeAuwCnBQRb5T0EDAB+D9JK4BNgeuASyPi+6ktJwKfADYH/gycEhGPpHFvIfsiYQvgx2Q/WVLKF4BbIuKjwwMi4j7guDSv8cA84CTg88B84EBJ7wC+SvZFxSzgQxHxlzTNp4DTgA2ABcC/RcTvJO0LfDet4wHgssLlDksfFj4eEXsXDDsDmBwR75B0eJl1O3JeM4bXW/qC5GvA8cAS4JsjsicAnwS2Bp4EvhYR35P0KuBaYJ30vJMewynAjhHx3jR9uXUyHzgfeD/ZdvJrYGpEDBZrt5mZ1cfQ0NC4vr6+lYbNmzeP/v5+pkyZwoQJEyrOozA/bdq0zcplI+IpYCKApD7g+Yj4xmo0/UTgDmDhakw70vbAMcCVdZhXQ3iPuJmZ3Q+skDRN0qGSNh4ekYqqDwK3pkPGNyqY7jjgy2R7kf8AvEBWdG0EHA58SNKRKXtg+r9Rms+thQ2IiB2AvwJvT+NX2huf5vNZ4F+AVwM3AVekcWOB/wH+AxgLPAT8U5nHezBwdeXVwkHAPwBvlbRzWt7pafm/IvvSYIykXYBTgX0iYn3grWTFO8C3gW9HxAZkRfRPSizrGmAXSTsVDDsOuDzdLrduyzkZOAJ4Hdke/6NGjH8ijd8AOAE4W9JeEfECcCiwID0f60XEgsIJy62Tgti7gbeRfcmyJ9kXAmZm1kSjKcKryZcjaaqkP6e949+VtJakLkk/lnSXpLmSTpN0NFkxf1WxPemS9kmnkd1K9rlkePgOkm6SdKek2yXtl0adBUxO8zqtTK5lXIibma3hImIJ8EYggIuAJyVdI2lchUl/HhE3R8RLETEYETMi4q50fw5ZkXZQnZr5AeCrEfGXiBgCvgJMlLQdcBhwT0RcHRHLgXMo/236psDjVSyzLyJeiIgB4GjglxHxm7SMbwC9wBuAFcA6wK6SuiNifkQ8lOaxHNhR0tiIeD4i/lhsQRGxFPg5cCxAKshfQ1agM4p1+27gnIh4NCKeJtt7XbjcX0bEQ5G5gexIiAOqmC8V1smwcyNiQVr2/5H2mJiZWXO0uAjfHXgn8IaImEh2NPYxwOuBsRGxR0TsDvwoIq4iO7Lq6IiYGBEvjpjdJWRHXe0PFJ4O9zjwloh4HfAe4Nw0/NPA9DSvc8vkWsaFuJmZkQrc4yNia2B3YEuygracRwvvSNpP0nRJT0p6luwb67F1auJ2wLclPSPpGeBpssPPt0ptfbktEREj2zbCU2SHsFdSOI8tgUcKlvFSGr9VRDxItle4D3hC0pWStkzRfyU7pPteSbdJOgJA0gXKrg7/vKTPpuzlpEKcbG/4/6YCfTTrdqV1U/gY0nwPlfRHZRfoe4bsS41qn7OS66QgU/iFyFJgvSrnbWZmo9TKIjw5GNgHmJnO6T6I7OiwB8mOAvu2pLeSnXJVUjryrTcibk6Dflwweh3gYklzyQ5D37XEbKrNNY0LcTMzW0lE3Ev2zfPuw4NKRUfcv5xsD+426QJoF/DKudql5lGtR4EPRMRGBX+9EXEL2bfc2wwHlZ2Evk2pGQG/Bd5VxTIL27yA7MuAkct4DCAiLo+IN6ZMkJ2XTUQ8EBHHApulYVdLelVEfLDgkO+vpNleD4yVNJGsIB8+LB3Kr9tyVlo3wLYFj2EdskP6vwGMS6cd/Irqn7Oy68TMzFonB0U4ZO8nP0h7pSdGxC4R8Z/pnPI9yU5rOw34XhXzKvWe9DHSxVeBfckK7tHkmsaFuJnZGk7SayR9TNLW6f42ZIXg8GHUi4Ctq7jy6frA0xExmC5SdlzBuCeBl8gunrI6LgA+I2m31MYNJU1J434J7CbpX5Rd4fw0sgu6lfJ54A2Svq50dVZlV2C9VNJGJab5CXC4pDdL6iZ7Q18G3CJpF0lvSoXtINlF2Vak+b5X0qvT3uJn0rxWFFtAOuT+auDrZFev/03B6HLrtpyfAKdJ2jqd+//pgnFjyD6IPAkMSToUKPw5uUXAppI2LDPvouukyraZmVmD5KAIh+yL73enPdrDV1ffVtKrAUVEP9l78l4p/xxFfr0kIhYDg5L2T4PeUzB6Q+DxdDTcVF75MnnkvErlWsZXTTczs+eA/YCPpkL0GbKfM/tEGv97sp8VWyjppYgodejyvwHflHQ+cANZobYRZOdAS/oycHMq2t5WSwMj4meS1gOuTOeFP0tWqPZHxOJUlJ8L/JDskLWby8zrofRm/iXg7lS8z0/TPjfc5hHT3CfpvWRXZh++QvjbI+LFVICfRXZht+VkhegpadK3Ad+StC7ZYdzHVLhq+OVkV5j/birMh5VctxVcRHZo/Gyyq6Z/A3hTekzPSTotzWsdsnO4ryl4zPdKugJ4WNnV11c6jK/cOqmiXWZm1iBrr73200uXLt1k2rRpNU1XKt/V1VX258tKiYi7JH0B+K2ktcjeIz9I9oX0xelIqgA+lSb5IfB9SQPAviPeT05I414g/bJLcj7Z0WbHkhX+wxd7vRNYW9Js4OIyuZZR9qWAmZmZmZmZmTWDD003MzMzMzMzayIX4mZmZmZmZmZN5ELczMzMzMzMrIlciJuZmZmZmZk1kQtxMzMzMzMzsyZyIW5mZmZmZmbWRC7EzczMzMzMzJqoq9UN6BTd3d0Lh4aGxrW6He2oq6tr0fLlyzcvHNbb27twcHDQ69NyoaenZ9HAwMBK26j7/Opzn7e8c5+vL/d5y7tifd6s0RQRrW5DR5AUfX19AMybN4/+/n6mTJnChAkTKk67puf7+vqICBVmJMXwtjljxgymTJlCf38/kyZNqjh/552vd15S0W20r68v9/0rj/lyfb4dtgfnOz9fqs9PnTo19/0rj/lSfX769OltsT043/n5Yn3erNF8aHqdtcubYrvk2+lF3Pk1L5+3/tLu+bw9v847P1Ke+ku754FcPb/OO2/WbC7E6yhvb3Ltns/bi7Lzzo+Up/7S7nnwh3Ln85sflpf+0u75YXl5fp133qwVXIjXUZ7e5No9D/5Q7nx+88Py0l/aPT8sL8+v886Xkof+0u75Qnl4fp133qxV2q4Ql/Q5SXdLmiNplqT9KuT7JH083f6ipIPT7dMlrVtimlMlPSgpJI2ttm15eZNr9/ywvLwoO+98KXnoL+2eL5SH59d550cjb/0rb/la5W17cL6z82bN1lZXTZe0P3AEsFdELEtF8phqp4+IMwvung5cCiwtEr0Z+AUwo5b25eFNrt3zhfLwouy886ORt/6Vt3yt8rY9ON/Z+VrlrX/lLV+rvG0Pznd23qwV2qoQB7YAFkfEMoCIWDw8QtJ84Cpgchp0XEQ8WDixpEvICuwt0990SYsjYnJhLiLuTPm6Nj5vb4p5y9cqby/iznd2vlZ56195y9cqb9uD852dr1Xe+lfe8rXK2/bgfOfnzVqh3Q5Nvx7YRtL9kr4r6aAR45dExL7A+cA5pWYSEecCC4DJI4vwWkg6RdJMSTMrZfP2ppi3fK3y+CLufOfma5W3/pW3fK3ytj043/n5WuStf+UxX4s8bg/Od37erBXaqhCPiOeB1wOnAE8CV0k6viByRcH//ZvQngsjYu+I2LtcLo9vinnK1yqvL+LOd26+FnnrX3nM1yKP24PznZ+vVh77Vx7z1crr9uB85+fNWqGtCnGAiFgRETMi4vPAqcC7CkeXuN0yeX1TzFO+Fnl+EXe+c/PVymP/ymO+WnndHpzv/Hw18tq/8pivRp63B+edN2uEtirEJe0iaaeCQROBRwruH13w/9YKs3sOWL+OzVtFnt8U85SvVt5elJ1fc/LVyGv/ymO+GnneHpx3Ps/9qx3zeXt+nXferBnaqhAH1gOmSbpH0hxgV6CvYPw6kv4EfAQ4o8K8LgSulTR95AhJp0n6G7A1MEfS92ttaN7e5PKcr0beXpSdd75QnvtXO+bz9vw673yhvPWXds/n7fl13nmzZmmrq6ZHxO3AG8pEvhMRXxgxTV/B7eMLbp8HnFdiOecC565uO/P2Jtfu+by9KDvvfKG89Zd2z+ft+XXe+UJ56y/tns/b8+u882bN1G57xHMvb29y7Z7P24uy884Xylt/afd83p5f550fKU/9pd3zQK6eX+edN2u2ttojXk5EjG91G/L2Jtfu+by9KDvv/Eh56i/tngd/KHc+v/lheekv7Z4flpfn13nnzVrBe8TrKE9vcu2eB38odz6/+WF56S/tnh+Wl+fXeedLyUN/afd8oTw8v847b9YqisjFr3y1va6urqdWrFixSavb0Y66uroWLV++fPPCYeuss85TL774oten5UJPT8+igYGBlbbR7u7uRUNDQ5u1qk3trFif7+3tXTQ4OOj1ablQos8vHBoaGteqNrWzEn1+4eDgoNen5UKxPm/WaC7EzczMzMzMzJrIh6abmZmZmZmZNZELcTMzMzMzM7MmciFuZmZmZmZm1kQuxM3MzMzMzMyayIW4mZmZmZmZWRO5EDczMzMzMzNrooqFuKSPSNpAmYsl3SHpkGY0zszMzMzMzKzTVLNH/MSIWAIcArwaOAE4q6GtMjMzMzMzM+tQ1RTiSv8PA34YEbMLhpmZmZmZmZlZDbqqyNwu6XpgAvAZSesDLzW2We2nt7d30eDg4Gatbke76+npWTQwMLB5d3f3oqGhIa/P1dTV1bVo+fLlmxcOW2eddZ568cUXN2lVm8yGDffzwmFdXV1PrVixwtvnairW5/2+ZHlRrM/7fX50SvT5hYODg+Na1aZOMWbMmKeXLVu2aavbYZ1PEVE+IK0FTAQejohnJG0KbBURc5rRwHYhKaZPn86kSZMqZmfMmMGUKVPo7+93fgRJRIQkxdSpU5kwYULF+c+bN4/+/n6mTJnifNLX10dErHTkiqSo1N8hX9uD852ZH+7nI4ZFX19fxfnnoX/lMb+6fT4P24PznZ9f3T6fl/6Vx/zq9Pm8bA95zy9evHiVdWvWCBUPTY+Il4BFwK6SDgR2AzZqdMPaUZ5eRNo1X6jVb3KdkK9V3rYH5zs7X6u89a+85WuVt+3B+c7O1ypv/Stv+VrlbXvIc96sWSoemi7pa8DRwD3AijQ4gBsb2K6OlOcXnbzka5G3N8W85WuVx+3B+c7N1ypv/Stv+VrlbXtwvrPztcpb/8pjvhZ52x7aPW9WL9WcI34ksEtELGt0YzpZ3l5E8pqvVh7fFPOUr1VetwfnOzNfq7z1rzzma5G37cH5zs/XIo/9K4/5auVxe2jnvFk9VTw0HXgY6G50QzpZ3l5E8pyvRl7fFPOUr0WetwfnOzNfizz2rzzmq5XH7cH5zs9XK6/9K4/5auR1e2jXvFm9VVOILwVmSfqepHOH/xrdsFIkfU7S3ZLmSJolab8K+T5JH0+3vyjp4HT7dEnrlpjmMkn3SZor6QeSVvuLiLy9iLR7Ps9vinnKVytvz6/za0a+WnntX3nMVyOv24PznZ+vRp77Vzvm87w9tGPerBGqKcSvAf4TuAW4veCv6STtDxwB7BURewIHA49WO31EnBkRv013TweKFuLAZcBrgD2AXuCk1Wlv3l5E2j2ftze5POerkbfn1/k1J1+NPPevdszneXtw3vm89Zd2z+ft+W33vFmjVDxHPCKmSRoD7JwG3RcRyxvbrJK2ABYPn68eEYuHR0iaD1z1/9u79zi5yjrP459v0h06McpFJgkCbhOIuhAhBlB0JCSAIBARXoBcHDYgF3W9wS6jIjszcbyNy65hDKALBhMUQYk6Zt1BRSWEUUE69wCaIASB3AQkgHSH7uS3f9RprHS6qqvorjpPVX/fr1e/uurUt+o81c/5nVNPn0sBM7JJ50XEw8VPljQf+DHwuuznLklPRcSM4lxE/HvRc34L7FdtQ1NbiTR6PrWNXKPnU+tf550vllq9NHo+tf513vliqdVLo+dT699Gz5vV0oB7xCVNB9YB1wHXA2uzrzHLw8+A/SWtlXS9pGP6PP5cRLwVuBa4ptSLRMRXgQ3AjL6D8GLZIennAz8p8filkjokdRRPT20l0uj51DZyjZ5PrX+dd75YagRFICMAABvcSURBVPXS6PnU+td554ulVi+NngeS6t9Gz5vVWiWHpv9v4ISIOCYipgEnAnNq26z+RcQLwOHApcCfgO9KuqAocmvR77cPwSyvB5ZExD0l2nNDRBwREUf0TkttJdLo+dQ2co2eT61/nXe+WGr10uh58Idy59PNA0nVS6Pne6XSv42eN6uHSr6+rDUift97JyLWDubiZYMVEduBxcBiSauBWcD83oeLo4OZj6R/Av4G+GClz0ltJdLo+dQ2co2eB38odz7dPPhD+VDme6XSv847359U6qXR88VS6N9Gz5vVSyV7xDskzZM0Pfu5kfwu1vZGSZOKJk0BHiu6f3bR798M8HLPA68uMZ+LKez5PzcidlTavpRWIo2eB38oH8p8r1T613nn+5NKvTR6vlgK/eu886WkUC+Nnq9WastDinmzeqlkj/iHgY8AHwcELKFwyHYexgJzJe0B9AAPUzhMvdduku6j8A+Gcwd4rRuAOyRt7Oc88a9TGOD/RhLADyLinwdqXEorkUbO90plI9fo+WIp9K/zzpeSQr00er5aqS0Pzjd3vlqp1Vdq+Wqltjykmjerl0qumr4N+Er2k6uIWAq8o0zkuoj4bJ/nzC66fUHR7bnA3BLzqeQfFLtIaSXSqPliKWzkGj1frdSWB+ebO1+t1OortXy1UlsenG/ufLVSq6/U8tVKbXlIOT9jRt/9c2a1UXLAKel7EfG+7DzsXc63zr7H26qQ8konlXw1UtsoppavVorLg/PNm69WavWVWr5aqS0Pzjd3vlqp1VeK+Wqktjw0et5sqJTb8/uJ7PfMejRksCKiPe82lJPaSiTVfKVS3CimlK9WqsuD882Zr1Zq9ZVivhqpLQ/ON3++GinWV4r5SqW4PDRy3mwoKaL8xcUlfTkiPjXQtOFu9OjRm7q6usbn3Y5G19bWtrmzs3NCa2vrpp6eHv89X6GRI0c+09PT89riaV5GLRWjRo16Ztu2bTstn675wWlpadnS3d2909/PNW+paGtr29LZ2bnTsuiaH5yWlpbN3d3dE4qnueaHRu9n0bzbYc2vkoH4soiY2mfaKh+abmZmZmZmZla9cueIfxj4r8BESauKHno18KtaN8zMzMzMzMysGZXcIy5pd2BP4EvAp4seej4inqlD28zMzMzMzMyazoCHpr8clMYBbb33I+KPtWqUmZmZmZmZWbMaMVBA0nskrQMeBe4G1gN31LhdZmZmZmZmZk1pwIE48HngKGBtRBwAHIfPETczMzMzMzN7RSoZiHdHxNPACEkjIuIuYEqN22VmZmZmZmbWlEpeNb3Is5LGAkuAWyRtAXpq2ywzMzMzMzOz5lTJ94i/CuiksPf8/cDuwC3ZXnIzMzMzMzMzq0LZgbikkcBPI+L4+jXJzMzMzMzMrHmVPUc8IrYDL2bfKW5mZmZmZmZmg1TJOeJdwGpJdwJ/6Z0YER+vWasa0OjRozd1dXWNz7sdZgCjRo16Ztu2ba8tntba2rqpp6fHy+grMHLkyGd6enp2+nu65i0lbW1tWzo7O3daHl3zr1xLS8uW7u7unf52rnlLSVtb2+bOzs4JxdNc869cS0vL5u7u7gkDJ82GTiXniM/qb3pELKhJixqUpOjvb7l48WLOOussbr/9dqZPnz7g6zjv/FDkn3rqKSJCxY9JitmzZ++Uf/TRR7n99ts566yzOOCAAwZ8/eGaf/HFF/v9e/at+VSXB+ebPz9jxowBaz7V+koxv2DBggFrPuXlwfnmz0sqW/Mp11eK+dmzZ+/y9zSrtQG/viwbcH8PuDciFvT+1L5pjS/1lbjzzZuvROobxZTylUh5eXDe+ZTrqxHzqfWv884XS61eGj1vVisDDsQlvQdYAfwkuz9F0qJaN6zRpbZSdt75Yqlt5Bo9n1r/Ou98sdTqpdHzqfWv884XS61eGj1vVksDDsSB2cBbgWcBImIF4CW3jNRWys47Xyy1jVyj51PrX+edL5ZavTR6PrX+dd75vlKql0bPm9VaJQPxnojY2mda+RPLa0jSVZIekLRK0gpJbxsgP1vSFdntf5Z0fHb7MkljSjxnnqSV2TwWShpbaftSWyk773yx1DZyjZ5PrX+dd76vlOql0fNAUv3rvPP9SaVeGj1vVg+VDMTXSDoPGClpkqS5wK9r3K5+SXo7MBOYGhGHAscDj1f6/Ij4x4j4eXb3MqDfgThweUQcls3jj8BHK3n91FbKzjvfV0obuUbPgz+UO59uvlcq9dLo+V6p9K/zzpeSQr00et6sXioZiH8MOATYBnwH2Ap8opaNKmMf4KmI2AYQEU9FxAYASeslfVnSb7Ofg/o+WdJ8SWdK+jjwOuAuSXf1zUXEc1lewGgqPAIgpZWy8873J5WNXKPne6XSv847X0oK9dLo+WIp9K/zzg9GavWVWt6snioZiJ8SEVdFxJHZz/8ATq11w0r4GbC/pLWSrpd0TJ/Hn4uItwLXAteUepGI+CqwAZgRETP6y0j6JrAJeBMwt0TmUkkdkjrAH8qdTzNfLIWNXKPni6XQv847Pxip1Vdq+Wqltjw439z5aqVWX6nlzeqtkoH4lRVOq7mIeAE4HLgU+BPwXUkXFEVuLfr99kHO60IKe80fAs4ukbkhIo6IiCPAH8qdTy9frdQ2iqnlq5Xa8uB8c+erlVp9pZavVmrLg/PNna9WavWVWt4sDy2lHpB0EnAysK+krxY99Bqgp9YNKyUitgOLgcWSVgOzgPm9DxdHh2Jekr4L/D3wzcG+XmorceebO1+t1DaKqeWrldry4Hxz56uVWn2llq9WasuD882fr0Zq9ZVi3iwP5faIbwA6gC5gadHPIuDE2jdtV5LeKGlS0aQpwGNF988u+v2bAV7ueeDV/cxDveeXZ+eIvwf43StudCbFlbjzzZuvVoobxZTy1UpteXC++fPVSK2+UsxXI8Xlwfnmz1cqxfpKMW+Wh5J7xCNiJbBS0i0Rkdse8D7GAnMl7UFhr/zDFA5T77WbpPso/IPh3AFe6wbgDkkb+5wnLmCBpNdkt1cCHx5Mo1NdiTvfvPlqpLpRTClfjRSXB+ebP1+pFOsrxXylUl0enG/+/IwZ/V7iaCep1leK+QULFgyYNxtq5Q5N/15EvA9YLmmXw7yzr/aqq4hYCryjTOS6iPhsn+fMLrp9QdHtufRzEbaI2AH87WDb2ivllbjzzZuvVMobxZTylUp1eXC++fP+UD60+Uo+lKe8PDjvfMr11Yh5s1ood2h671eUzaRweHbfHxtAaitl54dPvhKpbeRSzlci5eXBeedTrq9GzKfWv847Xyy1emn0vFmtlDs0fWP2+7FSmZRERHvebSiW2krZeeeLpbaRa/R8av3rvPPFUquXRs+n1r/OO18stXpp9LxZLZXbI26vUGorZeedL5baRq7R86n1r/POF0utXho9n1r/Ou98XynVS6PnzWpNEYP+li8DRo8evamrq2t83u0wA2hra9vc2dk5oXhaa2vrpp6eHi+jr0BLS8vm7u7unf6ernlLSYma39zT0zMurzY1shI1v7mrq8t/T0tCfzXf0tLy9Pbt2/fKq02NrL+aN6u1kgNxSVcA342Ix+vbJDMzMzMzM7PmVe7Q9H2BX0taIunDkvauV6PMzMzMzMzMmlXZQ9MlCZgGnAO8l8J3at8K/DAinq9LC83MzMzMzMyaSMXniEsaCRwP/AvwxogYU8uGmZmZmZmZmTWjkl9fVkzSmynsFT8beBr4TC0bZWZmZmZmZtasSg7EJU0CzqUwAN8O3AacEBGP1KltZmZmZmZmZk2n3FXTH6FwPvhtEbG6rq0yMzMzMzMza1LlBuKTgPER8R99ph8NbIiIP9ShfWZmZmZmZmZNpdzXl80BnutneidwTW2aY2ZmZmZmZtbcyg3E2yNiVd+JEdEBtNesRWZmZmZmZmZNrNxV09vKPDZ6qBvS6EaPHr2pq6trfN7tMLOh19bWtrmzs3NC8TTXvFnzcs2bDS/91bxZrZU7R/xW4JcRcWOf6RdRuHr62XVoX8OQFJV+J7uZNRZJRIT6THPNmzUp17zZ8NJfzZvVWrmB+Hjgh8BLwNJs8hHAKOD0iNhUlxY2CG+gzZqXP5SbDS+uebPhxQNxy0PJgfjLAWkGMDm7+0BE/LLmrWpA3kCbNS9/KDcbXlzzZsOLB+KWhwEH4lYZb6DNmpc/lJsNL655s+HFA3HLQ7mrppuZmZmZmZnZEKvZQFzSBEm3SfqDpAcl/bukN0hql7SmRvOcLemKATLzJZ1ZxWvWrL1mZmZmZmY2/NRkIC5JFC70tjgiDoyIg4HPAP7aD0vKpk2bOOecczjwwAM5+OCDOfnkk1m7di3r169n8uTJA7/AK7Bt2zbOPvtsDjroIN72trexfv36mszHzHaVR80vWbKEqVOn0tLSwsKFC2syDzPrXx41/5WvfIWDDz6YQw89lOOOO47HHnusJvMxs8ZWqz3iM4DuiPh674SIWBER9xSHsr3N90halv28I5u+j6QlklZIWiPpaEkjs73ZayStlnR5uQZIukTS/ZJWSvq+pDFFDx+fzXetpJlZfqSkq7PnrJL0waH7c1iKIoLTTz+d6dOn84c//IEHH3yQL37xi2zevLmm8503bx577rknDz/8MJdffjmf+tSnajo/MyvIq+Zf//rXM3/+fM4777yazsfMdpZXzb/lLW+ho6ODVatWceaZZ/LJT36ypvMzs8ZUq4H4ZP76lWflbAHeFRFTgbOBr2bTzwN+GhFTgMOAFcAUYN+ImBwRbwa+OcBr/yAijoyIw4CHgIuKHmsHjgFOAb4uqS17fGtEHAkcCVwi6YByM5B0qaQOSR0VvFdLzF133UVraysf+tCHXp42ZcoUjj766J1y69ev5+ijj2bq1KlMnTqVX//61wBs3LiRadOmMWXKFCZPnsw999zD9u3bueCCC5g8eTJvfvObmTNnzi7z/dGPfsSsWbMAOPPMM/nFL36BLwBkVnt51Xx7ezuHHnooI0b4sixm9ZRXzc+YMYMxYwr7f4466iieeOKJGr5LM2tULTnPvxW4VtIUYDvwhmz6/cBNklqBf4uIFZIeASZKmgv8P+BnA7z2ZEmfB/YAxgI/LXrsexGxA1iXve6bgBOAQ4vOH98dmASsLTWDiLgBuAEKV1Ot9E1bGtasWcPhhx8+YG7cuHHceeedtLW1sW7dOs4991w6Ojr4zne+w4knnshVV13F9u3befHFF1mxYgVPPvkka9YULivw7LPP7vJ6Tz75JPvvvz8ALS0t7L777jz99NPsvffeQ/sGzWwnedW8meUjhZqfN28eJ5100pC8HzNrLrUaiD8AVHJBtMuBzRT2eo8AugAiYomkaRT2WH9L0tURcbOkw4ATgY8A7wM+UOa15wOnRcRKSRcA04se6ztoDkDAxyKieMCOpPYK3oc1se7ubj760Y+yYsUKRo4cydq1hf/NHHnkkXzgAx+gu7ub0047jSlTpjBx4kQeeeQRPvaxj3HKKadwwgkn7PJ6/e39LlxWwcxSMNQ1b2Zpq1XNf/vb36ajo4O77767Xm/FzBpIrY6T+yWwm6RLeidIOlLSMX1yuwMbs73T5wMjs+x/ArZExI3APGCqpL2BERHxfeAfgKkDtOHVwMZsr/r7+zx2lqQRkg4EJgK/p7DH/MNZnuwK76+q+p1bwzjkkENYunTgMyjmzJnD+PHjWblyJR0dHbz00ksATJs2jSVLlrDvvvty/vnnc/PNN7PnnnuycuVKpk+fznXXXcfFF1+8y+vtt99+PP744wD09PSwdetW9tprr6F9c2a2i7xq3szykWfN//znP+cLX/gCixYtYrfddhvS92VmzaEmA/Eo7PI7HXhX9vVlDwCzgQ19otcDsyTdS+Gw9L9k06cDKyQtB84A/hXYF1gsaQWFvd1XDtCMfwDuA+4Eftfnsd8DdwN3AB+KiC7gG8CDwLLs68r+D/kfum81dOyxx7Jt2zZuvPHGl6fdf//9u/zneuvWreyzzz6MGDGCb33rW2zfvh2Axx57jHHjxnHJJZdw0UUXsWzZMp566il27NjBGWecwec+9zmWLVu2y3xPPfVUFixYAMDChQs59thjvUfcrA7yqnkzy0deNb98+XI++MEPsmjRIsaNG1fbN2lmDUu+SNTQkBT+WzaeDRs2cNlll7F06VLa2tpob2/nmmuuobW1lZkzZ7JmzRrWrVvHGWecwZgxY5gxYwZz587lhRdeYMGCBVx99dW0trYyduxYbr75Zp577jkuvPBCduzYAcCXvvSlXc4N6+rq4vzzz2f58uXstdde3HbbbUycODGPt28VkkREqM8013wDyqPm77//fk4//XT+/Oc/09bWxoQJE3jggQfyePtWIdd888ij5o8//nhWr17NPvvsAxS+OWHRokV1f+9Wuf5q3qzWPBAfIt5AmzUvfyg3G15c82bDiwfilgd/l4qZmZmZmZlZHfkc6CHS1ta2WdL4vNthZkOvra1tc3/TXPNmzck1bza89FfzZrXmQ9PNzMzMzMzM6siHppuZmZmZmZnVkQfiZmZmZmZmZnXkgbiZmZmZmZlZHXkgbmZmZmZmZlZHHoibmZmZmZmZ1ZEH4mZmZmZmZmZ15IG4mZmZmZmZWR15IG5mZmZmZmZWRx6Im5mZmZmZmdWRB+JmZmZmZmZmdeSB+BCRdGnebbCduU/S4z5Jk/slPe6T9LhP0uM+SY/7xKxyHogPHa940uM+SY/7JE3ul/S4T9LjPkmP+yQ97hOzCnkgbmZmZmZmZlZHHoibmZmZmZmZ1ZEH4kPnhrwbYLtwn6THfZIm90t63CfpcZ+kx32SHveJWYUUEXm3wczMzMzMzGzY8B5xMzMzMzMzszryQNzMzMzMzMysjjwQHyRJ75b0e0kPS/p03u0ZriTtL+kuSQ9JekDSJ7Lpe0m6U9K67Peeebd1uJE0UtJyST/O7h8g6b6sT74raVTebRxOJO0haaGk32X18nbXSb4kXZ6tt9ZIulVSm+uk/iTdJGmLpDVF0/qtDRV8Ndv2r5I0Nb+WN68SfXJ1tv5aJemHkvYoeuzKrE9+L+nEfFrd3Prrk6LHrpAUkvbO7rtOzMrwQHwQJI0ErgNOAg4GzpV0cL6tGrZ6gP8eEf8ZOAr4SNYXnwZ+ERGTgF9k962+PgE8VHT/y8CcrE/+DFyUS6uGr38FfhIRbwIOo9A3rpOcSNoX+DhwRERMBkYC5+A6ycN84N19ppWqjZOASdnPpcDX6tTG4WY+u/bJncDkiDgUWAtcCZBt888BDsmec332Oc2G1nx27RMk7Q+8C/hj0WTXiVkZHogPzluBhyPikYh4CbgNeG/ObRqWImJjRCzLbj9PYXCxL4X+WJDFFgCn5dPC4UnSfsApwDey+wKOBRZmEfdJHUl6DTANmAcQES9FxLO4TvLWAoyW1AKMATbiOqm7iFgCPNNncqnaeC9wcxTcC+whaZ/6tHT46K9PIuJnEdGT3b0X2C+7/V7gtojYFhGPAg9T+JxmQ6hEnQDMAT4JFF8F2nViVoYH4oOzL/B40f0nsmmWI0ntwFuA+4DxEbERCoN1YFx+LRuWrqGwYd6R3X8t8GzRhyjXTH1NBP4EfDM7XeAbkl6F6yQ3EfEk8L8o7EXaCGwFluI6SUWp2vD2Pw0fAO7IbrtPciLpVODJiFjZ5yH3iVkZHogPjvqZ5u+Dy5GkscD3gcsi4rm82zOcSZoJbImIpcWT+4m6ZuqnBZgKfC0i3gL8BR+GnqvsnOP3AgcArwNeReFwzr5cJ2nxuixnkq6icFraLb2T+om5T2pM0hjgKuAf+3u4n2nuE7OMB+KD8wSwf9H9/YANObVl2JPUSmEQfktE/CCbvLn3MKjs95a82jcM/S1wqqT1FE7bOJbCHvI9skNwwTVTb08AT0TEfdn9hRQG5q6T/BwPPBoRf4qIbuAHwDtwnaSiVG14+58jSbOAmcD7I6J3YOc+yceBFP6RuDLb3u8HLJM0AfeJWVkeiA/O/cCk7Oq2oyhcJGRRzm0alrJzj+cBD0XEV4oeWgTMym7PAn5U77YNVxFxZUTsFxHtFGrjlxHxfuAu4Mws5j6po4jYBDwu6Y3ZpOOAB3Gd5OmPwFGSxmTrsd4+cZ2koVRtLAL+S3ZV6KOArb2HsFttSXo38Cng1Ih4seihRcA5knaTdACFC4T9No82DicRsToixkVEe7a9fwKYmm1vXCdmZeiv/0i0V0LSyRT28o0EboqIL+TcpGFJ0juBe4DV/PV85M9QOE/8e8DrKXzgPSsi+rvIiNWQpOnAFRExU9JECnvI9wKWA38XEdvybN9wImkKhYvnjQIeAS6k8E9Z10lOJH0WOJvCYbbLgYspnEfpOqkjSbcC04G9gc3APwH/Rj+1kf3T5FoKV49+EbgwIjryaHczK9EnVwK7AU9nsXsj4kNZ/ioK5433UDhF7Y6+r2mD01+fRMS8osfXU/gWiKdcJ2bleSBuZmZmZmZmVkc+NN3MzMzMzMysjjwQNzMzMzMzM6sjD8TNzMzMzMzM6sgDcTMzMzMzM7M68kDczMzMzMzMrI48EDczs6YgabukFZIekLRS0n+TVHY7J6ld0nl1aNs3JB08QOa0gTJmZmbWHDwQNzOzZtEZEVMi4hDgXcDJFL53uJx2oOYD8Yi4OCIeHCB2GuCBuJmZ2TDggbiZmTWdiNgCXAp8VAXtku6RtCz7eUcW/Rfg6GxP+uVlci/LMr+TtEDSKkkLJY3JHjtO0nJJqyXdJGm3bPpiSUdkt1+Q9IVsr/29ksZn8zkVuDpry4GSPi7pwWwet9Xj72ZmZmb1oYjIuw1mZmaDJumFiBjbZ9qfgTcBzwM7IqJL0iTg1og4QtJ04IqImJnlx/SX6/Oa7cCjwDsj4leSbgIeBK4F1gHHRcRaSTcDyyLiGkmLs/l0SArg1Ij4v5L+J/BcRHxe0nzgxxGxMJvPBuCAiNgmaY+IeHbo/2pmZmaWB+8RNzOzZqbsdytwo6TVwO2UPgS80tzjEfGr7Pa3gXcCbwQejYi12fQFwLR+nvsS8OPs9lIKh8f3ZxVwi6S/A3pKZMzMzKwBeSBuZmZNSdJEYDuwBbgc2AwcBhwBjCrxtEpzfQ8nC/466B9Id/z1cLTtQEuJ3CnAdcDhwFJJpXJmZmbWYDwQNzOzpiPpb4CvA9dmg97dgY0RsQM4HxiZRZ8HXl301FK5vl4v6e3Z7XOB/wB+B7RLOiibfj5wdxXNfrkt2dXe94+Iu4BPAnsAY8s818zMzBqIB+JmZtYsRvd+fRnwc+BnwGezx64HZkm6F3gD8Jds+iqgJ7tw2uVlcn09lOVWAXsBX4uILuBC4Pbs0PYdFP4ZUKnbgL+XtByYBHw7e53lwByfI25mZtY8fLE2MzOzKmQXa/txREzOuSlmZmbWoLxH3MzMzMzMzKyOvEfczMzMzMzMrI68R9zMzMzMzMysjjwQNzMzMzMzM6sjD8TNzMzMzMzM6sgDcTMzMzMzM7M68kDczMzMzMzMrI7+P7RUQBTLZX0oAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "mglearn.plots.plot_stratified_cross_validation()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### More control over cross-validation\n", "- 기본적으로...\n", " - 분류: StratifiedKFold가 사용됨\n", " - 회귀: KFold가 사용됨\n", "- 하지만, 때때로 분류에 KFold가 사용되어야 할 필요도 있음\n", " - 다른 사람이 이미 수행한 사항을 재현해야 할 때\n", " - StratifiedKFold가 아닌 KFold를 생성하여 cross_val_score()의 cv 인자에 할당" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from sklearn.model_selection import KFold\n", "kfold = KFold(n_splits=5) #교차 검증 분할기의 역할 수행" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Cross-validation scores:\n", "[1. 0.933 0.433 0.967 0.433]\n" ] } ], "source": [ "print(\"Cross-validation scores:\\n{}\".format(cross_val_score(logreg, iris.data, iris.target, cv=kfold)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 이런 경우 3-Fold를 사용하면 데이터 타겟 레이블 분포 특성상 성능이 매우 나쁠 수 있음" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Cross-validation scores:\n", "[0. 0. 0.]\n" ] } ], "source": [ "kfold = KFold(n_splits=3)\n", "print(\"Cross-validation scores:\\n{}\".format(cross_val_score(logreg, iris.data, iris.target, cv=kfold)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 해결책\n", " - KFold를 만들 때 shuffle=True를 통해 데이터를 임의로 섞음.\n", " - random_state=0을 주면 추후 그대로 재현이 가능" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Cross-validation scores:\n", "[0.9 0.96 0.96]\n" ] } ], "source": [ "kfold = KFold(n_splits=3, shuffle=True, random_state=0)\n", "print(\"Cross-validation scores:\\n{}\".format(cross_val_score(logreg, iris.data, iris.target, cv=kfold)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Leave-one-out cross-validation (LOOCV)\n", "- Fold 하나에 하나의 샘플이 들어 있는 Stratified k-Fold 교차 검증\n", " - 즉, 각각의 반복에서 테스트 데이터에 하나의 샘플만 존재\n", " - 데이터셋이 클 때 시간이 매우 오래 걸림\n", " - 작은 데이터셋에 대해서는 일반적인 상황에 대한 거의 확실한 score 값을 얻을 수 있음." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of cv iterations: 150\n", "Mean accuracy: 0.95\n" ] } ], "source": [ "from sklearn.model_selection import LeaveOneOut\n", "loo = LeaveOneOut()\n", "scores = cross_val_score(logreg, iris.data, iris.target, cv=loo)\n", "print(\"Number of cv iterations: \", len(scores))\n", "print(\"Mean accuracy: {:.2f}\".format(scores.mean()))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Shuffle-split cross-validation\n", "- 임의 분할 교차 검증\n", " - model_selection.SuffleSplit(n_splits=10, test_size='default') or model_selection.StratifiedSuffleSplit(n_splits=10, test_size='default')\n", " - n_splits: 10\n", " - 분할의 개수\n", " - test_size 만큼의 테스트 셋트를 만들도록 분할\n", " - test_size의 기본값: 0.1\n", " - 보통 test_size 값만 설정하며, 추가적으로 train_size 도 설정 가능\n", " - 이런 경우 전체 데이터 집합 중 일부만 훈련과 테스트에 사용할 수 있음\n", " - 대규모 데이터에 유용\n", " - test_size, train_size\n", " - 정수: 데이터 포인트의 개수\n", " - 실수: 데이터 포인트 비율

\n", "\n", "- 아래 그림 예제\n", " - 전체 데이터 셈플 개수: 10\n", " - train_size = 5\n", " - test_size = 2\n", " - n_splits = 4" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false, "hide_input": false }, "outputs": [ { "data": { "image/png": "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Tcfr2bNnfbt27WzChAkDjjnmmPUnnnjieoCZM2d2fe+998ob49avX1+yadOm7D0ANN31dcDbQIdMrsXL5AUsBSqzNb3mvsrLy6sIGlgF8SovL69KVM727duvyXdubVXW8vLylfnOrS3KWVpaWlB1F7DS0tJtylpo39FU67TQylos5Symsvp2t7SgygmJt7vF9JozZ85SM5vV+AJsxowZlokZM2ZYZWVlynjA4qef6nXxxRcvv+qqq5aZ2az58+fPHzJkyObGz+bNmzd/wIABtatXr37DzGYdf/zxa2677bYlZjZrn3322Thz5syFW7dundW5c+dY4zh/+MMf3vv2t7+92sxmXXDBBcuvueaaD+PjzWzWBx98MKd///61ZjZr7Nixnzz99NOLGscfNGjQ5sa4+NfmzZtnT5069Z3jjz9+zZgxY9ab2ayuXbvGampqZjeNjZ9vule4LhKup0wu2VoClAEpO+NkyswGZmM6LVVTU9M7n/NvK1u2bNkp3zm0lZqaml75zqEt1NXVFUXdLZbvKBRPWYulnFA8ZS2i7W5RlLPY5fvMSSKffPJJSadOneq7detW/8EHH5S9+OKLXY888sj12ZzHAQccsGnatGndjjrqqE2vvfZaxZIlS7bpf7Ju3bp2NTU17SZMmLB+7Nixnw4fPnw4wIEHHrjhhhtu6PGLX/xiFcDLL79cMWbMmJouXbo0bNy4saS1uWXSQNkMzJH0HHGNFDO7sLUzd84555xzLl/69u0ba0Yf67SXYfft2zfW6qSAAw88cPOgQYNqBw8ePHyXXXbZMmrUqE3ZmG68K664YtX48eN3HTx48LC99tpr8+67717TvXv3L9w+bO3atSXf+MY3dt+6davMjF/96lfLAO66664PzzjjjF0GDx5cWV9frzFjxmwcM2bMhyeccMInJ5544peeeOKJbrfccssHhx9+eItuN6zgbFSKAOm0RMPNzHtZOeecc8657cbcuXOXjhgxojrfeURBXV0ddXV16tixo82fP7/DUUcdNXjp0qXzy8rK2mT+c+fOrRwxYsTARJ9lchevKZLaA4PDQW+bWV0W83POOeecc861ofXr15eMHTt2cCwWk5kxefLkD9qqcZJOJnfxOhiYQtC5XUB/SaeZWdK7eDnnnHPOOeeiq7Kysn7hwoVv5TuPRDK55u63wBFm9jaApMHANGBULhNzzjnnnHPOFZ9MniRf1tg4ATCzxQR39XLOOeecc865rMrkDMosSXcD94X/nwLMzl1KuVVRUVFVW1tbMLcNLC8vX5notpaFVk6A8vLyVYlubVloZS2ydbpNWYulnABlZWVVsVisYMpaWlq6MtHtsDt06LBm69at3fORU64Uy/e0iOruqkS3FC609QnQvn37tcX0KAK3fcrkLl4dgB8CXyXog/IicLuZZeW5KG1NkqUr8/ZEEma2zZM7G8sZtSfytvYJ66nKWijSrdN4UV5fmcQnKmuq9Rm1/DONT7VOJ06cmHS8qD1hOl38xIkTW/Udjcr6yiS+Od/T7Vmqcp522mnbVf1MFT9lypS063N7qp+p4qurqxOWtVj4Xbyio7V38doC/G/4ypiknwEnA/VAA3COmb2aIn4isMnMbpJ0LfCimU2XdBFwp5ltTjDOA8BooA54LZyH32EsFNWNY67ii03Uln9L4psjivnnsn5GeWcuk/jmitr68u1PelGqb7mOj1p9a+3BPve53r17j1i5cmXGz0FJp1evXrGqqqq5yT6vqqoqOfjgg4cAVFdXl7Vr1866d+8eA5gzZ85b5eXlGR3hmDRp0k7f/OY31++yyy6teu7Kv/71r45VVVWlJ5xwwobWTCfbkq4QSQ+a2bclzQe2WVhm9uUU4x4AHAvsY2ZbJFUC7TNNysyujvv3IuB+ggdGNvUA8J3w/VTgTOCOTOdT6KK6cfSdg9aL2vJvaXymopq/N06yI2rry7c/mYlKffPGSXbji83KlStLO3bsmM0zySkbO717965ftGjRmwCXXHJJn86dO9dfe+21K5ub93333Ve53377bW5tA+W1117ruGDBgortpoEC/Cj8e2wLprszUN14GZiZfXYqTdJS4K9AYxP+ZDN7N35kSfcCTwB9wtcMSdVm9oVmv5k9FTfOa0C/FuRasKKysfONaXZFbfnn+khelPPPxZmiqO2ceePEJROF+tYW9TlK9c3rc25EZXs4efLkne68886edXV1Gj169KYpU6Z82NDQwPjx43d98803K8xMp5122upevXrVvfXWWx1PPvnk3crLyxuannm55pprev75z3/uUVpaakOHDq157LHH3l+/fn27M844Y5fFixdXxGIxXXXVVR8ff/zxG2688cada2tr27388stdLr/88hWnn376uqwXrAWSNlDMbEX49gdmdnn8Z5JuAC7fdqzPPANcLWkxMB34q5m9EPf5BjPbT9KpwCSSNILM7BZJlwDj4hs5TUkqA77L540qB5HY2PnGNLuitvw9PrP4TEVt58wbJ641olY/W1qfo1LfvD7nThS2h//5z3/KH3vssR1ff/31t8rKypgwYcKAP/7xj90HDx68Ze3ataWLFy9+E6C6urqksrKy/ve//33PyZMnfzhmzJiaptO69dZbey9btmx+eXm5VVdXlwBcfvnlfY488sj1jzzyyNLVq1eX7Lvvvnt84xvfWHjZZZetWLBgQcU999yzLOuFaoVMbjN8eIJhR6cawcw2ETwn5WxgNfBXSd+LC5kW9/eADHJI53aCPisvJfpQ0tmSZkmalYV5FYyobRx9Y5pelJa/x2cen4mo7Zy1JL45ory+fPvTelGsny3duYxCffP6nF+5bpwAPP30013nzZvXaa+99ho2dOjQYa+88kqX9957r8OwYcNqlyxZUn766af3f+SRR7p27969Pt20Bg0aVPvNb35z1zvuuKN7+/btDeD555/vetNNN+08dOjQYV/72teGbNmyRe+++27G3S/aWqo+KOcBPwC+JGle3EddgJnpJmxm9cDzwPNhP5bTgHsbP44PbV7K2+T5C6AHcE6KXO4E7gzjC+f2Kq0QtY2jb0wzE5Xl7/HZjY/azllL4zMVteXfkniXXFTrp58JdC3RFo0TADNjwoQJ1TfffPPypp8tXLhw4SOPPLLD5MmTez788MPdpk2b9kGqab344ouLn3rqqS6PPvrojjfeeOPOixcvXmhmPProo+8NHz78C3fhnT59epdslyUbUp1BmQocBzwe/m18jTKz76QYD0lDJA2KGzQSiF+YJ8b9fSVNjhsJGkWJ5nMmcCQwwcwa0kzHhaK2cfSNaeaisPzbYv1GKR9vnGQen4moLf+WxrvEolw/vXHimivXZ5LjHX300Rsfe+yx7itWrCiF4G5f77zzTvvly5eXNjQ0cMYZZ6y79tprl8+fP78jQKdOnRo2bNhQ0nQ6sViMJUuWtD/++OM33nHHHR+tW7eudOPGje3GjRu34aabburZGDdz5swKgC5dutRv2rQpkyuq2lSqPijrgfXABABJPYFyoLOkzmb2YYrpdgYmS9oRiAHvElzu1aiDpFcJGkgT0uR4J/C0pBVNO8kDvydo+LwiCeBv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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "mglearn.plots.plot_shuffle_split()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Cross-validation scores:\n", "[1. 0.973 0.96 0.933 0.867 0.88 0.893 0.96 0.933 0.96 ]\n", "Mean accuracy: 0.94\n" ] } ], "source": [ "from sklearn.model_selection import ShuffleSplit\n", "\n", "shuffle_split = ShuffleSplit(n_splits=10, test_size=.5, train_size=.5)\n", "scores = cross_val_score(logreg, iris.data, iris.target, cv=shuffle_split)\n", "\n", "print(\"Cross-validation scores:\\n{}\".format(scores))\n", "print(\"Mean accuracy: {:.2f}\".format(scores.mean()))" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Cross-validation scores:\n", "[0.973 0.947 0.933 0.947 0.96 0.96 0.92 0.96 0.933 1. ]\n", "Mean accuracy: 0.95\n" ] } ], "source": [ "from sklearn.model_selection import StratifiedShuffleSplit\n", "\n", "shuffle_split = StratifiedShuffleSplit(n_splits=10, test_size=.5, train_size=.5)\n", "scores = cross_val_score(logreg, iris.data, iris.target, cv=shuffle_split)\n", "\n", "print(\"Cross-validation scores:\\n{}\".format(scores))\n", "print(\"Mean accuracy: {:.2f}\".format(scores.mean()))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Cross-validation with groups\n", "- 임의의 그룹에 속한 데이터 전체를 훈련 집합 또는 테스트 집합에 넣을 때 사용\n", "- 테스트 데이터가 때때로 완전히 새로운 데이터가 되어야 할 필요 있음\n", "- model_selection.GroupKFold\n", " - 그룹핑을 통하여 훈련 데이터 셋트와 테스트 데이터 셋트를 완벽히 분리하기 위해 사용\n", " - group 배열\n", " - 각 데이터 포인트 별로 그룹 index 지정 필요\n", " - 배열 내에 index 지정을 통해 훈련 데이터와 테스트 데이터를 랜덤하게 구성할 때 분리되지 말아야 할 그룹을 지정\n", " - 타깃 레이블과 혼동하면 안됨\n", "- 더 나은 방법\n", " - 이 방법대신 model_selection.train_test_split을 통해 처음 부터 테스트 데이터를 미리 분리하는 것이 더 좋음." ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false, "hide_input": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAyQAAACICAYAAAAWPC8MAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzt3XmUVPWZ//H3h+6GbhajyKaiorKDQgRJwKi0Rs1iiGPsKJpINImicYw6maiTSUJIPKPRmVExmnHUkRg1CTo5ZJzozyUgEyQhouwgRgRBaKCjssRu6OX5/VG3TNFUdS10971163mdU6erbz116/PYVNX3691kZjjnnHPOOedcGLqEHcA555xzzjlXunxC4pxzzjnnnAuNT0icc84555xzofEJiXPOOeeccy40PiFxzjnnnHPOhcYnJM4555xzzrnQ+ITEOedcu5H0FUm/b+Px+ZK+1pmZnHPORZtPSJxzrhNJuljSHyX9VdL24P41ktTJOQZJMknlwe+SNEvSWklHBROLZkl7Um73dmZG55xzpcEnJM4510kk/QNwN3AHMADoD0wHTgW6pqkv66RcAv4DmAycYWbvBA8tMrOeKbdrOyOPc8650uITEuec6wSSPgLMBK4xsyfNbLclvGZml5rZXkmPSLpf0m8l/RWolvQRST+TtEPSRkn/LKlLsM4Zkn6e8hqtt3rMl/QvkhZL2ilprqTeraKVAY8A44HJZrYtl14yZUpTe3aw1WVnsIWlU7cEOeeciz6fkDjnXOeYCHQD5mapuwS4FegF/B6YBXwEOB44A7gMuDyP170MuAI4EmgC7mn1+GPAcOBMM/tLjuvMKZOkPsBTwD8DfYA3SWwNcs455z7kExLnnOscfYA6M2tKLpD0sqT3JdVLOj1YPNfMFppZC9AIXATcEmxR2QD8K/DlPF73UTNbaWZ/Bb4LfLHVrmDnAL8ys/fTPPfjQb7k7ePBc3PN9BlgdbBFqBG4C6jNI7tzzrkSUB52AOecKxF/AfpIKk9OSsxsEoCkzfztfxBtSnlOHxLHlmxMWbYROCqP101d30agIlhv0nnA05LeM7OHWz33D2b2idQFkvrnkenI1Nc3M5O0KU2dc865EuZbSJxzrnMsAvYCn89SZyn360hsJTk2ZdkxQPKg878C3VMeG5BmfUe3em5jsN6kl4HPAXdLuiRLtlwypdqa+vrBwfNHp6lzzjlXwnxC4pxznSDYJeoHwH2SLpTUU1IXSWOBHhme0wz8CrhVUi9JxwI3AskD2ZcCp0s6Jjho/pY0q/mSpJGSupM4qP7JYL2pr/MScAHwgKQLs/SRLVOq/wVGSbogOND+OtJPmpxzzpUwn5A451wnMbMfkxi8fxvYDmwjcbrdm0hsqUjn70lsCVlP4iD3x4GHg/U9D/wSWA4sAZ5O8/xHSZxFqxaoJDEpSJfteRLHhjwi6XNZWsmYqdU664Aa4DYSu6wNARZmWbdzzrkSIzPLXuWcc67oSJoP/NzMHgw7i3POOZeJbyFxzjnnnHPOhcYnJM4555xzzrnQ+C5bzjnnnHPOudD4FhLnnHPOOedcaHxC4pxzzjnnnAuNT0icc84555xzofEJiXPOOeeccy40PiFxzjnnnHPOhaY87ACdraqqqrahoaF/2DlyVVlZub2+vn6/vMXWA8Sjj8rKym319fUDUpdVVFTUNjU1FU0PAOXl5dsaGxs/7CMOPUDx9ZGhh21NTU39wspUiHR9VFVVbWtoaCiaPtK9t4vt8wkO/Jwtxh66du367t69ew9PXVZsfcTh+w7Svy+c6ygld9pfSZap5/nz51NTU8OcOXOYPHly1nV1Rn11dTVmplx6iGL+ZH0ufUQ5/+TJk5GUtocZM2YA8NZbbzFnzhxqamo47rjjsq4/rPoZM2bs10eyh2LJn66HZB/du3cvivxt9TBt2rSiyJ+tj2zfLVF6v2d6b7fVQ5TyJ+tbf84W2/ddTU0NdXV1Of0topo/Lt93QeYD+nCuo3TYLluSviNplaTlkpZK+liW+hmSvhXcnynpk8H96yV1z/CcayX9WZJJ6nMweaP64ZCrqOYvlfqoDA5LtT4pKnkKzQ9EIs/B5M9F1N6/+Ypa/jh9X+QiyvlLod65jtAhExJJE4HzgJPN7CTgk8CmXJ9vZt8zsxeCX68H0k5IgIXBujceRNzIvdn9w7m46qM2OCxkMBmlPD6YDzdPqU1G5s+fn7Wms/P494XXR7XeuY6SdUIi6ZuSDlHCQ5JelXROlqcdAdSZ2V4AM6szsy3B+jZIul3S4uA2OM1rPiLpQknXAUcC8yTNa11nZq+Z2YYc+swoam92ry+ueojHYD4qeXwwH26eQurzEbX3b5y2LHi91/tkxBWzXLaQXGFmu4BzgL7A5cBtWZ7zHHC0pHWS7pN0RqvHd5nZBOBe4K5MKzGze4AtQLWZVeeQNS9Re7OXWj0QqTyFfjhHaXDoWxbCy1Nq+ZP1uYra+9e3LHh9Z9ZDPL7vnOsouUxIkgc0fQb4LzNblrIsLTPbA4wDrgR2AL+U9JWUkidSfk7MJ3AhJF0p6RVJrySXRe3NXmr1SVHJczAfzlEaHJbKYDhfUcuf75aFKOZP1uciau9fry+ueojHYD4qeXwy4qIol9P+LpH0HHAccIukXkBLtieZWTMwH5gvaQUwDXgk+XBqaT6BC2FmDwAPQOJMF1F7s5fqhzMQiTwd/eEctcFkvqKWPy6D+VxFNX+u9VF7/3p9cdUnRSWPf9851zFy2ULyVeBm4BQz+wDoSmK3rYwkDZM0JGXRWPY/8PyilJ+Lsrz+bqBXDjlzFqU3eyl/OOei2PNHbXDog/no1Bd7fp+MRL8e4vF9B6UxmC/2/M4djKwTEjNrAbYBIyWdDowCDs3ytJ7AbEmrJS0HRgIzUh7vJumPwDeBG7Ks6wHgmXQHtUu6TtJmYCCwXNKD2fqBeAzmo5DHP5zbFrXBoQ/mvb4z66P2/i3VwXxU8vj3Rbh5Cql3rjNl3WVL0u0ktmSsBpqDxQYsyPQcM1sCTGpjtT8xsx+0es6MlPtfSbk/C5iV4XXuAe5ps4E0ovJmL6UPt3xFLX++H85RGxym1s+ePTtSebw+fvXgg/kw61NFIU+pfV/kK2r5k/XOdaasV2qX9DpwUvIUvgf9gtIGYLyZ1bXH+vJVVVVV29DQ0D+M1y5EZWXltvr6+gGpy4qtB4CuXbu+u3fv3sNTlxVbH5WVldvr6+v3y1tRUVHb1NRUND0AlJeXb2tsbPzw31QceoDi6yMOPUD6Prp16/aXffv29Q4rU74yfM5ua2ho6BdWpkK07qPYPmMh/edssfURh+87SP++cK6j5DIheQaoCc6c5ZxzzjnnnHPtJpezbH0ALJX0IvDhVhIzu67DUjnnnHPOOedKQi4Tkt8EN+ecc84555xrV1l32QKQ1BUYGvz6upk1dmgq55xzzjnnXEnI5RiSycBsYAOJK7QfDUwzs4xn2XLOOeeccy5qlixZ0q+8vPxBYDS5XY/PtY8WYGVTU9PXxo0bt731g7nssvWvwDlm9jqApKHAE8C4do3pnHPOOedcByovL39wwIABI/r27ftely5dsu8m5NpFS0uLduzYMbK2tvZBYErrx3OZGVYkJyMAZrYOqGjHjM4555xzznWG0X379t3lk5HO1aVLF+vbt+9OElumDpDLFpJXJD0EPBr8fimwpJ3ydbpiOxd4XM+PD8XXR1yuCdP6PP/F2EMczvMfh+stQPr3RbFdTyWu14SJQw/Bsr80NzcXzXVtMvx72tbU1FQ033eQvo+Y6OKTkXAE/93TbgzJ5RiSbsA3gE+QOIZkAXBfe10osbNJsj59+kTuiqiZ6iVhZmrdw7x584oif0rmtH1k+/cXlfxB3rx7iFL+ZH11dfV+fbTVQxTz19TUUFdXl9PfIqr558yZc8DfIV0PUc6frM/0vpgxY0bkriCfqX7GjBlpe5g2bVpR5M/UhyTr3r170eRP10OyjxkzZhRF/oPpISr5k9L1EQfLli3bMGbMmFAuzu1g2bJlfcaMGTOo9fKsW0iCice/BbecSfoOcAnQTOJAlqvM7I9t1M8A9pjZnZJmAgvM7AVJ1wMPmNkHaZ7zGDAeaAQWB6+R9QxgUf5yz1UU8hxM/lx4/o6pz1VU8ycH81HK4/UHitrgKt96IFJ5CskPRCZPoflz5fnbv75UDBw4cMw777yTyx5DOTnqqKOaNm/evCzT47W1tWWTJ08eBlBXV1fRpUsX6927dxPA0qVL11RWVmbdenPhhRcO+u53v7t1zJgxGTcO/Mu//EvfQw89tPnqq69+t5A+CvWb3/ymV48ePVrOOuusv+bzvIzHkEj6VfBzhaTlrW9trVTSROA84GQzOwn4JLAp11Bm9j0zeyH49Xqge4bSx4DhwIlAFfC1XNYfhS/rUhsM5ytq+efPn5+1prPzFFqfiyjn9/ro14MP5sOsTxWFPKU2mM9X1PIn60vFO++8U96nTx/mzZuHmWW9zZs3j7bqs01uBgwY0Lx27drVa9euXX3ZZZftmD59+rbk78nJSEtLC83NzRnX8eSTT25oazICcMstt+zo7MkIwAsvvNBr4cKFPfJ9XlsHtX8z+Hke8Lk0t7YcAdQld+syszoz2wIgaYOk2yUtDm6DWz9Z0iOSLpR0HXAkME/SvNZ1ZvZbC5DYQjIwS66cRPHLPR9Ryx+XwXyuoprf672+M+qToja48sF8OHlKLX++WxaimD9ZX0qiMH5buXJltyFDhoy65JJLjhk1atTIt99+u2Lq1KnHjh49esTgwYNHfetb3zoiWTtu3LhhL7/8clVjYyO9evUae8011xw1bNiwkWPHjh2enBBdd911R86cObNfsv6aa6456sQTTxwxaNCg0c8//3wPgF27dnU599xzTxg2bNjIz33uc8eNHj16xMsvv1zVOttVV1018IQTThg1dOjQkVdfffVRAJs2bSo/55xzThg9evSIE088ccSLL77YY9WqVd0ef/zxvvfee++A4cOHj0y+Ti4yTkjMbGtw9xoz25h6A67Jst7ngKMlrZN0n6QzWj2+y8wmAPcCd7WR4R5gC1BtZhn30ZBUAXwZeDZLrqyi+uWeq6jlj9NgPhdRzu/10a8HIpXnYD6voja4KoXBcL6ilj8ug/lcRTV/R/17i7IojN8A3nzzzcqrrrqqbs2aNauPO+64xrvuumvzypUr16xZs2bVvHnzDlmyZEll6+fs2bOnbPLkybtff/311ePHj9/zk5/8pE+6dZsZK1asWHPrrbdumjlz5pEAt912W79+/fo1vv7666v/6Z/+qXbNmjUH7JG0adOm8hdffPEjb7zxxqp169at/uEPf1gLMH369GNuuumm2pUrV6558skn35w+ffqgUaNG7b3kkkt2XHvttbVr165dffbZZ+e821ZbW0iSzk6z7NNtPcHM9pC4TsmVwA7gl5K+klLyRMrPiTlkyOY+Esec/F+6ByVdKekVSa+0tZKofbnHZcuCD+a9vjPqIR6D+ajk6egv32IfXEUtvw/mo1Nf7PlLbTKSi86YjAAcffTRe88444wPj5l++OGHe48cOXLEqFGjRq5fv75y+fLlB2y9qKysbPniF7+4C2DcuHEfbNiwoWu6ddfU1LwPMGnSpA82b97cFWDRokU9L7300ncBJk6cWH/CCSfUt35ev379mrt06WJTp0499mc/+9mhvXr1agFYuHDhId/4xjeOHT58+MjPf/7zg3fu3Fm2Z8+egk+C0NYxJFdLWgEMa3X8yFtAm8eQAJhZs5nNN7PvA9cCX0h9OMP9vEn6PtAXuLGNLA+Y2XgzG5+pJmpf7nHasuD1Xu+D+dxFIY9PRsLN44P56OTxetdZkxGAqqqqluT9FStWdPuP//iP/gsWLFi3bt261aeffvqu+vr6Awb85eXlH46jy8rKrLm5Oe2koLKysqV1TbYznQJ069bNli1btub8889/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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "mglearn.plots.plot_group_kfold()" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Cross-validation scores:\n", "[0.75 0.8 0.667]\n", "Mean accuracy: 0.74\n" ] } ], "source": [ "from sklearn.model_selection import GroupKFold\n", "\n", "# create synthetic dataset\n", "X, y = make_blobs(n_samples=12, random_state=0)\n", "\n", "# assume the first three samples belong to the same group,\n", "# then the next four, etc\n", "groups = [0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3]\n", "scores = cross_val_score(logreg, X, y, groups, cv=GroupKFold(n_splits=3))\n", "print(\"Cross-validation scores:\\n{}\".format(scores))\n", "print(\"Mean accuracy: {:.2f}\".format(scores.mean()))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.2 Grid Search\n", "- 모델 매개변수 튜닝을 통한 일반화 성능 개선 \n", "- 가장 널리 사용되는 방법은 Grid Search (그리드 탐색)\n", " - 관심있는 매개변수들을 대상으로 모든 조합을 시도함." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 5.2.1 Simple Grid-Search\n", "- SVC 모델에서 가장 중요한 매개변수는 gamma, C\n", "- 그리드 탐색 범위 설정 예\n", " - gamma: [0.001, 0.01, 0.1, 1, 10, 100]\n", " - C: [0.001, 0.01, 0.1, 1, 10, 100]\n", " - 총 6x6=36개의 조합에 대하여 반복적으로 새로운 모델 생성 및 평가\n", " - 가장 좋은 성능을 보여주는 gamma와 C의 조합을 찾음" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
 C=0.001C=0.01C=0.1C=1C=10C=100
gamma=0.001SVC(C=0.001, gamma=0.001)SVC(C=0.01, gamma=0.001)SVC(C=0.1, gamma=0.001)SVC(C=1, gamma=0.001)SVC(C=10, gamma=0.001)SVC(C=100, gamma=0.001)
gamma=0.01SVC(C=0.001, gamma=0.01)SVC(C=0.01, gamma=0.01)SVC(C=0.1, gamma=0.01)SVC(C=1, gamma=0.01)SVC(C=10, gamma=0.01)SVC(C=100, gamma=0.01)
gamma=0.1SVC(C=0.001, gamma=0.1)SVC(C=0.01, gamma=0.1)SVC(C=0.1, gamma=0.1)SVC(C=1, gamma=0.1)SVC(C=10, gamma=0.1)SVC(C=100, gamma=0.1)
gamma=1SVC(C=0.001, gamma=1)SVC(C=0.01, gamma=1)SVC(C=0.1, gamma=1)SVC(C=1, gamma=1)SVC(C=10, gamma=1)SVC(C=100, gamma=1)
gamma=10SVC(C=0.001, gamma=10)SVC(C=0.01, gamma=10)SVC(C=0.1, gamma=10)SVC(C=1, gamma=10)SVC(C=10, gamma=10)SVC(C=100, gamma=10)
gamma=100SVC(C=0.001, gamma=100)SVC(C=0.01, gamma=100)SVC(C=0.1, gamma=100)SVC(C=1, gamma=100)SVC(C=10, gamma=100)SVC(C=100, gamma=100)
" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Size of training set: 112 size of test set: 38\n", "Best score: 0.97\n", "Best parameters: {'C': 100, 'gamma': 0.001}\n" ] } ], "source": [ "# naive grid search implementation\n", "from sklearn.svm import SVC\n", "\n", "X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=0)\n", "print(\"Size of training set: {} size of test set: {}\".format(X_train.shape[0], X_test.shape[0]))\n", "\n", "best_score = 0\n", "\n", "for gamma in [0.001, 0.01, 0.1, 1, 10, 100]:\n", " for C in [0.001, 0.01, 0.1, 1, 10, 100]:\n", " # for each combination of parameters, train an SVC\n", " svm = SVC(gamma=gamma, C=C)\n", " svm.fit(X_train, y_train)\n", " # evaluate the SVC on the test set\n", " score = svm.score(X_test, y_test)\n", " # if we got a better score, store the score and parameters\n", " if score > best_score:\n", " best_score = score\n", " best_parameters = {'C': C, 'gamma': gamma}\n", "\n", "print(\"Best score: {:.2f}\".format(best_score))\n", "print(\"Best parameters: {}\".format(best_parameters))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 위 0.97의 정확도는 전혀 새로운 데이터에 대한 성능으로 이어지지 않을 수 있다.\n", "- 즉, 위 예제에서 사용한 테스트 데이터는 모델 구성시에 사용을 해버렸기 때문에 이 모델이 얼마나 좋은지 평가하는 데 더 이상 사용할 수 없다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 5.2.2 The danger of overfitting the parameters and the validation set\n", "- 검증 데이터 세트 (Valudation Set) 필요\n", " - 모델 파라미터 튜닝 용도\n", "- 모델을 구성할 때 훈련 데이터 세트와 검증 데이터 세트를 활용" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false, "hide_input": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1cAAABqCAYAAABQzqseAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAH0FJREFUeJztnXm4HVWZr98fGUiYJ5lESFRUQFFacEaDijiAOEVEQXBqbRsnuCIKaBSVFtsLON2GZgiNTCIoINAoQ7wEBNoBFBBlSgQlJExBSAIJ+fqPtXZS1Kl9zt771Dm7TvJ7n6eefU7VW6vWrl21Vn2r1qpSRGCMMcYYY4wxZnis0e8MGGOMMcYYY8yqgIMrY4wxxhhjjKkBB1fGGGOMMcYYUwMOrowxxhhjjDGmBhxcGWOMMcYYY0wNOLgyxhhjjDHGmBpwcGXMGEHSDEkhadow05mW05lRT86MMas6kuZImlOad2AuSw7sIp2ZeZ0p9eZwwHYG5NcYY0YDB1fG9ICkKfkCYWa/82IGx7+VMasekmZJ8os6cYNZt/SzTqirkbROmpinsc74fmfAGNMx3wfOBv46zHRuALYDHhh2jowxqzM/Ba4D7ut3Rip4Q78zYIxZPXFwZcwYISIeoIaAKCIWAbcNP0fGmNWZiFgILOx3PqqIiDv7nQdjzOqJuwUa0yW568Xd+d8D8u30KI49KHbTkPQySRdLeqg41kDSbpJOlHSrpEclLZZ0s6SvSJpUtd2qW/d53ixJm+T07pP0hKRbJH2oIp3KLiStbjaSxkv6kqTbczr3SPqWpIlt9scHJP0u53++pNMlbdlttx1JO0o6K4+VeELSgpzucZImlNzxkj4p6bq87xZJ+r2kgyStUfBmMMRvZcxYRtIr8/F8/iDOn/I5tVH+f2I+Vy6RNDcve0jS5ZLe0sW22465kvRGSVdLejyn/TNJLxgirfMk3ZXLkkclXSNpv5I3JZcrr8v/F8/pWQWvcsyVpDUlHSbpD7nceDTn870V7oruY/nvsyU9IGmJpN9I2rPTfZXT21XSRZLuzft8Xi7DvlLhriXpi5JuzPvwMUm/lrRvyZsJXJX//Uppf0zrJn+rA93UCZL2yOfIA/n3ulPStyVtUJHukPVXPh5bv/VVxW13kG9JOkDStTntJUp182WS9qnwt5L0/Xw+PSHpQUkXStql5PWcJ9Me37kypntmARsAnwFuAn5WWHZjyX0l8EVgNnAKsAnwZF72BeAFwLXAxcAk4NXADGCapDdGxFMd5mkD4Jqc9k9yWu8BTpG0PCJO6/zrcSawK3Ap8CjwVuBQYFPgacGapM8DxwAPA6eRWrF3z3npuEVb0o7A9UAAF5Iqv/WA5wKfBI4AlmZ3AnARsAfw55zfJcBuwPeAlwP756Rn0flvZcyYIyJ+LenPwJ6SNo6IB4vLJb2MVM6cFxEP5dkbAceTyp5fAguALYC9gEskfSwiTuo1T5LeA5xDKo/OIXUbfA3wa+APbVb7f8CtwP/P/saksud0Sc+PiCOz9wjwVeBAYJv8d4s5Q+RrInAZKTC7DfgBsBaprDxH0ksi4ksVq25D6k59F3A6af/tA1yQy+mrKtYpb/vNpHL+UVIZ97ecznakMu6rBXcD4EpgJ+B3pLpjDVKZd6akHSLiiKy3yrQDgF+RyrwWc4bK12rILDqoEyR9mfSbPAT8HJgP7Aj8H+Ctkl4ZEY9mt9P66zjgHaTj7zS6+32+QbqWuBv4Mal+3QLYBZhOOs9aef8n4Bek4+sy4HzStcc7gNmS3hkRl2R9OHky7YgIT548dTkBU0gF6cw2y6fl5QF8vI3zbEAV84/K6+1Tmj8jz59Wmt/azknAuML87YFlwK1t8jajNH9Wnv9bYKPC/LWBO4CngM1L+V9KujB7VmG+gLNa+epwf34n+3tXLNsQWKNiP3yv9H3HASeX0xnqt/LkaaxPpIuuAA6qWPaDvGyvwrw1ga0q3PWBm0kXlJNLy+YAc0rzDsxpH1iYtw7wYC4bdi75xxbKqymlZc+pyM9E4Iqc1jNLy2YNVr60yW9rP10CjC/M3zT7AbyqMH9KIb9fKaW1RyutDn+j87L/4oplm5T+n5ndQ0vzJwH/DSwHXlKYP42KMt1T299i0DqB1FAXpMaHDUrLWsf8sYV5vdRf07rM84PAvcBagx0/pJsmd5AaHF9X8rYkBfX3AWsON0+e2k/uFmjMyHJjRJxQtSAi7opcspU4Ln/u0cV2FgEHR+FOV0TcSrqDtJ2kdbtI6wuxsoWbiHgcOIPUcrpzwXs/qSD/XkTcU/ADOIwUjHXL4vKMiHg4IpYDKHX5OwiYB3yu9H2fAg4hVRIf6GHbxoxVTiddcB9QnJnv1LyP1Op+aWt+RDwREfeWE4k0huoU0gXhLuXlHbI3qcX8zIj4TWnZDNrc0Y6KMVIR8SQpOBxPPQ+o+DCpfDg4IpYVtjOf1KgF8NGK9eYCXy/l7TLSw4Ve1mUeqsq4FWNpJW0M7Af8JiKOKXlLSD0eRCp/zcjw6fz5sYh4pLggImaS7nBV1TGD1l81sJSKerV4/ABvA55Dqpd/VfL+Tuppsjl+4MuI4m6BxowsN7RbIGltUteEdwLPA9YlVZotntnFdm6P3EWhRCvo2QD4R4dplS+IiulsWJi3U/6cXZYjYq6ke0gthJ1wDmlf/EzST4DLgWsqLrieR+oudDtwhCQqWEzqamPMakFE3CvpCmB3SdvnhhVI3fw2IrWyLyuuI2kH4PPAa0ndi8rjPLspf4r8U/78VXlBRCyUdCN5vFQpP1uTAoc3AFsDk2vKTyv9dUndtP4WEVUP9Lkyf+5UsezGqO6ifQ+p63cnnAG8C7he0jmkcVLXVAS5u5Duwrd7tHpr/KnLuJHjlaRAZrqk6RXLJwLPKHTD7bT+Gg5nAJ8CbpF0Lun8+nVuECnnHWCbNsfPtvlzO9IdXDMCOLgyZmSZVzUzjxu6ktTqeTOpcF5AHldEGmC6ZhfbeaTN/NYF1bhOEyq31A2Szvr58/42Sd1Ph8FVRNwgaVfgcNL4h/0B8liSr0bEWVndOH9uy8pBuFWs08l2jVmFmEka73gAKUiBlXeynjbmUtIrSOXPeFK3uwtJY4GWAy8h3X3qpvwpMlS5MKBMlPRsUkPUhsDVpPEiC0mt9FPy9+g1P+V8tXtsfGv+gIcVMHj52lEPoIg4Pz8A4xDSHbSPA0j6LfDFiPhlVltl3C4MfvfQZdzIsTHp3BisjoHcBbaL+ms4fA64k3TsHJanZZIuAQ6JiDsKeYc0DmuovJsRwsGVMSNLuyfu7E0KrE6LiAOLCyRtwdCFehNo3SnbDLilYvlm3SQWEb8mDcpfE3gp8GZSS92ZkhZExOWs7FL004h4V2/ZNmaV5Kekc3I/SV8i3bF6C3BTRNxUco8g3RnaLSJmFRdI+iKpfOqV1jna7vzfvGLewaSLwg/lblfF/OxLqbvjMPNVtX1Id++KXu1ExMXAxbnXwsuBPYF/AX4uaad8x7G1/WMj4uCRyosZlIWkcVIbdbpCh/VXz+Q7p8cDx0valPSAmPeRgqgd8kNOnmDl8bN3RFw4nG2a3vGYK2N6o9VFpOM7QiWemz/Pq1g2oMtMQ/l9/nxNeYGkbYBn9ZJoHg9ybUR8mZV931sXe7eRWpFfodLj2QdhuL+VMY0nIhaTniK2JfBG0piQ8ZTuWmWeCzxUDqwywy1/ftcuHUnrk+6MVeUHuisPn8ppdnReR8Q/SC3/z5S0bYWyW/78XcWyWomIxyPiyhw8fZPUzaz1CPwbSHcQd+0iSZdx3THU/roO2DB3ne2KIeqvTrbdyTbmR8T5EfFe0h3o5wAvzIuvy58+fvqIgytjeuNh0l2prXtcf07+nFacmbvHfKvnXI0uZ5K6xXxK0opASmkg1NF0UVArvf9l/YpFrdbvRQB53Mj3SK3M35VUHpeBpC0kbV+YNdzfypixwsz8+cE8LSON1SgzB9goP0J6BZI+QncP0qniAtI5935JO5eWzWBl97xyfmBgebgH1Q+YgPT0NOjuvD6FNK7128WgTNImwJEFp3YkvaGqvGJgGTef9JvtLOlISQN6GEl6jqSphVm97IvVmaHqhGPz539K2rK8UNLauWtt6/+O6q9M17+V0rvZ3qDSIOPcwNi6u9baxgWkRoR/lfTWNum9UtJaw8mTGRx3CzSmByLiMUnXA7tKOgP4C6n158KIaPcelyIXkR6XerCkF5HuAm1N6iZyMWOgkIuIO/O7QL4J3JQHabfec7UR6R0iOw6SRJFDgDcpvQT0LuAxYAdSa+7DwIkF9yjgxcAngL0kXUl6vOympLFYryb1fb8153O4v5UxY4KIuEbSHaSuQhOAi/LFepnjSEHUbEmtd+bsTLoL/RPSuJFe8/CYpH8mjSO9OpcLrfdcvZD0HqvXllb7IekdeudKOo90Pr+Q1LXqx6R3SpW5In/P8/O4k8XA3Ig4fZDs/TupTNmbVGZdQnrP1XRS+XFMRAx4QE9NfAeYksu4OaR3gL0UeD3paYRnF9yDSGXZ14D9Jc0mjWHbkvQggl2AfVn5Mtw/k/bZ+yQ9SXqKYQCnR8TcEfo+Y5ah6oSIuELSYaRGwtvzcXI3aZzSNqS7qbNJxyd0V39dRbozebSkF+blRMTTnkZZYjLpIRlzcr7nkh5AszvpeLgwIv6U01kq6V2k91tdLOla0tMNF5F6k+xCeo3KFqwMyHrJkxmMkXrGuydPq/pE6spyEanVZzmF973QwXtHSAXdGaRKcTFp3NKhpEaPAGaV/Bm0f8/VrDbbmEnpnTLt8sYg742h4n02hWX7k4LDJaSHcvyIdBFwM/BIh/vyTcCppIBoIfA46YLhu8A2Fb7ydq8gvZPnybwfZwNfovDeraF+K0+eVqWJNJ6q9W6mdw/i7UnqQvQPUlfbX5CCnspznQ7fc1VYtns+HxeRLtYuIL3MeECZlP1Xkbo4PZzzNJv0ctN25dU4UsPOXaQHAT2tHKzKb54/KZcRN5PK3da29q1wpzD4+5DalpkV7ntJ7/+7nXTx/WjOwzeAZ1T4E0lB1rW5THyCFDRdAXwW2Ljk75KXLSyUcdP6fTw2deqkTiA1CPwY+HuuYxaQApX/S+EdbnRff+2X01ncOleHyOsE0rXBpfkYaNW115EaGSdWrLMp8G/5GFuUj7nbSY0n+1F4z1svefI0+KS8U40xpjYkrUdqab0xIjp9VLExxhhjzJjGY66MMT0j6RnlB0vkMQLfIbUQ/7QvGTPGGGOM6QO+c2WM6RlJnyCNC7ic9ELNjUhdi55H6mLwqkhPMTPGGGOMWeXxAy2MMcPhetJ4hdey8uWFd5PGEXzLgZUxxhhjVid858oYY4wxxhhjasBjrowxxhhjjDGmBhxcGWOMMcYYY0wN9DTmavLkyfOWLFmy2dCmMcYYY/rJpEmT7l+8ePHmxXkTJky4f9myZZv2K09mZBk/fvz8pUuXrrhOmzBhwrxly5b5us2YIRg/fvz9S5cu3Xxosz09jbmSFK31Zs2axfTp0zn33HOZNm3akOvat2/fvn379kfPl0REqDQvZsyYMWj6d999N+eeey7Tp09n6tSpQ+bHfnP800477Wm/eSe/tzEGZsyYMaC87JZhdQtsSsVh3759+/bt26+PJgcO9ofvG2NGjp6Dq6ZVHPbt27dv37794dO0QMB+vb4xZmTpObhqUsVh3759+/bt26/2u6FpgYD9en1jzMjTc3DVpIrDvn379u3bt1/td0rTAgH79frGmNGh5+CqSRWHffv27du3b7/a74SmBQL26/WNMaNHz8HVUDS5orFv3759+/btJ5oWCNiv1zfGjC4jElw1reKwb9++ffv27Q+kaYGA/Xp9Y8zoU3tw1bSKw759+/bt27c/kKYFAvbr9Y0x/aHW4KppFYd9+/bt27dvv5omBQL26/WNMf2jtuCqaRWHffv27du3b789TQkE7NfvG2P6Ry3BVdMqDvv27du3b9/+4DQlELBfv2+M6R/DDq6aVnHYt2/fvn379odPUwMH+0P7xpj+MazgqmkVh3379u3bt29/+DQ5cLA/fN8YM3L0HFw1reKwb9++ffv27Q+fpgUC9uv1jTEjS8/BVZMqDvv27du3b99+td8NTQsE7NfrG2NGnp6DqyZVHPbt27dv3779ar9TmhYI2K/XN8aMDj0HV02qOOzbt2/fvn371X4nNC0QsF+vb4wZPXoOroaiyRWNffv27du3bz/RtEDAfr2+MWZ0GZHgqmkVh3379u3bt29/IE0LBOzX6xtjRp/ag6umVRz27du3b9++/YE0LRCwX69vjOkPtQZXTas47Nu3b9++ffvVNCkQsF+vb4zpH7UFV02rOOzbt2/fvn377WlKIGC/ft8Y0z9qCa6aVnHYt2/fvn379genKYGA/fp9Y0z/GHZw1bSKw759+/bt27c/fJoaONgf2jfG9I9hBVdNqzjs27dv3759+8OnyYGD/eH7xpiRo+fgqmkVh3379u3bt29/+DQtELBfr2+MGVl6Dq6aVHHYt2/fvn379qv9bmhaIGC/Xt8YM/L0HFw1qeKwb9++ffv27Vf7ndK0QMB+vb4xZnToObhqUsVh3759+/bt26/2O6FpgYD9en1jzOjRc3A1FE2uaOzbt2/fvn37iaYFAvbr9Y0xo8uIBFdNqzjs27dv3759+wNpWiBgv17fGDP61B5cNa3isG/fvn379u0PpGmBgP16fWNMf6g1uGpaxWHfvn379u3br6ZJgYD9en1jTP+oLbhqWsVh3759+/bt229PUwIB+/X7xpj+UUtw1bSKw759+/bt27c/OE0JBOzX7xtj+sewg6umVRz27du3b9++/eHT1MDB/tC+MaZ/DCu4alrFYd++ffv27dsfPk0OHOwP3zfGjBw9B1dNqzjs27dv3759+8OnaYGA/Xp9Y8zI0nNw1aSKw759+/bt27df7XdD0wIB+/X6xpiRp+fgqkkVh3379u3bt2+/2u+UpgUC9uv1jTGjQ8/BVZMqDvv27du3b99+td8JTQsE7NfrG2NGj56Dq6FockVj3759+/bt2080LRCwX69vjBldRiS4alrFYd++ffv27dsfSNMCAfv1+saY0af24KppFYd9+/bt27dvfyBNCwTs1+sbY/pDrcFV0yoO+/bt27dv3341TQoE7Nfr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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "mglearn.plots.plot_threefold_split()" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Size of training set: 84, size of validation set: 28,size of test set: 38\n", "\n", "Best score on validation set: 0.96\n", "Best parameters: {'C': 10, 'gamma': 0.001}\n", "Test set score with best parameters: 0.92\n" ] } ], "source": [ "from sklearn.svm import SVC\n", "# split data into train+validation set and test set\n", "X_trainval, X_test, y_trainval, y_test = train_test_split(iris.data, iris.target, random_state=0)\n", "\n", "# split train+validation set into training and validation sets\n", "X_train, X_valid, y_train, y_valid = train_test_split(X_trainval, y_trainval, random_state=1)\n", "\n", "print(\"Size of training set: {}, size of validation set: {},size of test set: {}\\n\".format(\n", " X_train.shape[0], \n", " X_valid.shape[0], \n", " X_test.shape[0]))\n", "\n", "best_score = 0\n", "\n", "for gamma in [0.001, 0.01, 0.1, 1, 10, 100]:\n", " for C in [0.001, 0.01, 0.1, 1, 10, 100]:\n", " # for each combination of parameters train an SVC\n", " svm = SVC(gamma=gamma, C=C)\n", " svm.fit(X_train, y_train)\n", " # evaluate the SVC on the validation set\n", " score = svm.score(X_valid, y_valid)\n", " # if we got a better score, store the score and parameters\n", " if score > best_score:\n", " best_score = score\n", " best_parameters = {'C': C, 'gamma': gamma}\n", "\n", "# rebuild a model on the combined training and validation set,\n", "# and evaluate it on the test set\n", "svm = SVC(**best_parameters)\n", "\n", "#[NOTE] 훈련 데이터와 검증 데이터를 합쳐서 다시 모델을 구성함\n", "svm.fit(X_trainval, y_trainval)\n", "\n", "test_score = svm.score(X_test, y_test)\n", "print(\"Best score on validation set: {:.2f}\".format(best_score))\n", "print(\"Best parameters: \", best_parameters)\n", "print(\"Test set score with best parameters: {:.2f}\".format(test_score))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 위 예제를 통하여 전혀 새로운 테스트 데이터에 대하여, 생성 모델은 92%의 정확도로 분류한다고 볼 수 있음" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 5.2.3 Grid-search with cross-validation\n", "- 그리드 탐색에서도 교차 검증 필요\n", " - 위 두 예제에서 최고의 성능을 보여주는 파라미터가 변경된 점을 주의\n", " - cross_val_score 사용" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Size of training set: 84, size of validation set: 28,size of test set: 38\n", "\n", "Best score on validation set: 0.97\n", "Best parameters: {'C': 100, 'gamma': 0.01}\n", "Test set score with best parameters: 0.97\n" ] } ], "source": [ "X_trainval, X_test, y_trainval, y_test = train_test_split(iris.data, iris.target, random_state=0)\n", "X_train, X_valid, y_train, y_valid = train_test_split(X_trainval, y_trainval, random_state=1)\n", "\n", "print(\"Size of training set: {}, size of validation set: {},size of test set: {}\\n\".format(\n", " X_train.shape[0], \n", " X_valid.shape[0], \n", " X_test.shape[0]))\n", "\n", "# reference: manual_grid_search_cv\n", "for gamma in [0.001, 0.01, 0.1, 1, 10, 100]:\n", " for C in [0.001, 0.01, 0.1, 1, 10, 100]:\n", " # for each combination of parameters,\n", " # train an SVC\n", " svm = SVC(gamma=gamma, C=C)\n", " # perform cross-validation\n", " scores = cross_val_score(svm, X_trainval, y_trainval, cv=5)\n", " # compute mean cross-validation accuracy\n", " score = np.mean(scores)\n", " # if we got a better score, store the score and parameters\n", " if score > best_score:\n", " best_score = score\n", " best_parameters = {'C': C, 'gamma': gamma}\n", "# rebuild a model on the combined training and validation set\n", "svm = SVC(**best_parameters)\n", "\n", "#[NOTE] 훈련 데이터와 검증 데이터를 합쳐서 다시 모델을 구성함\n", "svm.fit(X_trainval, y_trainval)\n", "\n", "test_score = svm.score(X_test, y_test)\n", "print(\"Best score on validation set: {:.2f}\".format(best_score))\n", "print(\"Best parameters: \", best_parameters)\n", "print(\"Test set score with best parameters: {:.2f}\".format(test_score))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 위 예에서는 반복적인 모델 생성 작업이 6 \\* 6 \\* 5 = 180번 이루어짐\n", " - 즉, 시간이 많이 소요됨에 주의" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 아래 그림은 교차 검증에 5-fold 사용\n", "- 매개변수 그리드는 일부만 표시\n", "- 교차 검증 5번의 평균이 가장 높은 매개변수를 빨간 동그라미로 표시" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false, "hide_input": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/yhhan/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n", " warnings.warn(*warn_args, **warn_kwargs)\n", "/Users/yhhan/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n", " warnings.warn(*warn_args, **warn_kwargs)\n", "/Users/yhhan/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n", " warnings.warn(*warn_args, **warn_kwargs)\n", "/Users/yhhan/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n", " warnings.warn(*warn_args, **warn_kwargs)\n", "/Users/yhhan/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n", " warnings.warn(*warn_args, **warn_kwargs)\n", "/Users/yhhan/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n", " warnings.warn(*warn_args, **warn_kwargs)\n", "/Users/yhhan/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n", " warnings.warn(*warn_args, **warn_kwargs)\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxQAAAFCCAYAAABoy5tSAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzs3Xtc1FX+P/DXe0BBFFCBdLyjchFQDFAzpPBSaabmpZtWVm6XLesLXdjWbe277qXS0r5mbWa2amm6m63LqmX6My9hWmCigqBgIgoqKPc7zPn9MQyOyGWAmQGG1/PxmAfz+cznc97n8zmHmTnz+ZxzRCkFIiIiIiKi5tC0dgaIiIiIiKj9YoOCiIiIiIiajQ0KIiIiIiJqNjYoiIiIiIio2digICIiIiKiZmODgoiIiIiImo0NCiIiIiIiajY2KIiIiIiIqNnYoCAiIiIiomazb+0MNJW7u7saNGhQa2eDiIiIqFFxcXHZSimP1s4HkSW1uwbFoEGDEBsb29rZICIiImqUiKS1dh6ILI23PBERERERUbOxQUFERERERM3GBgURERERETUbGxRERERERNRsbFAQEREREVGzsUFBRERERETNxgYFERGROSkF7N0LPPccEBwMdO0KaDT6v8HB+vV79+q3IyKyAaLa2RtaSEiI4jwURETUJu3cCbzyCpCU1Pi2vr7A8uXAlCmWzxe1GhGJU0qFtHY+iCyJVyiIiIhaqrQUWLAAmDrVtMYEoN/u3nuB3/wGKCuzbP6IiCyIDQoiIqKWKC0FZswAPvvs+jpnZ2DhQmD3biA7G6iq0v/dvVu/3tn5+rZr1wLTp7NRQUTtlsUaFCLymYhcEZGT9bwuIrJSRFJE5LiIBFkqL0RERBbzwgvAd99dX37oIeDsWeCDD4BJkwA3N30fCjc3/fIHH+hff+ih6/t8950+HSKidsiSVyjWAZjcwOtTAHhVP54B8HcL5sVkxcXF+Prrr5Gbm9vaWSEjFRUViIuLQ2lpqcViWKvsrXEs1ohhLbZS9tYqE9avpmlx2e/ceeOViT/9CfjyS8DdveEY7u767f73f6+vW7tWn14zWaMe29L/ChGZj8UaFEqpAwCuNbDJDAAblN5hAN1FRGup/JgqISEBZ8+exffff9/aWSEjmZmZOH36NBITEy0Ww1plb41jsUYMa7GVsrdWmbB+NU2Lyl4pfQdsg4ceAv74R4wLC4OI1Dy6du2K2bNno0ePHjesHxcWBixefOOVildeafboT9aox7b0v0JE5mPfirH7Akg3Wr5QvS6z9oYi8gz0VzEwYMAAi2VIp9PhxIkT6Nq1K86fP4/U1FQMGTLEYvHINEoppKSkoHv37khLS8PAgQPh5ubW4nTHjRuHmJiYRrcLDQ3FDz/80OJ4gOWOxdoxrKU9lz3rV9tk1nL5/vvrHbCdnYFVqwARjBo1CqNGjcKKFSug0+mwbt06lJWVoby8HPfddx+GDBmCyMhIiAggot9v506goECf3r59wPjxTToua3x+WSNGe69fRB1VazYopI51df4so5T6BMAngH7YWEtl6MKFCygsLES3bt0AAPv378fAgQNhb9+ap4ny8vKQn58PV1dXKKUQHx+P8PBwaDQtu8Bm/KF//vx5bNu2Dd26dUNZWRkcHBzw+OOP47XXXtN/6JuJpY7F2jGspT2XvXGM3Nxc7Nu3D66urigpKYGjoyPCw8PxyiuvsH5ZmVnL/p//vP58/vya25yioqLg7++PqKgoVFRU3PS50rlzZ2zYsAEJCQn6fd3dgccfBz78UL+8ZUuTGxTW+PyyRoz2Xr+IOiqLzkMhIoMAbFdKBdTx2moA+5RSX1YvJwMIV0rddIXCmLnnoWiNXxGpaeLj45GWlgYXFxcAQE5ODkaOHAlPT88WpZuZmQl/f38kJCQgNjYW586dg3P1yCv5+fkYNGgQnnzySSQkJKB3794tPg7Acsdi7RjW0p7L3jjGlStXbjqOPn364N5772X9sjKzln1wMHD0qP757t36DtfVIiMjAQATJky4KUZMTAz69u2L5cuXX09rzx7grruup2vC55y1P7/++9//3nQsISEhuP3221uctkF7r1914TwU1BG05k/v0QAWishmAGMA5DXWmLAE41+rNm7ciKtXr97weq9evXD48GGz/opITVNYWAidTlfTCVBEcOXKlRZ/wGi1WsyfPx9Lly5FSEgIlFLIz8+vef3jjz/G/PnzW/xlz9of+pY6X62hPZe9cYw5c+bcdBzvv/++WeqXMWuUfXuvX2Yte+P5Jm699YaXDFcphgwZckOMvLw87Ny5E2fOnLkxLeP9T50y6Vis8fnF9y8iMolSyiIPAF9C3x+iAvr+EQsAPAfguerXBcCHAFIBnAAQYkq6wcHBypwyMjJUjx49VEZGRr2v9+zZU2VmZpo1LrUNxuVfXl6uYmNjVUlJiVnLPSIiQkVERNQsG8cx3iYyMrLFsRqKQTeyRtkbxygqKlJbt25VOTk5Zo0RGhqqoL9dtMFHaGhoi2MZtPf6ZbayF1FK34Vaqaqqm142/O8bx6j3f72y8npaIk0+DqVuLhdz1LPa71/1bcP3r/oBiFUW+q7FBx9t5WHRW54swdy3PAHXL02vWLECFRUVOH78OPz9/eHo6FjTce6GS9NkdbXLxZwM5f/iiy9i165dCAoKwubNm81W7sa3WGi1Wpw9e7YmzpgxY5CZmYmAgACz3vpSO0Z71p7L3jjGnDlz8P3338PLy6vmV2NzxDB+/wLqLntzv4/ZQv0yS9l37QoUF+ufZ2fr55kwYvjfj46OxpEjRzBkyBAsWLCg7v/1q1evDzXr5AQUFTXpOFasWHFTuZij3Gu/f9X+f+T7V+N4yxN1BGxQ4MY3zIqKCsTExMDHxwdardbsb5RkGmteZjeU/7Jly1BYWIiKigr87W9/Q2JiotnK3fChv3z5cmzbtg3nz59H165dMXPmTPzlL38x65c9pdRNMdrTKCm2VvaGGP/zP/8DEUFxcTFWr16NU6dOmSWG8ftX7969byr78vJys76Ptff6ZWCWsm+gD4VBREQEkpKSEBYWht27d2PYsGH4+9/rmHapGX0ojI/j5MmTOHLkSE25jB07FnfccYdZyt240XL+/Pmaz8igoCCzN1ZtpX4ZY4OCOgI2KKpFRkZCKYXp06ejrKwMpaWl2LVrF5ycnHh1ohUYf4AppfD999/XlMsdd9wBNzc3s36Q/fa3v8Xp06fx8MMPY9OmTXB1dcXXX39ttpFFDB/6MTEx2LdvH+zt7VFWVgZXV1dERES0+EPflgYXsLWyB4AFCxbg1KlTmDp1Knbs2AFHR0d89913Zhsdx3DOFi9ejM2bN9fUL09PT+zevRsajaZF58qW6pexFpf9c88Bq1frny9cqJ8Bu5bExESEhITgmWeewSeffIKVK1fiqaeeujnGwoXXR3l69lng449NPo7IyEiUlpZixIgRNWW/Z88eeHp61ly5agnjRktSUlLN/6O3t7dZGi22Wr8M2KCgjoDjoVaLioqCn58fRowYAU9PT1y9ehWbNm1CknGnO7Ia42EXu3TpctMwgj4+PjcOu9hC9957LzZs2ICwsDD8/PPPeOONN/Drr7+abYx1Q0fQP/3pTwgNDa25dWfdunWYMWNGi39BNO6c+eOPPyI2NhbdunVDZWUlKisrcffdd2PVqlXtYnABWyt7AAgKCsKXX36JoKAgHDt2DAsXLsShQ4dwxx13mCV9wzmbMGECKisra+rXiRMnsH79epwysZNvfWypfhlrcdk/+OD1BsX69cCbb94wQzYAXLp0CUFBQfjkk08QEhKCnJwcpKamwsvL6/pG2dnAhg3Xl40nujNBVFQUfHx80LdvX/Tt2xe5ubnYs2cP9uzZ06R06mN4//rLX/6Cu+++u+b/8c0338Tjjz/O9y8istxM2e2NVqvF1KlTsW3bNogI/vOf/yA8PBxlZWWtnbUOyXgklrS0NGg0GogInJyckJeXhz/+8Y9mHSGnrKwMo0aNwrJly3DbbbfBycnJ7I3JqKgobN++Hbm5uSgrK8O1a9dw+PBhTJgwwSxpr1+/HpmZmbh48SKUUigrK0NVVRUqKipw6NAhbNiwAVFRUWY4EsuyxbIvKyvDyJEj8dlnn+HWW29Ft27dcPLkSbOlbzhnq1evvqHsv/32W9x5550tPle2VL+Mtbjsx48HfH31zwsK9FcZal31P3v2LMLCwtC/f3+Eh4ejoqICN1xlV0q/X0GBfnnYMCA8vEnHodVqcccdd2DPnj0oKyvDt99+i1GjRt006lNLREVFYePGjcjNzYWIoKSkBLt27cIjjzxilrRtsX4RdSS8QmHkgQcewKOPPorw8HB8++23WLlyJYera0WGX13Dw8OhlKoZRjAnJwdbt25FcnKy2WJptVo8/vjjyM/Px7x589CjRw+41/ql0Rwxpk6dip9++gkzZszAwYMHMXHixBt/qWxB2sZDlNa+lWbLli1mH6LUkmyt7Hv16oUpU6YgJycHU6ZMgYuLi9nvCzf8Sj1z5kwYbmWNi4vDli1bWpy2rdUvgxaXvQjw3nvA1Kn65S1b9A2CxYv1rwHo0qULtFotXnjhhZrdam53UgpYskS/n8F779Xs2xRPP/00Hn30UUyfPh0//fQTVq5cadZ6rNVqMXnyZGzduhUzZszAtm3bMH78eJjjtmlbrV9EHUprDzPV1Ie5h42t7aWXXlIuLi7qxRdftGgcMk2Thl1sBzIyMpSrq6v629/+plxdXc06HHF9QyC316GPba3srSEiIkItWLBAbdq0Sc2dO9es58rW6pdZPfWUqhnyFVDqoYeUyspqeJ+sLP12xvstWNCibERERKgePXpY7H+E71/NAw4by0cHeLR6Bpr6sHSD4scff1R+fn5qx44dFo1DpjF8yPz444/qo48+Utu3b7fYh4s1xj7X6XRq5syZqmvXrmrq1KkqOzvbrOnXNWZ8e/0Sbmtlbw0XL15Uzs7O6oMPPlDdunVTCQkJZk3fluqXgVnKvrRUqbvvVjc0DpydlXrhBaV271YqO1s/z0R2tn75hRf0rxtvf/fd+nRaICMjQ91zzz0W+/Kt0+nU7NmzVbdu3dS0adP4/mUiNij46AgPjvJkRCnbG67OFkRERCA1NRWTJk3C9u3bMXTo0LqHXWyh2sMhWkJubi6++OILfPjhh3juuecwfPhwhIeHm300KcOY8ZYYI96abKnsrSE3NxePP/449u3bh4kTJ+LFF19k/WqE2cq+rAx44QVg7dqm77tggX6EJweH5se3gtzcXHz99df4+OOP8dJLL6FPnz6sXybgKE/UEbBTtpHc3FxcunQJTk5OKC0txeHDh6HT6Vo7Wx3es88+i7179yI7OxuHDh1CaGio2ctFKYWUlBR0794daWlpZu3MaOzcuXOwt7fHyy+/jM6dO+PKlStIS0szW/rG9yIDwNKlS9v1vce2VPbWkJaWhlmzZsHX1xePPfYY8vLyWL8aYNayd3AAPv0U2LHjekftxvj6Ajt36vdr440JQF+/3N3dsXTpUvTr14/1i4hqsEFhJCkpCZWVlbC3t4eDgwPOnz+PX3/9tbWz1eHl5uZi9OjRWLFiBW6//XYUFBSYvVzy8vKQn58PR0dHODg4ID4+3iKNyezsbJSXl6OyshJVVVXIycnBpUuXzBrDMGLKL7/80u5HRrGlsreGwsJCdO/eHYsWLaoZHevKlStmjWFL9csiZX/vvUBiIrB3r34+ieBg/czXIvq/wcH69Xv36rebMsU8B2MFhYWF0Ol0yM3NrRntifWLiACO8nQD4+HqAKCiogJJSUlmHY+emu7ixYuYMGECrly5gkmTJlmkXGoPT5qTk4O0tDSzj/Dl4eGBQYMGwcXFBYB+1CJz//pm+JVv4sSJeOKJJ9r1r3u2VPbWEBoaavEYtlS/LFb2IvohZcePN09G2wjWLyKqDxsURrRa7U3D1Zl7+EhqOq1WC41Gg8jISPTo0QN2dnZmLxfjX94A1PzyZu4vldaKExkZiSNHjuCll14ya7rWZktlb0tspX6x7NsmW6lfRB0JO2VTu2ArnWatxZbOly0dizVUVFTg+PHj8Pf3r5kx29xYJm2TNcqe9avp2CmbOoJG+1CISIA1MkJUH1vqNGsNtnS+bOlYrCUzMxOnT59GYmKiRdJnmbRdli57a8Rg/SJqn0zplP2xiPwkIs+LSHeL54ioFlvqNGsNtnS+bOlYrMEaX8ZYJm2TNcqe9YuI6tNog0IpNQ7APAD9AcSKyCYRucviOSOqVrvjpLmHKrQ1tnS+bOlYrMEaX8ZYJm2TNcqe9YuI6mPSsLFKqTMA3gDwOwB3AlgpIkkiMsuSmSMCrDNUoS2xpfNlS8diDdb4MsYyaZusUfasX0RUn0ZHeRKREQCeBDAVwG4A05RSR0WkD4AfAXxt2SxSR2eNoQptiS2dL1s6FmuwxqhFLJO2yRplz/pFRPVpdJQnETkAYA2Ar5RSJbVee0wp9bkF83cTjvJERERE7QVHeaKOwJRbnu4FsMnQmBARjYg4AYC1GxNEZJqKigrExcWhtLS0tbNCNoj1iyyJ9Yuo/TGlQbEHQBejZafqdY0SkckikiwiKSLyeh2vDxCR70XkFxE5LiL3mpZtImqINYaPpI6L9YssifWLqP0xpUHhqJQqNCxUP3dqbCcRsQPwIYApAPwAPCIifrU2ewPAP5VStwJ4GMBHpmaciOrGcdzJkli/yJJYv4jaJ1MaFEUiUjNVpYgEAyhpYHuD0QBSlFJnlVLlADYDmFFrGwXApfq5K4AME9IlogZwHHeyJNYvsiTWL6L2yZQGRQSAf4nIQRE5CGALgIUm7NcXQLrR8oXqdcb+F8CjInIBwE4AL5qQLhE1gOO4kyWxfpElsX4RtU+mTGz3MwBfAL8F8DyAYUqpOBPSlrqSq7X8CIB1Sql+0Hf+/lxEbsqTiDwjIrEiEpuVlWVCaKKOi+O4kyWxfpElsX4RtU+NDhsLACISAH0/CEfDOqXUhkb2GQvgf5VS91Qv/756v7eMtkkAMFkplV69fBbAbUqpet89OGwsERERtRccNpY6gkavUIjImwA+qH6MB7AUwHQT0v4ZgJeIeIpIZ+g7XUfX2uY8gInVcYZB32DhJQgiIiIionbClD4Uc6D/0n9JKfUkgEAADo3tpJSqhL6vxS4Ap6AfzSlBRJaIiKFB8gqAp0UkHsCXAJ5QplwyISIiIiKiNsHehG1KlFI6EakUERcAVwAMNiVxpdRO6DtbG69bbPQ8EUBoE/JLRERERERtiCkNilgR6Q5gDYA4AIUAfrJoroiIiIioyeLi4m6xt7f/FEAATLsThagxOgAnKysrfxMcHFxnP+cGGxQiIgDeUkrlAvhYRL4F4KKUOm7+vBIRERFRS9jb23/au3fvYR4eHjkajYa3kVOL6XQ6ycrK8rt06dKnqKcfdYMt1+r+DNuMls+xMUFERETUZgV4eHjkszFB5qLRaJSHh0ce9Fe96t7GhHQOi8go82WLiIiIiCxEw8YEmVt1naq33WBKH4rxAJ4VkTQARdBPWKeUUiPMk0UiIiIiImqvTGlQTLF4LqhdGTduHGJiYhrdLjQ0FD/88IMVckRERERErcWUW55UPQ/qoEaNGoWIiAgopaCUQmpqKj766CMcPny4Zl1ERARGjx7d2lklIiIiuoFOp0NVVVVrZ8OmmNKg2AFge/Xf/wfgLIBvLJkpatuioqKwfv16ZGZmQimF48ePo6ysDCdOnMDVq1eRmZmJDRs2ICoqqrWzSkRERI0oKyvTHDp0yL24uNjOHOmtWrXKzdvb28/Hx8fv/vvv97x69apd3759hxu+xBcUFGh69+49oqysTIz327Rpk+uIESN8hw0b5nf77bd7p6en2wNAXl6eZs6cOYO8vb39vL29/datW9cdAL766isXPz+/YT4+Pn5jx471BoCXX365z+LFi3sZ0vTy8vJPTk7unJyc3Hnw4MH+jz766AB/f3+/1NTUzvPmzRsQEBAwbOjQof6RkZF9DPvs37/f6dZbb/X18fHxGz58+LCcnBxNcHCwz6FDh7oYtgkKCvI9cuRIFxAAE255UkoNN14WkSAAz1osR9TmabVazJ8/H0uXLsXixYuRkZEBpRSKi4vx448/Ys+ePZg/fz569+7d2lklIiKiRqSnp3c5c+aMq4iosWPHXm1JWrGxsY7vvvuu9scff0zSarWVly9ftnNzc6vy9fUt3rlzp/O0adMKNm/e7HrnnXfmOTg43HDHy1133VX48MMPJ2k0Gixfvtx9yZIlvdesWXPh9ddf17q4uFSdPn06EQCysrLsMjIy7BcuXDho3759Sb6+vuWXL19utDF07tw5xzVr1pz74osvzgPA8uXLL/bq1auqsrISt99+u8+RI0e6BAYGls6bN2/Ixo0bU++8887ia9euabp166Z74oknsj/99FP322+/Pf348eMO5eXlMmbMmJKWnCtbYkofihsopY5y1CeKioqCv78/JkyYgNLSUlRUVMDBwQEnT57E+vXrcerUqdbOIhERETVCKYUzZ864uLq6lp8/f9558ODBhb169Sprbnq7du1ymTZtWo5Wq60EgF69elUBwAMPPJDz5Zdf9pg2bVrBP//5z57PP/98Vu19f/311873339/v6ysrE7l5eWa/v37lwHAgQMHXDZv3nzWsJ2Hh0fVpk2bXEePHl3g6+tbbhynIVqttnzixIlFhuX169f3XLdunXtlZaVkZWV1io+PdxQR3HLLLRV33nlnMQD07NlTBwBPPPFEzrJly7RlZWUXPv74Y/e5c+dmN/cc2aJGb3kSkZeNHq+KyCYAN1UC6lgMVyk+/vhjlJeXo7y8HCUlJfjmm28QHh7OqxNERETtwLVr1zoXFBQ4ODo6Vjk4OFQdPXrUrSX9C5RSEJGb+to+8sgjufv27XO9fPmy3cmTJ52mTZuWX3ubhQsXDnj++eevnD59OnHVqlVpZWVlGqM064pzU3x7e3ul0+lqlo1vq3Jycqp5ISkpqfOqVat67d+///Tp06cTJ0yYkFdaWqqpL//Ozs66sLCw/E2bNnWPjo7uuWDBgmsmn5QOwJQ+FM5GDwfo+1LMsGSmqH2IiorCwYMHUVBQAKUU8vPzERcXhwULFrR21oiIiMgEqamp3TQajU5E0KVLl6r8/PzOKSkp3Zqb3uTJk/Ojo6N7Xrp0yQ4ADLciubq66gIDA4ueffbZARMnTsyzt7/5JpmCggK7AQMGVADAunXr3Azrw8PD85cvX36LYTkrK8tu/PjxRUeOHHFOSkrqbBxn0KBBZceOHesKAD/88IPTxYsXHerKZ05Ojl2XLl10PXv2rEpPT7fft2+fKwAEBgaWXr58ufP+/fudqrfTVFRUAACee+657N/97nf9AwMDi0y5ItKRmNKH4k/WyAi1P1qtFtOmTcOBAwcwffp0fPfddxg3bhz8/f1bO2tERERkgsLCwk5VVVWa3NzczoZ1ly9fdvLx8SlsTnohISGlr7zySmZYWJivRqNRAQEBxVu3bj0HAA8++GDOU089NXj79u3Jde37hz/8IeORRx4Z0qtXr/KQkJCi8+fPOwDAW2+9lfnkk08O8PLy8tdoNGrRokUZ8+fPz125cuW5mTNnDtXpdHBzc6s4dOjQmccffzxn48aNbr6+vn4jR44sGjhwYGldscaOHVsSEBBQ7OXl5T9gwICy4ODgQgBwdHRUGzduTH3ppZcGlJaWahwdHXUHDhw47erqqgsLCyvu2rVr1ZNPPsnbnWoRpRoeAVZEdgN4QCmVW73cA8BmpdQ9VsjfTUJCQlRsbGxrhKY6bNiwAc899xyefvpprFmzBq+++iruuecehIaGtnbWiIiIWp2IxCmlQqwVLz4+/lxgYCC/8FrAuXPnOoWHh/ukpqaetLMzy4BY7Up8fLx7YGDgoLpeM+WWJw9DYwIAlFI5AG5pYHvqQHr06IExY8Zg7dq1CAsLg7u7e533NBIRERG1V6tWrXK77bbbhi1evPhiR2xMNMaUUZ6qRGSAUuo8AIjIQHBiO6qWn5+PCRMm4NKlSwgLCwMApKent3KuiIiIiMxn4cKFVxcuXNiiIXVtmSkNij8A+EFE9lcv3wHgGctlidqTefPmAQD++Mc/tnJOiIiIiKg1mNIp+9vqyexuAyAAIpVSvDePiIiIiIhMmodiJoAKpdR2pdR/AVSKyP2WzxoREREREbV1ptzy9KZS6t+GBaVUroi8CWCb5bJFRERERJYQHBzsc/To0UbnmggKCiqMi4urc4hXImOmNCjquophyn5ERETNVlFRgePHj8Pf3x+Ojo6tnR2yMR25fo0cObJ45MiRxWvXrq13FJUFCxb0r2vGaKK6mDJsbKyILBeRISIyWERWAIgzJXERmSwiySKSIiKv17PNgyKSKCIJIrKpKZknIiLblZmZidOnTyMxMbG1s0I2qCPXr8WLF1/66quv3NLS0jrV9XpaWlqnrVu3ui1evPiStfPWXlRWVrZ2FtoUUxoULwIoB7AFwL8AlAJ4obGdRMQOwIcApgDwA/CIiPjV2sYLwO8BhCql/AFENCn3RERkk5RSSElJQffu3ZGWloarVzlaI5lPR69fAwcOrJgzZ87VJUuW9K7r9SVLlvSeM2dO9oABA5r8rTk5Obmzp6en/0MPPTTQy8vLf/r06Z7btm1zDgoK8h04cGDA999/7wQA+fn5mgceeGBQQEDAsGHDhvl98cUX3Q37BwcH+/j5+Q3z8/Mbtnv37q4AsH37dufRo0f7TJ48ebCnp6f/9OnTPXU63U3x33vvPfeAgIBhPj4+fvfcc8+QgoICDQCkp6fb33XXXUN8fHz8fHx8/Azprlq1ys3b29vPx8fH7/777/cEgNmzZw/6xz/+0cOQppOT062GPIwZM8Z72rRpnj4+Pv4AMGnSpCH+/v7Dhg4d6v/uu++6G/b56quvXPz8/Ib5+Pj4jR071ruqqgoDBw4MyMjIsAeAqqoqDBgwICAzM9Mm7vpptEGhlCpSSr2ulApRSgUrpX6vlCoyIe3RAFKUUmeVUuUANgOYUWubpwF8WD1ZHpRGMOEdAAAgAElEQVRSV5p6AEREZHvy8vKQn58PR0dHODg4ID4+HnV9eSBqDtav+q9SmOPqRHp6uuMrr7xyJSkpKSE1NdVx48aNbrGxsUl//etfL/z1r3/VAsCiRYu048ePzz958uSpgwcPJr/xxhv98vPzNX369Kk8ePDg6cTExFNbtmw5GxkZOcCQ7qlTp7p8+OGH6SkpKQnnz5932L179039QObNm5dz8uTJU8nJyYk+Pj4lK1eudAeA5557bkBYWFhBcnJyYkJCQmJQUFBpbGys47vvvqvdv3//6eTk5MTVq1efb+zYjh8/3nXZsmUXU1NTEwBg48aN5xISEk4dO3YscfXq1b0uXbpkl5GRYb9w4cJBX3/9dWpycnLitm3bUu3s7DBnzpyrn376aU8A+M9//uMybNiwEq1WaxOXOkwZ5clDRJaJyE4R2Wt4mJB2XwDG9+ZdqF5nzBuAt4jEiMhhEZlcTx6eEZFYEYnNysoyITQREbVnaWlpUEohKSkJGo0GeXl5SEtLa+1skY1g/ar/KkVLrk4Y9O3bt2z06NEldnZ28Pb2LpkwYUK+RqNBUFBQ8YULFxwAYN++fS4rVqzQ+vr6+o0bN86nrKxMUlJSOpeXl8vcuXMHeXt7+z3wwANDUlNTazq4DB8+vGjIkCEVdnZ28Pf3L05NTe1cO3ZcXFyX4OBgH29vb7+tW7e6JSQkOALAoUOHnF977bUsALC3t4ebm1vVrl27XKZNm5Zj+FLfq1evqsaObcSIEUW+vr7lhuV33nmnl4+Pj19wcPCwS5cudUpISHDct29f19GjRxcYtjOk+9vf/jZ78+bNbgDw2WefuT/xxBM2Mw2DKZdZNkJ/u9N9AJ4DMB+AKd/qpY51tTv32APwAhAOoB+AgyISoJTKvWEnpT4B8AkAhISEsIMQEZENGjduHGJiYhrdLjQ0FD/88IMVckS2hPXrZosXL740YsQI/8WLF18aOHBgheHqxPHjx0+2JN3OnTvXfFfTaDRwdHRUAGBnZ4eqqioB9LedffXVVymBgYFlxvu+/PLLfW655ZaKrVu3/qrT6dClS5dgw2sODg416drZ2aGysvKm75rPPPOM51dffZUyduzYkpUrV7rt37/fub58KqVQV8dze3t7VVWlb1vodDpUVFTUxHFycqq5lLV9+3bn/fv3O8fGxiY5OzvrRo8e7VNSUqKpTvemeEOHDq1wd3evjI6Odv7ll1+6btu27Wx9eWtvTOlD4aaUWgv9XBT7lVJPQT/JXWMuAOhvtNwPQEYd2/xHKVWhlPoVQDL0DQwiIupgRo0ahYiICCilUFVVhbVr1+Kjjz7C+++/j5SUFCilEBERgdGjR7d2VqkdYv26We2rFOa4OmGq8ePH57/33nu9DLeaxcTEdAGAvLw8O61WW2FnZ4ePPvrIzfDF3lTFxcWaAQMGVJSVlcnmzZt7GtaHhoYWLFu2zAPQd6i+du2aZvLkyfnR0dE9L126ZAcAly9ftgOAgQMHlsfFxTkBwMaNG7vX1XABgNzcXDtXV9cqZ2dn3S+//OIYHx/ftfrYio4cOeKclJTU2ThdAHjqqaeyfvOb33hOnz79mr29TXSfAGBag6Ki+m+miEwVkVuhbxw05mcAXiLiKSKdATwMILrWNtsAjAcAEXGH/hYom2mtEdmyiooKxMXFobS0tLWzQjYiKioK69evR2ZmJi5cuIDCwkI4ODigc+fO2L9/P9LT07FhwwZERUW1dlapHWL9qpuhL0VMTEwXa47s9Pbbb2dUVlaKr6+vn5eXl/8bb7zRFwAiIiKufPnll26BgYG+p0+fduzSpUuTOre8/vrrGaNHjx4WFhbm7eXlVfMB9fe///38/v37nb29vf0CAgL8jh492iUkJKT0lVdeyQwLC/P18fHxe/755/sDwIsvvph16NAh5+HDhw87fPhw1/ryMHv27LzKykrx9vb2W7RoUZ/AwMAiAOjTp0/lypUrz82cOXOoj4+P38yZMwcb9nnkkUfyiouL7Z555hmbGglAlGr4DiIRuQ/AQeivNnwAwAXAn5RStRsHde17L4D3AdgB+Ewp9VcRWQIgVikVLfrrQe8BmAygCsBflVKbG0ozJCRExcbGNn5kRGRR58+fR0xMDHx8fBAUFNTa2SEbERkZCQCYMGECzp07B2dn/d0K+fn5iImJQd++fbF8+fLWzCK1Y61Rv0QkTikVYtZEGxAfH38uMDCw4XvzdTpg+3ZnbN7cA/HxXcuSk506VVWhws5OOfj4lCAwsAgPP5yD++4rgMaU357JVAcOHHCKjIzs3x4nDIyPj3cPDAwcVNdrjV5rUUptr36ah+qrCaZSSu0EsLPWusVGzxWAl6sfRNRO1B5yceDAgXBzc2vtbJENiIqKgr+/P4YMGQKlFPLz8wHoR+XZuXMnzpw508o5pPaM9QvAli2u+P3v++HXX2s6OzsY/lZVCRITnZCY6IQvv/SAp2cp3n47HQ8+mN9KubUpixYt6r1u3TqPf/zjH7+2dl7MrdErFG0Nr1AQtb7c3Fzs3bsXJSUlcHFxQdeuXREeHg4Nf8kiMzD8irxixYob1okIr05Qi1m7frWZKxTFxYInnhiAf/3LvY7dGvbgg9lYt+48unRpX18ayaxadIWCiKi2tLQ0lJWV4dq1a9BoNKisrERaWho8PT1bO2tkAwy/IkdGRiIrKws9e/bEhg0bkJCQ0NpZIxvQIetXcbHg7ruHIibGpWZd1646zJ6djZkzc3HbbcXw8KhCVpYdDh92wr//3R1bt7qjqEj/K9E//+mOixc7Y/fuFDYqqC78OZGImqywsBC5ubkQEVy5cgVlZWW4coXzUpJ5aLVazJ8/H0uWLMHp06fxxhtvYP78+ejdu85JfYmapEPWryeeGHBDY2Lq1BycOXMC69en4/77C9C7dxXs7IDevatw//0FWL8+HWfOnMDUqTk1+8TEuOCJJwbUlTxRo1coRMQBwGwAg4y3V0otsVy2iKit4RjuZE2vvfYafH19MXLkSERHR+PIkSOtnSWyIR2qfm3Z4nrDbU6vvJKBpUszG+1srdVWIjr6LF57TYvly/sA0F+pmDUrFw89lGfJLFP7Y8otT/+BvkN2HICyRrYlIhs1atQojBo1CitWrEB8fDzS0tLg4qL/wSsnJwcjR47EypUr65zMh6ipnJycEB4ejkWLFmHSpEm4dOkSfH192U+HzKLD1C+dDvj9768P9T91ao5JjQkDjQZYtiwTycldsGNHDwD69B54II+jP5ExU2pDP6XUQ0qppUqp9wwPi+eMiNoU4zHcCwsLodPpkJubW3PrU2JiYoccw50sIy0tDbNmzYKvry8ee+wx5OXlIS0trbWzRTaiw9Sv7duda0Zz6tpVhzVrzje5IaDRAGvWnEfXrvq5GH791RE7dtQ7+3RycnJnLy8v/+ZnWm/79u3Ou3fv7trSdKwpOzvb7u233/awZsza5+nzzz/vHhcXVzOCV0RERJ9t27bVW17mYkqtOiQiwy2dESJq2wz3HS9duhShoaG4//77b3js2bPH9u9DJqspLCxE9+7dsWjRImg0mpr+OkTm0GHq1+bNPWqez56dDa22eTNga7WVmDXr+kRsX37Zo4GtzWLv3r3OBw8e7GbudHU6HZo6+7aprl69ard27dpbrJmf2udp27Zt3Y8fP97FsPz+++9n3H///QXNDmAqpVSDDwCJAMoBJAM4DuAEgOON7WepR3BwsCKi1pGRkaF69OihMjIyVFFRkdq6davKyclRGRkZqmfPniozM7O1s0hE1KZAP5mv1b4nHTt27JxSKlYpFav8/IoUoBSg1L//nVyzvjmPf/87uSYtf/+i+rZLSko6PmjQoJKZM2dme3l5Fd9zzz3X8vPzjyqlYg8cOJAYEhJS4OfnVxQaGpp37ty5eKVU7J///OfzgwcPLvHy8iqeOnXqtaSkpONubm4VHh4e5T4+PsXffPNNknGMyMjIjBkzZlwdM2ZM/oABA0rffffdc0qp2Nzc3KO33XZb/rBhw4q8vLyKP//88xRDnjw9PUvmzZt3xdfXtzg5Ofn43Llzr/j7+xcNGTKkJCIiIsOQdp8+fcpeeOGFzMDAwEJ/f/+igwcPJoaGhub169ev9J133kkzbPfGG2+k+/v7F3l5eRUb9p86deo1BwcHnY+PT/Ezzzxzqb7t6sqP8fH99re/zTScj6effvqSUir24sWLx+6+++4cf3//In9//6Jdu3adqn2etm/fnuTi4lLZp0+fMh8fn+KTJ0+emDVrVvZnn32Waji2iIiIDMP5OXr06ElD2mPHjs0bNmxY0SOPPJKl1WrLMjIyjtUu2+q6VWe9M6UPxRSLtWaIqF0xvkoxd+5cnD17FiKCAwcO8OoEEVFbc/Zsza0vuO224halZbx/aqpjA1vi3LlzjqtXrz539913Fz3wwAODli1b5vGHP/zhyksvvTRgx44dKX369Klcs2ZNj1dffbXvv/71r3MrV67snZaWdqJLly4qOzvbzt3dverxxx/P6tatW9WSJUsu1xXj1KlTXeLi4k4VFBTY3XrrrX6zZ8/O69u3b8WOHTtSevbsqcvMzLQfM2aM79y5c3MNeVqzZs25L7744jwALF++/GKvXr2qKisrcfvtt/scOXKky5gxY0oAoH///uXHjh1LWrBgQf+nnnpq0JEjR5JKSko0AQEB/lFRUVlff/21S0pKiuPx48dPKaUwadKkod988023995778J9993XJSkpKREA6ttu8ODB5bXzY3D58mW7nTt39jh79uxJjUaD7OxsOwB49tln+7/88suX77nnnsIzZ850vueee7zOnj2bUPs8TZo0Kfe+++7Le/LJJ3NQB3d398rExMRTb7/9tsfbb7/da8uWLWmvv/56nzvvvLPgrbfeuvTVV1+5fPnll02eq8SUmbLTRCQQQFj1qoNKqfimBiIi22AYw71///7o2rUrTpw4gXXr1uHUqVOtnTUiIjJWVnb91nYPj5bd5+Pufn1/43Tr0Lt37/K77767CAAee+yxqytXrrzl+PHjeWfOnOkyYcIEb0B/q4+Hh0cFAPj4+JTMnDnTc/r06bnz5s3LNSU7U6ZMye3WrZvq1q1b5dixY/MPHjzY9cEHH8yLiIjod/jw4W4ajQZXrlzpfOHCBXsA0Gq15RMnTiwy7L9+/fqe69atc6+srJSsrKxO8fHxjoYGxYMPPpgLAMOHDy8uKirS9OjRQ9ejRw+dg4ODLjs72+7bb791OXDggIufn58fABQXF2uSkpIcBw8eXG6cx4a2q50fg549e1Y5ODjoHn744YFTp07Ne6h6RK2YmBiXM2fO1NzKVFhYaJeTk9PknvFz587NAYDRo0cXR0dH9wCAn376qdu2bdtSAGDOnDn5Li4uTa4rpgwb+z8AngbwdfWqL0TkE6XUB00NRkTtn1arxaxZsxAdHY3HH38c+/fvx6hRo+Du3vTJV4kaUlFRgePHj8Pf3x+Ojg3+IErUZB2ifjk46FBaqv/SmZVlh969m9+oqP6lvCbdBtQe7U9EoJSSoUOHlhw7diyp9vbff//9mW+++cZ527Zt3ZcuXdrnzJkzJxvLTl0xVq9e3fPq1av2J06cOOXg4KD69u07vKSkRAMATk5ONXlOSkrqvGrVql5xcXGnPDw8qmbPnj2o1HCeADg6OioA0Gg06Ny5c81EfhqNBhUVFaKUQkREROZrr712w4zkycnJnY2XG9rOOD/GOnXqhGPHjp2Kjo522bx5c4+///3vtxw+fPi0UgqxsbGnunXr1qKJBQ3HZm9vryorK8WQz5YypWWzAMAYpdRipdRiALdB38Agog4qLCwMP//8M9LT03HkyBHccccd+Omnn1o7W2RjMjMzcfr0aSQmJrZ2VsgGdYj6NXhwac3zw4edWpSW8f5DhpQ2sCUyMzM779mzpysAbNq0qeftt99eOGLEiNJr167ZG9aXlZVJbGysY1VVFVJTUztPmzat4KOPPrpQUFBgl5eXZ+fs7FxVUFBgV1+Mb775pntxcbFcunTJ7vDhw87jxo0rysvLs3N3d69wcHBQ//3vf50zMjI617VvTk6OXZcuXXQ9e/asSk9Pt9+3b59rU07FlClT8j///HP3vLw8DQD8+uuvnS5evGjv6upaVWSYXbyB7RpKOy8vT3Pt2jW7hx56KO/jjz9OP3XqlBMAjBs3Lv+dd96p6fB96NChLgBQ+zx169atKj8/v0lXLkaPHl34+eef9wT0t2nl5+fXe97rY0pAAWDcoq2qXkdEHZS9vT1GjRqFpUuXYtSoUXBxcUF6enprZ4tsiFIKKSkp6N69O9LS0nD16tXGdyIyUYepX4GB12+p+fe/u7cora+/vj6y04gRN92qY2zw4MGln332mZu3t7dfTk6O/auvvprl6OioNm/enPr666/38/Hx8fP39/fbv39/t8rKSpk7d66nt7e3X0BAgN+zzz572d3dvWr27Nm5O3bs6O7r6+v37bff3jTa06233lo0ceJErzFjxgx79dVXMwcNGlTxm9/85lp8fHzXgICAYV988UVPT0/POhs+Y8eOLQkICCj28vLyf+yxxwYFBwcXNuVUzJo1K/+BBx64NmrUKF9vb2+/mTNnDsnNzbXr3bt3VXBwcKGXl5f/s88+26++7RpKOzc3127y5Mle3t7efmFhYT5/+ctf0gHgk08+ST969GhXb29vvyFDhvivWrXKAwBqn6d58+ZdW7lyZe9hw4b5JSQkOJhyPG+//XbG3r17Xfz8/Ibt2LHD1cPDo6J79+5NupoljV3mEJGXAcwH8O/qVfcDWKeUer8pgcwlJCRExcbGtkZoIjKSmZmJJ598EuvWrWNnbDK73Nxc7Nu3D66urigpKYGjoyPCw8Ntb+IxahXWrF8iEqeUCjF7wvWIj48/FxgYqL/FJjraGTNmeAPQz0Nx5syJZg0dm5lpDy+v4TD8+h4dfRrTpll+KNJ6vPzyy30a6rBNTVNSUiL29vaqU6dO2LNnT9eFCxcONHQsNxYfH+8eGBg4qK40TOmUvVxE9gEYB/2ViSeVUr+0MO9E1M5ptVp8++23rZ0NslFpaWk18wM4OTkhJycHaWlp8PT0bO2skQ3oMPXrvvsK4OlZil9/dURRkQZPPz0A0dFnmzS5nU4HPP30gJrGxODBpZg6tdUaE2R+KSkpnR988MEhOp0OnTp1UqtXrz7X1DTqbVCIiItSKl9EegI4V/0wvNZTKXWtGXkmIiJqlPFs7ABqJh6zuS981Co6TP3SaIC33rqAhx8eCgDYsaMHXntNi2XLMk1qVOh0wGuvabFjx/Xbnd56K73Js22b2fLlyzNaNQM2Zvjw4WWnTp1qUWeihq5QbAJwH4A4AMb3RUn18uCWBCYiIqpPaGhoa2eBbJiN1y+dTqcTjUaj/+720EN52Lo1G//6l34ovuXL+yA5uQvWrDnf4O1PmZn2ePrpATc0Jh58MBsPPphv2exTW6TT6QRAvaN71dugUErdV/3XxprrRGQOHWLIRSKi9udkVlaWn4eHR15No2L9+vPIyOiMmBgXAPorFV5erpg16ypmzcrBbbcVw929CtnZdjh82Alff90DX3/tBqMRixAamo91687XGZFsmk6nk6ysLFcA9Q7na0qn7P+nlJrY2DprYadsorbh/PnziImJgY+PD4KCglo7O0REbZK1O2XHxcXdYm9v/ymAABiN5illZej/pz+59di586YRkxqTc++9helvvnlVOZg0aBDZHh2Ak5WVlb8JDg6+UtcGDfWhcATgBMBdRHrg+lCxLgD6mDunRNR+1B5yceDAgXBzc2vtbBERdXjVX/im1/nijh2AyL0A3gPga0JySQBe7rFjxzc9Gt2UOrKGetU8C33/Cd/qv4bHfwB8aEriIjJZRJJFJEVEXm9guzkiokTEai14Imq+vLw85Ofnw9HREQ4ODoiPj4dO1+DEqURE1BYotROAH4AJAFZD/92uGPr+scXVy6urX/eDUt+0Uk6pHWmoD8X/Afg/EXlRKfVBUxMWETvoGx53AbgA4GcRiVZKJdbazhnASwCONDUGEbWODjPkIhGRLdLf7/599YOoxUyZh+IDEQmAvjXraLR+QyO7jgaQopQ6CwAishnADAC1h6X6M4ClAF5tQr6JqBV1mCEXiYiIqFGNNihE5E0A4dA3KHYCmALgBwCNNSj6Akg3Wr4AYEyttG8F0F8ptV1E2KAgaidsfMhFIiIiagJTZiaZA2AigEtKqScBBAIwpZu/1LGuZkgpEdEAWAHglUYTEnlGRGJFJDYrK8uE0G3PuHHjICKNPsaNG9emYxARERERGTOlQVGilNIBqBQRFwBXYNqkdhcA9Dda7gfAeGZDZ+iHNNsnIucA3AYguq6O2UqpT5RSIUqpEA8PDxNCtz2jRo1CREQElFJQSqG8vByxsbEoKSmpWRcREYHRo0e36RhERERERMZMmYfiIwCLADwM/dWEQgDHqq9WNLSfPYDT0F/duAjgZwBzlVIJ9Wy/D8CrSqkGJ5lor/NQZGZmwt/fHwkJCdBqtTh79ix27dqFoKAgjBkzBpmZmQgICEBCQgJ69+7dZmMQERGR6aw9DwVRa2j0CoVS6nmlVK5S6mPoR2ya31hjonq/SgALAewCcArAP5VSCSKyRETqHh/Zhmm1WsyfPx9Lly6FUgpHjx7FtWvXcOzYMVy9ehVLly7F/PnzW/RF3xoxiIiIiIiM1XuFQkQanPpWKXXUIjlqRHu9QgFcv4IQExODnTt3orCwEJ06dUK/fv0QGRlplisH1ohBREREpuEVCuoIGmpQGMYmdgQQAiAe+o7WIwAcUUq1Ss/e9tygAIDIyEhkZGRg+PDhEBHodDrs2bMHQ4cOxdq1a9tNDCIiImocGxTUEdR7y5NSarxSajyANABB1Z2igwHcCiDFWhm0NVFRUdixYwfy8vKg0+lQUFCAn3/+GeHh4e0qBhERERERYNooT75KqROGBaXUSQAjLZcl26bVajF27FgcOnQIAHDo0CEEBQXB3r7RKUHaVAwiIiIiIsC0BsUpEflURMJF5E4RWQN9J2tqphkzZuCXX37BlStXcPToUdx1113QaEwpirYVg4iIiIjIlJ+snwTwWwD/U718AMDfLZajDuDRRx/Fd999h/Xr1+Oee+5BWFiY2W9HskYMIiIiIqJGGxRKqVLoZ7ReYfnsdAxpaWmYNWsWLl26hMceewx5eXlIS0uDp6dnu4pBRERERFTvPTAi8s/qvydE5Hjth/WyaHsKCwvRvXt3LFq0CBqNBiKCK1eutLsYREREREQNXaEw3OJ0nzUy0pGEhobaRAwiIiIionobFEqpzOq/adbLDhERERERtSf1NihEpABAXbPeCQCllHKxWK6IiIiIiKhdaOgKhbM1M0JERERERO2PyTOdicgtABwNy0qp8xbJERERERERtRuNznQmItNF5AyAXwHsB3AOwDcWzhcREREREbUDpkyd/GcAtwE4rZTyBDARQIxFc0VERERERO2CKQ2KCqXUVQAaEdEopb4HMNLC+SIiIiIionbAlD4UuSLSDcABABtF5AqASstmi4iIiIiI2gNTrlDMAFACIBLAtwBSAUyzZKaIiIiIiKh9aGgeilUANimlDhmtXm/5LBERERERUXvR0BWKMwDeE5FzIvKOiLDfBBERERER3aDeBoVS6v+UUmMB3AngGoB/iMgpEVksIt5WyyEREREREbVZjfahUEqlKaXeUUrdCmAugJkATlk8Z0RERERE1OaZMrFdJxGZJiIboZ/Q7jSA2aYkLiKTRSRZRFJE5PU6Xn9ZRBJF5LiI/D8RGdjkIyAiIiIiolZTb4NCRO4Skc8AXADwDICdAIYopR5SSm1rLGERsQPwIYApAPwAPCIifrU2+wVAiFJqBICvACxt3mEQEREREVFraOgKxSIAPwIYppSappTaqJQqakLaowGkKKXOKqXKAWyGfgjaGkqp75VSxdWLhwH0a0L6RERERETUyuodNlYpNb6FafcFkG60fAHAmAa2XwD9LVVERERERNROmDJTdnNJHetUnRuKPAogBPoRpep6/Rnob7vCgAEDzJU/IiIiIiJqIVNmym6uCwD6Gy33A5BReyMRmQTgDwCmK6XK6kpIKfWJUipEKRXi4eFhkcwSEREREVHTWbJB8TMALxHxFJHOAB4GEG28gYjcCmA19I2JKxbMCxERERERWYDFGhRKqUoACwHsgn7ein8qpRJEZImITK/ebBmAbgD+JSLHRCS6nuSIiIiIiKgNsmQfCiildkI/3KzxusVGzydZMj4REREREVmWJW95IiIiIiIiG8cGBRERERERNRsbFERERERE1GxsUBARERERUbOxQUFERERERM3GBgURERERETUbGxRERERERNRsbFAQEREREVGzsUFBRERERETNxgYFERERERE1GxsURERERETUbGxQEBERERFRs7FBQURE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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "mglearn.plots.plot_cross_val_selection()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 그리드 서치와 교차 검증을 사용한 매개 변수 선택과 모델 평가의 전체 작업 흐름" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![process](./images/process.jpg)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- **model_selection.GridSearchCV**\n", " - **교차 검증을 사용하는 그리드 탐색을 통한 모델 파라미터 검색 기능 제공 객체**\n", " - 기본적으로 사용하는 교차 검증 분류기\n", " - 분류에는 StratifiedKFold 사용함\n", " - 회귀에는 KFold 사용함\n", " - fit을 수행한 이후에는 가장 최적의 파라미터로 만들어진 모델을 구성하고 있음.\n", "- 다른 estimator (or 모델)를 사용하여 만들어지는 estimator를 메타 추정기(meta-estimator)라고 함.\n", " - GridSearchCV는 가장 널리 사용되는 메타 추정기\n", " - scikit-learn에서는 MetaEstimatorMixin 클래스를 상속한 모델을 메타 추정기라고 부름\n", " - 메타 추정기 예\n", " - GridSearchCV\n", " - RandomForest\n", " - GradientBoosting\n", " - RFE\n", " - ..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 우선 모델에 들어갈 각 매개변수 값을 사전(Dict)타입으로 구성\n", " - 문자열 매개변수 이름을 모델(예:SVC)에 설정된 매개변수와 동일하게 맞춤 " ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Parameter grid:\n", "{'C': [0.001, 0.01, 0.1, 1, 10, 100], 'gamma': [0.001, 0.01, 0.1, 1, 10, 100]}\n" ] } ], "source": [ "param_grid = { \n", " 'C': [0.001, 0.01, 0.1, 1, 10, 100],\n", " 'gamma': [0.001, 0.01, 0.1, 1, 10, 100]\n", "}\n", "print(\"Parameter grid:\\n{}\".format(param_grid))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- GridSearchCV 생성\n", " - model_selection.GridSearchCV(estimator, param_grid, n_jobs=1, cv=None, verbose=0, return_train_score='True')\n", " - estimator\n", " - param_grid\n", " - n_jobs\n", " - Number of jobs to run in parallel\n", " - default: 1\n", " - -1 --> Using All threads\n", " - cv\n", " - None, to use the default 3-fold cross validation\n", " - integer, to specify the number of folds in a (Stratified)KFold.\n", " - fold의 개수를 cv=5와 같이 설정\n", " - An object to be used as a cross-validation generator.\n", " - An iterable yielding train, test splits." ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from sklearn.model_selection import GridSearchCV\n", "from sklearn.svm import SVC\n", "\n", "estimator = SVC()\n", "grid_search = GridSearchCV(\n", " estimator = estimator, \n", " param_grid = param_grid, \n", " n_jobs = -1, \n", " cv = 5, \n", " return_train_score = True\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 훈련 데이터와 테스트 데이터 분리" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": true }, "outputs": [], "source": [ "X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 훈련 데이터만 GridSearchCV 객체에 넣어 fit을 함\n", " - 이 때 훈련 데이터중 일부는 내부적으로 검증 데이터 (Validation Data)로 사용됨\n", "- GridSearchCV는 생성시 모델을 내장하므로 fit, predict, score 등의 함수를 제공\n", " - 모델에 따라서 predict_proba, decision_function을 제공하기도 함" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "GridSearchCV(cv=5, error_score='raise',\n", " estimator=SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,\n", " decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf',\n", " max_iter=-1, probability=False, random_state=None, shrinking=True,\n", " tol=0.001, verbose=False),\n", " fit_params=None, iid=True, n_jobs=-1,\n", " param_grid={'C': [0.001, 0.01, 0.1, 1, 10, 100], 'gamma': [0.001, 0.01, 0.1, 1, 10, 100]},\n", " pre_dispatch='2*n_jobs', refit=True, return_train_score=True,\n", " scoring=None, verbose=0)" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grid_search.fit(X_train, y_train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 모델 구성시 사용하지 않은 완전히 새로운 데이터인 X_test와 y_test를 사용하여 모델 평가" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Test set score: 0.97\n" ] } ], "source": [ "print(\"Test set score: {:.2f}\".format(grid_search.score(X_test, y_test)))" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Best parameters: {'C': 100, 'gamma': 0.01}\n", "Best cross-validation score: 0.97\n" ] } ], "source": [ "print(\"Best parameters: {}\".format(grid_search.best_params_))\n", "print(\"Best cross-validation score: {:.2f}\".format(grid_search.best_score_))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 위 두 예에서 grid_search.score() 메소드와 grid_search.best\\_score\\_ 속성은 매우 큰 차이\n", " - grid_search.score() 메소드\n", " - 새로운 데이터인 테스트 데이터 셋을 통한 모델 평가 점수\n", " - grid_search.best\\_score\\_ 속성\n", " - 훈련 데이터에 대하여 수행한 교차 검증에서의 최고 점수" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Best estimator:\n", "SVC(C=100, cache_size=200, class_weight=None, coef0=0.0,\n", " decision_function_shape='ovr', degree=3, gamma=0.01, kernel='rbf',\n", " max_iter=-1, probability=False, random_state=None, shrinking=True,\n", " tol=0.001, verbose=False)\n" ] } ], "source": [ "print(\"Best estimator:\\n{}\".format(grid_search.best_estimator_))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### [NOTE] 전형적인 교차 검증 그리드 서치를 통한 모델 구성 및 테스트 집합 성능 평가 코드" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Test set score: 0.97\n" ] } ], "source": [ "from sklearn.model_selection import GridSearchCV\n", "from sklearn.svm import SVC\n", "\n", "X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=0)\n", "\n", "estimator = SVC()\n", "\n", "param_grid = { \n", " 'C': [0.001, 0.01, 0.1, 1, 10, 100],\n", " 'gamma': [0.001, 0.01, 0.1, 1, 10, 100]\n", "}\n", "\n", "grid_search = GridSearchCV(\n", " estimator = estimator, \n", " param_grid = param_grid, \n", " n_jobs = -1, \n", " cv = 5, \n", " return_train_score = True\n", ")\n", "\n", "grid_search.fit(X_train, y_train)\n", "\n", "print(\"Test set score: {:.2f}\".format(grid_search.score(X_test, y_test)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Analyzing the result of cross-validation\n", "- grid_search.cv\\_results\\_\n", " - 그리드 탐색에 대한 교차 검증 결과 정보가 상세히 들어 있는 속성" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Index(['mean_fit_time', 'mean_score_time', 'mean_test_score',\n", " 'mean_train_score', 'param_C', 'param_gamma', 'params',\n", " 'rank_test_score', 'split0_test_score', 'split0_train_score',\n", " 'split1_test_score', 'split1_train_score', 'split2_test_score',\n", " 'split2_train_score', 'split3_test_score', 'split3_train_score',\n", " 'split4_test_score', 'split4_train_score', 'std_fit_time',\n", " 'std_score_time', 'std_test_score', 'std_train_score'],\n", " dtype='object')\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
mean_fit_timemean_score_timemean_test_scoremean_train_score...std_fit_timestd_score_timestd_test_scorestd_train_score
00.00357350.00128890.36607140.3660787...0.00100960.00048290.01137080.0028518
10.00135280.00047130.36607140.3660787...0.00038040.00009420.01137080.0028518
20.00098930.00044840.36607140.3660787...0.00020810.00014430.01137080.0028518
30.00147540.00054290.36607140.3660787...0.00049510.00002760.01137080.0028518
40.00139180.00104720.36607140.3660787...0.00046320.00095450.01137080.0028518
50.00455460.00128070.36607140.3660787...0.00668140.00166330.01137080.0028518
60.00168930.00075050.36607140.3660787...0.00132670.00062360.01137080.0028518
70.00137590.00053240.36607140.3660787...0.00061390.00004500.01137080.0028518
80.00129420.00069990.36607140.3660787...0.00019660.00020610.01137080.0028518
90.00113330.00127350.36607140.3660787...0.00015140.00147800.01137080.0028518
100.00160420.00063870.36607140.3660787...0.00057560.00013270.01137080.0028518
110.00144160.00223710.36607140.3660787...0.00043390.00250220.01137080.0028518
120.00344460.00045770.36607140.3660787...0.00471590.00001840.01137080.0028518
130.00154490.00048230.69642860.6964237...0.00050180.00009420.01319630.0032580
140.00101790.00058420.91964290.9197442...0.00011870.00002580.04401020.0212659
150.00111380.00048360.95535710.9598457...0.00012350.00005930.04010430.0113043
160.00141430.00054170.36607140.3817097...0.00051190.00019060.01137080.0213374
170.00208370.00048330.36607140.3660787...0.00163790.00009020.01137080.0028518
180.00184770.00047340.69642860.6964237...0.00161440.00006790.01319630.0032580
190.00091470.00043170.92857140.9353247...0.00013140.00006650.04298270.0078884
200.00081450.00051050.96428570.9776501...0.00010120.00010730.03407690.0100842
210.00094500.00046070.94642860.9843928...0.00015120.00004810.03247990.0088664
220.00165140.00058480.91964291.0000000...0.00023750.00018000.06479060.0000000
230.00139550.00048170.50892861.0000000...0.00005000.00007980.04643500.0000000
240.00086430.00041600.92857140.9353247...0.00006640.00002530.04298270.0078884
250.00068380.00045320.96428570.9776757...0.00004230.00015500.03407690.0070319
260.00082320.00040550.96428570.9865662...0.00026320.00003440.01776870.0083555
270.00075980.00040540.93750000.9865906...0.00011780.00006550.04525280.0083624
280.00100570.00033990.91964291.0000000...0.00011390.00005840.06479060.0000000
290.00109630.00045420.56250001.0000000...0.00015790.00013120.04966780.0000000
300.00050680.00025470.96428570.9776757...0.00009040.00003520.03407690.0070319
310.00054470.00029560.97321430.9843684...0.00022280.00004140.02239950.0054851
320.00058280.00051190.95535710.9887884...0.00010830.00030100.04956620.0099945
330.00057920.00028650.94642861.0000000...0.00005840.00003910.05192270.0000000
340.00100270.00035210.91964291.0000000...0.00013540.00009960.06479060.0000000
350.00102710.00032210.56250001.0000000...0.00010110.00004090.04966780.0000000
\n", "

36 rows × 22 columns

\n", "
" ], "text/plain": [ " mean_fit_time mean_score_time mean_test_score mean_train_score \\\n", "0 0.0035735 0.0012889 0.3660714 0.3660787 \n", "1 0.0013528 0.0004713 0.3660714 0.3660787 \n", "2 0.0009893 0.0004484 0.3660714 0.3660787 \n", "3 0.0014754 0.0005429 0.3660714 0.3660787 \n", "4 0.0013918 0.0010472 0.3660714 0.3660787 \n", "5 0.0045546 0.0012807 0.3660714 0.3660787 \n", "6 0.0016893 0.0007505 0.3660714 0.3660787 \n", "7 0.0013759 0.0005324 0.3660714 0.3660787 \n", "8 0.0012942 0.0006999 0.3660714 0.3660787 \n", "9 0.0011333 0.0012735 0.3660714 0.3660787 \n", "10 0.0016042 0.0006387 0.3660714 0.3660787 \n", "11 0.0014416 0.0022371 0.3660714 0.3660787 \n", "12 0.0034446 0.0004577 0.3660714 0.3660787 \n", "13 0.0015449 0.0004823 0.6964286 0.6964237 \n", "14 0.0010179 0.0005842 0.9196429 0.9197442 \n", "15 0.0011138 0.0004836 0.9553571 0.9598457 \n", "16 0.0014143 0.0005417 0.3660714 0.3817097 \n", "17 0.0020837 0.0004833 0.3660714 0.3660787 \n", "18 0.0018477 0.0004734 0.6964286 0.6964237 \n", "19 0.0009147 0.0004317 0.9285714 0.9353247 \n", "20 0.0008145 0.0005105 0.9642857 0.9776501 \n", "21 0.0009450 0.0004607 0.9464286 0.9843928 \n", "22 0.0016514 0.0005848 0.9196429 1.0000000 \n", "23 0.0013955 0.0004817 0.5089286 1.0000000 \n", "24 0.0008643 0.0004160 0.9285714 0.9353247 \n", "25 0.0006838 0.0004532 0.9642857 0.9776757 \n", "26 0.0008232 0.0004055 0.9642857 0.9865662 \n", "27 0.0007598 0.0004054 0.9375000 0.9865906 \n", "28 0.0010057 0.0003399 0.9196429 1.0000000 \n", "29 0.0010963 0.0004542 0.5625000 1.0000000 \n", "30 0.0005068 0.0002547 0.9642857 0.9776757 \n", "31 0.0005447 0.0002956 0.9732143 0.9843684 \n", "32 0.0005828 0.0005119 0.9553571 0.9887884 \n", "33 0.0005792 0.0002865 0.9464286 1.0000000 \n", "34 0.0010027 0.0003521 0.9196429 1.0000000 \n", "35 0.0010271 0.0003221 0.5625000 1.0000000 \n", "\n", " ... std_fit_time std_score_time std_test_score \\\n", "0 ... 0.0010096 0.0004829 0.0113708 \n", "1 ... 0.0003804 0.0000942 0.0113708 \n", "2 ... 0.0002081 0.0001443 0.0113708 \n", "3 ... 0.0004951 0.0000276 0.0113708 \n", "4 ... 0.0004632 0.0009545 0.0113708 \n", "5 ... 0.0066814 0.0016633 0.0113708 \n", "6 ... 0.0013267 0.0006236 0.0113708 \n", "7 ... 0.0006139 0.0000450 0.0113708 \n", "8 ... 0.0001966 0.0002061 0.0113708 \n", "9 ... 0.0001514 0.0014780 0.0113708 \n", "10 ... 0.0005756 0.0001327 0.0113708 \n", "11 ... 0.0004339 0.0025022 0.0113708 \n", "12 ... 0.0047159 0.0000184 0.0113708 \n", "13 ... 0.0005018 0.0000942 0.0131963 \n", "14 ... 0.0001187 0.0000258 0.0440102 \n", "15 ... 0.0001235 0.0000593 0.0401043 \n", "16 ... 0.0005119 0.0001906 0.0113708 \n", "17 ... 0.0016379 0.0000902 0.0113708 \n", "18 ... 0.0016144 0.0000679 0.0131963 \n", "19 ... 0.0001314 0.0000665 0.0429827 \n", "20 ... 0.0001012 0.0001073 0.0340769 \n", "21 ... 0.0001512 0.0000481 0.0324799 \n", "22 ... 0.0002375 0.0001800 0.0647906 \n", "23 ... 0.0000500 0.0000798 0.0464350 \n", "24 ... 0.0000664 0.0000253 0.0429827 \n", "25 ... 0.0000423 0.0001550 0.0340769 \n", "26 ... 0.0002632 0.0000344 0.0177687 \n", "27 ... 0.0001178 0.0000655 0.0452528 \n", "28 ... 0.0001139 0.0000584 0.0647906 \n", "29 ... 0.0001579 0.0001312 0.0496678 \n", "30 ... 0.0000904 0.0000352 0.0340769 \n", "31 ... 0.0002228 0.0000414 0.0223995 \n", "32 ... 0.0001083 0.0003010 0.0495662 \n", "33 ... 0.0000584 0.0000391 0.0519227 \n", "34 ... 0.0001354 0.0000996 0.0647906 \n", "35 ... 0.0001011 0.0000409 0.0496678 \n", "\n", " std_train_score \n", "0 0.0028518 \n", "1 0.0028518 \n", "2 0.0028518 \n", "3 0.0028518 \n", "4 0.0028518 \n", "5 0.0028518 \n", "6 0.0028518 \n", "7 0.0028518 \n", "8 0.0028518 \n", "9 0.0028518 \n", "10 0.0028518 \n", "11 0.0028518 \n", "12 0.0028518 \n", "13 0.0032580 \n", "14 0.0212659 \n", "15 0.0113043 \n", "16 0.0213374 \n", "17 0.0028518 \n", "18 0.0032580 \n", "19 0.0078884 \n", "20 0.0100842 \n", "21 0.0088664 \n", "22 0.0000000 \n", "23 0.0000000 \n", "24 0.0078884 \n", "25 0.0070319 \n", "26 0.0083555 \n", "27 0.0083624 \n", "28 0.0000000 \n", "29 0.0000000 \n", "30 0.0070319 \n", "31 0.0054851 \n", "32 0.0099945 \n", "33 0.0000000 \n", "34 0.0000000 \n", "35 0.0000000 \n", "\n", "[36 rows x 22 columns]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import pandas as pd\n", "# convert to Dataframe\n", "results = pd.DataFrame(grid_search.cv_results_)\n", "pd.options.display.float_format = '{:,.7f}'.format\n", "\n", "print(results.columns)\n", "# show the first 5 rows\n", "# display(results.head(5))\n", "display(results)" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
rank_test_scoreparamsmean_test_scorestd_test_scoremean_train_scorestd_train_score
311{'C': 100, 'gamma': 0.01}0.97321430.02239950.98436840.0054851
202{'C': 1, 'gamma': 0.1}0.96428570.03407690.97765010.0100842
302{'C': 100, 'gamma': 0.001}0.96428570.03407690.97767570.0070319
262{'C': 10, 'gamma': 0.1}0.96428570.01776870.98656620.0083555
252{'C': 10, 'gamma': 0.01}0.96428570.03407690.97767570.0070319
326{'C': 100, 'gamma': 0.1}0.95535710.04956620.98878840.0099945
156{'C': 0.1, 'gamma': 1}0.95535710.04010430.95984570.0113043
338{'C': 100, 'gamma': 1}0.94642860.05192271.00000000.0000000
218{'C': 1, 'gamma': 1}0.94642860.03247990.98439280.0088664
2710{'C': 10, 'gamma': 1}0.93750000.04525280.98659060.0083624
2411{'C': 10, 'gamma': 0.001}0.92857140.04298270.93532470.0078884
1911{'C': 1, 'gamma': 0.01}0.92857140.04298270.93532470.0078884
2213{'C': 1, 'gamma': 10}0.91964290.06479061.00000000.0000000
1413{'C': 0.1, 'gamma': 0.1}0.91964290.04401020.91974420.0212659
2813{'C': 10, 'gamma': 10}0.91964290.06479061.00000000.0000000
3413{'C': 100, 'gamma': 10}0.91964290.06479061.00000000.0000000
1317{'C': 0.1, 'gamma': 0.01}0.69642860.01319630.69642370.0032580
1817{'C': 1, 'gamma': 0.001}0.69642860.01319630.69642370.0032580
2919{'C': 10, 'gamma': 100}0.56250000.04966781.00000000.0000000
3519{'C': 100, 'gamma': 100}0.56250000.04966781.00000000.0000000
2321{'C': 1, 'gamma': 100}0.50892860.04643501.00000000.0000000
022{'C': 0.001, 'gamma': 0.001}0.36607140.01137080.36607870.0028518
1222{'C': 0.1, 'gamma': 0.001}0.36607140.01137080.36607870.0028518
1122{'C': 0.01, 'gamma': 100}0.36607140.01137080.36607870.0028518
1022{'C': 0.01, 'gamma': 10}0.36607140.01137080.36607870.0028518
922{'C': 0.01, 'gamma': 1}0.36607140.01137080.36607870.0028518
822{'C': 0.01, 'gamma': 0.1}0.36607140.01137080.36607870.0028518
722{'C': 0.01, 'gamma': 0.01}0.36607140.01137080.36607870.0028518
622{'C': 0.01, 'gamma': 0.001}0.36607140.01137080.36607870.0028518
522{'C': 0.001, 'gamma': 100}0.36607140.01137080.36607870.0028518
422{'C': 0.001, 'gamma': 10}0.36607140.01137080.36607870.0028518
322{'C': 0.001, 'gamma': 1}0.36607140.01137080.36607870.0028518
222{'C': 0.001, 'gamma': 0.1}0.36607140.01137080.36607870.0028518
122{'C': 0.001, 'gamma': 0.01}0.36607140.01137080.36607870.0028518
1622{'C': 0.1, 'gamma': 10}0.36607140.01137080.38170970.0213374
1722{'C': 0.1, 'gamma': 100}0.36607140.01137080.36607870.0028518
\n", "
" ], "text/plain": [ " rank_test_score params mean_test_score \\\n", "31 1 {'C': 100, 'gamma': 0.01} 0.9732143 \n", "20 2 {'C': 1, 'gamma': 0.1} 0.9642857 \n", "30 2 {'C': 100, 'gamma': 0.001} 0.9642857 \n", "26 2 {'C': 10, 'gamma': 0.1} 0.9642857 \n", "25 2 {'C': 10, 'gamma': 0.01} 0.9642857 \n", "32 6 {'C': 100, 'gamma': 0.1} 0.9553571 \n", "15 6 {'C': 0.1, 'gamma': 1} 0.9553571 \n", "33 8 {'C': 100, 'gamma': 1} 0.9464286 \n", "21 8 {'C': 1, 'gamma': 1} 0.9464286 \n", "27 10 {'C': 10, 'gamma': 1} 0.9375000 \n", "24 11 {'C': 10, 'gamma': 0.001} 0.9285714 \n", "19 11 {'C': 1, 'gamma': 0.01} 0.9285714 \n", "22 13 {'C': 1, 'gamma': 10} 0.9196429 \n", "14 13 {'C': 0.1, 'gamma': 0.1} 0.9196429 \n", "28 13 {'C': 10, 'gamma': 10} 0.9196429 \n", "34 13 {'C': 100, 'gamma': 10} 0.9196429 \n", "13 17 {'C': 0.1, 'gamma': 0.01} 0.6964286 \n", "18 17 {'C': 1, 'gamma': 0.001} 0.6964286 \n", "29 19 {'C': 10, 'gamma': 100} 0.5625000 \n", "35 19 {'C': 100, 'gamma': 100} 0.5625000 \n", "23 21 {'C': 1, 'gamma': 100} 0.5089286 \n", "0 22 {'C': 0.001, 'gamma': 0.001} 0.3660714 \n", "12 22 {'C': 0.1, 'gamma': 0.001} 0.3660714 \n", "11 22 {'C': 0.01, 'gamma': 100} 0.3660714 \n", "10 22 {'C': 0.01, 'gamma': 10} 0.3660714 \n", "9 22 {'C': 0.01, 'gamma': 1} 0.3660714 \n", "8 22 {'C': 0.01, 'gamma': 0.1} 0.3660714 \n", "7 22 {'C': 0.01, 'gamma': 0.01} 0.3660714 \n", "6 22 {'C': 0.01, 'gamma': 0.001} 0.3660714 \n", "5 22 {'C': 0.001, 'gamma': 100} 0.3660714 \n", "4 22 {'C': 0.001, 'gamma': 10} 0.3660714 \n", "3 22 {'C': 0.001, 'gamma': 1} 0.3660714 \n", "2 22 {'C': 0.001, 'gamma': 0.1} 0.3660714 \n", "1 22 {'C': 0.001, 'gamma': 0.01} 0.3660714 \n", "16 22 {'C': 0.1, 'gamma': 10} 0.3660714 \n", "17 22 {'C': 0.1, 'gamma': 100} 0.3660714 \n", "\n", " std_test_score mean_train_score std_train_score \n", "31 0.0223995 0.9843684 0.0054851 \n", "20 0.0340769 0.9776501 0.0100842 \n", "30 0.0340769 0.9776757 0.0070319 \n", "26 0.0177687 0.9865662 0.0083555 \n", "25 0.0340769 0.9776757 0.0070319 \n", "32 0.0495662 0.9887884 0.0099945 \n", "15 0.0401043 0.9598457 0.0113043 \n", "33 0.0519227 1.0000000 0.0000000 \n", "21 0.0324799 0.9843928 0.0088664 \n", "27 0.0452528 0.9865906 0.0083624 \n", "24 0.0429827 0.9353247 0.0078884 \n", "19 0.0429827 0.9353247 0.0078884 \n", "22 0.0647906 1.0000000 0.0000000 \n", "14 0.0440102 0.9197442 0.0212659 \n", "28 0.0647906 1.0000000 0.0000000 \n", "34 0.0647906 1.0000000 0.0000000 \n", "13 0.0131963 0.6964237 0.0032580 \n", "18 0.0131963 0.6964237 0.0032580 \n", "29 0.0496678 1.0000000 0.0000000 \n", "35 0.0496678 1.0000000 0.0000000 \n", "23 0.0464350 1.0000000 0.0000000 \n", "0 0.0113708 0.3660787 0.0028518 \n", "12 0.0113708 0.3660787 0.0028518 \n", "11 0.0113708 0.3660787 0.0028518 \n", "10 0.0113708 0.3660787 0.0028518 \n", "9 0.0113708 0.3660787 0.0028518 \n", "8 0.0113708 0.3660787 0.0028518 \n", "7 0.0113708 0.3660787 0.0028518 \n", "6 0.0113708 0.3660787 0.0028518 \n", "5 0.0113708 0.3660787 0.0028518 \n", "4 0.0113708 0.3660787 0.0028518 \n", "3 0.0113708 0.3660787 0.0028518 \n", "2 0.0113708 0.3660787 0.0028518 \n", "1 0.0113708 0.3660787 0.0028518 \n", "16 0.0113708 0.3817097 0.0213374 \n", "17 0.0113708 0.3660787 0.0028518 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "results2 = results[['rank_test_score', 'params', 'mean_test_score', 'std_test_score', \n", " 'mean_train_score', 'std_train_score']]\n", "results2 = results2.sort_values('rank_test_score')\n", "display(results2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- heatmap을 사용한 mean_test_score를 각 매개변수별로 시각화" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0.36607142857142855, 0.36607142857142855, 0.36607142857142855, 0.36607142857142855, 0.36607142857142855, 0.36607142857142855, 0.36607142857142855, 0.36607142857142855, 0.36607142857142855, 0.36607142857142855, 0.36607142857142855, 0.36607142857142855, 0.36607142857142855, 0.6964285714285714, 0.9196428571428571, 0.9553571428571429, 0.36607142857142855, 0.36607142857142855, 0.6964285714285714, 0.9285714285714286, 0.9642857142857143, 0.9464285714285714, 0.9196428571428571, 0.5089285714285714, 0.9285714285714286, 0.9642857142857143, 0.9642857142857143, 0.9375, 0.9196428571428571, 0.5625, 0.9642857142857143, 0.9732142857142857, 0.9553571428571429, 0.9464285714285714, 0.9196428571428571, 0.5625]\n", "\n", "(36,)\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "print([x for x in results.mean_test_score])\n", "print()\n", "\n", "print(results.mean_test_score.shape)\n", "\n", "scores = np.array(results.mean_test_score).reshape(6, 6)\n", "\n", "# plot the mean cross-validation scores\n", "mglearn.tools.heatmap(\n", " scores, \n", " xlabel='gamma', \n", " xticklabels=param_grid['gamma'],\n", " ylabel='C', \n", " yticklabels=param_grid['C'], \n", " cmap=\"viridis\"\n", ")" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false, "scrolled": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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Y8VrG+vY44/GBqCbMaYzkAGMByY2dYj6fN+kTB9F3/N74yn3UHiwiHnXLKxav/c5PclJzyVrV9M01ARS3kDKqrzO81jLrE/f58VRlxNkXLz63ZdsO5TLrWcM5oucLN5P8z289eKTevL2Tv9G0/zSEhZsWsPbKVcB8Ph/15Bf2nwP1/1RauZeAw1hahs70ygbNuYV4FwgGtgP3AcEA1hrn65R9gV8J9B1Tr8Tadras835jR1XRALc+/a1z6y1zTL1ghP1XXh8B9t5yq1OxHXEmzfMb+4I9dYt2NkHOja2LE9gdeP8pjywHmw178LLmztCg6zaMrc567rR+IZYBQHPWWvnGGPuBzZaa5dVTh37JtAGKAGyrLWnnGibOq8TaRrfPdO/7kI/Imm/ubPZ6rqmEB7fwXb+dcPO87bOvbVZjoljPQystRMaUPYap3KIiDhN9Z2I/BxYa5cDy2t8NqvazxvwDVUQEZG6BEgPg+Z8hoGIiIiIiIiI/EipwUBERERERESkCTkxS4Ix5gJjzLfGmO3GmLuOU2asMWaLMeZrY8zLdW2z2R56KCIiIiIiIvKz1MhDEowxQcCTwHB8M9tsMMYss9ZuqVamG3A3MNhae9AY076u7aqHgYiIiIiIiEhTaeiUivVrXOgPbLfW7rTWlgFLgJQaZX4DPGmtPQhgra1z2g01GIiIiIiIiIg0IQeGJCQCe6u9T6/8rLruQHdjzGpjzFpjzAV1bVRDEkRERERERESaUsOHJEQbYzZWe/+MtfaZau9NPfbiBrrhmw48CfiPMeZUa+2h4+1UDQYiIiIiIiIiTai+DzKsJsdae+YJlqcDHaq9TwL21VJmrbW2HNhljPkWXwPChuNtVEMSRERERERERJpS4z/DYAPQzRjT2RgTAowHltUo809gGIAxJhrfEIWdJ9qoGgxEREREREREmooDDz201lYA04FVwFbgVWvt18aY+40xF1cWWwXkGmO2AKnAHdba3BNtV0MSRERERERERJqIofYHDvxQ1trlwPIan82q9rMFbq181YsaDERERERERESaUsOfYdAs1GAgIiIiIiIi0oS+x0MPm4UaDERERERERESakhoMREREREREROQYajAQERERERERET9WQxJEREREREREpDZqMBARERERERGRmgKlh4GruQOIiIiIiIiIyI+PehiIiMgPVmBDmjuC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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, axes = plt.subplots(1, 3, figsize=(20, 5))\n", "\n", "param_grid_linear = {'C': np.linspace(1, 2, 6), 'gamma': np.linspace(1, 2, 6)}\n", "param_grid_one_log = {'C': np.linspace(1, 2, 6), 'gamma': np.logspace(-3, 2, 6)}\n", "param_grid_range = {'C': np.logspace(-3, 2, 6), 'gamma': np.logspace(-7, -2, 6)}\n", "\n", "for param_grid, ax in zip([param_grid_linear, param_grid_one_log, param_grid_range], axes):\n", " grid_search = GridSearchCV(SVC(), param_grid, n_jobs=-1, cv=5)\n", " grid_search.fit(X_train, y_train)\n", " scores = grid_search.cv_results_['mean_test_score'].reshape(6, 6)\n", "\n", " # plot the mean cross-validation scores\n", " scores_image = mglearn.tools.heatmap(\n", " scores, xlabel='gamma', ylabel='C', xticklabels=param_grid['gamma'],\n", " yticklabels=param_grid['C'], cmap=\"viridis\", ax=ax)\n", "\n", "plt.colorbar(scores_image, ax=axes.tolist())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 첫번째 그래프\n", " - 매개변수 C와 gamma의 스케일과 범위를 잘못 택하였음을 나타냄\n", " - 처음에는 더 넓은 범위의 C와 gamma 스케일 및 범위를 택하고, 이후 정확도에 따라 매개변수를 바꾸어 선택할 필요있음

\n", "\n", "- 두번째 그래프\n", " - 세로 띠 형태를 보이므로 gamma 매개변수만 정확도에 영향을 주고 있음을 나타냄\n", " - 두 가지 케이스\n", " - C 매개변수는 전혀 중요한 역할을 못할 수 있음\n", " - C 매개변수의 스케일과 범위를 잘못 선택하였을 수 있음

\n", " \n", "- 세번째 그래프\n", " - 그래프 왼쪽 아래에서는 변화가 없음\n", " - 다시 매개변수 스케일과 범위를 선택하는 과정에서 현재 선택한 것 보다 더 높은 gamma 및 C 값을 선택할 필요성 있음" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Grid search with asymmetric parameters\n", "- SVC\n", " - kernel='rbf' 일 때\n", " - C 매개변수, gamma 매개변수 동시 사용\n", " - kernel='linear' 일 때\n", " - C 매개변수만 사용\n", " - gamma 매개변수는 사용하지 않음" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "List of grids:\n", "[{'kernel': ['rbf'], 'C': [0.001, 0.01, 0.1, 1, 10, 100], 'gamma': [0.001, 0.01, 0.1, 1, 10, 100]}, {'kernel': ['linear'], 'C': [0.001, 0.01, 0.1, 1, 10, 100]}]\n" ] } ], "source": [ "param_grid = [{'kernel': ['rbf'],\n", " 'C': [0.001, 0.01, 0.1, 1, 10, 100],\n", " 'gamma': [0.001, 0.01, 0.1, 1, 10, 100]},\n", " {'kernel': ['linear'],\n", " 'C': [0.001, 0.01, 0.1, 1, 10, 100]}]\n", "print(\"List of grids:\\n{}\".format(param_grid))" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Best parameters: {'C': 100, 'gamma': 0.01, 'kernel': 'rbf'}\n", "Best cross-validation score: 0.97\n" ] } ], "source": [ "grid_search = GridSearchCV(SVC(), param_grid, n_jobs=-1, cv=5, return_train_score=True)\n", "\n", "grid_search.fit(X_train, y_train)\n", "\n", "print(\"Best parameters: {}\".format(grid_search.best_params_))\n", "print(\"Best cross-validation score: {:.2f}\".format(grid_search.best_score_))" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
rank_test_scoreparamsmean_test_scorestd_test_scoremean_train_scorestd_train_score
391{'C': 1, 'kernel': 'linear'}0.97321430.02239950.98436840.0054851
311{'C': 100, 'gamma': 0.01, 'kernel': 'rbf'}0.97321430.02239950.98436840.0054851
203{'C': 1, 'gamma': 0.1, 'kernel': 'rbf'}0.96428570.03407690.97765010.0100842
303{'C': 100, 'gamma': 0.001, 'kernel': 'rbf'}0.96428570.03407690.97767570.0070319
263{'C': 10, 'gamma': 0.1, 'kernel': 'rbf'}0.96428570.01776870.98656620.0083555
253{'C': 10, 'gamma': 0.01, 'kernel': 'rbf'}0.96428570.03407690.97767570.0070319
403{'C': 10, 'kernel': 'linear'}0.96428570.03383870.98881340.0070280
413{'C': 100, 'kernel': 'linear'}0.96428570.03383870.99325790.0055055
329{'C': 100, 'gamma': 0.1, 'kernel': 'rbf'}0.95535710.04956620.98878840.0099945
159{'C': 0.1, 'gamma': 1, 'kernel': 'rbf'}0.95535710.04010430.95984570.0113043
3811{'C': 0.1, 'kernel': 'linear'}0.94642860.03321850.96653850.0121316
2111{'C': 1, 'gamma': 1, 'kernel': 'rbf'}0.94642860.03247990.98439280.0088664
3311{'C': 100, 'gamma': 1, 'kernel': 'rbf'}0.94642860.05192271.00000000.0000000
2714{'C': 10, 'gamma': 1, 'kernel': 'rbf'}0.93750000.04525280.98659060.0083624
2415{'C': 10, 'gamma': 0.001, 'kernel': 'rbf'}0.92857140.04298270.93532470.0078884
1915{'C': 1, 'gamma': 0.01, 'kernel': 'rbf'}0.92857140.04298270.93532470.0078884
2217{'C': 1, 'gamma': 10, 'kernel': 'rbf'}0.91964290.06479061.00000000.0000000
1417{'C': 0.1, 'gamma': 0.1, 'kernel': 'rbf'}0.91964290.04401020.91974420.0212659
3417{'C': 100, 'gamma': 10, 'kernel': 'rbf'}0.91964290.06479061.00000000.0000000
2817{'C': 10, 'gamma': 10, 'kernel': 'rbf'}0.91964290.06479061.00000000.0000000
3721{'C': 0.01, 'kernel': 'linear'}0.84821430.05477830.85506940.0503114
1822{'C': 1, 'gamma': 0.001, 'kernel': 'rbf'}0.69642860.01319630.69642370.0032580
1322{'C': 0.1, 'gamma': 0.01, 'kernel': 'rbf'}0.69642860.01319630.69642370.0032580
3524{'C': 100, 'gamma': 100, 'kernel': 'rbf'}0.56250000.04966781.00000000.0000000
2924{'C': 10, 'gamma': 100, 'kernel': 'rbf'}0.56250000.04966781.00000000.0000000
2326{'C': 1, 'gamma': 100, 'kernel': 'rbf'}0.50892860.04643501.00000000.0000000
3627{'C': 0.001, 'kernel': 'linear'}0.36607140.01137080.36607870.0028518
227{'C': 0.001, 'gamma': 0.1, 'kernel': 'rbf'}0.36607140.01137080.36607870.0028518
327{'C': 0.001, 'gamma': 1, 'kernel': 'rbf'}0.36607140.01137080.36607870.0028518
127{'C': 0.001, 'gamma': 0.01, 'kernel': 'rbf'}0.36607140.01137080.36607870.0028518
827{'C': 0.01, 'gamma': 0.1, 'kernel': 'rbf'}0.36607140.01137080.36607870.0028518
527{'C': 0.001, 'gamma': 100, 'kernel': 'rbf'}0.36607140.01137080.36607870.0028518
727{'C': 0.01, 'gamma': 0.01, 'kernel': 'rbf'}0.36607140.01137080.36607870.0028518
627{'C': 0.01, 'gamma': 0.001, 'kernel': 'rbf'}0.36607140.01137080.36607870.0028518
1727{'C': 0.1, 'gamma': 100, 'kernel': 'rbf'}0.36607140.01137080.36607870.0028518
1627{'C': 0.1, 'gamma': 10, 'kernel': 'rbf'}0.36607140.01137080.38170970.0213374
1227{'C': 0.1, 'gamma': 0.001, 'kernel': 'rbf'}0.36607140.01137080.36607870.0028518
1127{'C': 0.01, 'gamma': 100, 'kernel': 'rbf'}0.36607140.01137080.36607870.0028518
1027{'C': 0.01, 'gamma': 10, 'kernel': 'rbf'}0.36607140.01137080.36607870.0028518
927{'C': 0.01, 'gamma': 1, 'kernel': 'rbf'}0.36607140.01137080.36607870.0028518
427{'C': 0.001, 'gamma': 10, 'kernel': 'rbf'}0.36607140.01137080.36607870.0028518
027{'C': 0.001, 'gamma': 0.001, 'kernel': 'rbf'}0.36607140.01137080.36607870.0028518
\n", "
" ], "text/plain": [ " rank_test_score params \\\n", "39 1 {'C': 1, 'kernel': 'linear'} \n", "31 1 {'C': 100, 'gamma': 0.01, 'kernel': 'rbf'} \n", "20 3 {'C': 1, 'gamma': 0.1, 'kernel': 'rbf'} \n", "30 3 {'C': 100, 'gamma': 0.001, 'kernel': 'rbf'} \n", "26 3 {'C': 10, 'gamma': 0.1, 'kernel': 'rbf'} \n", "25 3 {'C': 10, 'gamma': 0.01, 'kernel': 'rbf'} \n", "40 3 {'C': 10, 'kernel': 'linear'} \n", "41 3 {'C': 100, 'kernel': 'linear'} \n", "32 9 {'C': 100, 'gamma': 0.1, 'kernel': 'rbf'} \n", "15 9 {'C': 0.1, 'gamma': 1, 'kernel': 'rbf'} \n", "38 11 {'C': 0.1, 'kernel': 'linear'} \n", "21 11 {'C': 1, 'gamma': 1, 'kernel': 'rbf'} \n", "33 11 {'C': 100, 'gamma': 1, 'kernel': 'rbf'} \n", "27 14 {'C': 10, 'gamma': 1, 'kernel': 'rbf'} \n", "24 15 {'C': 10, 'gamma': 0.001, 'kernel': 'rbf'} \n", "19 15 {'C': 1, 'gamma': 0.01, 'kernel': 'rbf'} \n", "22 17 {'C': 1, 'gamma': 10, 'kernel': 'rbf'} \n", "14 17 {'C': 0.1, 'gamma': 0.1, 'kernel': 'rbf'} \n", "34 17 {'C': 100, 'gamma': 10, 'kernel': 'rbf'} \n", "28 17 {'C': 10, 'gamma': 10, 'kernel': 'rbf'} \n", "37 21 {'C': 0.01, 'kernel': 'linear'} \n", "18 22 {'C': 1, 'gamma': 0.001, 'kernel': 'rbf'} \n", "13 22 {'C': 0.1, 'gamma': 0.01, 'kernel': 'rbf'} \n", "35 24 {'C': 100, 'gamma': 100, 'kernel': 'rbf'} \n", "29 24 {'C': 10, 'gamma': 100, 'kernel': 'rbf'} \n", "23 26 {'C': 1, 'gamma': 100, 'kernel': 'rbf'} \n", "36 27 {'C': 0.001, 'kernel': 'linear'} \n", "2 27 {'C': 0.001, 'gamma': 0.1, 'kernel': 'rbf'} \n", "3 27 {'C': 0.001, 'gamma': 1, 'kernel': 'rbf'} \n", "1 27 {'C': 0.001, 'gamma': 0.01, 'kernel': 'rbf'} \n", "8 27 {'C': 0.01, 'gamma': 0.1, 'kernel': 'rbf'} \n", "5 27 {'C': 0.001, 'gamma': 100, 'kernel': 'rbf'} \n", "7 27 {'C': 0.01, 'gamma': 0.01, 'kernel': 'rbf'} \n", "6 27 {'C': 0.01, 'gamma': 0.001, 'kernel': 'rbf'} \n", "17 27 {'C': 0.1, 'gamma': 100, 'kernel': 'rbf'} \n", "16 27 {'C': 0.1, 'gamma': 10, 'kernel': 'rbf'} \n", "12 27 {'C': 0.1, 'gamma': 0.001, 'kernel': 'rbf'} \n", "11 27 {'C': 0.01, 'gamma': 100, 'kernel': 'rbf'} \n", "10 27 {'C': 0.01, 'gamma': 10, 'kernel': 'rbf'} \n", "9 27 {'C': 0.01, 'gamma': 1, 'kernel': 'rbf'} \n", "4 27 {'C': 0.001, 'gamma': 10, 'kernel': 'rbf'} \n", "0 27 {'C': 0.001, 'gamma': 0.001, 'kernel': 'rbf'} \n", "\n", " mean_test_score std_test_score mean_train_score std_train_score \n", "39 0.9732143 0.0223995 0.9843684 0.0054851 \n", "31 0.9732143 0.0223995 0.9843684 0.0054851 \n", "20 0.9642857 0.0340769 0.9776501 0.0100842 \n", "30 0.9642857 0.0340769 0.9776757 0.0070319 \n", "26 0.9642857 0.0177687 0.9865662 0.0083555 \n", "25 0.9642857 0.0340769 0.9776757 0.0070319 \n", "40 0.9642857 0.0338387 0.9888134 0.0070280 \n", "41 0.9642857 0.0338387 0.9932579 0.0055055 \n", "32 0.9553571 0.0495662 0.9887884 0.0099945 \n", "15 0.9553571 0.0401043 0.9598457 0.0113043 \n", "38 0.9464286 0.0332185 0.9665385 0.0121316 \n", "21 0.9464286 0.0324799 0.9843928 0.0088664 \n", "33 0.9464286 0.0519227 1.0000000 0.0000000 \n", "27 0.9375000 0.0452528 0.9865906 0.0083624 \n", "24 0.9285714 0.0429827 0.9353247 0.0078884 \n", "19 0.9285714 0.0429827 0.9353247 0.0078884 \n", "22 0.9196429 0.0647906 1.0000000 0.0000000 \n", "14 0.9196429 0.0440102 0.9197442 0.0212659 \n", "34 0.9196429 0.0647906 1.0000000 0.0000000 \n", "28 0.9196429 0.0647906 1.0000000 0.0000000 \n", "37 0.8482143 0.0547783 0.8550694 0.0503114 \n", "18 0.6964286 0.0131963 0.6964237 0.0032580 \n", "13 0.6964286 0.0131963 0.6964237 0.0032580 \n", "35 0.5625000 0.0496678 1.0000000 0.0000000 \n", "29 0.5625000 0.0496678 1.0000000 0.0000000 \n", "23 0.5089286 0.0464350 1.0000000 0.0000000 \n", "36 0.3660714 0.0113708 0.3660787 0.0028518 \n", "2 0.3660714 0.0113708 0.3660787 0.0028518 \n", "3 0.3660714 0.0113708 0.3660787 0.0028518 \n", "1 0.3660714 0.0113708 0.3660787 0.0028518 \n", "8 0.3660714 0.0113708 0.3660787 0.0028518 \n", "5 0.3660714 0.0113708 0.3660787 0.0028518 \n", "7 0.3660714 0.0113708 0.3660787 0.0028518 \n", "6 0.3660714 0.0113708 0.3660787 0.0028518 \n", "17 0.3660714 0.0113708 0.3660787 0.0028518 \n", "16 0.3660714 0.0113708 0.3817097 0.0213374 \n", "12 0.3660714 0.0113708 0.3660787 0.0028518 \n", "11 0.3660714 0.0113708 0.3660787 0.0028518 \n", "10 0.3660714 0.0113708 0.3660787 0.0028518 \n", "9 0.3660714 0.0113708 0.3660787 0.0028518 \n", "4 0.3660714 0.0113708 0.3660787 0.0028518 \n", "0 0.3660714 0.0113708 0.3660787 0.0028518 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "results = pd.DataFrame(grid_search.cv_results_)\n", "\n", "results2 = results[['rank_test_score', 'params', 'mean_test_score', 'std_test_score', \n", " 'mean_train_score', 'std_train_score']]\n", "results2 = results2.sort_values('rank_test_score')\n", "display(results2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Using different cross-validation strategies with grid-search\n", "- GridSearchCV의 인자인 cv에 스스로 정의한 다음과 같은 교차 검증 분할기 제공\n", " - KFold(n_splits=5) \n", " - StratifiedKFold(n_splits=5)\n", " - ShuffleSplit(n_splits=5)\n", " - StratifiedShuffleSplit(n_splits=5)\n", "- n_splits=1을 사용하는 경우\n", " - 훈련 데이터 세트와 검증 데이터 세트로의 분리를 한번 만 수행\n", " - 데이터셋이 매우 크거나 모델 구축 시간이 오래 걸릴 때 사용하는 전략" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Best parameters: {'C': 10, 'gamma': 0.1, 'kernel': 'rbf'}\n", "Best cross-validation score: 0.92\n" ] } ], "source": [ "from sklearn.model_selection import StratifiedShuffleSplit\n", "\n", "shuffle_split = StratifiedShuffleSplit(test_size=.8, n_splits=1)\n", "grid_search = GridSearchCV(SVC(), param_grid, cv=shuffle_split, return_train_score=True)\n", "\n", "grid_search.fit(X_train, y_train)\n", "\n", "print(\"Best parameters: {}\".format(grid_search.best_params_))\n", "print(\"Best cross-validation score: {:.2f}\".format(grid_search.best_score_))" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
rank_test_scoreparamsmean_test_scorestd_test_scoremean_train_scorestd_train_score
411{'C': 100, 'kernel': 'linear'}0.92222220.00000001.00000000.0000000
391{'C': 1, 'kernel': 'linear'}0.92222220.00000001.00000000.0000000
321{'C': 100, 'gamma': 0.1, 'kernel': 'rbf'}0.92222220.00000001.00000000.0000000
311{'C': 100, 'gamma': 0.01, 'kernel': 'rbf'}0.92222220.00000001.00000000.0000000
261{'C': 10, 'gamma': 0.1, 'kernel': 'rbf'}0.92222220.00000001.00000000.0000000
401{'C': 10, 'kernel': 'linear'}0.92222220.00000001.00000000.0000000
387{'C': 0.1, 'kernel': 'linear'}0.91111110.00000001.00000000.0000000
338{'C': 100, 'gamma': 1, 'kernel': 'rbf'}0.90000000.00000001.00000000.0000000
308{'C': 100, 'gamma': 0.001, 'kernel': 'rbf'}0.90000000.00000001.00000000.0000000
278{'C': 10, 'gamma': 1, 'kernel': 'rbf'}0.90000000.00000001.00000000.0000000
258{'C': 10, 'gamma': 0.01, 'kernel': 'rbf'}0.90000000.00000001.00000000.0000000
2012{'C': 1, 'gamma': 0.1, 'kernel': 'rbf'}0.88888890.00000001.00000000.0000000
2113{'C': 1, 'gamma': 1, 'kernel': 'rbf'}0.87777780.00000001.00000000.0000000
2814{'C': 10, 'gamma': 10, 'kernel': 'rbf'}0.73333330.00000001.00000000.0000000
2214{'C': 1, 'gamma': 10, 'kernel': 'rbf'}0.73333330.00000001.00000000.0000000
3414{'C': 100, 'gamma': 10, 'kernel': 'rbf'}0.73333330.00000001.00000000.0000000
1417{'C': 0.1, 'gamma': 0.1, 'kernel': 'rbf'}0.70000000.00000000.68181820.0000000
3717{'C': 0.01, 'kernel': 'linear'}0.70000000.00000000.68181820.0000000
1917{'C': 1, 'gamma': 0.01, 'kernel': 'rbf'}0.70000000.00000000.68181820.0000000
2417{'C': 10, 'gamma': 0.001, 'kernel': 'rbf'}0.70000000.00000000.68181820.0000000
1521{'C': 0.1, 'gamma': 1, 'kernel': 'rbf'}0.50000000.00000000.59090910.0000000
3522{'C': 100, 'gamma': 100, 'kernel': 'rbf'}0.44444440.00000001.00000000.0000000
2922{'C': 10, 'gamma': 100, 'kernel': 'rbf'}0.44444440.00000001.00000000.0000000
2324{'C': 1, 'gamma': 100, 'kernel': 'rbf'}0.42222220.00000001.00000000.0000000
425{'C': 0.001, 'gamma': 10, 'kernel': 'rbf'}0.36666670.00000000.36363640.0000000
325{'C': 0.001, 'gamma': 1, 'kernel': 'rbf'}0.36666670.00000000.36363640.0000000
1225{'C': 0.1, 'gamma': 0.001, 'kernel': 'rbf'}0.36666670.00000000.36363640.0000000
225{'C': 0.001, 'gamma': 0.1, 'kernel': 'rbf'}0.36666670.00000000.36363640.0000000
125{'C': 0.001, 'gamma': 0.01, 'kernel': 'rbf'}0.36666670.00000000.36363640.0000000
3625{'C': 0.001, 'kernel': 'linear'}0.36666670.00000000.36363640.0000000
525{'C': 0.001, 'gamma': 100, 'kernel': 'rbf'}0.36666670.00000000.36363640.0000000
825{'C': 0.01, 'gamma': 0.1, 'kernel': 'rbf'}0.36666670.00000000.36363640.0000000
725{'C': 0.01, 'gamma': 0.01, 'kernel': 'rbf'}0.36666670.00000000.36363640.0000000
1125{'C': 0.01, 'gamma': 100, 'kernel': 'rbf'}0.36666670.00000000.36363640.0000000
925{'C': 0.01, 'gamma': 1, 'kernel': 'rbf'}0.36666670.00000000.36363640.0000000
1025{'C': 0.01, 'gamma': 10, 'kernel': 'rbf'}0.36666670.00000000.36363640.0000000
1825{'C': 1, 'gamma': 0.001, 'kernel': 'rbf'}0.36666670.00000000.36363640.0000000
1725{'C': 0.1, 'gamma': 100, 'kernel': 'rbf'}0.36666670.00000000.36363640.0000000
1625{'C': 0.1, 'gamma': 10, 'kernel': 'rbf'}0.36666670.00000000.36363640.0000000
1325{'C': 0.1, 'gamma': 0.01, 'kernel': 'rbf'}0.36666670.00000000.36363640.0000000
625{'C': 0.01, 'gamma': 0.001, 'kernel': 'rbf'}0.36666670.00000000.36363640.0000000
025{'C': 0.001, 'gamma': 0.001, 'kernel': 'rbf'}0.36666670.00000000.36363640.0000000
\n", "
" ], "text/plain": [ " rank_test_score params \\\n", "41 1 {'C': 100, 'kernel': 'linear'} \n", "39 1 {'C': 1, 'kernel': 'linear'} \n", "32 1 {'C': 100, 'gamma': 0.1, 'kernel': 'rbf'} \n", "31 1 {'C': 100, 'gamma': 0.01, 'kernel': 'rbf'} \n", "26 1 {'C': 10, 'gamma': 0.1, 'kernel': 'rbf'} \n", "40 1 {'C': 10, 'kernel': 'linear'} \n", "38 7 {'C': 0.1, 'kernel': 'linear'} \n", "33 8 {'C': 100, 'gamma': 1, 'kernel': 'rbf'} \n", "30 8 {'C': 100, 'gamma': 0.001, 'kernel': 'rbf'} \n", "27 8 {'C': 10, 'gamma': 1, 'kernel': 'rbf'} \n", "25 8 {'C': 10, 'gamma': 0.01, 'kernel': 'rbf'} \n", "20 12 {'C': 1, 'gamma': 0.1, 'kernel': 'rbf'} \n", "21 13 {'C': 1, 'gamma': 1, 'kernel': 'rbf'} \n", "28 14 {'C': 10, 'gamma': 10, 'kernel': 'rbf'} \n", "22 14 {'C': 1, 'gamma': 10, 'kernel': 'rbf'} \n", "34 14 {'C': 100, 'gamma': 10, 'kernel': 'rbf'} \n", "14 17 {'C': 0.1, 'gamma': 0.1, 'kernel': 'rbf'} \n", "37 17 {'C': 0.01, 'kernel': 'linear'} \n", "19 17 {'C': 1, 'gamma': 0.01, 'kernel': 'rbf'} \n", "24 17 {'C': 10, 'gamma': 0.001, 'kernel': 'rbf'} \n", "15 21 {'C': 0.1, 'gamma': 1, 'kernel': 'rbf'} \n", "35 22 {'C': 100, 'gamma': 100, 'kernel': 'rbf'} \n", "29 22 {'C': 10, 'gamma': 100, 'kernel': 'rbf'} \n", "23 24 {'C': 1, 'gamma': 100, 'kernel': 'rbf'} \n", "4 25 {'C': 0.001, 'gamma': 10, 'kernel': 'rbf'} \n", "3 25 {'C': 0.001, 'gamma': 1, 'kernel': 'rbf'} \n", "12 25 {'C': 0.1, 'gamma': 0.001, 'kernel': 'rbf'} \n", "2 25 {'C': 0.001, 'gamma': 0.1, 'kernel': 'rbf'} \n", "1 25 {'C': 0.001, 'gamma': 0.01, 'kernel': 'rbf'} \n", "36 25 {'C': 0.001, 'kernel': 'linear'} \n", "5 25 {'C': 0.001, 'gamma': 100, 'kernel': 'rbf'} \n", "8 25 {'C': 0.01, 'gamma': 0.1, 'kernel': 'rbf'} \n", "7 25 {'C': 0.01, 'gamma': 0.01, 'kernel': 'rbf'} \n", "11 25 {'C': 0.01, 'gamma': 100, 'kernel': 'rbf'} \n", "9 25 {'C': 0.01, 'gamma': 1, 'kernel': 'rbf'} \n", "10 25 {'C': 0.01, 'gamma': 10, 'kernel': 'rbf'} \n", "18 25 {'C': 1, 'gamma': 0.001, 'kernel': 'rbf'} \n", "17 25 {'C': 0.1, 'gamma': 100, 'kernel': 'rbf'} \n", "16 25 {'C': 0.1, 'gamma': 10, 'kernel': 'rbf'} \n", "13 25 {'C': 0.1, 'gamma': 0.01, 'kernel': 'rbf'} \n", "6 25 {'C': 0.01, 'gamma': 0.001, 'kernel': 'rbf'} \n", "0 25 {'C': 0.001, 'gamma': 0.001, 'kernel': 'rbf'} \n", "\n", " mean_test_score std_test_score mean_train_score std_train_score \n", "41 0.9222222 0.0000000 1.0000000 0.0000000 \n", "39 0.9222222 0.0000000 1.0000000 0.0000000 \n", "32 0.9222222 0.0000000 1.0000000 0.0000000 \n", "31 0.9222222 0.0000000 1.0000000 0.0000000 \n", "26 0.9222222 0.0000000 1.0000000 0.0000000 \n", "40 0.9222222 0.0000000 1.0000000 0.0000000 \n", "38 0.9111111 0.0000000 1.0000000 0.0000000 \n", "33 0.9000000 0.0000000 1.0000000 0.0000000 \n", "30 0.9000000 0.0000000 1.0000000 0.0000000 \n", "27 0.9000000 0.0000000 1.0000000 0.0000000 \n", "25 0.9000000 0.0000000 1.0000000 0.0000000 \n", "20 0.8888889 0.0000000 1.0000000 0.0000000 \n", "21 0.8777778 0.0000000 1.0000000 0.0000000 \n", "28 0.7333333 0.0000000 1.0000000 0.0000000 \n", "22 0.7333333 0.0000000 1.0000000 0.0000000 \n", "34 0.7333333 0.0000000 1.0000000 0.0000000 \n", "14 0.7000000 0.0000000 0.6818182 0.0000000 \n", "37 0.7000000 0.0000000 0.6818182 0.0000000 \n", "19 0.7000000 0.0000000 0.6818182 0.0000000 \n", "24 0.7000000 0.0000000 0.6818182 0.0000000 \n", "15 0.5000000 0.0000000 0.5909091 0.0000000 \n", "35 0.4444444 0.0000000 1.0000000 0.0000000 \n", "29 0.4444444 0.0000000 1.0000000 0.0000000 \n", "23 0.4222222 0.0000000 1.0000000 0.0000000 \n", "4 0.3666667 0.0000000 0.3636364 0.0000000 \n", "3 0.3666667 0.0000000 0.3636364 0.0000000 \n", "12 0.3666667 0.0000000 0.3636364 0.0000000 \n", "2 0.3666667 0.0000000 0.3636364 0.0000000 \n", "1 0.3666667 0.0000000 0.3636364 0.0000000 \n", "36 0.3666667 0.0000000 0.3636364 0.0000000 \n", "5 0.3666667 0.0000000 0.3636364 0.0000000 \n", "8 0.3666667 0.0000000 0.3636364 0.0000000 \n", "7 0.3666667 0.0000000 0.3636364 0.0000000 \n", "11 0.3666667 0.0000000 0.3636364 0.0000000 \n", "9 0.3666667 0.0000000 0.3636364 0.0000000 \n", "10 0.3666667 0.0000000 0.3636364 0.0000000 \n", "18 0.3666667 0.0000000 0.3636364 0.0000000 \n", "17 0.3666667 0.0000000 0.3636364 0.0000000 \n", "16 0.3666667 0.0000000 0.3636364 0.0000000 \n", "13 0.3666667 0.0000000 0.3636364 0.0000000 \n", "6 0.3666667 0.0000000 0.3636364 0.0000000 \n", "0 0.3666667 0.0000000 0.3636364 0.0000000 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "results = pd.DataFrame(grid_search.cv_results_)\n", "\n", "results2 = results[['rank_test_score', 'params', 'mean_test_score', 'std_test_score', \n", " 'mean_train_score', 'std_train_score']]\n", "results2 = results2.sort_values('rank_test_score')\n", "display(results2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Nested cross-validation\n", "- 지금까지 살펴본 코드들의 단점\n", " - 처음에 원본 데이터들을 훈련 데이터와 테스트 데이터로 **한번만** 나누고 있음.\n", " - 원본 데이터를 훈련 데이터와 테스트 데이터로 나누는 시점도 교차 검증화 시킬 수 있음 --> **중첩 교차 검증**\n", "- **중첩 교차 검증**\n", " - outer_scores = []\n", " - 1st Loop: 원본 데이터를 훈련(Training) 데이터와 테스트(Test) 데이터로 분리 및 순회\n", " - best_params = {}\n", " - best_score = -np.inf\n", " - 2nd Loop: 매개변수 그리드를 순회\n", " - 3rd Loop: 훈련 데이터를 다시 훈련(Training) 데이터와 검증(Validation) 데이터로 분리\n", " - 3rd Loop의 결과 모델을 평가하여 best_params 및 best_score 조정\n", " - best_params와 함께 모델 구성하여 평가결과를 outer_scores에 저장" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![process](./images/nestedkfold.jpg)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 위 중첩 교차 검증과정을 corss_val_score 및 GridSearchCV 조합으로 간단하게 완성" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Cross-validation scores: [0.967 1. 0.967 0.967 1. ]\n", "Mean cross-validation score: 0.9800000000000001\n" ] } ], "source": [ "param_grid = {'C': [0.001, 0.01, 0.1, 1, 10, 100],\n", " 'gamma': [0.001, 0.01, 0.1, 1, 10, 100]}\n", "\n", "grid_search = GridSearchCV(SVC(), param_grid, cv=5)\n", "scores = cross_val_score(grid_search, iris.data, iris.target, n_jobs=-1, cv=5)\n", "\n", "print(\"Cross-validation scores: \", scores)\n", "print(\"Mean cross-validation score: \", scores.mean())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 위 코드 설명\n", " - 매개 변수 조합: 6 \\* 6 = 36\n", " - 바깥 루프: 5개 분할\n", " - 안쪽 루프: 5개 분할\n", " - 모델 생성 횟수: 36 \\* 5 \\* 5 = 900" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def nested_cv(X, y, inner_cv, outer_cv, Classifier, parameter_grid):\n", " outer_scores = []\n", " outer_best_params = []\n", " \n", " # for each split of the data in the outer cross-validation\n", " # (split method returns indices of training and test part)\n", " for training_samples, test_samples in outer_cv.split(X, y):\n", " # find best parameter using inner cross-validation\n", " best_parms = {}\n", " best_score = -np.inf\n", "\n", " # iterate over parameters\n", " for parameters in parameter_grid:\n", " # accumulate score over inner splits\n", " cv_scores = []\n", "\n", " # iterate over inner cross-validation\n", " for inner_train, inner_test in inner_cv.split(X[training_samples], y[training_samples]):\n", " # build classifier given parameters and training data\n", " clf = Classifier(**parameters)\n", " clf.fit(X[inner_train], y[inner_train])\n", " # evaluate on inner test set\n", " score = clf.score(X[inner_test], y[inner_test])\n", " cv_scores.append(score)\n", "\n", " # compute mean score over inner folds\n", " mean_score = np.mean(cv_scores)\n", " if mean_score > best_score:\n", " # if better than so far, remember parameters\n", " best_score = mean_score\n", " best_params = parameters\n", "\n", " # build classifier on best parameters using outer training set\n", " clf = Classifier(**best_params)\n", " clf.fit(X[training_samples], y[training_samples])\n", "\n", " # evaluate\n", " outer_scores.append(clf.score(X[test_samples], y[test_samples]))\n", " outer_best_params.append(best_params)\n", " return np.array(outer_scores), outer_best_params" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": false, "hide_input": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Cross-validation scores: [0.967 1. 0.967 0.967 1. ]\n", "Mean cross-validation score: 0.9800000000000001\n", "best params: [{'C': 100, 'gamma': 0.01}, {'C': 100, 'gamma': 0.01}, {'C': 100, 'gamma': 0.01}, {'C': 100, 'gamma': 0.01}, {'C': 100, 'gamma': 0.01}]\n" ] } ], "source": [ "from sklearn.model_selection import ParameterGrid, StratifiedKFold\n", "\n", "scores, params = nested_cv(\n", " iris.data, \n", " iris.target, \n", " StratifiedKFold(5), \n", " StratifiedKFold(5), \n", " SVC,\n", " ParameterGrid(param_grid)\n", ")\n", "\n", "print(\"Cross-validation scores: {}\".format(scores))\n", "print(\"Mean cross-validation score: \", scores.mean())\n", "print(\"best params: {}\".format(params))" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "#### Parallelizing cross-validation and grid search\n", "- 다중 CPU 코어 or 다중 GPU 코어 사용\n", "- 사용가능한 프레임워크\n", " - ipyparallel\n", " - https://ipyparallel.readthedocs.io\n", " - spark-sklearn\n", " - https://github.com/databricks/spark-sklearn" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.3. Evaluation Metrics and Scoring\n", "- 기존의 Simple한 모델 평가 지표 (score)\n", " - 분류 문제: 정확도 (Accuracy)\n", " - 회귀 문제: $R^2$\n", "- 하지만, 어플리케이션에 따라 위의 평가 지표가 적합하지 않을 수 있음. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 5.3.1 Keep the End Goal in Mind (최종 목표를 기억하라)\n", "- 어플리케이션의 고차원 목표인 비지니스 지표를 우선적으로 고려해야 함\n", " - 비지니스 지표 예\n", " - 교통사고율 낮춤\n", " - 입원환자 수 낮춤\n", " - 웹사이트 사용자 유입률 증대\n", " - 소비자 소비률 증대\n", " - 분석 모델 개발 초기 단계에 매개변수를 조정하기 위해 시험 삼아 모델을 실제 운영 시스템에 곧바로 적용하기란 위험부담이 크다.\n", "- 비지니스 임팩트 (Business Impact)\n", " - 어떤 머신러닝 어플리케이션에서 특정 알고리즘을 선택하여 나타난 결과\n", "- 훈련 모델에 대한 비지니스 임팩트를 정확하게 예상할 수 있는 다양한 평가지표 도입 필요\n", " - 이진 분류의 평가 지표\n", " - 다중 분류의 평가 지표\n", " - 회귀의 평가 지표" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 5.3.2 Metrics for Binary Classification\n", "- 두 가지 분류 클래스\n", " - 양성 클래스 (주 관심 클래스) --> Positive Class\n", " - 음성 클래스 --> Negative Class

\n", " \n", "- 모델 적용 결과에 대한 분류\n", " - True Positive (참 양성, TP)\n", " - 모델에서 실제 양성 클래스를 정확하게 양성으로 평가한 것들\n", " - False Negative (거짓 음성, FN)\n", " - 모델에서 실제 양성 클래스를 잘못하여 음성으로 평가한 것들 \n", " - True Negative (참 음성, TN)\n", " - 모델에서 실제 음성 클래스를 정확하게 음성으로 평가한 것들 \n", " - False Positive (거짓 양성, FP)\n", " - 모델에서 실제 음성 클래스를 잘못하여 양성으로 평가한 것들 \n", "\n", "- 참고: https://developers.google.com/machine-learning/crash-course/classification/true-false-positive-negative" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Kinds of errors\n", "- 암의 조기 발견 어플리케이션 \n", " - 테스트가 음성(-)이면 건강함을 뜻함\n", " - 음성 클래스(Negative Class)\n", " - 테스트가 양성(+)이면 암 진단이 되었음을 뜻함\n", " - 양성 클래스(Positive Class)\n", " - 잘못된 분류 케이스\n", " - Case 1. 건강한 사람을 양성으로 잘못 분류한 경우\n", " - 이 환자에게 비용 손실과 불편함을 초래함\n", " - 즉, 잘못된 양성 예측\n", " - 분류: ***거짓 양성 (False Positive)***\n", " - Case 2. 암에 걸린 사람을 음성으로 잘못 분류한 경우\n", " - 제대로 된 검사나 치료를 제때에 못하게 하는 치명적인 오류\n", " - 즉, 잘못된 음성 예측\n", " - 분류: ***거짓 음성 (False Negative)***\n", " \n", "- 대부분의 경우 ***거짓 음성***이 ***거짓 양성***보다 더 치명적\n", "- 거짓 음성 분류와 거짓 양성 분류 중 하나가 다른 것 보다 훨씬 많을 때 이 상황은 매우 중요한 상황으로 인식해야 함." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Imbalanced datasets\n", "- 불균형 데이터셋(Imbalanced datasets)\n", " - 예) 인터넷 광고 클릭 데이터에서 원본 데이터 샘플의 99%가 '클릭 아님'이고 1%만이 '클릭'인 데이터셋\n", " - 현실에서 불균형 데이터는 매우 많음\n", " - 위 예에서 머신러닝 모델을 만들지 않고서도 무조건 '클릭 아님'으로 예측하면 그 정확도가 99%가 됨.\n", " \n", "- 따라서, '정확도'만으로 모델의 성능을 판별하는 것은 지양해야 함." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- digits 데이터셋에서 Target 데이터를 숫자 9이면 True, 그렇지 않으면 False로 변환하여 1:9의 불균형 데이터셋 생성" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1347, 64)\n", "(1347,)\n", "(450, 64)\n", "(450,)\n", "[False False False False False False False True False False]\n", "\n", "47\n", "403\n" ] } ], "source": [ "from sklearn.datasets import load_digits\n", "\n", "digits = load_digits()\n", "y = digits.target == 9\n", "\n", "X_train, X_test, y_train, y_test = train_test_split(digits.data, y, random_state=0)\n", "print(X_train.shape)\n", "print(y_train.shape)\n", "print(X_test.shape)\n", "print(y_test.shape)\n", "print(y_test[:10])\n", "print()\n", "print(len(np.where(y_test == True)[0]))\n", "print(len(np.where(y_test == False)[0]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 정답 '9임'의 총 개수: 47 --> ***양성 클래스***\n", "- 정답 '9가 아님'의 총 개수: 403 --> ***음성 클래스***" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- DummyClassifier\n", " - strategy='stratified'\n", " - 기본값\n", " - 레이블 비율에 맞추어서 예측\n", " - strategy='most_frequent' \n", " - 가장 많은 레이블로 항상 예측\n", "\n", "- DummyRegressor\n", " - strategy='mean'\n", " - strategy='median' " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 아무런 학습을 하지 않고도 90% 정확도가 나올 수 있음" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Unique predicted labels: [False]\n", "Test score: 0.90\n" ] } ], "source": [ "from sklearn.dummy import DummyClassifier\n", "dummy_majority = DummyClassifier(strategy='most_frequent').fit(X_train, y_train)\n", "pred_most_frequent = dummy_majority.predict(X_test)\n", "\n", "print(\"Unique predicted labels: {}\".format(np.unique(pred_most_frequent)))\n", "print(\"Test score: {:.2f}\".format(dummy_majority.score(X_test, y_test)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 정상적인 학습을 하더라도 92% 정확도가 나옴 --> 위의 결과와 그리 차이가 없음" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Test score: 0.92\n" ] } ], "source": [ "from sklearn.tree import DecisionTreeClassifier\n", "tree = DecisionTreeClassifier(max_depth=2).fit(X_train, y_train)\n", "pred_tree = tree.predict(X_test)\n", "print(\"Test score: {:.2f}\".format(tree.score(X_test, y_test)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 레이블 비율에 맞추어서 예측을 하는 Dummy 모델도 꽤 성능이 좋음." ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Unique predicted labels: [False True]\n", "dummy score: 0.82\n", "logreg score: 0.98\n" ] } ], "source": [ "from sklearn.linear_model import LogisticRegression\n", "\n", "dummy = DummyClassifier().fit(X_train, y_train)\n", "pred_dummy = dummy.predict(X_test)\n", "print(\"Unique predicted labels: {}\".format(np.unique(pred_dummy)))\n", "print(\"dummy score: {:.2f}\".format(dummy.score(X_test, y_test)))\n", "\n", "logreg = LogisticRegression(C=0.1).fit(X_train, y_train)\n", "pred_logreg = logreg.predict(X_test)\n", "print(\"logreg score: {:.2f}\".format(logreg.score(X_test, y_test)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Dummy 분류기 조차 매우 좋은 예측 정확도를 산출하는 점에 유의\n", " - 현실세계에서 많이 발생할 수 있는 불균형 데이터셋(Imbalanced datasets)과 함께 **오로지 정확도만으로 모델의 성능을 지표화하는 것은 올바른 방법이 아님**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Confusion matrices\n", "- **오차 행렬(Confusion Matrix)**\n", " - 이진 분류 평가 결과를 나타낼 때 가장 널리 사용되는 방식\n", " - 행(Row)\n", " - 정답 클래스\n", " - 열(Colume)\n", " - 예측 클래스" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "47\n", "403\n", "Confusion matrix:\n", "[[401 2]\n", " [ 8 39]]\n" ] } ], "source": [ "from sklearn.metrics import confusion_matrix\n", "\n", "print(len(np.where(y_test == True)[0]))\n", "print(len(np.where(y_test == False)[0]))\n", "\n", "confusion = confusion_matrix(y_test, pred_logreg)\n", "print(\"Confusion matrix:\\n{}\".format(confusion))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- [***음성*** 정답] - 정답 '9가 아님'의 총 개수: 403\n", " - [***음성*** 예측] - 예측 '9가 아님'의 총 개수: 401 --> ***True Negative (TN)***\n", " - [***양성*** 예측] - 예측 '9임'의 총 개수: 2 --> ***False Positive (FP, 거짓 양성)*** --> 잘못된 양성 분류\n", " \n", "- [***양성*** 정답] - 정답 '9임'의 총 개수: 47\n", " - [***음성*** 예측] - 예측 '9가 아님'의 총 개수: 8 --> ***False Negative (FN, 거짓 음성)*** --> 잘못된 음성 분류\n", " - [***양성*** 예측] - 예측 '9임'의 총 개수: 39 --> ***True Positive (TP)***\n", "\n" ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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luiNN97Qgw8+qKDxgNu3b9dZZ52lLl266MADD6yuQ0AlMHYT6VS3bl0ddthh6tWrl0KhkDp37qz27duradOm2rp1q1avXq3PPvtMM2bM0NNPP633338/sC3nnEaNGqW2bdvqtNNOy+BRZKGKXNdkY0vHxhiyqKuvvnqn8RRm5vr27ZuRMWT33XdfwrEdPXv2dJ9++mnSdh577DHXtGnTwHa6dOniNm/enFKsr7/+eoXHr5122mnutttuYwwZkKKg96hjjz3WjR8/3q1du7ZS7b344otuzz33TPgabtasmfviiy+q6Yj8EmPIgOwzd+5c3XXXXTvtP++883TUUUdVe//ffPONrr322sDygQMHavr06dpzzz2TtnXGGWdoxowZatGiRdzyTz75RLfffnuVYw3Svn17DR06VH/60580derUH7+NT5w4UVdddVXa+wNqsyZNmuiKK67QJ598oldeeUXDhw9X8+bNK9XGwIEDNWfOHA0ePDiwzvr163XllVemGm6NxiVLIEO2bdumESNGaNu2bT/bv9tuu+mOO+7Q3XffXe0x3HLLLVqzZk3csm7dumnixImqX79+hds7+OCD9cQTT+j4449X9Ivgz/3lL3/RBRdcoF133bVK8TZp0kQnnHCCQqGQQqGQDjnkELVp06ZKbdVmxcXFklhkHBXXpEkTXX755brsssvUsmXLlNtr3ry5Jk2apP79++uNN96IW2fSpElauHCh9t5775T7q5EqchqNjS0dW22/ZPmnP/0p7qn6J554wjnn3E033VStlyy/+eYb16hRo7jtm5l79913q9z2+eefHxj7ddddl3LslREUR22+ZFn6GAAV8cYbb7gVK1ZUS9vLli0LfB/y8X6RCeKSJZA9Fi5cqD/84Q877T/++OP161//OiMxPPjgg9q0aVPcslNOOUU9evSoctu33HKLGjRoELfsvvvu0w8//FDltgFkVq9evap8VjuZX/ziF7rssssCy19++eVq6bcmICEDqplzTueff762bNnys/2NGzfWP/7xj4zF8c9//jOw7Iorrkip7bZt2+rMM8+MW/btt9/qpZdeSql9ALnj9NNPDyybP39+rf0CR0IGVLO///3veuutt3baf/PNN6tTp04ZiWHBggVasGBB3LIuXbqoZ8+eKfdxzjnnBJYx+SOAUt27d1erVq3ilm3fvr3WTgRN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ve25c+fq7LPP1ocffphyW2amESNG6J577lHDhg3TEF32IyFD1iEhQyqWLl2qgQMHpuVDIcgll1yisWPH5ty4l9IzJ7zf+5GJhEyS6tatqz/+8Y+6+uqr09bmww8/rAsuuEBbtmxJW5uSdOCBB2rKlCnafffd09puNqpoQpZb7zoActJXX32lXr16VWsyJkn33nuvioqKqrUPoLps27ZN11xzjX73u9+lpb17771X5557btqTMUmaP3+++vbtm7bLt7mAQf0Astq2bdt08skn64svvkhYr127djr77LN1+OGHa//991eLFi3UsGFDrV27VsuXL9fs2bM1depUTZ48Wdu2bQts56GHHlL37t01atSodB8K8DONGzfWoYceqoMPPlhdu3ZV165d1aFDBzVt2lTNmjVTnTp1tH79eq1Zs0YfffSR5s6dq8mTJ+v9999P2O6dd96pPffcUxdeeGGVY3v66aeTvgaaNWumU045RSeeeKL2339/7bbbbsrLy9OKFSv03//+V88//7yeeuoprVy5Mu7vL1y4UEOHDtWMGTNUv379KseaM5xzbGwZ2QoLCx1QWXfddZeTFLg1adLEjRs3zm3durVC7X355ZduyJAhCdvcZZdd3JIlS6r5yDKn9LjgxyeffOIkuXr16rl+/fq5MWPGuJKSErdt27YqtVdSUuKOPPLIpM/hzz77rErtL1682DVr1ixh++edd55bsWJF0rbWrVvnrrzySlenTp3Ati6//PIqxVlTSCpxFfiM9P4hzVZ7NhIyVNbmzZtdq1atAt/IW7Vq5RYsWFCltm+88caEHzgXXXRRmo/GHxIyv1avXu0mTJjg1q1bl9Z2b7jhhoTP4bPOOqtK7Q4ePDiwTTNzY8eOrXSbEyZMcPXq1YvbZl5enispKalSrDUBCRlb1m0kZKisCRMmJPzAmT59ekrtDxs2LLDt5s2buy1btqTpSPwiIctdl1xySeBzuEGDBm716tWVau+NN95I+JobPXp0lWN94IEHAtvt1atXldvNdhVNyBjUDyBrvfzyy4FlQ4cOVe/evVNq/4477gi89X7dunV69913U2o/WxQUFKigoMB3GKgGt956q37xi1/ELduyZYv+/e9/V6q9sWPHBpaFQiFdf/31lWqvrBEjRuiEE06IW/bmm29qxowZVW47F5CQAchac+bMCSwbPnx4yu3/8pe/1LHHHhtYPnfu3JT7yAaRSESRSMR3GKgGjRs31umnnx5Y/t5771W4rXXr1un5558PLP/jH/+ounVTuxfw1ltvDSz761//mlLbNR0JGYCslejOyr59+6alj6OPPrpK/QPZ4phjjgks++yzzyrczssvvxw44XLnzp3Vv3//SsdW3n777Rf42p0yZYq++eablPuoqUjIAGStDRs2xN3frFmztC2y3K5du0r3D2SToEuWUnTB8op65513AstOPPHEtC3NNGTIkLj7t27dqqeeeiotfdREJGQAslajRo3i7k/nupOJErug/msaM6sVi6jXVg0aNAgsq8xzONH8Zj169KhUTIkkamvKlClp66emISEDkLVatWoVd/+3336btj5WrVoVWNa6deu09QNUl6+//jqwrDLP4c8//zyw7IADDqhMSAl17949sOz1119P6zq1NQkJGYCsFfTG/f333+vLL79MSx+LFi0KLDvooIPS0gdQnRJdaqzM3bWJvpy0bNmyUjEl0rBhQ+2yyy5xyzZu3FjtS6RlKxIyAFmrT58+gWWJpsSojKBLJHl5eTryyCPT0gdQXXbs2KEJEyYElvfr16/CbW3evDmwLD8/v1JxJdOiRYvAstp6RzAJGYCsdeaZZwaOj7nnnnu0Y8eOlNp/++23NXPmzLhlp5xySsIPDSAb3HPPPVqwYEHcsj59+mifffapcFuJxhkmWv+1KhJdlky2VmeuIiEDkLV23XVXnXvuuXHLPvjgA915551Vbvu7777TRRddFLcsLy9PV199dZXbBjLh8ccf1+9+97u4ZWam0aNHV6q9RDcArF27tlJtJZOovU8//TStfdUUJGQAstptt92mDh06xC275ppr9L//+7+VbnPVqlU68cQTA7+JX3XVVcxsj6y1bNkynXPOOfrNb34TeObqiiuuqPRKFrvuumtg2YoVKyrVViLffvttwjNulZk7LZeQkAHIas2aNdPkyZPjjmFxzumiiy7SkCFDEs7qX+r777/X+PHjdcABB2j69Olx65x00km6+eabUw07q4wbN07jxo3zHQYqaceOHVq/fr2+/PJLvf766xo7dqz69++vjh076tFHH1V0mcSd/eY3v9Ftt91W6f46duwYWFZSUlLp9oIkWz0g0V2juSy1NRCQFcysj6TXJd3snBvtNxog/QoKCjRt2jQNHTpUS5cu3an8ueee03PPPafu3bvryCOP1H777aeWLVtql1120bp167R8+XLNnj1b06dPTzhlxtlnn60HHnhA9erVq87Dybji4mLfISCBzp07p+UyXd26dXX99dfrxhtvVJ06lT/f0r17d7366qtxy959910VFRWlGqIkBY7bLLVu3Tpt27Yt5WWaapyKrECerZukToquFP+w71iqGP/wWPx9UmynT6yd0R6O4eHo0yh53cLCQgekYs2aNW748OEuLy/PxZ7zadnat2/vJkyY4PvwUEvttddeKT+HBw0a5CKRSEpxTJw4MbD9/Px8t3HjxpSPdceOHa5Lly5Jj2fFihUp95UtJJW4CnxGcskyN8yW1E3S33wHAlSn/Px8jR8/Xv/5z3/0P//zPwmXjEmmbt266tu3rx588EF9+umnCRdorunC4bDC4bDvMJBmu+++u2666SYtWLBAL7zwQsrjHvv37x94dnjt2rV67LHHUmpfik5X88knnyStt3HjxpT7qmlIyHKAc26Tc+5j51zwrH5ADuncubN+/etf64wzzqjyMkp77723+vfvryOOOCLnLlGWN3LkSI0cOdJ3GEizr7/+WhMmTNADDzygjz/+OOX2mjdvrsGDBweW33DDDSkt/r1582ZdfvnlFar7ww8/VLmfmqrGJmRmNlrS4th/zzEzV2YbHqvTJ/b/0WZ2qJm9aGbfxvZ1itVxZjY9oI+Hy9YtV3aYmU0ys+Vm9oOZLTWzcWZW9a/sP7XtzGy6mbU2s7CZfW1mW8xsgZntNAdA2eMst396bH9dM7vOzD6JtbPUzG4zs/oB/e8TO/alsforzOxxM9s71WMDUrFt2zaNHz9e++67r3r16qU777yzyguAL1iwQNdee626deumE044QbNmzUpztED1W7hwocaMGaN9991XQ4YMSfkOxVGjRgWWrVy5Uuedd16V5yS79NJLtXDhwgrVrY0JWU0eMTddUr6kUZLmS/pXmbJ55er2lHStpLckPSSptaQq/7VjSdH9krZIek7SUkldJJ0v6QQz6+GcW1LV9mPyJb0di3OSpF0knSrpITPb4Zx7pBJtPS6pl6QpktZLGijpKkm7SvpZgmdmAyQ9I6mepOclLZLUTtLJkgaZWV/nXPLb2YA0W7hwoc4666ykd2hVlnNOL7zwgl588UVddtlluvXWWxMu1gyk2/333x/3Et0PP/ygNWvWaO3atfroo480e/ZsffTRR3EnRHbO6bnnntOrr76qu+++WyNGjKhSLL1791b//v31yiuvxC1/4YUXdPLJJ2vixImByx+Vt337do0cOVIPPvhgheOoyk0JNV5FBppl66Ykg/r102B3J2lkQB0naXpA2cOx8k5l9nVVNElaJOmX5eofLWm7pMkpHldpzA9Iyiuzf19J2yR9FHCco8vtnx7bH5HUssz+xrH4t0tqW2Z/C0lrJK2StG+5tvaTtEHSnKoeF4P6UVVTp051jRo1SjgIeN9993XXX3+9mzp1qvvss8/c2rVr3Q8//OBWrFjhFixY4B5++GF33nnnuSZNmiRsp0ePHm7dunW+DzmtSo8NNd+SJUvc73//e9emTZuEz+O//OUvVe5j0aJFrnHjxgnb33PPPd3TTz/tduzYkbCt1157zR144IGVvklh0aJFVY4/26iCg/q9J1WpbJVIyOYmaKOyCdmY2L5BAb8zOZY0NU3huJykjZKaxSmbEStvWmZfsoTsmDjt3BwrG1xm36jYvv8JiKv02PetxLEUSyqRVNKhQwcHVNa0adPcLrvskvCD4fnnn0/6wVBqzZo17qabbnJ169YNbLNnz55u8+bN1XxkmUNClntWrVrlfv3rXydMah544IEqt//YY49VKHHafffdXVFRkRs7dqx74okn3MSJE929997rLrnkErfHHnsE/l779u1dz549A8uXLVuWxkfLr4omZDX5kmVlzE5jWz1jP3ub2SFxyneVlKfombRUVkj9xDm3Ps7+0kmY8iV9V8G24s3oV9pO2cX6So/twPLj0WK6xn52k/RRRTp2zoUlhSUpFAq5ivwOUGrlypU644wz9P3338ctHzRokB577DE1b968wm3m5+dr9OjROu644zRkyJC4g5TfffddXXvttRozZkyVYweqU6tWrfTEE09ojz320K233hq3zqhRo9S7d2917ty50u2fccYZWr58uX77298mrPf111/r/vvvr1TbzZo10zPPPKNLL700sE6rVq0q1WYuqC0J2fI0tlX6LIm/gNhPqnbr10+CFvoqHU2ZV9GGnHPx2orXTumxJZv9L9VjAyrk4osv1sqVK+OW9ejRQ5MmTarwOJbyevbsqWeffVZHH3103ITv7rvv1rBhw3TooYdWqX0gE/785z/ryy+/1D//+c+dyjZu3KjrrrtOEydOrFLbV1xxhVq2bKkLL7ww8EtRZbVu3VovvPCCQqFQ4Gu7ZcuWtXIcZ20ZNZfozIxTcGK681ot0rrYz+bOOUuwzUgpYj9Kj+3AJMdWmRsKgCr573//q6effjpuWf369fXEE09UORkr1bNnT/3+97+PW+ac0x133JFS+9nC/TSEADnorrvuCjxL/Mwzz2jx4sVVbnv48OGaPXu2evToUeU2SvXp00dz5szRYYcdph07dsRddUOSfvnLX6bcV01U0xOy7bGfFT5bFMcaSe3L7zSzPEkHxalfuuZDrxT6zFa5fGyoYe677764d5NJ0ogRI9SpU6e09DNq1Ci1bt06btnkyZMDv8UD2aJNmzaBd1Vu375d//rXv+KWVdQBBxygd955R88884yOOuoomVmlfv/ggw/Wk08+qddff13t20c/br/88svAqS26deuWUrw1VU1PyNYoeoarQwptzJbUwcz6l9t/g6SOcer/TdJWSWPMrGv5QjOrb2Y1NaEZr+il0pvMbKfrNGZWJ7ZuJlDtpk2bFliWzln1GzdurEGDBsUt2759u2bMqIknu1HbnHDCCYFl6XgOm5mGDh2qGTNmaMmSJRo3bpzOPfdcHXbYYdp9993VsGFD1alTR40bN1aHDh103HHH6aabbtJ7772nOXPm6Fe/+tXP2ps/f35gX/vvv3/K8dZENXoMmXNug5nNktTLzB6T9F9Fz5o955x7v4LN3CnpOEnPmtmTkr6VdLikPRS9S7FPuT4/NrPzFJ3PbIGZvRzrt56iiWEvSd9I2ie1o8s859xqMztV0TtFZ5rZq5IWSNqh6LH1VHScWWrXiYAk1q9frw8//DBuWcOGDXX44Yentb9jjjlGjzwS/0r8zJkzddppp6W1v0wrLCyUJEUiqdxnhGx22GGHBZYtWLAgrX21a9dOxcXFKS1aP2dO8HSWoVCoyu3WZDU6IYs5S9HpGAZIGibJJH0pqUIJmXPuVTM7SdKNkn6t6HQT/5Z0uqJTQ8T7nf8zs/mSfiupr6T+sd/7StFJXJ9M4Xi8ij0e3SVdqWii2kvRede+kvSapPiDeoA0Wr58eeCYp1/+8pdpX+oo0eXPr7/+Oq19+ZDoww+5oWHDhmratKm++27nm+9Xr17tIaLEpk+fHnd/3bp1deSRR2Y2mCxR4xMy59wiSXHP1TrnpiuaoCVr4zlFZ9wvb3hsi/c7HwSVpco5Fxizc26nmIKO0znXJ0E7Dys6z1q8ss8lXZw0UKCaJPoACRrvlYo2bdpUKRYgmzRu3DhuQrZ+fbwZlPz57rvv9O6778YtO/TQQ9W0adMMR5QdavoYMgA5KNEdgVu3bk17f1u2bAksq+wAZsAH51zgl4dGjRplOJrEnn/++cDXXE0fHpAKEjIAWSfRN+R4E7mmKlGbTZow7R6y36pVqwK/rGTbJKtBE8nWqVMnrTfs1DQkZACyTqJ5iJYtW6a1a4PmTa6aoBsIJP14mz6QzV577bXAsi5dumQwksTmzp0bOH5s6NCh2n333TMbUBYhIQOQdVq2bBk4Vmz79u169dVX09rf1KlTA8v23nvvtPYFVIdEc41l02oT11xzTWDZlVdemcFIsg8JGYCs1LNnz8Cy++67L239LFq0SP/+97+rFEdNUVRUpKKiZCuioaZ6//339dRTTwWW9+9ffppNPx599FG98sorccsGDhyYltUAajISMgBZafDgwYFl06ZNC3xjr6xrrrlG27Zti1vWvn17de/ePS39+BQOhxUOh32HgWqwZcsWXXDBBdq+fXvc8k6dOqlXL/9zlc+bN08XXxz/5v169eppzJgxGY4o+5CQAchKp556asK7w8444wwtWrQopT5uvfXWwPUyJenss8/mLkukZOzYsZo9e3a1tL1lyxYNHTo0cAoJSfrtb3/r/Tk8d+5cDRgwIO6UHJJ04403qmvXnRa+qXVIyABkpZYtW2rkyJGB5atXr1afPn301ltvVbrtbdu26dprr9X1118fWKdx48a69NJLK912NopEIszS78n06dN12GGHafDgwXrrrbfStsj7zJkzddhhh2nKlCmBdbp161bl2fRHjx6tRx99NOGUMMk453T//ffrqKOO0ooVK+LW6d27t6677roq95FTnHNsbBnZCgsLHVAZa9ascW3btnWKrlkbd6tbt6674IIL3CeffJK0ve3bt7unn37aFRQUJGxTkrvzzjszcISZUXpMyLwhQ4b87HnVrl07d9lll7m33nrLbd68uVJtbdmyxU2ePNkNHTrUmVnC52+DBg1cJBJJOe42bdq4Cy+80L388stuy5YtFfrd77//3k2cONEVFhYmjLFLly5u5cqVVY6xppBU4irwGWnRukD1C4VCrqSkxHcYqGFef/119e/fP3Cc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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "mglearn.plots.plot_confusion_matrix_illustration()" ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "mglearn.plots.plot_binary_confusion_matrix()" ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Most frequent class:\n", "[[403 0]\n", " [ 47 0]]\n", "\n", "Dummy model:\n", "[[361 42]\n", " [ 41 6]]\n", "\n", "Decision tree:\n", "[[390 13]\n", " [ 24 23]]\n", "\n", "Logistic Regression\n", "[[401 2]\n", " [ 8 39]]\n" ] } ], "source": [ "print(\"Most frequent class:\")\n", "print(confusion_matrix(y_test, pred_most_frequent))\n", "\n", "print(\"\\nDummy model:\")\n", "print(confusion_matrix(y_test, pred_dummy))\n", "\n", "print(\"\\nDecision tree:\")\n", "print(confusion_matrix(y_test, pred_tree))\n", "\n", "print(\"\\nLogistic Regression\")\n", "print(confusion_matrix(y_test, pred_logreg))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "###### Accuracy (정확도)\n", "\\begin{equation}\n", "\\text{Accuracy} = \\frac{\\text{TP} + \\text{TN}}{\\text{TP} + \\text{TN} + \\text{FP} + \\text{FN}}\n", "\\end{equation}\n", "\n", "- 전체 샘플 수 중에서 정확히 예측한 것(TP 와 TN)의 비율\n", "- scikit-learn 에서 score 함수가 반환하는 값" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Precision (정밀도)\n", "\\begin{equation}\n", "\\text{Precision} = \\frac{\\text{TP}}{\\text{TP} + \\text{FP}}\n", "\\end{equation}\n", "\n", "- 양성(Positive)로 예측한 것(TP와 FP)들 중 진짜 양성인 것(TP)의 비율\n", "- **거짓 양성(FP)의 수를 줄이는 것을 목표**로 할 때 사용하는 지표\n", " - 신약의 효과 검증 등 임상 시험에 많이 사용\n", "- **거짓 음성(FN)의 수가 늘어나는 것에 대해 정밀도 수치는 영향받지 않음**\n", "- 양성 예측도 (PPV)라고도 불리움" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true, "hide_input": false }, "source": [ "##### Recall (재현율)\n", "\\begin{equation}\n", "\\text{Recall} = \\frac{\\text{TP}}{\\text{TP} + \\text{FN}}\n", "\\end{equation}\n", "\n", "- 진짜 양성인 것(FN과 TP)들 중 올바르게 양성으로 예측된 것(TP)의 비율 \n", "- **거짓 음성(FN)의 수를 줄이는 것**을 목표로 할 때 사용하는 지표\n", " - 암 진단\n", "- **거짓 양성(FP)의 수가 늘어나는 것에 대해 재현율 수치는 영향받지 않음***\n", " - 즉, 건강한 사람이 일부 암 진단을 받더라도 암에 걸린 사람을 빠짐없이 찾는 것이 더 중요\n", "- 민감도(Sensitivity), 적중률(Hit Rate), 진짜 양성 비율 (TPR)라고도 불리움" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### f-score (f-점수)\n", "- $P$: Precision\n", "- $R$: Recall\n", "\\begin{equation}\n", "\\text{F} = \\frac{1}{\\displaystyle \\alpha \\frac{1}{P} + (1-\\alpha) \\frac{1}{R}}\n", "\\end{equation}\n", "- 정밀도와 재현율은 상충 관계\n", "- 모든 샘플을 양성 클래스로만 예측한 경우\n", " - FP와 TP만 존재\n", " - 재현율: 1, 정밀도는 상대적으로 낮아짐\n", "- 하나의 샘플만 (올바르게) 양성 클래스로 예측하고 나머지 샘플을 음성 클래스로만 예측한 경우\n", " - TN과 FN만 존재\n", " - 정밀도: 1, 재현율은 상대적으로 낮아짐\n", "- f-score\n", " - 정밀도와 재현율의 조화 평균\n", " - 정밀도와 재현울을 동시에 고려한 수치이므로 불균한 이진 분류문제의 정확도(Accuracy)보다 더 나은 지표 \n", " - f1-score\n", " - f-score 공식에서 $\\alpha=0.5$\n", "\\begin{equation}\n", "\\text{f1-score} = \\frac{1}{\\displaystyle 0.5 \\frac{1}{P} + 0.5 \\frac{1}{R}} = 2 \\cdot \\frac{P \\cdot R}{P + R}\n", "\\end{equation}\n", "- f-measure (f-측정)이라고도 함" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### [Note] 주가 변동 이진 분류 예측\n", "- 특성 데이터\n", " - 일봉의 종가 기반\n", " - N개 종목의 과거 M일치의 종가 데이터\n", " - 1개 샘플의 특성 데이터 크기 N * M\n", " - 하루씩 Shift하면서 새로운 샘플 생성\n", "- 타겟 데이터\n", " - 특정 종목의 M+1일의 종가 데이터\n", " - 직전 M일자 종가보다 M+1일자 종가가 올랐다면 1, 그렇지 않으면 0\n", "- 두 가지 분류 클래스\n", " - 1: 양성 (Positive) 클래스\n", " - 0: 음성 (Negative) 클래스 \n", "- 성능 평가 측정\n", " - Accuracy는 당연히 높아야 함.\n", " - Precision과 Recall은 상충관계이므로 둘 중 하나를 택하여 더 집중적으로 높여야 한다면 어떤것을 높여야 하나?\n", " - Precision 관점\n", " - 거짓 양성(FP)을 줄이는 것을 목적\n", " - 즉, 주가가 올라간다고 예측을 했는 데, 실제로는 하락을 한 경우를 줄이고자 함.\n", " - **재화의 상실**\n", " - Recall 관점\n", " - 거짓 음성(FN)을 줄이는 것을 목적\n", " - 즉, 주가가 하락한다고 예측을 했는 데, 실제로는 상승을 한 경우를 줄이고자 함.\n", " - **기회의 상실**" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "f1 score most frequent: 0.00\n", "f1 score dummy: 0.13\n", "f1 score tree: 0.55\n", "f1 score logistic regression: 0.89\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/yhhan/anaconda3/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 due to no predicted samples.\n", " 'precision', 'predicted', average, warn_for)\n" ] } ], "source": [ "from sklearn.metrics import f1_score\n", "print(\"f1 score most frequent: {:.2f}\".format(f1_score(y_test, pred_most_frequent)))\n", "print(\"f1 score dummy: {:.2f}\".format(f1_score(y_test, pred_dummy)))\n", "print(\"f1 score tree: {:.2f}\".format(f1_score(y_test, pred_tree)))\n", "print(\"f1 score logistic regression: {:.2f}\".format(f1_score(y_test, pred_logreg)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- f1 score most frequent 모델의 f1 점수는 TP가 0이므로, 재현율과 정밀도가 모두 0\n", " - 그러므로 f1 점수 공식에서 분모가 0\n", " - 위 Warning 메시지의 원인 \n", "- f1-점수로 비교해본 가장 좋은 모델\n", " - Logistic Regression" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- sklearn.metrics.classification_report\n", " - 각 클래스마다 교대로 양성임을 가정\n", " - 상위 두 개의 출력 라인\n", " - 해당 클래스가 양성일 때 다음 4개의 값을 출력\n", " - 정밀도(precision)\n", " - 재현율(recall)\n", " - f1-점수(f1-score)\n", " - 해당 클래스에 실제로 속한 샘플 개수(support) \n", " - 정답 데이터인 y_test에 대한 각 클래스별 샘플 개수" ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " not nine 0.90 1.00 0.94 403\n", " nine 0.00 0.00 0.00 47\n", "\n", "avg / total 0.80 0.90 0.85 450\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/yhhan/anaconda3/lib/python3.6/site-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples.\n", " 'precision', 'predicted', average, warn_for)\n" ] } ], "source": [ "from sklearn.metrics import classification_report\n", "print(classification_report(y_test, pred_most_frequent, target_names=[\"not nine\", \"nine\"]))" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " not nine 0.90 0.90 0.90 403\n", " nine 0.12 0.13 0.13 47\n", "\n", "avg / total 0.82 0.82 0.82 450\n", "\n" ] } ], "source": [ "print(classification_report(y_test, pred_dummy, target_names=[\"not nine\", \"nine\"]))" ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " not nine 0.98 1.00 0.99 403\n", " nine 0.95 0.83 0.89 47\n", "\n", "avg / total 0.98 0.98 0.98 450\n", "\n" ] } ], "source": [ "print(classification_report(y_test, pred_logreg, target_names=[\"not nine\", \"nine\"]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Taking uncertainty into account\n", "- 모델 예측의 확신도를 가늠하기 위한 함수\n", " - decicion_function\n", " - 임계값: 0\n", " - decision_fuction의 임계값이 0일 때 클래스 분류 \n", " - decision_function() <= 0 --> 클래스 0 (음성 클래스)로 분류\n", " - decision_function() > 0 --> 클래스 1 (양성 클래스)로 분류\n", " - predict_proba\n", " - 임계값: 0.5" ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(337, 2)\n", "(337,)\n", "\n", "(113, 2)\n", "(113,)\n" ] } ], "source": [ "from mglearn.datasets import make_blobs\n", "\n", "X, y = make_blobs(\n", " n_samples=(400, 50), # 음성 클래스: 400개, 양성 클래스: 50개\n", " centers=2, \n", " cluster_std=[7.0, 2], \n", " random_state=22\n", ")\n", "\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)\n", "print(X_train.shape)\n", "print(y_train.shape)\n", "print()\n", "print(X_test.shape)\n", "print(y_test.shape)\n", "\n", "svc = SVC(gamma=.05).fit(X_train, y_train)" ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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85/jf/uNMXvPYf3yhcmPER2X8rnwMaK/uQ5RInMcGCAaijTboS6z2rfxvItfIjp+J4iO79FptvsXRDcueIpo4vnX4vdkCVDsmaDYs/Riz+T1+4D3EJ0Dg8C1nJm/hzHmz40xfx4vO0J0l8JfiZd9gih+/d5sy1sM5buJiIiIiIiISI2oR0tERERERKTGlGiJiIiIiIjUmBItERERERGRGlOiJSIiIiIiUmNKtERERERERGpspieJi4g0vJaWLrtiRbWH1MtyscrN1rsKE/qC5npX4bxw+PDTp621q+pdj/lSfFqaGinm1Jpi2PzNNj4p0RKRJW/FivV84hP/Vu9qyAL6hZZH612FCX85dl29q3Be+MhHthyqdx1qQfFpaWqkmFNrimHzN9v4pKGDIiIiIiIiNaZES0REREREpMaUaImIiIiIiNSY5miJLCN79uzp9jzvNuB1nN2QEgJP+77/oauvvrq3PrUTEREROX8o0RJZRjzPu23NmjWXrFq1atBxHFt+PwxD09fXd+nJkydvA95VxyqKiIiInBc0dFBkeXndqlWrRiqTLADHceyqVauGiXq6RERERGSBKdESWV6cyUlWxQcW/Z8XERERWRS66BIREREREakxJVoiIiIiIiI1pkRLZHkJwzA0U3xgiO4+KCIiIiILTImWyPLydF9fX/vkZCu+62A78HSd6iUiIiJyXtHt3UWWEd/3P3Ty5MnbTp48OeVztOpUNREREZHzihItkWUkfhixnpMlIiIiUmcaOigiIiIiIlJjSrRERERERERqTImWiIiIiIhIjSnREhERERERqTElWiIiIiIiIjWmREtERERERKTGlGiJiIiIiIjUmBItERERERGRGlOiJSIiIiIiUmNKtERERERERGpMiZaIiIiIiEiNKdESERERERGpMSVaIiIiIiIiNaZES0REREREpMaUaImIiIiIiNSYEi0REREREZEaU6IlIiIiIiJSY0q0REREREREakyJloiIiIiISI0p0RIREREREakxJVoiIiIiIiI15tW7AiIiIgspm89zuL+fXLFIZ3MzF3Z317tKIiJYaznY18fI+DilIODKTZvwXLfe1ZIaUqIlIiLL1jNHj/Km3/s9+kZGJt77o1tu4aNvf3sdayUi57swDPmZL3yBf3rssYn3tm/ezDc/+Ula0uk61kxqSUMHRURkWRrK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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "mglearn.plots.plot_decision_threshold()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 위 상위 두 개의 그림에서 검은색 동그라미\n", " - decision_fuction의 임계점이 0일 때와 -0.8일 때의 경계 위치\n", " - 이 동그라미 내부는 양성 클래스(decision_function() > 0)로 분류, 바깥쪽은 음성 클래스로 분류" ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " 0 0.97 0.89 0.93 104\n", " 1 0.35 0.67 0.46 9\n", "\n", "avg / total 0.92 0.88 0.89 113\n", "\n" ] } ], "source": [ "print(classification_report(y_test, svc.predict(X_test)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 양성 클래스 1에 대해 정밀도(0.35)가 매우 낮음, 재현율(0.67)도 낮음.\n", " - 음성 클래스 0에 대한 샘플 수가 많아서 생긴 결과임 --> 데이터 불균형" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 이제 클래스 1의 재현율(recall)을 높이는 것이 중요하다고 가정.\n", " - 즉, 거짓 양성(FP)의 수가 늘어나도 중요하지 않음.\n", " - 진짜 양성(TP)을 늘리고 거짓 음성(FN)을 줄이려고 함.\n", " - decision_function의 임계값을 낮추면 클래스 1로 분류되는 경우가 더 많아짐" ] }, { "cell_type": "code", "execution_count": 59, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(113,)\n" ] } ], "source": [ "y_pred_lower_threshold = svc.decision_function(X_test) > -.8\n", "print(y_pred_lower_threshold.shape)" ] }, { "cell_type": "code", "execution_count": 60, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " 0 1.00 0.82 0.90 104\n", " 1 0.32 1.00 0.49 9\n", "\n", "avg / total 0.95 0.83 0.87 113\n", "\n" ] } ], "source": [ "print(classification_report(y_test, y_pred_lower_threshold))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 클래스 1의 재현율이 1.00 --> 즉, 거짓 음성은 전혀 없음\n", " - 반면에 정밀도는 다소 낮아짐\n", "- decision_function 값의 임계점을 고르는 일반적인 방법을 제시하기는 어려움" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Precision-Recall curves (정밀도-재현율 곡선)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 분류 임계값 조정 작업\n", " - 정밀도와 재현율의 상충 관계 조정하는 일과 동일\n", " - 임계값 조정은 비지니스 목표에 의존적\n", " - 비지니스 목표: 어떤 클래스에 대해 목표로 하는 재현율 또는 정밀도 값을 얻어냄\n", " - 예를 들어 양성 클래스에 대하여 **90% 재현율 산출**이 비지니스 목표가 될 수 있음" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- ***운영 포인트 (Operating Point)*** 지정\n", " - 예: **90% 재현율 산출**\n", " - 분류 모델이 목표로 하는 성능지표를 지정하는 작업\n", " - 비지니스 목표와 연관이 깊음\n", " - 많은 경우 운영 포인트를 정확하게 지정하는 것은 어려움\n", " - 이런 경우 임계값을 폭넓게 변경해 가며 정밀도와 재현율을 산출하며 그 장단점을 살펴보는 작업 필요\n", " - 이를 위해 ***정밀도-재현율 곡선***을 사용\n", " - sklearn.metrics.precision_recall_curve\n", " - 가능한 모든 임계값에 대한 정밀도와 재현율 값을 리스트로 반환" ] }, { "cell_type": "code", "execution_count": 61, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "precision: [0.321 0.296 0.308 0.32 0.333 0.348 0.364 0.381 0.4 0.368 0.333 0.353\n", " 0.375 0.4 0.429 0.385 0.417 0.455 0.4 0.444 0.5 0.571 0.667 0.6\n", " 0.5 0.667 0.5 1. 1. ]\n", "\n", "recall: [1. 0.889 0.889 0.889 0.889 0.889 0.889 0.889 0.889 0.778 0.667 0.667\n", " 0.667 0.667 0.667 0.556 0.556 0.556 0.444 0.444 0.444 0.444 0.444 0.333\n", " 0.222 0.222 0.111 0.111 0. ]\n", "\n", "thresholds: [-0.751 -0.587 -0.487 -0.444 -0.404 -0.29 -0.242 -0.193 -0.179 -0.166\n", " -0.16 0.086 0.146 0.192 0.37 0.52 0.523 0.532 0.632 0.744\n", " 0.872 0.88 0.884 0.978 1. 1.07 1.084 1.251]\n", "\n", "11\n", "0.08620483947417501\n" ] } ], "source": [ "from sklearn.metrics import precision_recall_curve\n", "\n", "precision, recall, thresholds = precision_recall_curve(y_test, svc.decision_function(X_test))\n", "\n", "print(\"precision: {}\\n\".format(precision))\n", "print(\"recall: {}\\n\".format(recall))\n", "print(\"thresholds: {}\\n\".format(thresholds))\n", "\n", "close_zero = np.argmin(np.abs(thresholds))\n", "print(close_zero)\n", "print(thresholds[close_zero])" ] }, { "cell_type": "code", "execution_count": 62, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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L/ic1atXdy77+voWqnOvVasWAHl5edSrV49ffvnljM+//fbbrF69mgULFtC5c2dnmeKOq1psE+MZXOmCmZaWxk033cS0adNo1sxRlayqzJ0794ykunr1aufPcrpcVVJlxz66445WJCUNYvv2AWzfPoDQUMdfGq+88ht9+y7xcHTGlG7w4MH4+PgQExNDUlJSsWUSExOZP38+Pj4+5/yXbWBgICdPnjznuOrUqUOrVq2YPXs24Lip/vrrrwDs3LmTqKgopkyZQlBQ0FnbOaKiovjhhx84cuQIubm5zJw5kyuuuKJQmb59+zJv3jxOnTrFyZMn+fLLL4s91h133MEdd9xBnz59nNuuu+46pk6d6rzpr1+/vtjP9u3bl1mzZpGbm8vhw4dZtmwZPXr0cP2CeJkqmxQAmjevQXh4IOHhgUyceDEXXxwIwPr1KWRl5Xk4OmPOLjQ0lKFDh5KdnU10dPQZN9jExESGDBlCTk4OQ4cOPecX2Ro2bEivXr2IiIhwNjS76uOPP+a9996jU6dOtG/f3tmIO3HiRGfDcd++fenUqVOJx2jatCnPPfccV155JZ06daJr165ER0cXKtO1a1dGjhxJ586dGTZsWKGb/ml79uxhzpw5TJ8+3dnYHBsby+OPP052djYdO3YkIiKCxx9/vNg4hg4dSseOHenUqRNXXXUVL7zwAsHBwed0PbyJeNujUWRkpLprkp1vvtnPwIE/ArB6dX969GjglvMY44qtW7dyySWXnLXM6fcUdu3ahZ+fH9HR0bRt25bt27czf/58cnJyaN26NStXrqRJkyblFLnxtOJ+d0RkrapGlvZZqzgvoH//3//TREUtplYt32LLBQT48s473Rg2rEWx+40pL8HBwaxYsYLx48czb9485s6d69zn4+PDsGHDeOONNywhGJdZUiigWjUfevRowM8/O0bnSEsr/iWctLRcHnlkIwXbtwID/bnqqsb4+trgZaZ8BQcHM2fOHBITE4mJieHYsWPUr1+fwYMH29hH5pxZUijip5+uIj295Dcyb755FQsW7GfHjlSGDfup0L633urKn/98kbtDNKZYISEh5/XmsjEFWVIowsdHztod9aGH2lKjhi+5ub+3xSxadJCTJ3O49951/O9/5T+EhioEBwfw7393omZN+yc1xpw/u4Oco379GtOvX+NC2y67bDGrVzuqnObP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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# create a similar dataset as before, but with more samples\n", "# to get a smoother curve\n", "X, y = make_blobs(\n", " n_samples=(4000, 500), \n", " centers=2, \n", " cluster_std=[7.0, 2],\n", " random_state=22\n", ")\n", "\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)\n", "\n", "svc = SVC(gamma=.05).fit(X_train, y_train)\n", "\n", "precision, recall, thresholds = precision_recall_curve(y_test, svc.decision_function(X_test))\n", "\n", "# find threshold closest to zero\n", "close_zero = np.argmin(np.abs(thresholds))\n", "plt.plot(\n", " precision[close_zero],\n", " recall[close_zero],\n", " 'o',\n", " markersize=10,\n", " label=\"threshold zero\",\n", " fillstyle=\"none\",\n", " c='k',\n", " mew=2)\n", "\n", "plt.plot(precision, recall, label=\"precision recall curve\")\n", "plt.xlabel(\"Precision\")\n", "plt.ylabel(\"Recall\")\n", "plt.legend(loc=\"best\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 위그림의 파란색 곡선은 decision_function의 가능한 모든 임계값에 대응되는 Precision과 Recall 값을 나타냄\n", "- 검은색 원은 decision_function의 기본 임계값인 0의 지점을 나타냄\n", " - 이 지점은 predict 메소드를 호출할 때 사용되는 임계 지점 값\n", "- 위 정밀도-재현율 곡선은 오른쪽 위로 갈 수록 좋은 분류기\n", " - 오른쪽 위 --> 정밀도와 재현율이 모두 높은 곳\n", "- 위 그래프에서 알 수 있는 것\n", " - 0.9 정도의 높은 Recall을 유지하면서도 0.5 정도의 Precision을 얻을 수 있음\n", " - 0.5보다 더 높은 Precision을 얻어내기 위해서는 Recall을 많이 손해 봐야 함" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- RandomForestClassifier는 decision_function은 제공하지 않고 predict_proba만 제공\n", " - rf.predict_proba(X_test)[:, 1]\n", " - 양성 클래스(클래스 1)의 확신 정도값을 가지고 오는 코드\n", " - 기본 임계값: 0.5" ] }, { "cell_type": "code", "execution_count": 63, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from sklearn.ensemble import RandomForestClassifier\n", "\n", "rf = RandomForestClassifier(n_estimators=100, random_state=0, max_features=2)\n", "rf.fit(X_train, y_train)\n", "\n", "# RandomForestClassifier has predict_proba, but not decision_function\n", "precision_rf, recall_rf, thresholds_rf = precision_recall_curve(y_test, rf.predict_proba(X_test)[:, 1])\n", "\n", "plt.plot(precision, recall, label=\"svc\")\n", "\n", "plt.plot(\n", " precision[close_zero], \n", " recall[close_zero], \n", " 'o', \n", " markersize=10,\n", " label=\"threshold zero svc\", \n", " fillstyle=\"none\", \n", " c='k', \n", " mew=2)\n", "\n", "plt.plot(precision_rf, recall_rf, label=\"rf\")\n", "\n", "close_default_rf = np.argmin(np.abs(thresholds_rf - 0.5))\n", "\n", "plt.plot(\n", " precision_rf[close_default_rf], \n", " recall_rf[close_default_rf], \n", " '^', \n", " markersize=10,\n", " label=\"threshold 0.5 rf\", \n", " fillstyle=\"none\", \n", " c='k',\n", " mew=2)\n", "\n", "plt.xlabel(\"Precision\")\n", "plt.ylabel(\"Recall\")\n", "plt.legend(loc=\"best\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 높은 Precision 또는 높은 Recall을 얻기 위해서는 RandomForestClassifier가 더 좋은 모델\n", "- Precision 과 Recall 두 개의 값을 적절히 동시에 높은 값을 얻기 위해서는 SVC가 더 좋은 모델" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- f1-score만으로는 이런 세세한 부분을 비교할 수 없음\n", " - f1-score는 정밀도-재현율 곡선의 한 지점인 기본 임계값에 대한 점수임" ] }, { "cell_type": "code", "execution_count": 64, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "f1_score of random forest: 0.610\n", "f1_score of svc: 0.656\n" ] } ], "source": [ "from sklearn.metrics import f1_score\n", "\n", "print(\"f1_score of random forest: {:.3f}\".format(f1_score(y_test, rf.predict(X_test))))\n", "print(\"f1_score of svc: {:.3f}\".format(f1_score(y_test, svc.predict(X_test))))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 어느 모델이 좋은지 보다 정확하게 비교하려면... \n", " - 특정 임계값이나 운영 포인트에 국한하지 않고 전체 곡선에 대한 정보를 요약해야 함\n", "- ***Average Precision (평균 정밀도)***\n", " - 정밀도-재현율 곡선의 아랫부분 면적을 계산한 값\n", " - 항상 0(가장 나쁨)에서 1(가장 좋음)사이의 값을 지님\n", " - sklearn.metrics.average_precision_score" ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Average precision of random forest: 0.660\n", "Average precision of svc: 0.666\n" ] } ], "source": [ "from sklearn.metrics import average_precision_score\n", "\n", "ap_rf = average_precision_score(y_test, rf.predict_proba(X_test)[:, 1])\n", "ap_svc = average_precision_score(y_test, svc.decision_function(X_test))\n", "\n", "print(\"Average precision of random forest: {:.3f}\".format(ap_rf))\n", "print(\"Average precision of svc: {:.3f}\".format(ap_svc))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 평균 정밀도 측면에서 RandomForestClassifier와 SVC가 큰 차이 없음" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Receiver Operating Characteristics (ROC) and AUC\n", "- 진짜 양성 비율 (TPR): 전체 양성 샘플(TP와 FN)중에서 진짜 양성(TP)로 올바로 분류된 비율 = 재현율\n", "\\begin{equation}\n", "\\text{TPR} = Recall = \\frac{\\text{TP}}{\\text{TP} + \\text{FN}}\n", "\\end{equation}\n", "
\n", "
\n", "- 거짓 양성 비율 (FPR): 전체 음성 샘플(FP와 TN) 중에서 거짓 양성(FP)로 잘못 분류된 비율 \n", "\\begin{equation}\n", "\\text{FPR} = \\frac{\\text{FP}}{\\text{FP} + \\text{TN}}\n", "\\end{equation}\n", "
\n", "
\n", "- TPR과 FPR의 해석\n", " - TPR과 FPR은 서로 반비례적인 관계에 있다. 암환자를 진단할 때, 성급한 의사는 아주 조금의 징후만 보여도 암인 것 같다고 할 것이다. 이 경우 TPR은 1에 가까워질 것이다. 그러나 FPR은 반대로 매우 낮아져버린다. (정상인 사람도 다 암이라고 하니까)\n", "\n", " - 반대로 돌팔이 의사라서 암환자를 알아내지 못한다면, 모든 환자에 대해 암이 아니라고 할 것이다. 이 경우 TPR은 매우 낮아져 0에 가까워 질 것이다. 그러나 반대로 FPR은 급격히 높아져 1에 가까워질 것이다.(암환자라는 진단 자체를 안하므로, 암환자라고 잘못 진단 하는 경우가 없음)\n", " - 출처: http://newsight.tistory.com/53 [New Sight]\n", "
\n", "
\n", "\n", "- ROC 곡선\n", " - ROC curve is created by plotting the true positive rate (TPR) against the false positive rate (FPR) at various threshold settings.\n", " - '수신기 운영 특성 (Receiver Operating Characteristics)'이라는 이름은 신호 탐지 이론에서 비롯\n", " - 이름 그 자체의 의미는 무시하고 'TPR-FPR 곡선'으로 이해하는 것이 좋음" ] }, { "cell_type": "code", "execution_count": 66, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from sklearn.metrics import roc_curve\n", "fpr, tpr, thresholds = roc_curve(y_test, svc.decision_function(X_test))\n", "\n", "plt.plot(fpr, tpr, label=\"ROC Curve\")\n", "plt.xlabel(\"FPR\")\n", "plt.ylabel(\"TPR (recall)\")\n", "\n", "# find threshold closest to zero\n", "close_zero = np.argmin(np.abs(thresholds))\n", "plt.plot(fpr[close_zero], tpr[close_zero], 'o', markersize=10, label=\"threshold zero\", fillstyle=\"none\", c='k', mew=2)\n", "plt.legend(loc=4)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- ROC 곡선 해석\n", " - ROC 곡선은 왼쪽 상단에 가까울 수록 이상적임.\n", " - 즉, FPR은 낮게 유지하면서 TPR(재현율)은 높은 뷴류기가 좋음. \n", " - 위 그림에서 기본 임계값 0에 대한 FPR과 TPR값보다는 FPR을 조금 더 늘려주면(0.1 정도) TPR을 상당히 높일 수 있음(0.9 정도)\n", " - 이러한 FPR=0.1 & TPR=0.9을 산출할 수 있는 임계값이 적절한 **운영 포인트**가 될 수 있음" ] }, { "cell_type": "code", "execution_count": 67, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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i97rG/yVkJDA4cOHK7w/a9YsHn/88UCFViMPPvggffv2pV+/fqSlpbF27VpmzZrFvffee067/Px87+mlJ0+e5Pbbb6dbt2707duX4cOHs3bt2oDGFT09BWMM06ZNY9euXQwYMIDc3Fzi47+7r1VBQQHjx4/no48+4s477zyn4qg/ypJCZdVNq1JSUkJsbGSUnikuLiYurvrD6urVq/nXv/7FRx99RKNGjTh8+DBnz54lKyuL73//+zz88MPetosWLWLKFKeW6H/913+RmJjIjh07iImJYdeuXWzdujWg+xA9PQVPHZRi6ymYKLV7925qeMe7AAAP2ElEQVRycnJo0KBBhYQAEB8fzz//+U/i4uLIyclhz54959lS5e655x4+++wz0tLSmDFjBuB8s500aRK9evXipptu8t5UJyEhgQceeIChQ4eyZMkSPvvsM8aMGcPAgQMZNmwYn376KQBLliwhOTmZ1NTUcwrT7d27lzFjxtC9e3dvqQyAl19+mZSUFJKTk7n77rsrjfPBBx+kZ8+eXHXVVWzbtq3SNr43ymnSpAkrV66ksLCQH/3oR1x66aX079+f3NxcwOm5XH/99Vx77bWMHj0aVWXGjBkkJyeTkpLC4sWLK2x/3759tG/fnkaeEv7t27fn4osvpmfPnrRu3fqcb/+vvPIKN954I5999hlr165lzpw5xMQ4h+6uXbsybtw4//6B/KWqYfUYOHCg1srcuaoTJujPus6u3c8bU89t2bKlyvV/+tOfFNCJEydW2W7ixIkK6Ny5c2v0+Z9//rn27dvXu7xixQpt2bKl7tmzR0tKSvSyyy7T9957T1VVL7nkEv3973/vbXvFFVfo9u3bVVV1zZo1OmrUKFVVTU5O1oKCAlVVPXr0qKqqvvDCC5qYmKjHjh3TU6dOaZcuXXT37t361VdfaefOnfXgwYNaVFSko0aN0pycHO/nHTp0SNevX6/JyclaWFiox48f127duuljjz123n3Ky8vToUOH6tmzZ/Xee+/Vl156yRtL9+7d9eTJk/rCCy9op06d9MiRI6qqmp2drVdddZUWFxfr/v37tXPnzrp3795ztnvixAlNTU3V7t276x133KHvvPOOd92jjz6qv/jFL1RVdfXq1Zqenq6qqrm5uTphwgS//i0q+1vAqU5d7TE2enoKR48C8Pm356+HYkwkK7s1Zs+e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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fpr_rf, tpr_rf, thresholds_rf = roc_curve(y_test, rf.predict_proba(X_test)[:, 1])\n", "\n", "plt.plot(fpr, tpr, label=\"ROC Curve SVC\")\n", "plt.plot(fpr_rf, tpr_rf, label=\"ROC Curve RF\")\n", "\n", "plt.xlabel(\"FPR\")\n", "plt.ylabel(\"TPR (recall)\")\n", "plt.plot(fpr[close_zero], tpr[close_zero], 'o', markersize=10, label=\"threshold zero SVC\", fillstyle=\"none\", c='k', mew=2)\n", "\n", "close_default_rf = np.argmin(np.abs(thresholds_rf - 0.5))\n", "plt.plot(fpr_rf[close_default_rf], tpr[close_default_rf], '^', markersize=10, label=\"threshold 0.5 RF\", fillstyle=\"none\", c='k', mew=2)\n", "\n", "plt.legend(loc=4)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 두 개의 ROC 곡선 해석\n", " - RandomForest 모델이 SVC 보다 좀 더 왼쪽 상단으로 ROC 곡선이 위치하는 듯 함\n", " - 어떤 ROC 곡선이 더 좋은지 알아보기 ROC 곡선아래의 면적을 하나의 값으로 요약할 수 있음\n", " - AUC (Area Under the (ROC) Curve)\n", " - 0(최악) ~ 1(최선)\n", " - 수집한 데이터가 불균현한 데이터 집합이라면 정확도보다 AUC가 더 의미있는 지표\n", " - sklearn.metrics.roc_auc_score" ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "AUC for Random Forest: 0.937\n", "AUC for SVC: 0.916\n" ] } ], "source": [ "from sklearn.metrics import roc_auc_score\n", "\n", "rf_auc = roc_auc_score(y_test, rf.predict_proba(X_test)[:, 1])\n", "svc_auc = roc_auc_score(y_test, svc.decision_function(X_test))\n", "\n", "print(\"AUC for Random Forest: {:.3f}\".format(rf_auc))\n", "print(\"AUC for SVC: {:.3f}\".format(svc_auc))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- AUC 측면에서 RandomForest 모델이 SVC 보다 좀 더 좋다고 볼 수 있음" ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "gamma = 1.00 accuracy = 0.90 AUC = 0.50\n", "gamma = 0.05 accuracy = 0.90 AUC = 1.00\n", "gamma = 0.01 accuracy = 0.90 AUC = 1.00\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYoAAAEKCAYAAAAMzhLIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzt3Xd8VfX9x/HXl62AKFMkQBgREggzDKsiFALUCvxwINpWqCwJOBBBUETEBbLUMjSAFVqVOoqipUAQcFYggYAQ9lASkCUjjEDG9/fHCSGGJISQm5tz7/vZB4/ee+7JuZ97hPvJGe/v11hrERERyUkxbxcgIiJFmxqFiIjkSo1CRERypUYhIiK5UqMQEZFcqVGIiEiu1ChERCRXahQiIpIrNQoREclVCW8XcKUqV65sAwMDvV2GiIirxMTEHLHWVsnPz3qsURhj3gHuAg5Zaxtn87oB3gDuBM4Afa216y633cDAQKKjowu6XBERn2aM+Sm/P+vJU0/vAl1zef0PQFD6n4HALA/WIiIi+eSxIwpr7dfGmMBcVukBzLfOqIQ/GGOuN8ZUt9YeKJACtm2DhIQC2ZSIiFtZa4mJOXZV2/DmNYoawL5Mz+PTl+W7UfSk58UnDdL/pBs8EzpHOY+XhcOsiJy3szDTZoZPht31sl8vfBlEpB8H7aoLT03JeZuTh0O93c7jmYMhqnP269XdBVOeuvi858Kct6nPdPGxPlPO29RnuvjcXz9TWM6r5Ik3G4XJZlm2Y54bYwbinJ6iVq1a+Xu3Bg0g5ab0x/uBbTmv26HDxcfl1wKnsl/vpurQoaHzuEoikMu1k7AwqF0+/ee2kmM/LF8OOrTKtGBlztvUZ8r0HvpMOdJnyrTAvz7T6hNV2P9zOUqWuLqrDMaT81Gkn3r6IoeL2W8Dq6y1H6Q/3wa0v9ypp7CwMJv5YvZwhgMwhSmQnAzPPAM7d8Itt8CIEWCy60ciIr5px45EBgyI4auvDgPQrVt1Zs5sQc2aZWOstfk6uPDmEcUiYKgxZgHQBjiRn+sTu9l98ckHHzhNokoViIhQkxARv5GcnMaUKdsZN24z586lUbVqaf72t+bcd18A5iq/Cz15e+wHQHugsjEmHngeKAlgrX0LWIxza+xOnNtj/3pVb7hhAyxcCMWKwbBhUK7cVW1ORMQt1q07Rr9+0cTGHgegb99AJk9uQqVKpQtk+5686+mBy7xugSEF9oZvvOH8//33Q3BwgW1WRKSoOnMmhXHj4pg6dTupqZbAwGuJjAwjPLxagb6P65LZOTp2DEJC4J57vF2JiIjHrVhxiIEDo9m16zTFisGTT97M+PGNKFu24L/WfadRlCvnnHIqXtzblYiIeMyxY+cZMWIjc+fuASA0tAJz5oTRunVFj72nuxvFnj1QJ/3xkCFQubJXyxER8aRPPoln6ND1/PJLEqVKFWPs2BBGjGhAqVKeHd/V3Y3in/8kvA1QMwDatvV2NSIiHrF//1mGDl3PwoXOaBO33VaZ2bNb0rDhdYXy/u5uFCdPOqnHiY96uxIRkQKXlmaZO3cPI0Zs5MSJZMqXL8HEiU0YNKguxYoV3u3/rm4Uu2okQRrkkJ4XEXGtHTsSGTgwhlWrnODcXXddCM5dW+i1uLpRPPVEPAALt3u5EBGRApKcnMbUqU5wLikpjSpVnOBcr15XH5zLL1c3ChERX7Ju3TH6949m/XonONenT22mTGlaYMG5/FKjEBHxsjNnUnjhhTimTLkYnHv77ZZ07nyjt0sD1ChERLxq5cpDDBhwMTg3bFgQL77Y2CPBufwqOpWIiPiR48ed4NycOU5wrnHj65g7t5VHg3P5pUYhIlLI/v3veIYMuRice+65YEaObOjx4Fx+qVGIiBSS/fvP8uij6/n3v53g3K23VmL27DCCgwsnOJdfrm4Uk18PgH3xMMjblYiI5Mxay5w5F4Nz5cqVYOLEUB55pF6hBufyy9WNol5CGTLPWyQiUtTs3HmKAQOiM4Jzf/xjdWbN8k5wLr9c3ShERIqqlJSLM85dCM69+WYz7r+/pteCc/nl6kYx855DcBIivF2IiEgm69c7M85dCM499FBtpk71fnAuv1zdKKLangQgQkN4iEgRcPZsKuPGbc4IztWu7QTnunQpGsG5/HJ1oxARKSpWrTrEgAEx7Nx5CmPgiSec4Fy5cu7/mnX/JxAR8aLsgnNz5oTRpk0lL1dWcNQoRETyaeHCBIYMWceBA05wbsyYYJ5+uugG5/JLjUJE5AodOODMOOe24Fx+qVGIiOSRtZZ33tnLU09t4PhxJzg3YUIogwe7IziXX65uFHXjS8O5c94uQ0T8wM6dpxg4MJqVK90bnMsvVzeKKW/UhJ07YaK3KxERX5WSksa0aTsYO3YTSUlpVK5cijffbE7v3u4LzuWXaxvFS0ljGLNzp7fLEBEftn69M+PcunVOcO4vf3GCc5UruzM4l1+uvTQfU2YzC+5Pf3Kdb15AEhHvOHs2lVGjNtKq1ZesW3ec2rWv5b//vZ3581v7XZMAFx9RAPyrN/Q+2B5udHfqUUSKjqzBuccfD+Kll3wjOJdf7v/kISHerkBEfMDx4+cZOXIjs2c7wblGjZzgXNu2vhOcyy/3NwoRkauUOThXsqRhzJgQRo3yveBcfqlRiIjf+uWXJIYOXccnnzjBuVtuqcScOWGEhOi6Z2ZqFCLid7ILzr36aigREb4dnMsvNQoR8Su7dp1i4MAYVqw4BMCdd97IrFktqVXL94Nz+eXaRjF4ZUPYshWCvF2JiLjBheDc889v5uzZVL8MzuWXR6/UGGO6GmO2GWN2GmNGZfN6LWPMSmPMemPMRmPMnXnddue4ADpHFWy9IuKbYmOP07btCkaO3MjZs6n8+c+12LKlKw88UEtNIg88dkRhjCkOzADCgXhgrTFmkbU2LtNqY4APrbWzjDEhwGIg0FM1iYh/OXs2lfHj45g0aRupqZZatZwZ57p2VfbqSnjy1FNrYKe1djeAMWYB0API3CgscOH2ggrA/rxufFlIPBjoXEDFiohv+eqrwwwYEM2OHU5w7rHH6vPyy6F+HZzLL0/usRrAvkzP44E2WdYZBywzxjwKlAU6ZbchY8xAYCBArVq1AJjVYSt0QKefROQ3TpxIZuTIjURG7gYUnCsInrxGkd2JP5vl+QPAu9baAOBO4B/GmEtqstZGWmvDrLVhVapU8UCpIuILPv00gZCQJURG7qZkScO4cSGsWxeuJnGVPHlEEQ/UzPQ8gEtPLfUDugJYa/9njCkDVAYOebAuEfExv/ySxKOPrufjj+MBBecKmiePKNYCQcaYOsaYUkBvYFGWdX4GOgIYY4KBMsBhD9YkIj7ECc7tITh4CR9/HE/ZssV5881mfPNNBzWJAuSxIwprbYoxZiiwFCgOvGOt3WyMGQ9EW2sXAcOB2caYYTinpfpaa7OenhIRuUTW4Nwf/nAjb72l4JwnePTyv7V2Mc4tr5mXjc30OA641ZM1iIhvSUlJ4/XXdzB2rBOcq1SpFG+80YwHH1QmwlN0n5iIuEZs7HH6948mJuYYAH/6Uy2mTWtGlSr+N5lQYXLtGLoLZ3RiYU9vVyEihSEpKZVnnvmRsLDlxMQco2bNa1i8+Db++c82ahKFQEcUIlKkff21E5zbvt0Jzj36aH1efrkx5cuX9HZpfkONQkSKpBMnknn66Y28/bYTnAsJcYJzt9yiTERhc22jGH7faugKU3Z7uxIRKWiffZZARMQ69u93Zpx79tlgRo1qSOnSxb1dml9ybaPYXTURqgJqFCI+4+BBJzj30UdOcK5t24rMmRNGo0YVvFyZf3NtoxAR32Gt5d139zJ8+AaOHUumbNni6TPO1ad4cd3y6m1qFCLiVbt3n2LQoBiWL3eCc1273shbb7Wgdu2yXq5MLlCjEBGvSElJ4403dvDccwrOFXVqFCJS6DZscIJz0dEKzrmBGoWIFJqkpFRefDGO117bRkqKpWbNa3jrrZbceWd1b5cmuXBtowjfXAMSErKf9UJEihwF59zLtY0iYlUwLE+ACG9XIiK5OXEimVGjNvLWW8697MHB5ZkzJ4zf/a6ylyuTvHJtoxCRom/Rov1ERKwjIeEsJUsannkmmNGjFZxzG9c2il1VTkJdqOftQkTkEgcPJvHYY+v58EMnONemjROca9xYwTk3cm2jeKrXGugFC6O8XYmIXGCtZd68n3jyydiM4Nwrr4QyZIiCc27m2kYhIkVL1uBcly7VeOutlgQGKjjndmoUInJVUlNtenBuE2fOOMG5119vxp/+pOCcr1CjEJF827jRCc6tXesE5x58sBavv67gnK9RoxCRK5aUlMpLL21h4sStGcG5WbNa8sc/Kjjni9QoROSKfPPNYQYMiGHbtkSMgaFD6/PKKwrO+TI1ChHJk5Mnkxk16kdmzdoFKDjnT1zbKCZ/2BpWr4Gu3q5ExPd9/vl+Bg++GJwbPTqYZ55RcM5fuLZR1Dt8nWa3E/EwBecEXNwoRMRzrLXMn/8Tw4Y5wblrr3WCc0OHKjjnj1zbKGa23wJBGhNQpKDt2XOaQYNiiIo6CEDnztV4+20F5/xZMW8XkF9RjRKI6uztKkR8R2qqZdq07TRuvJSoqINUrFiK+fNbs2TJ7WoSfs61RxQiUnCyBuceeKAmr7/ejKpVy3i5MikK1ChE/FhSUiovv7yFCROc4FxAwDXMmtWCu+66ydulSRGiRiHip7799ggDBkSzdWsiAEOG1OOVV0K57joF5+S31ChE/MzJk8mMHv0jM2c6wbmGDZ3g3K23Kjgn2VOjEPEjX3zhBOfi489SooRh9OiGPPtssIJzkivXNoq6h8pDYqK3yxBxhUOHknj88VgWLNgHQOvWTnAuNFTBObk8j94ea4zpaozZZozZaYwZlcM6vYwxccaYzcaY9/O67SkftWHKUwVXq4gvcoJzewkOXsqCBfu49triTJvWlO+//72ahOSZx44ojDHFgRlAOBAPrDXGLLLWxmVaJwgYDdxqrT1mjKnqqXpE/M2ePad55JEYli1TcE6ujidPPbUGdlprdwMYYxYAPYC4TOsMAGZYa48BWGsPebAeEb+Qmmp5880djBnjzDhXsWIppk1ryl/+Ulszzkm+ePLUUw1gX6bn8enLMrsZuNkY850x5gdjTJ7Hgu05ZDk9FxZAlSI+5McfT/C7363gySc3cOZMKr1712TLli489FCgmoTkmyePKLL7W2mzef8goD0QAHxjjGlsrT3+mw0ZMxAYCFCrVq2Cr1TE5c6dc2acU3BOPMGTjSIeqJnpeQCwP5t1frDWJgN7jDHbcBrH2swrWWsjgUiAsLCwrM1GxK99990R+ve/GJyLiKjHq68qOCcFx5OnntYCQcaYOsaYUkBvYFGWdT4FOgAYYyrjnIrSLBMieXDyZDJDhqzjtttWsnVrIg0alOebbzowY0YLNQkpUB47orDWphhjhgJLgeLAO9bazcaY8UC0tXZR+mudjTFxQCowwlp71FM1ifiK//znAI88EpMRnBs1ygnOlSmj4JwUPI8G7qy1i4HFWZaNzfTYAk+m/xGRy8ganGvV6gbmzAmjSZPrvVyZ+DLXJrNF/Im1ln/+82eeeCKWX389z7XXFuellxrz2GNBmnFOPM61jWLwyoawZatz6VvEh+3d6wTnli51gnPh4U5wrk4dBeekcLi2UXSOC4DlahTiu1JTLdOn7+TZZ3/k9GkF58R7XNsoRHzZpk0n6N8/mtWrfwXg/vtr8sYbzahWTTPOSeFzbaNYFhIPBjRttviSc+dSeeWVrbz66haSky01ajjBuW7dFJwT73Fto5jVYSt0gM5R3q5EpGB8/70TnNuyxQnODR5cjwkTFJwT77viRpE+Kmxva+17HqhHxO8kJl6ccc5aaNDAmXHutts045wUDTkms40x1xljRhtjphtjOhvHozjJ6V6FV6KI7/rPfw4QErKUGTN2Uby44dlng4mNDVeTkCIltyOKfwDHgP8B/YERQCmgh7U2thBqE/FZhw+f4/HH1/PBBwrOSdGXW6Ooa60NBTDGzAGOALWstZp/VCSfLgTnhg2L5ejR81xzjROce/xxBeek6MqtUSRfeGCtTTXG7FGTEMm/n346zaBBF4NznTpV5e23W1K3bjkvVyaSu9waRVNjzEkuzitxTabn1lp7ncerE/EBWYNzN9xQkqlTm9Gnj4Jz4g45NgprbZEehnLhjE6wfDlEeLsSkZxt3nyCfv0uBud69QrgzTebKzgnrpJjozDGlAEeAeoDG3GGCU8prMJE3CxrcO6mm8owa1ZLundXcE7cJ7dTT/NwrlN8A9wJNAIeL4yiRNwsa3DukUfqMmFCEypUUHBO3Cm3RhGS6a6nucCawikpb4bftxq6whTNhydFRGJiMs88s4kZM3ZiLdx8cznmzAnj9tureLs0kauS17ueUoraRbfdVROhKpo4VYqExYudGef27XNmnHv66YaMGaMZ58Q35NYomqXf5QTOnU6660kki8OHz/HEE7G8//7PAISFOcG5pk0VnBPfkVuj2GCtbV5olYi4iLWW995zZpzLHJx77LH6lCiR48g4Iq6UW6OwhVaFiIv89NNpHnlkHUuW/AIoOCe+L7dGUdUY82ROL1prp3qgHpEiKzXVMmPGTp55RsE58S+5NYriQDkuJrNF/Nbmzc6Mcz/84ATn7rvPCc7deKOCc+L7cmsUB6y14wutkisUvrkGJCSojYlHnTuXyquvbuWVVy4G52bObEGPHjW8XZpIocmtURTpr+CIVcGwPEFDeIjH/O9/R+nfP5q4OOfmv0GD6jJxooJz4n9yaxQdC60KkSIkMTGZZ5/dxPTpF4Nzs2eH0a6dgnPin3IbFPDXwizkSu2qchLqQj1vFyI+5b//PcAjj6zj55/PULy4YeTIBowdG6LgnPi1K54zu6h4qtca6AULo7xdifiCw4fPMWxYLO+95wTnWra8gblzFZwTARc3CpGCYK3l/fed4NyRI05wbvz4RjzxRJCCcyLp1CjEb/3002kGD17Hf//rBOc6dnSCc/XqKTgnkpkahfid1FTLzJk7GT3aCc5df31Jpk5tSt++gQrOiWRDjUL8SlzcSfr3j+Z//zsKKDgnkhdqFOIXzp1LZcKErbz8soJzIldKjUJ8noJzIlfHtY1i8oetYfUa6OrtSqSoOnUqhWee+TEjOBcU5ATn7rhDwTmRK+HR+/+MMV2NMduMMTuNMaNyWe9eY4w1xoTlddv1Dl9HPc1uJzlYsuQXGjVayt/+tpNixQyjRzdkw4bOahIi+eCxIwpjTHFgBhAOxANrjTGLrLVxWdYrDzwGrPZULeI/jhxxZpy7EJxr0eJ65s5tRbNmCs6J5JcnjyhaAzuttbutteeBBUCPbNZ7EXgNSLqSjc9sv4WZg6++SPENF4JzwcFLeO+9n7nmmuJMmtSE1as7qkmIXCVPNooawL5Mz+PTl2UwxjQHalprv7jSjUc1SiCq89UVKL7h55/PcNdd3/KnP63myJHz/P73Vfnxx8489VQDpatFCoAnL2Znl1zKmF7VGFMMmAb0veyGjBkIDASoVatWAZUnbpeWZpk5cxejR//IqVMpXH99SaZMacpf/6rgnEhB8mSjiAdqZnoeAOzP9Lw80BhYlf6P+kZgkTGmu7U2OvOGrLWRQCRAWFiY5vKWS4Jz99xTg7/9rTnVq1/j5cpEfI8nG8VaIMgYUwdIAHoDD1540Vp7Aqh84bkxZhXwVNYmIZLZ+fNpGcG58+fTqF69DDNmtKBnTwXnRDzFY43CWptijBkKLMWZf/sda+1mY8x4INpau8hT7y2+6YcfnODc5s1OcG7AgDq89loTrr++lJcrE/FtHg3cWWsXA4uzLBubw7rtPVmLuNepUymMGbOJN9/ckRGci4xsSfv2Vb1dmohfcG0yu+6h8pCY6O0yxMOWLv2FQYNi+OknZ8a5ESOcGeeuuUYzzokUFtc2iikftYHlyyHC25WIJxw5co4nn9zAP/7xE+AE5+bMCaN58xu8XJmI/3FtoxDfZK3lgw/28fjj6zly5DxlyhRj/PjGDBumGedEvEWNQoqMn38+w+DBMSxe7Mw416FDFSIjw6hfXzPOiXiTa39F6zlkOT0XersKKQhpaZbp03fSqNFSFi/+hQoVSjJnThhffnmHmoRIEaAjCvGqLVuc4Nz33ys4J1JUqVGIVyg4J+IeahRS6FavdoJzmzYpOCfiBmoUUmiyBufq13eCcx06KDgnUpSpUUihyBqce+qpm3n++UYKzom4gBqFeNTRo+cYNuxicK55cyc416KFgnMibuHaRjF4ZUPYshWCvF2JZMday7/+tY/HHovl8OFzlClTjBdeaMSTT96s4JyIy7i2UXSOC4DlahRF0b59Z4iIWMcXXxwAoH37KkRGtiQoqLyXKxOR/HBto5CiJy3N8tZbuxg16kcSE1OoUKEkkyc3oV+/OppxTsTFXNsoloXEgwFNm100bNlykgEDovnuOyc4d/fdNZg+XcE5EV/g2kYxq8NW6ACdo7xdiX87fz6NiRO38tJLTnDuxhvLMGNGc+6+O8DbpYlIAXFtoxDvyxqc69+/DpMmKTgn4mvUKOSKnT7tBOfeeMMJztWrV5bZs8MUnBPxUWoUckWWLXOCc3v3OsG54cNvZtw4BedEfJkaheTJ0aPOjHPz5zvBuWbNrmfuXAXnRPyBGoXkKrvg3LhxTnCuZEkF50T8gRqF5Cg+/gyDBys4J+LvXPsr4cIZnVjY09tV+Ka0NMvMmTsJCVnKF18coEKFkkRGtuTLL+9QkxDxQzqikN/YuvUkAwbE8O23RwDo2dMJzt10k4JzIv5KjUIAJzj32mtbefHFi8G56dObc889Cs6J+DvXNorh962GrjBlt7crcb+1a3+lX79ofvzxBAD9+jnBuRtuUHBORFzcKHZXTYSqgBpFvp0+ncJzzznBubQ0JzgXGRnG73+v4JyIXOTaRiFXJ2twbuTIm3n++RCuvVZ/JcSRnJxMfHw8SUlJ3i5FrkCZMmUICAigZMmSBbZNfSv4maNHzzF8+AbmzVNwTnIXHx9P+fLlCQwM1DDxLmGt5ejRo8THx1OnTp0C265rb4+VK3MhOBcSspR5836iTJliTJgQypo1HdUkJFtJSUlUqlRJTcJFjDFUqlSpwI8CdUThB+LjnRnnPv/cCc7dcUcVZs9WcE4uT03CfTzx30xHFD4sLc0ya9YuQkKW8vnnB7juuhJERrZkxQoF50Q8afr06dSvXx9jDEeOHMlxvXnz5hEUFERQUBDz5s3LWB4TE0NoaCj169fnsccew1oLwK+//kp4eDhBQUGEh4dz7Ngxj38WcHGjCN9cg/Bl3q6i6Nq69SR33LGKiIh1JCam8H//dxNbtnRlwIC6FCum3xJFPOnWW29l+fLl1K5dO8d1fv31V1544QVWr17NmjVreOGFFzK++AcPHkxkZCQ7duxgx44dLFmyBIAJEybQsWNHduzYQceOHZkwYUKhfB7XNoqIVcFEzPJ2FUVPcnIaL7+8haZNo/j22yNUq1aajz++hX//+3dKV4srvfjiizRs2JDw8HAeeOABJk+ezOzZs2nVqhVNmzblnnvu4cyZMwD07duXwYMH06FDB+rWrctXX33Fww8/THBwMH379s3YZrly5Xj66adp2bIlnTp1Ys2aNbRv3566deuyaNEiAPbu3cvtt99OixYtaNGiBd9//32ea27evDmBgYG5rrN06VLCw8OpWLEiN9xwA+Hh4SxZsoQDBw5w8uRJbrnlFowxPPTQQ3z66acAfPbZZ/Tp0weAPn36ZCz3NI9eozDGdAXeAIoDc6y1E7K8/iTQH0gBDgMPW2t/8mRNvixrcO7hhwOZPLmpgnNy1Yz5yCPbtfa+XF+Pjo7mk08+Yf369aSkpNCiRQtatmzJ3XffzYABAwAYM2YMc+fO5dFHHwXg2LFjrFixgkWLFtGtWze+++475syZQ6tWrYiNjaVZs2acPn2a9u3bM3HiRHr27MmYMWOIiooiLi6OPn360L17d6pWrUpUVBRlypRhx44dPPDAA0RHR5OYmMjtt9+ebb3vv/8+ISEhefrsCQkJ1KxZM+N5QEAACQkJJCQkEBAQcMlygIMHD1K9enUAqlevzqFDh/L0XlfLY43CGFMcmAGEA/HAWmPMImttXKbV1gNh1tozxpjBwGvA/XnZ/q4qJ6Eu1Cvowl3o9OkUxo7dzOuvbyctDerWLUtkZEs6dqzm7dJErsq3335Ljx49uOYa52i4W7duAGzatIkxY8Zw/PhxTp06RZcuXTJ+plu3bhhjCA0NpVq1aoSGhgLQqFEj9u7dS7NmzShVqhRdu3YFIDQ0lNKlS1OyZElCQ0PZu3cv4ORIhg4dSmxsLMWLF2f79u0AlC9fntjY2Kv+bBeuO2RmjMlxuTd58oiiNbDTWrsbwBizAOgBZDQKa+3KTOv/APw5rxt/qtca6AULowqoWpdavvwgAwfGsGfPaYoVg6eeupkXXmik4JwUqMv95u+59730SxOcU0yffvopTZs25d1332XVqlUZr5UuXRqAYsWKZTy+8DwlJQWAkiVLZnz5Zl4v8zrTpk2jWrVqbNiwgbS0NMqUKQNQYEcUAQEBv6k7Pj6e9u3bExAQQHx8/G+W33TTTQBUq1aNAwcOUL16dQ4cOEDVqoUzioInr1HUAPZleh6fviwn/YD/ZveCMWagMSbaGBN9+PDhAizRvX799Tx//etawsO/Zs+e0zRtWoE1azoxaVJTNQnxGbfddhuff/45SUlJnDp1iv/85z+A82VdvXp1kpOTee+99zzy3idOnKB69eoUK1aMf/zjH6SmpgIXjyiy+5PXJgHQpUsXli1bxrFjxzh27BjLli2jS5cuVK9enfLly/PDDz9grWX+/Pn06NEDgO7du2fcHTVv3ryM5Z7myUaR3bFStr8eGGP+DIQBk7J73Vobaa0Ns9aGValSpQBLdB9rLR9+uI/g4CW8++5eSpcuxiuvNGbt2k60bKngnPiWVq1a0b17d5o2bcrdd99NWFgYFSpU4MUXX6RNmzaEh4fTsGFDj7x3REQE8+bNo20Oi9D0AAAPO0lEQVTbtmzfvp2yZcvm+WfffPPNjCODJk2a0L9/f8C55nLhccWKFXnuuedo1aoVrVq1YuzYsVSsWBGAWbNm0b9/f+rXr0+9evX4wx/+AMCoUaOIiooiKCiIqKgoRo0aVcCfOgfWWo/8AW4BlmZ6PhoYnc16nYAtQNW8bLdly5bWWmv/L/1/dtky6y/i48/Y7t2/tfChhQ9tu3Yr7LZtJ71dlviouLg4b5dgrbU2MTHRWmvt6dOnbcuWLW1MTIyXKyr6svtvB0TbfH6fe/IcxVogyBhTB0gAegMPZl7BGNMceBvoaq0tnMv3LpSWZomM3M3TT2/k5MkUrruuBJMmNaV//zrKRIjPGzhwIHFxcSQlJdGnTx9atGjh7ZL8jscahbU2xRgzFFiKc3vsO9bazcaY8TidbRHOqaZywEfpF5Z+ttZ291RNbrRtWyIDBkTzzTdOurNHj5uYMaMFNWooEyH+4f333/d2CX7Po1c9rbWLgcVZlo3N9LiTJ9/fzZKT05g0aRvjx8dx7lwa1aqVZvr0FtxzTw2v3yonIv7FtbfHTP6wNaxeA129XUnBi452gnMbN14Mzk2a1JSKFRWcE5HC59pGUe/wdT43u93p0yk8//xmpk1TcE5Eig7XNgpfo+CciBRVrh0UcGb7Lcwc7O0qrt6vv57n4YcvBueaNKnA6tUdFZwTcbE9e/bQpk0bgoKCuP/++zl//ny267366qvUr1+fBg0asHTp0ozlgYGBhIaG0qxZM8LCwjKWa5jxKxTVKIGozt6uIv+stXz00T5CQpbw979fDM5FR3ciLKyit8sTkavw9NNPM2zYMHbs2MENN9zA3LlzL1knLi6OBQsWsHnzZpYsWUJERERG+htg5cqVxMbGEh0dnbFMw4z7kYSEs/Ts+T29ev3AwYPnuP32ymzY0JnRo4MpWVL/SUQyc9sw49ZaVqxYwb333gvkPBz4Z599Ru/evSldujR16tShfv36rFmzJtdt++Qw4/JbaWmW2bN3M3LkxeDca6810WRCUvT17OmZ7S5cmOvLbhxmvGrVqlx//fWUKOF8vWYeJjyzhIQE2rZtm/E883rGGDp37owxhkGDBjFw4EDAB4cZl9/avt0Jzn39tROc6979JmbOVHBOJDduHGY8u4FLs8s+2VyGE//uu++46aabOHToUMZ4Vu3atbvs/vIUNQoPS05OY/LkbbzwghOcq1q1NNOnN+feewMUnBP3uMxv/p6S3ZcpFO1hxoODgzl+/DgpKSmUKFHiN8OEZxYQEMC+fRcH2M683oX/r1q1Kj179mTNmjW0a9fOJ4cZ93vR0b/SqtVynnlmE+fOpdG3byBbtnTlvvtqqkmI5IEbhxk3xtChQwc+/vhjIOfhwLt3786CBQs4d+4ce/bsYceOHbRu3ZrTp0+TmJgIwOnTp1m2bBmNGzfO+BlvDDPu2iOKuofKQ/rOLGrOnHGCc1OnOsG5OnWc4FynTgrOiVyJzMOM165d+5JhxmvXrk1oaGjGF2tBioiI4J577uGjjz6iQ4cOVzTM+MSJE+nduzdjxoyhefPm9OvXD4BFixYRHR3N+PHjadSoEb169SIkJIQSJUowY8YMihcvzsGDB+mZfk0oJSWFBx98MOM02ahRo+jVqxdz586lVq1afPSRZ6aozcrkdGhXVIWFhdno6GiYMQOWL4eICAgP93ZZGb780gnO7d7tBOeGDXOCc2XLurYni5/asmULwcHB3i6DU6dOUa5cOc6cOUO7du2IjIzUCLKXkd1/O2NMjLU2LIcfyZW+vQrIsWPnGT58A3//+14AmjSpwJw5YbRqpUyEyNXQMOPep0Zxlay1fPJJAkOHruPgwXOULl2MsWNDGDGigTIRIgVAw4x7n2sbRc8hy2EILIzyXg0JCWcZMmQdn322H4Dbb6/M7NlhNGhQ3ntFiYgUMNc2Cm9KS7PMmbOHESM2cPJkCuXLO8G5gQMVnBMR36NGcYW2b09k4MAYvvrKCdV061admTNbEBBwrZcrExHxDDWKPEpOTmPKlO2MG7c5Izj3t7815777FJwTEd+mq615EBNzjNatv2T06B8zgnNxcV3o1UvBORG51NUOM/7www9TtWrVjKDdBRpmvAg6cyaFkSM30rr1cmJjjxMYeC3LlrXj739vRaVKpS+/ARHxS1c7zHjfvn1ZsmTJJT+jYcaLmBUrDtGkyTImTdoGwJNP3symTV0ID1e6WqQw+eMw4+3ataNixUszWBpm/AoNXtkQtmyFoILd7rFj5xkxYiNz5+4BIDTUCc61bq3gnPi3nuQ81PhgBtMZZyaxZSxjFrNyXHcheR9g0F+HGc+Jhhm/Qp3jAmB5wTaKTz6JZ+jQ9fzySxKlSl0MzpUqpQMvEW/w12HGixrXNoqCtH//WYYOXc/ChU43v+22ysye3ZKGDa/zcmUiRUdejwQ6p/+vIPjrMOM50TDjV2hZSDzLrnIswLQ0S2TkboKDl7BwYQLly5dg5swWfPVVezUJkSLAH4cZz423hhl3baOY1WErsyLy//M7diTy+99/xaBBMZw8mUK3btWJi+vC4MH1lK4WKSIyDzN+9913XzLM+IXZ3zwhIiKCefPm0bZtW7Zv337Fw4xPnTqV+vXrc/To0d8MMz527FiA3wwz3rVr14xhxgEeeOABbrnlFrZt20ZAQEDGXVOjRo0iKiqKoKAgoqKiGDVqVAF/6uy5dpjxCxfWFkZd2TDjWYNzVao4wblevRScE8lMw4y7l4YZvwrr1h2jX79oYmOPA9CnT22mTGmqTIRIEaZhxr3PLxrFmTMpjBsXx9Sp20lNtQQGXsvbb7ekc+cbvV2aiFyGhhn3Pp9vFCtWHGLgwGh27bow41wQL77YWDPOiYjkkc9+W2YNzjVufB1z57ZScE7kClhrde3OZTxx3dknG0XW4NxzzwUzcmRDBedErkCZMmU4evQolSpVUrNwCWstR48ezch8FBTXNoqFMzrB8uWQ6RbZrMG5W2+txOzZYQQHKxMhcqUCAgKIj4/PNmksRVeZMmUICAgo0G16tFEYY7oCbwDFgTnW2glZXi8NzAdaAkeB+621e/O08e7d4bbbICAAay/MOLeREyeSKVeuBBMnhvLII8pEiORXyZIlqVOnjrfLkCLAY43CGFMcmAGEA/HAWmPMImttXKbV+gHHrLX1jTG9gYnA/Xl6g5o1oWZNdu48xYB7v2LVKue3nj/+sTqzZrWgZk3NOCciUhA8edK+NbDTWrvbWnseWABkzZv3AOalP/4Y6GjyeDI0JSWNiRO3Ehq6lFWrDlOlSmk++KANn39+q5qEiEgB8uSppxrAvkzP44E2Oa1jrU0xxpwAKgFHLrfxu+76lqVLDwLw0EO1mTpVwTkREU/wZKPI7sgg631beVkHY8xAYGD601PGmG3pjysDR+bPh/nz812nr6hMHhqsH9B+cGg/XKR94WiQ3x/0ZKOIB2pmeh4A7M9hnXhjTAmgAvBr1g1ZayOByKzLjTHR+R27xNdoXzi0HxzaDxdpXziMMdH5/VlPXqNYCwQZY+oYY0oBvYFFWdZZBPRJf3wvsMK6bZRCEREf57EjivRrDkOBpTi3x75jrd1sjBkPRFtrFwFzgX8YY3biHEn09lQ9IiKSPx7NUVhrFwOLsywbm+lxEnDfVbzFJaej/Jj2hUP7waH9cJH2hSPf+8F181GIiEjh0uBHIiKSK1c0CmNMV2PMNmPMTmPMJXP/GWNKG2P+lf76amNMYOFX6Xl52A9PGmPijDEbjTFfGmNqe6POwnC5fZFpvXuNMdYY45N3veRlPxhjeqX/vdhsjPHJyR3y8G+jljFmpTFmffq/jzu9UaenGWPeMcYcMsZsyuF1Y4x5M30/bTTG5G0WKGttkf6DcyF8F1AXKAVsAEKyrBMBvJX+uDfwL2/X7aX90AG4Nv3xYF/cD3ndF+nrlQe+Bn4Awrxdt5f+TgQB64Eb0p9X9XbdXtoPkcDg9MchwF5v1+2hfdEOaAFsyuH1O4H/4mTY2gKr87JdNxxReHQoEBe57H6w1q601p5Jf/oDTnbFF+Xl7wTAi8BrQFJhFleI8rIfBgAzrLXHAKy1hwq5xsKQl/1ggQvDSFfg0kyXT7DWfk02WbRMegDzreMH4HpjTPXLbdcNjSK7oUBq5LSOtTYFuDAUiC/Jy37IrB/Obw6+6LL7whjTHKhprf2iMAsrZHn5O3EzcLMx5jtjzA/pIzr7mrzsh3HAn40x8Th3Yj5aOKUVOVf6PQK4Yz6KAhsKxOXy/BmNMX8GwoA7PFqR9+S6L4wxxYBpQN/CKshL8vJ3ogTO6af2OEeY3xhjGltrj3u4tsKUl/3wAPCutXaKMeYWnPxWY2ttmufLK1Ly9V3phiOKKxkKhNyGAnG5vOwHjDGdgGeB7tbac4VUW2G73L4oDzQGVhlj9uKci13kgxe08/pv4zNrbbK1dg+wDadx+JK87Id+wIcA1tr/AWVwxoDyN3n6HsnKDY1CQ4E4Lrsf0k+3vI3TJHzxXPQFue4La+0Ja21la22gtTYQ53pNd2ttvse6KaLy8m/jU5ybHDDGVMY5FbW7UKv0vLzsh5+BjgDGmGCcRuGPU/ctAh5Kv/upLXDCWnvgcj9U5E89WQ0FAuR5P0wCygEfpV/L/9la291rRXtIHveFz8vjflgKdDbGxAGpwAhr7VHvVV3w8rgfhgOzjTHDcE619PXBXyYxxnyAc5qxcvr1mOeBkgDW2rdwrs/cCewEzgB/zdN2fXBfiYhIAXLDqScREfEiNQoREcmVGoWIiORKjUJERHKlRiEiIrlSoxDJI2NMqjEmNtOfQGNMe2PMifRRSbcYY55PXzfz8q3GmMnerl8kv4p8jkKkCDlrrW2WeUH6kPbfWGvvMsaUBWKNMRfGl7qw/BpgvTFmobX2u8ItWeTq6YhCpIBYa08DMUC9LMvPArHkYfA1kaJIjUIk767JdNppYdYXjTGVcMaV2pxl+Q044yt9XThlihQsnXoSybtLTj2lu90Ysx5IAyakDx/RPn35RqBB+vJfCrFWkQKjRiFy9b6x1t6V03JjzM3At+nXKGILuziRq6VTTyIeZq3dDrwKPO3tWkTyQ41CpHC8BbQzxtTxdiEiV0qjx4qISK50RCEiIrlSoxARkVypUYiISK7UKEREJFdqFCIikis1ChERyZUahYiI5EqNQkREcvX/3DiupSfylxUAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "y = digits.target == 9\n", "\n", "X_train, X_test, y_train, y_test = train_test_split(digits.data, y, random_state=0)\n", "\n", "plt.figure()\n", "\n", "for gamma in [1, 0.05, 0.01]:\n", " svc = SVC(gamma=gamma).fit(X_train, y_train)\n", " \n", " accuracy = svc.score(X_test, y_test)\n", " auc = roc_auc_score(y_test, svc.decision_function(X_test))\n", " fpr, tpr, _ = roc_curve(y_test , svc.decision_function(X_test))\n", "\n", " print(\"gamma = {:.2f} accuracy = {:.2f} AUC = {:.2f}\".format(gamma, accuracy, auc))\n", " plt.plot(fpr, tpr, label=\"gamma={:.3f}\".format(gamma))\n", " \n", "plt.xlabel(\"FPR\")\n", "plt.ylabel(\"TPR\")\n", "plt.xlim(-0.01, 1)\n", "plt.ylim(0, 1.02)\n", "plt.legend(loc=\"best\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Multi-class classification\n", "- 다중클래스 분류문제에서 불균형 데이터에 대해서 Accuracy(정확도) 지표는 좋은 지표가 되지 못함.\n", " - 훈련 샘플 비율\n", " - A 클래스: 85%\n", " - B 클래스: 10%\n", " - C 클래스: 5%\n", " - 실제 새로운 데이터도 위와 같은 비율로 출현한다고 하면 아무런 학습이 안된 모델 (Dummy Model)도 85% 정확도를 산출할 수 있음." ] }, { "cell_type": "code", "execution_count": 78, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Shape of Test data: (450,)\n", "Accuracy: 0.953\n", "\n", "Confusion matrix:\n", "[[37 0 0 0 0 0 0 0 0 0]\n", " [ 0 39 0 0 0 0 2 0 2 0]\n", " [ 0 0 41 3 0 0 0 0 0 0]\n", " [ 0 0 1 43 0 0 0 0 0 1]\n", " [ 0 0 0 0 38 0 0 0 0 0]\n", " [ 0 1 0 0 0 47 0 0 0 0]\n", " [ 0 0 0 0 0 0 52 0 0 0]\n", " [ 0 1 0 1 1 0 0 45 0 0]\n", " [ 0 3 1 0 0 0 0 0 43 1]\n", " [ 0 0 0 1 0 1 0 0 1 44]]\n" ] } ], "source": [ "from sklearn.metrics import accuracy_score\n", "\n", "X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target, random_state=0)\n", "\n", "lr = LogisticRegression().fit(X_train, y_train)\n", "pred = lr.predict(X_test)\n", "\n", "print(\"Shape of Test data: {}\".format(y_test.shape))\n", "print(\"Accuracy: {:.3f}\".format(accuracy_score(y_test, pred)))\n", "print()\n", "print(\"Confusion matrix:\\n{}\".format(confusion_matrix(y_test, pred)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 다중 클래스 예측 결과에 대한 confusion matrix \n", " - 행: 정답 레이블\n", " - 열: 예측 레이블\n", "- 위 confusion matrix에서 레이블 0에 대한 해석\n", "$\n", "\\begin{bmatrix}\n", " TN & FP \\\\\n", " FN & TP\n", "\\end{bmatrix}\n", "=\n", "\\begin{bmatrix}\n", " 413 & 0 \\\\\n", " 0 & 37\n", "\\end{bmatrix}\n", "$\n", " - 클래스 0에 대해서는 거짓 음성(FN)이 없음\n", " - 첫번째 행(예측 레이블 행)에서 다른 항목들이 모두 0\n", " - 클래스 0에 대해서는 거짓 양성(FP)이 없음\n", " - 첫번째 열(정답 레이블 열)에서 다른 항목들이 모두 0\n", " - Accuracy = 1.0\n", " - Precision = 1.0\n", " - Recall = 1.0\n", " - F1-score = 1.0\n", "
\n", "- 위 confusion matrix에서 레이블 1에 대한 해석 $\n", "\\begin{bmatrix}\n", " TN & FP \\\\\n", " FN & TP\n", "\\end{bmatrix}\n", "=\n", "\\begin{bmatrix}\n", " 402 & 5 \\\\\n", " 4 & 39\n", "\\end{bmatrix}\n", "$\n", " - 클래스 1에 대해서는 거짓 음성(FN)이 4건\n", " - 클래스 1에 대해서는 거짓 양성(FP)이 5건\n", " - Accuracy = (402+39)/450 = 0.98\n", " - Precision = 39/(39+5) = 0.89\n", " - Recall = 39/(4+39) = 0.91\n", " - F1-score = 2 x 0.89 x 0.91 / (0.89 + 0.91) = 0.90\n", "\n", "\n", "- 위 confusion matrix에서 레이블 7에 대한 해석 $\n", "\\begin{bmatrix}\n", " TN & FP \\\\\n", " FN & TP\n", "\\end{bmatrix}\n", "=\n", "\\begin{bmatrix}\n", " 402 & 0 \\\\\n", " 3 & 45\n", "\\end{bmatrix}\n", "$\n", " - 클래스 7에 대해서는 거짓 음성(FN)이 3건\n", " - 클래스 7에 대해서는 거짓 양성(FP)이 0건\n", " - Accuracy = (402+45)/450 = 0.99\n", " - Precision = 45/45 = 1.0\n", " - Recall = 45/(3+45) = 0.94\n", " - F1-score = 2 x 1.0 x 0.94 / (1.0 + 0.94) = 0.97" ] }, { "cell_type": "code", "execution_count": 71, "metadata": { "collapsed": false, "hide_input": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAQYAAAEWCAYAAACE4zmnAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJztnXl4FWWavu83hNDsiCKKaAOytMIoaxAhhCUI9tAq044jgoxDoz/UtrVl5CeKC4IboDQDKoO73aIiiK2ibNJBoBEMm7LTgCIISqBRAZFA3vmjKphwkpPDOfUlp/C9r6suzqn66qnnfJzzprbvKVFVDMMwCpNS3gYMw0g+rDAYhhGBFQbDMCKwwmAYRgRWGAzDiMAKg2EYEVhhOMUQkcoi8q6IfCsibyag009E5gTprbwQkQwR2VjePsKE2H0M5YOIXAfcCfwK+B5YBTysqosS1L0euA24VFWPJmw0yRERBZqo6j/K28uphO0xlAMicifwJ+ARoC5wHvA0cGUA8r8ENv0cikIsiEhqeXsIJapqUxlOQE3gAPDvUdpUwiscX/nTn4BK/rIuwA5gCPANsAv4L3/ZCOAIkOdv43fAg8BfCmk3ABRI9d/fAGzF22vZBvQrNH9RofUuBT4BvvX/vbTQsmxgJLDY15kDnFHCZyvwP7SQ/6uAXwObgH3APYXapwNLgP1+24lAmr/sI/+zHPQ/738U0v//wG7gzwXz/HXO97fR2n9fD8gFupT3dyOZpnI38HObgF7A0YIfZgltHgI+Bs4E6gB/B0b6y7r46z8EVPR/UIeA0/zlJxaCEgsDUBX4DmjmLzsbaO6/Pl4YgNrAP4Hr/fX6+u9P95dnA1uApkBl//1jJXy2Av/3+/5vBPYAU4DqQHPgMNDIb98GuMTfbgNgPXBHIT0FGhej/zhega1cuDD4bW70daoAs4Gx5f29SLbJDiXKntOBXI2+q98PeEhVv1HVPXh7AtcXWp7nL89T1ffx/lo2i9NPPtBCRCqr6i5VXVtMm38FNqvqn1X1qKq+BmwAflOozYuquklVfwCmAi2jbDMP73xKHvA6cAYwXlW/97e/FrgIQFWXq+rH/nY/B/4XyIzhMz2gqj/6foqgqs8Cm4GleMXw3lL0fnZYYSh79gJnlHLsWw/4otD7L/x5xzVOKCyHgGona0RVD+Ltfg8GdonITBH5VQx+CjydU+j97pPws1dVj/mvC364Xxda/kPB+iLSVETeE5HdIvId3nmZM6JoA+xR1cOltHkWaAFMUNUfS2n7s8MKQ9mzBG9X+aoobb7CO4lYwHn+vHg4iLfLXMBZhReq6mxV7YH3l3MD3g+mND8FnnbG6elkeAbPVxNVrQHcA0gp60S91CYi1fDO2zwPPCgitYMweiphhaGMUdVv8Y6vnxKRq0SkiohUFJHLRWS03+w1YLiI1BGRM/z2f4lzk6uAziJynojUBIYVLBCRuiJyhYhUBX7EOyQ5VozG+0BTEblORFJF5D+AC4H34vR0MlTHOw9ywN+bufmE5V8DjU5SczywXFUHATOBSQm7PMWwwlAOqOqTePcwDMc78fYl8Hvgbb/JKCAH+BT4DFjhz4tnW3OBN3yt5RT9MafgXd34Cu9MfSZwSzEae4Heftu9eFcUeqtqbjyeTpL/Bq7Du9rxLN5nKcyDwMsisl9ErilNTESuxDsBPNifdSfQWkT6Beb4FMBucDIMIwLbYzAMIwIrDIZhRGCFwTCMCKwwGIYRQVINMElLS9PKlSsHqtmkSZNA9QwjzCxfvjxXVeuU1i6pCkPlypXp2LFjoJrvv/9+oHqGEWZE5MQ7WIvFDiUMw4jACoNhGBFYYTAMIwIrDIZhRGCFwTCMCJK+MFSsWJFx48YxceJEnnnmGfr188a6jB49mgkTJjBhwgT+/Oc/c9999yW0nVmzZtGsWTMaN27MY489FoR1J5qm607TdAvhMh4KbxTbRuAfwN2lta9Ro4ZefvnlEVOfPn308ssv1969e+uGDRv0jjvuKLJ80aJFOmbMmGLXjYWjR49qo0aNdMuWLfrjjz/qRRddpGvXro1p3bLUNN3weU02XSBHyzPaTUQqAE8Bl+ON3e8rIhfGo3X4sBfGk5qaSoUKFYosq1y5MhdddBFLliyJ2+uyZcto3LgxjRo1Ii0tjWuvvZa//vWvceu50jTd8HkNoy64PZRIB/6hqltV9Qhetl9c8egpKSlMmDCBKVOmsHLlSjZu/OnZIR06dGD16tX88ENEtF/M7Ny5k3PPPff4+/r167NzZ2LhRC40TdedpukWxWVhOAcvgKSAHRTNCARARG4SkRwRyTly5EixQvn5+dx2220MGDCApk2b8stf/pQy1qVLFxYsWJCQUS0mk0KktPSwstc0XXeaplsUl4WhOIcRn0RVJ6tqW1Vtm5aWFlXw4MGDfPbZZ7Rp0waA6tWr07RpU5YtW5aQ0fr16/Pllz/VsB07dlCvXr0oa5SPpum60zTdorgsDDuAcwu9r08cgaY1atSgatWqAKSlpdGyZUt27NgBQEZGBsuWLSMvLy8ho+3atWPz5s1s27aNI0eO8Prrr3PFFVcknabphs9rGHXB7SCqT4AmItIQL034WrzsvpOidu3aDBkyhJSUFESEhQsXHt9D6Ny5M2++GfdzW4+TmprKxIkT6dmzJ8eOHWPgwIE0b9486TRNN3xew6gLjjMfReTXeDHdFYAXVPXhaO1r1qypNrrSMNwhIstVtW1p7ZwOu1bvKUn2yzSMkJH0dz4ahlH2WGEwDCMCKwyGYURghcEwjAisMBiGEUFShcE2adIk8MuLXbp0CVSvgOzsbCe6BgmNeymJoNPHC3DhFdz5jRXbYzAMIwIrDIZhRGCFwTCMCKwwGIYRgRUGwzAisMJgGEYEoSsMQaXipqWl8cwzz/Dcc8/x4osvcsMNNwDQqlUrJk+ezIsvvsjdd98dkTFZHl5Ntyg7duygV69etGrVijZt2vDUU08F4NLDRR+EzS/gLiUaeAH4BlgT6zpt2rQJPBU3MzOzxKlXr16amZmp3bp107Vr1+ott9yiX3/9tfbr108zMzP1pZde0scff7zYdUsjmZKBw6Z76NChqNOWLVt08eLFeujQIf3666+1cePGunz58qjrlJfXZPNLeadEAy/hxccHRtCpuAU3p6SmppKamkp+fj55eXnHE6JycnLo3LlzUng13Z84++yzadWqFeDF+zVr1oyvvjrpcLAy8Qrh8wsODyVU9SNgX5CaQafipqSk8Nxzz/H222+Tk5PD+vXrqVChAs2aNQMgMzOTM888Mym8mm7xfPHFF6xevZp27dolrOXaK4THb7nfEi0iNwE3AZx33nlR22rAqbj5+fkMGjSIatWqMXLkSBo2bMhDDz3ErbfeSsWKFcnJyeHYsWNxaQft1XQjOXDgAH379mX06NHUqFEjYT2XXiFcfsu9MKjqZGAyQNu2baPmzLlKxT1w4ACrVq0iPT2dN954gz/84Q/4fqhfv35cmmFLBg6bbl5eHtdddx3XXnstV111VcJ64DZ1OWx+Q3VVIshU3Jo1a1KtWjXAu0LRpk0btm/fTq1atQDvmZl9+/blnXfeKXevplsUVeXmm2+mWbNmx4t4ELjqg7D5hSTYYzgZgkzFPf300xk2bBgpKSmkpKTwt7/9jSVLljB48GA6dOiAiPDOO++wcuXKcvdqukVZsmQJU6ZMoUWLFrRv3x6AESNG0KtXYue6XfVB2PyCw5RoEXkN6AKcAXwNPKCqz0dbp23btpqTkxOoDxt2HT5s2LU7v+WeEq2qfV1pG4bhllCdYzAMo2ywwmAYRgRWGAzDiMAKg2EYEYTqcmU8uLp6UHDZKUjmzp0buCYQyF12ZUl5B6GeDGHyejLYHoNhGBFYYTAMIwIrDIZhRGCFwTCMCKwwGIYRgRUGwzAisMJgGEYEoSsMYUgyTklJ4ZVXXuGJJ54A4Oqrr2batGksXbqUmjVrJqR9+PBhunbtSseOHWnfvj2PPPJIQnqFCUPfutQ03ULEkhgbzwScC/wNWA+sBW4vbR0XKdGxEI9uenp6idO4ceN01qxZunDhQk1PT9f+/fvrlVdeqTt37tQePXqUuN63335b6rR//37duXOnfvvtt5qbm6tt2rTRefPmRV3HVR+Ul26YvCabLkmQEn0UGKKqFwCXALeKyIWJCIYhyfjMM8+kY8eORdbftGkTu3btStgneJl+BclTeXl55OXlBZLzF4a+DaPXMOqC25ToXaq6wn/9Pd6ewzmJaIYhyfiPf/wjEydOLDaoMyiOHTtGp06daNy4MV27dqVt21JzN0olDH3rUtN0i1Im5xhEpAHQClhazLKbRCRHRHL27NkTVae4H1syJRl37NiRffv2sWHDhoQ9RaNChQosWrSIdevWsWLFCtatW5ewZrL3rWtN0y2K88IgItWA6cAdqvrdictVdbKqtlXVtnXq1ImqlexJxhdffDGdO3dmxowZjBo1irZt2/Lggw8m7K8katWqRadOnZg3b17CWsnet641TbcoTguDiFTEKwqvqupbieole5Lx008/zW9+8xv69OnD8OHDycnJCbww5Obmsn//fsDLG8zOzqZp06YJ6yZ734bVaxh1weGwa/H2aZ4H1qvqk0FohinJuDDXXHMN119/PbVr1+bVV1/l73//e9yXGXfv3s3gwYPJz88nPz+fPn36JJw2DOHq2zB5DaMuuE2J7gQsBD4D8v3Z96jq+yWt4yIl2hWWx2CEkWRIiV4EBPd8L8MwyozQ3floGIZ7rDAYhhGBFQbDMCKwwmAYRgSnfEq0KxYvXhy4ZqtWrQLXBPjss8+c6BruOHr0aLlu3/YYDMOIwAqDYRgRWGEwDCMCKwyGYURghcEwjAisMBiGEUHoCkOYQjUHDRpEvXr1aNmyZSB6KSkpTJ06lYkTJwIwYsQIpk2bxvTp03niiScSfsBqmPo2TF5d6Qb9/SpCLMGQ8UzAL4BlwGq8MNgRpa0TpjDYvLy8Uqf58+fr0qVLtXnz5jG1b9GiRdRp9OjROnPmTM3OztYWLVpo+/btjy97+eWXddy4ccWu56oPyks3TF7j1XXx/crLy0uKMNgfgW6qejHQEuglIpckIhi2UM2MjAxq166dsA5A3bp1ycjIYPr06cfnHTx48PjrSpUqJZQzGaa+DZNXl7pBfr9OxGUYrKrqAf9tRX9KKPwhjKGaQTF06FDGjRtHfn5+kfkjR44kOzubhg0bMmXKlLj1w9S3YfLqUtclrqPdKojIKuAbYK6qntJhsK7o3Lkz+/btKzb09b777qNbt25s3bo1oSSnMPVtmLy61HWJ08KgqsdUtSVQH0gXkRbFtDllwmBd0apVK7p27cqsWbMYM2YM6enpPProo8eX5+fnM3v2bLKysuLeRpj6NkxeXeq6pEyuSqjqfiAbSCicMIyhmkEwfvx4srKy6NWrF3fddRfLli1j2LBhRXZPMzMz2bZtW9zbCFPfhsmrS12XuAyDrQPkqep+EakMZAGPJ6IZtlDN/v37s2DBAnJzc2nQoAH3338/AwcOTFgXvF3Rhx9++PhTqTZt2sTIkSPj1gtT34bJq0tdp9+vRM5kRxUWuQh4GaiAt2cyVVUfirZOmMJgXQyLtWHXRgGuhl1XrFix3MNgP8V7+pRhGCEjdHc+GobhHisMhmFEYIXBMIwIrDAYhhFBiScfRSTqc820mCdXG4ZxahDtqsRavLENhe/dLHivwHkOfSU9qanBX9BxdVmxR48eTnRdPWvTcPP9Oqntl7RAVc8taZlhGKc2MZ1jEJFrReQe/3V9EWnj1pZhGOVJqYVBRCYCXYHr/VmHgEkuTRmGUb7EciBzqaq2FpGVAKq6T0TSHPsyDKMcieVQIk9EUvBDVkTkdCA/+iqGYYSZWArDU8B0oI6IjAAWkeAoScMwkptSC4OqvgIMB8YC+4B/V9XXXRsriTCl+Ca714oVKzJhwgQmTZrEs88+y4ABAwBvlOfTTz/NpEmTGDduXMKhIj/Hvg27bqyJzxcBtwA3AxfFsk6hdSsAK4H3SmsbppTo8tCMVzcrK6vEqXfv3pqVlaU9e/bUdevW6W233aZffvmlDhw4ULOysnT8+PE6e/bsYtctr35Ipr4Nmy5BpUSLyL3Aa0A9vIi2KSIy7CRqz+3A+pMpViURphTfsHg9fPgw4N1Qk5qaevyLUaVKFQCqVq3K3r17k8avK03TLUos5xj6A+1Udbiq3gukAwNiEReR+sC/As/Fb/EnwpTiGxavKSkpTJo0iTfffJMVK1awYcMGnnzySR5++GGmTJlCVlYWr78e/5Hjz7lvw6oLsRWGLyh6WTMV2Bqj/p+AoUS5inGqpkSHxWt+fj6DBw+mb9++NGvWjAYNGvDb3/6We++9l+uuu47Zs2czePDgpPHrStN0i1JiYRCRcSLyJN4NTWtF5DkReRb4DNhfmrCI9Aa+UdXl0drpKZoSHSav4D28ZvXq1bRr145GjRqxYcMGALKzs7nwwguTym/Y+jZsuhB9j2EN3kCqmcCDwBLgY+AhYH4M2h2BK0Tkc+B1oJuI/CURs2FK8Q2D15o1a1K1alUA0tLSaN26Ndu3b6dq1aqcc845ALRp04bt27cnhV+XmqZblGiDqJ5PRFhVhwHDAESkC/Dfqto/Ec0wpfiGwWvt2rUZOnQoKSkpiAgfffQRS5cuZdy4cTzwwAPk5+dz4MABxo4dmxR+XWqablFKTYkWkfOBh4EL8R5UC4CqNo15Iz8Vht7R2oUpJTpM2LBrowARiSklOpaTjy8BL+LlMFwOTMU7NIgZVc0urSgYhpE8xFIYqqjqbABV3aKqw/FGWxqGcYoSy+jKH8W7BrJFRAYDO4Ez3doyDKM8iaUw/BGoBvwB71xDTSCY52AZhpGUlFoY9KdH13/PT2EthmGcwkRLiZ6Bn8FQHKr6b04cGYZR7kTbY5hYZi4c4urhoOWd4nsyuLqsePbZZzvR3bVrlxNdI3ai3eD0YVkaMQwjebAnURmGEYEVBsMwIoi5MIhIJZdGDMNIHmJJcEoXkc+Azf77i0VkgnNnhmGUG7HsMfwP0BvYC6Cqq7Fbog3jlCaWwpCiql+cMO+YCzOx4CIVd9CgQdSrV4+WLVsGoldA2JKBg9RNSUlhzpw5vPLKKwC8/fbbzJ07l7lz57Jy5UpefPHFpPFqusVQWlos3jMl0oEVeInPdwBvxpI0C3yOl/i0ihjSaV2kROfl5ZU6zZ8/X5cuXarNmzePqX1eXl7UbcbrNRaSSfess84qcXrggQd0+vTpOmfOnIhl7733nt52220lrhumPgibbiy/Q40lJRovMv5OvMfefw1c4s+Lla6q2lJjGANeGq5ScTMyMqhdu3bCOoUJWzJwkLpnn3023bt3Z8qUKRHLqlatSseOHfnggw+SwqvpFk8sD5z5RlWvVdUz/OlaVc0NZOsnictU3KAJWzJwkLoPPfQQo0aNIj8/MgP417/+NYsWLeLAgQNJ4dV0i6fU+3r9ANiIMROqelMM+grMEREF/ldVJxejfxNwE8B5550XXcxhKm7QuPKa7LpZWVnk5uby6aef0qFDh4jlV111VbF7EidDsvdB2HUhtmHX8wq9/gXQB/iyhLYn0lFVvxKRM4G5IrJBVT8q3MAvFpPBi3aLJuYyFTdowpYMHJRueno6l112Gd27d6dSpUpUr16diRMn8vvf/57TTjuNli1bMnBgYqP2k70Pwq4LxPaIusIT3uHHh3Gs9yBe7mPcJx/z8vK0YcOGunXr1uMnW9asWVPqOrFMmzdvDvTkYzxeYyGZdKOdfDzrrLO0T58+RU4+Dh06VN94441S1wtTH4RNlxhPPsYzRLAh8MvSGolIVbxLnd/7ry/Di56PG1epuP3792fBggXk5ubSoEED7r///oT/qoUtGdhl4nABV155JRMnJj5oN2x9EDZdiC0l+p/8dI4hBe+J13er6tRS1msEzPDfpgJTVPXhaOu4SIm2YdfusGHX4SPWlOio324/6/FivJxHgHwtrZL4qOpWf13DMEJG1MuVfhGYoarH/CmmomAYRriJ5QanZSLS2rkTwzCShmiZj6mqehToBNwoIluAg3gPnlFVtWJhGKco0c4xLANaA1eVkRfDMJKEaIVBwHv6VBl5cYJdPXCHq6sHLu5mtdNjJ0e0X00dEbmzpIWq+qQDP4ZhJAHRCkMFvCdQJedgBMMwnBGtMOxS1YTuVDQMI5xEu1xpewqG8TMlWmHoXmYuDMNIKkosDKq6ryyNGIaRPNgDZwzDiCB0hSFMabth8hoG3W3btvHpp5+ycuVKPvnkEwBGjx7N+vXrWb16NW+99RY1a9ZMCq9h1z3poJaTmYBawDRgA7Ae6BCtvYuU6FhwoRsmr8mmizfMP2Latm2bnn766UXm9ejRQytUqKCAPvbYY/rYY48Vu27Y+sCVLgGmRCfCeGCWqv4Kbwj2+kTEwpS2GyavYdQtYO7cuRw75j3m5OOPP6Z+/fpxa4WtD8o1JTpeRKQG0Bl4HkBVj6jq/kQ0w5S2GyavYdFVVebMmUNOTg433nhjxPKBAwcmFEsfhj4oC12ILQw2XhoBe4AXReRiYDlwu6oeLNwoGVKiXeiGyWtYdDt27MiuXbuoU6cOc+fOZcOGDSxcuBCAe+65h6NHj/Lqq68mhdcw64Lbk4+peKMzn1HVVnhDtu8+sZGqTlbVtqratk6dOlEFw5S2GyavYdEtGLS1Z88eZsyYQXp6OgADBgygd+/e9OvXL2m8hlkXcHfyETgL+LzQ+wxgZrR1XKREx4IL3TB5TTZdijl5WKVKFa1Wrdrx14sXL9aePXtqz549de3atXrGGWeUeNKSGE8+JlMfuNIlxpOPrq9KLASa+a8fBMZEa19aYVBVnTlzpjZp0kQbNWqko0aNKrV9rLjQDZPXZNIt7ofdsGFDXbVqla5atUrXrFmj99xzjwK6efNm3b59u65cuVJXrlypzzzzTNyFIR6vYdONtTCUmhKdCCLSEngOSAO2Av+lqv8sqb2LlGgjfFgegzsCSYlOFFVdBST8MFvDMMqW0N35aBiGe6wwGIYRgRUGwzAisMJgGEYEp3yEcpieXenKqytcJXC7uIJw/vnnB64JsGVLqEPUS8T2GAzDiMAKg2EYEVhhMAwjAisMhmFEYIXBMIwIrDAYhhFB6AqDi/DLQYMGUa9ePVq2bBmIXgGugjpd+HXVBxCOoN2UlBTeeecdnn32WcALmc3Ozubdd9/l3Xff5YILLkgqv651XQ65bgasKjR9B9wRbR0XYbB5eXmlTvPnz9elS5dq8+bNY2qfl5dX2uhWZ17j9VsefRBvP7jQbNSoUdRp1KhR+te//lU//PBDbdSokU6bNk1vueWWUtcrrz6IV5fyDoNV1Y2q2lJVWwJtgEPAjEQ0XYVfZmRkULt27YR1CuMyqNOFXxeaEI6g3bPOOouuXbsyderUhHyVhIXBlkx3YIuqfpGIiMvwy6AJk1eXhCFod/jw4Tz++OPk5+cXmT9kyBBmzpzJvffeS1paWtL4da0LZVcYrgVeK26BiNwkIjkikrNnz56oIuow/DJowuTVJS76IUjNrl27snfvXtasWVNk/pgxY+jRowd9+vShVq1a3HTTTXHpg4XBFouIpAFXAG8Wt1yTIAzWBWHy6pJkD9pt06YN3bt3Z8GCBYwfP54OHTrwxBNPUPBH6siRI0ybNo2LL744KfyWhS6UzR7D5cAKVf06UaF27dqxefNmtm3bxpEjR3j99de54oorArAYPGHy6hIX/RCk5tixY+nUqROZmZncfvvtLFmyhCFDhlD4j1SPHj3YtGlTUvgtC10om8LQlxIOI06W1NRUJk6cSM+ePbngggu45ppraN68ecK6/fv3JyMjg40bN9KgQQNeeOGFpPUKbvy60AQ3/eCybwsYN24c77//Ph988AGnnXYaTz31VNxarvy67AfXYbBVgC+BRqr6bWntXYTB2rBrd7gadu0CG3btkSxhsIeA011uwzCM4AndnY+GYbjHCoNhGBFYYTAMIwIrDIZhRGCFwTCMCMJzvSlODh065ES3SpUqgWuG6fJf2HB1WfFf/uVfnOiuXLnSiW6s2B6DYRgRWGEwDCMCKwyGYURghcEwjAisMBiGEYEVBsMwIghdYXCRinv48GG6du1Kx44dad++PY888kggumFLnw6Tbli8pqSkMHXqVCZOnAjAiBEjmDZtGtOnT+eJJ56gcuXKcWu7TPZ2WhhE5I8islZE1ojIayLyi0T0jh07xq233soHH3zAunXreO2111i3bl3CPitVqsS7777L4sWLWbRoEfPmzeOTTz5JWPc///M/ee+99xLWKYyrPgiTbpi89u/fn23bth1/P3r0aK6++mp++9vfsnv3bq677rq4tV18vwpwVhhE5BzgD0BbVW0BVMDLfowbV6m4IkK1atUAyMvLIy8vL5DsvDClT4dJNyxe69atS0ZGBtOnTz8+7+DBg8dfV6pUqdjcxlhxlewN7g8lUoHKIpIKVAG+SkTMZSrusWPH6NSpE40bN6Zr1660bVtqlkW5ELbE4TCkRLvSHTp0KOPGjYtInx45ciTZ2dk0bNiQKVOmxK3vEpfPldgJjAW2A7uAb1V1zontkiUlukKFCixatIh169axYsWKQHZNXRC2xOFkT4l2pdu5c2f27dtX7Pfovvvuo1u3bmzdupVevXrFpe8al4cSpwFXAg2BekBVEel/YrtkS4muVasWnTp1Yt68eYHqBkXYEoeTPSXa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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "scores_image = mglearn.tools.heatmap(\n", " confusion_matrix(y_test, pred), xlabel='Predicted label',\n", " ylabel='True label', xticklabels=digits.target_names,\n", " yticklabels=digits.target_names, cmap=plt.cm.gray_r, fmt=\"%d\")\n", "\n", "plt.title(\"Confusion matrix\")\n", "plt.gca().invert_yaxis()" ] }, { "cell_type": "code", "execution_count": 72, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " 0 1.00 1.00 1.00 37\n", " 1 0.89 0.91 0.90 43\n", " 2 0.95 0.93 0.94 44\n", " 3 0.90 0.96 0.92 45\n", " 4 0.97 1.00 0.99 38\n", " 5 0.98 0.98 0.98 48\n", " 6 0.96 1.00 0.98 52\n", " 7 1.00 0.94 0.97 48\n", " 8 0.93 0.90 0.91 48\n", " 9 0.96 0.94 0.95 47\n", "\n", "avg / total 0.95 0.95 0.95 450\n", "\n" ] } ], "source": [ "print(classification_report(y_test, pred))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 관심있는 클래스를 양성, 그 외의 모든 클래스는 음성으로 두고 precision, recall, f1-score 계산" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- [NOTE] 다중 분류에서 불균형 데이터셋을 위해 가장 많이 사용되는 지표는 f1-score\n", "- 클래스별로 f1-score를 산출한 이후, 전체 클래스에 대한 평균 f1-score 산출 전략 (다중 클래스일 때 반드시 아래 세 개의 항목 중 하나를 average 파라미터 값으로 제시해야 함)\n", " - macro 평균\n", " - 클래스별 f1-score에 가중치를 고려하지 않음\n", " - weighted 평균 (보통은 이것을 선택)\n", " - 클래스별 테스트 데이터 샘플 수로 가중치를 두어 f1-score 계산 (classification_report에 노출되는 값)\n", " - micro 평균\n", " - 모든 클래스별로 FP, FN, TP의 총 수를 헤아린 다음 산출" ] }, { "cell_type": "code", "execution_count": 73, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Macro average f1 score: 0.954\n", "Weighted average f1 score: 0.953\n", "Micro average f1 score: 0.953\n" ] } ], "source": [ "print(\"Macro average f1 score: {:.3f}\".format(f1_score(y_test, pred, average=\"macro\")))\n", "\n", "print(\"Weighted average f1 score: {:.3f}\".format(f1_score(y_test, pred, average=\"weighted\")))\n", "\n", "print(\"Micro average f1 score: {:.3f}\".format(f1_score(y_test, pred, average=\"micro\")))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Regression metrics\n", "- [note]: http://scikit-learn.org/stable/modules/model_evaluation.html#regression-metrics\n", "

\n", "- **Explained variance score**\n", "![...](http://scikit-learn.org/stable/_images/math/494cda4d8d05a44aa9aa20de549468e4d121e04c.png)\n", "\n", " - $\\hat{y}$: the estimated target output\n", " - $y$: the corresponding (correct) target output\n", " - $Var$: Variance" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- **Mean absolute error**\n", "![...](http://scikit-learn.org/stable/_images/math/c38d771fb5eb121916c06cf8c651363583d17794.png)\n", "\n", " - $\\hat{y}_i$: the predicted value of the $i$-th sample \n", " - $y_i$: the corresponding (correct) target output\n", " - $n_{samples}$: the number of target samples" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- **Mean squared error**\n", "![...](http://scikit-learn.org/stable/_images/math/44f36557fef9b30b077b21550490a1b9a0ade154.png)\n", "\n", " - $\\hat{y}_i$: the predicted value of the $i$-th sample \n", " - $y_i$: the corresponding (correct) target output\n", " - $n_{samples}$: the number of target samples" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- **Mean squared logarithmic error**\n", "![...](http://scikit-learn.org/stable/_images/math/7ab9dd9a29d207d773d08e4d1a0fc370f9b1fa35.png)\n", " - This metric is best to use when targets having exponential growth, such as population counts, average sales of a commodity over a span of years etc.\n", " - $\\hat{y}_i$: the predicted value of the $i$-th sample \n", " - $y_i$: the corresponding (correct) target output\n", " - $n_{samples}$: the number of target samples" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- **Median absolute error**\n", "![...](http://scikit-learn.org/stable/_images/math/9252f9de0d8c2043cf34a26e6f2643a6e66540b9.png)\n", " - It is particularly interesting because it is robust to outliers.\n", " - The loss is calculated by taking the median of all absolute differences between the target and the prediction.\n", " - $\\hat{y}_i$: the predicted value of the $i$-th sample \n", " - $y_i$: the corresponding (correct) target output" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- **$R^2$ score (the coefficient of determination)**\n", "![...](http://scikit-learn.org/stable/_images/math/bdab7d608c772b3e382e2822a73ef557c80fbca2.png)\n", " - where \n", "![...](http://scikit-learn.org/stable/_images/math/4b4e8ee0c1363ed7f781ed3a12073cfd169e3f79.png)\n", " - It provides a measure of how well future samples are likely to be predicted by the model.\n", " - $\\hat{y}_i$: the predicted value of the $i$-th sample \n", " - $y_i$: the corresponding (correct) target output" ] }, { "cell_type": "code", "execution_count": 103, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "explained_variance_score: 0.9571734475374732\n", "mean_absolute_error: 0.5\n", "mean_squared_error: 0.375\n", "mean_squared_log_error: 0.12803912255571967\n", "median_absolute_error: 0.5\n", "r2_score: 0.9486081370449679\n" ] } ], "source": [ "from sklearn.metrics import explained_variance_score\n", "from sklearn.metrics import mean_absolute_error\n", "from sklearn.metrics import mean_squared_error\n", "from sklearn.metrics import mean_squared_log_error\n", "from sklearn.metrics import median_absolute_error\n", "from sklearn.metrics import r2_score\n", "\n", "y_test = [3, -0.5, 2, 7]\n", "y_pred = [2.5, 0.0, 2, 8]\n", "\n", "print(\"explained_variance_score:\", explained_variance_score(y_test, y_pred))\n", "print(\"mean_absolute_error:\", mean_absolute_error(y_test, y_pred))\n", "print(\"mean_squared_error:\", mean_squared_error(y_test, y_pred))\n", "print(\"mean_squared_log_error:\", mean_squared_log_error(y_test, y_pred))\n", "print(\"median_absolute_error:\", median_absolute_error(y_test, y_pred))\n", "print(\"r2_score:\", r2_score(y_test, y_pred))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- [NOTE]: 전형적인 교차검증을 활용한 Regression 모델 구성 및 성능 측정 " ] }, { "cell_type": "code", "execution_count": 124, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "X shape: (200, 1)\n", "y shape: (200,)\n", "X_train shape: (150, 1)\n", "X_test shape: (50, 1)\n", "\n", "Best cross-validation accuracy: 0.67\n", "Best parameters:\n", "{'alpha': 0.1, 'learning_rate': 0.1}\n", "Best estimator:\n", "GradientBoostingRegressor(alpha=0.1, criterion='friedman_mse', init=None,\n", " learning_rate=0.1, loss='ls', max_depth=3, max_features=None,\n", " max_leaf_nodes=None, min_impurity_decrease=0.0,\n", " min_impurity_split=None, min_samples_leaf=1,\n", " min_samples_split=2, min_weight_fraction_leaf=0.0,\n", " n_estimators=100, presort='auto', random_state=None,\n", " subsample=1.0, verbose=0, warm_start=False)\n", "Test set score: 0.62\n", "\n", "explained_variance_score: 0.6333933570920071\n", "mean_absolute_error: 0.4410440244803421\n", "mean_squared_error: 0.2945365131871811\n", "median_absolute_error: 0.37617245551529926\n", "r2_score: 0.6195689836183305\n" ] } ], "source": [ "import warnings\n", "warnings.filterwarnings('ignore')\n", "from sklearn.ensemble import GradientBoostingRegressor\n", "\n", "X, y = mglearn.datasets.make_wave(n_samples=200)\n", "print(\"X shape: {}\".format(X.shape))\n", "print(\"y shape: {}\".format(y.shape))\n", "\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)\n", "print(\"X_train shape: {}\".format(X_train.shape))\n", "print(\"X_test shape: {}\".format(X_test.shape))\n", "\n", "print()\n", "\n", "param_grid = { \n", " 'learning_rate': [0.001, 0.01, 0.1, 1, 10, 100],\n", " 'alpha': [0.1, 0.3, 0.5, 0.7, 0.9]\n", "}\n", "\n", "estimator = GradientBoostingRegressor()\n", "\n", "grid_search = GridSearchCV(\n", " estimator = estimator, \n", " param_grid = param_grid, \n", " n_jobs = -1, \n", " cv = 5, \n", " return_train_score = True\n", ")\n", "\n", "grid_search.fit(X_train, y_train)\n", "print(\"Best cross-validation accuracy: {:.2f}\".format(grid_search.best_score_))\n", "print(\"Best parameters:\\n{}\".format(grid_search.best_params_))\n", "print(\"Best estimator:\\n{}\".format(grid_search.best_estimator_))\n", "\n", "print(\"Test set score: {:.2f}\".format(grid_search.score(X_test, y_test)))\n", "\n", "y_pred = gbr.predict(X_test)\n", "\n", "print()\n", "\n", "# Possible scoring\n", "print(\"explained_variance_score:\", explained_variance_score(y_test, y_pred))\n", "print(\"mean_absolute_error:\", mean_absolute_error(y_test, y_pred))\n", "print(\"mean_squared_error:\", mean_squared_error(y_test, y_pred))\n", "#print(\"mean_squared_log_error:\", mean_squared_log_error(y_test, y_pred))\n", "print(\"median_absolute_error:\", median_absolute_error(y_test, y_pred))\n", "print(\"r2_score:\", r2_score(y_test, y_pred))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Using evaluation metrics in model selection\n", "- [note]: http://scikit-learn.org/stable/modules/model_evaluation.html#scoring-parameter" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 이진 분류" ] }, { "cell_type": "code", "execution_count": 118, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Default scoring: [0.9 0.9 0.9]\n", "Explicit accuracy scoring: [0.9 0.9 0.9]\n", "\n", "ROC_AUC scoring: [0.994 0.99 0.996]\n", "Average Precision scoring: [0.96 0.953 0.978]\n", "\n", "Precision scoring: [0.81 0.81 0.81]\n", "Precision scoring: [0.9 0.9 0.9]\n", "F1_score scoring: [0.852 0.852 0.852]\n" ] } ], "source": [ "# default scoring for classification is accuracy\n", "scores = cross_val_score(SVC(), digits.data, digits.target == 9)\n", "print(\"Default scoring: {}\".format(scores))\n", "\n", "# providing scoring=\"accuracy\" doesn't change the results\n", "scores2 = cross_val_score(SVC(), digits.data, digits.target == 9, scoring=\"accuracy\")\n", "print(\"Explicit accuracy scoring: {}\".format(scores2))\n", "\n", "print()\n", "\n", "# 곡선의 면적을 활용한 성능 측정 (Recommended)\n", "roc_auc = cross_val_score(SVC(), digits.data, digits.target == 9, scoring=\"roc_auc\")\n", "print(\"ROC_AUC scoring: {}\".format(roc_auc))\n", "\n", "average_precision = cross_val_score(SVC(), digits.data, digits.target == 9, scoring=\"average_precision\")\n", "print(\"Average Precision scoring: {}\".format(average_precision))\n", "\n", "print()\n", "\n", "# 다양한 성능 측정 (Not Recommended)\n", "precision = cross_val_score(SVC(), digits.data, digits.target == 9, scoring=\"precision_weighted\")\n", "print(\"Precision scoring: {}\".format(precision))\n", "\n", "recall = cross_val_score(SVC(), digits.data, digits.target == 9, scoring=\"recall_weighted\")\n", "print(\"Precision scoring: {}\".format(recall))\n", "\n", "f1_score = cross_val_score(SVC(), digits.data, digits.target == 9, scoring=\"f1_weighted\")\n", "print(\"F1_score scoring: {}\".format(f1_score))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 다중 분류" ] }, { "cell_type": "code", "execution_count": 119, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Explicit accuracy scoring: [0.394 0.411 0.46 ]\n", "F1_weighted scoring: [0.439 0.463 0.524]\n" ] } ], "source": [ "scores = cross_val_score(SVC(), digits.data, digits.target, scoring=\"accuracy\")\n", "print(\"Explicit accuracy scoring: {}\".format(scores))\n", "\n", "f1_weighted = cross_val_score(SVC(), digits.data, digits.target, scoring=\"f1_weighted\")\n", "print(\"F1_weighted scoring: {}\".format(f1_weighted))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- GridSearchCV에 다양한 scoring 적용 " ] }, { "cell_type": "code", "execution_count": 120, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Grid-Search with accuracy\n", "Best parameters: {'gamma': 0.0001}\n", "Best cross-validation score (accuracy)): 0.970\n", "Test set AUC: 0.992\n", "Test set accuracy: 0.973\n", "\n", "Grid-Search with AUC\n", "Best parameters: {'gamma': 0.01}\n", "Best cross-validation score (AUC): 0.997\n", "Test set AUC: 1.000\n", "Test set accuracy: 1.000\n" ] } ], "source": [ "X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target == 9, random_state=0)\n", "\n", "# we provide a somewhat bad grid to illustrate the point:\n", "param_grid = {'gamma': [0.0001, 0.01, 0.1, 1, 10]}\n", "\n", "# using the default scoring of accuracy:\n", "grid = GridSearchCV(SVC(), param_grid=param_grid)\n", "grid.fit(X_train, y_train)\n", "print(\"Grid-Search with accuracy\")\n", "print(\"Best parameters:\", grid.best_params_)\n", "print(\"Best cross-validation score (accuracy)): {:.3f}\".format(grid.best_score_))\n", "print(\"Test set AUC: {:.3f}\".format(roc_auc_score(y_test, grid.decision_function(X_test))))\n", "print(\"Test set accuracy: {:.3f}\".format(grid.score(X_test, y_test)))\n", "\n", "print()\n", "\n", "# using AUC scoring instead:\n", "grid = GridSearchCV(SVC(), param_grid=param_grid, scoring=\"roc_auc\")\n", "grid.fit(X_train, y_train)\n", "print(\"Grid-Search with AUC\")\n", "print(\"Best parameters:\", grid.best_params_)\n", "print(\"Best cross-validation score (AUC): {:.3f}\".format(grid.best_score_))\n", "print(\"Test set AUC: {:.3f}\".format(roc_auc_score(y_test, grid.decision_function(X_test))))\n", "print(\"Test set accuracy: {:.3f}\".format(grid.score(X_test, y_test)))" ] }, { "cell_type": "code", "execution_count": 121, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Available scorers:\n", "['accuracy', 'adjusted_mutual_info_score', 'adjusted_rand_score', 'average_precision', 'completeness_score', 'explained_variance', 'f1', 'f1_macro', 'f1_micro', 'f1_samples', 'f1_weighted', 'fowlkes_mallows_score', 'homogeneity_score', 'log_loss', 'mean_absolute_error', 'mean_squared_error', 'median_absolute_error', 'mutual_info_score', 'neg_log_loss', 'neg_mean_absolute_error', 'neg_mean_squared_error', 'neg_mean_squared_log_error', 'neg_median_absolute_error', 'normalized_mutual_info_score', 'precision', 'precision_macro', 'precision_micro', 'precision_samples', 'precision_weighted', 'r2', 'recall', 'recall_macro', 'recall_micro', 'recall_samples', 'recall_weighted', 'roc_auc', 'v_measure_score']\n" ] } ], "source": [ "from sklearn.metrics.scorer import SCORERS\n", "print(\"Available scorers:\\n{}\".format(sorted(SCORERS.keys())))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Summary and Outlook" ] } ], "metadata": { "anaconda-cloud": {}, "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.0" } }, "nbformat": 4, "nbformat_minor": 1 }