{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "LlS4gyYqJVpn" }, "source": [ "# 로지스틱 회귀" ] }, { "cell_type": "markdown", "metadata": { "id": "m9MHDgx2JVpv" }, "source": [ "\n", " \n", "
\n", " 구글 코랩에서 실행하기\n", "
" ] }, { "cell_type": "markdown", "metadata": { "id": "tQBDVUjBbIsL" }, "source": [ "## 럭키백의 확률" ] }, { "cell_type": "markdown", "metadata": { "id": "ILi_LPl9JVpw" }, "source": [ "### 데이터 준비하기" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 206 }, "id": "Mba6QeEmLn3r", "outputId": "752ed0d7-c1cf-4dea-9baa-7953bfa0fbf3" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " Species Weight Length Diagonal Height Width\n", "0 Bream 242.0 25.4 30.0 11.5200 4.0200\n", "1 Bream 290.0 26.3 31.2 12.4800 4.3056\n", "2 Bream 340.0 26.5 31.1 12.3778 4.6961\n", "3 Bream 363.0 29.0 33.5 12.7300 4.4555\n", "4 Bream 430.0 29.0 34.0 12.4440 5.1340" ], "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", "
SpeciesWeightLengthDiagonalHeightWidth
0Bream242.025.430.011.52004.0200
1Bream290.026.331.212.48004.3056
2Bream340.026.531.112.37784.6961
3Bream363.029.033.512.73004.4555
4Bream430.029.034.012.44405.1340
\n", "
\n", " \n", "\n", "\n", "\n", "
\n", " \n", "
\n", "\n", "\n", "\n", " \n", "\n", " \n", " \n", "\n", " \n", "
\n", "
\n" ] }, "metadata": {}, "execution_count": 1 } ], "source": [ "import pandas as pd\n", "\n", "fish = pd.read_csv('https://bit.ly/fish_csv_data')\n", "fish.head()" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "UWJWlRCHVWUg", "outputId": "3ce7ab01-0ab1-45eb-ddce-c0a7378f5220" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "['Bream' 'Roach' 'Whitefish' 'Parkki' 'Perch' 'Pike' 'Smelt']\n" ] } ], "source": [ "print(pd.unique(fish['Species']))" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "id": "8JjMXc9wVE7C" }, "outputs": [], "source": [ "fish_input = fish[['Weight','Length','Diagonal','Height','Width']].to_numpy()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "1T6C1d5iMzb8", "outputId": "fbe78230-14cd-4327-da8f-377e72774930", "scrolled": true }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "[[242. 25.4 30. 11.52 4.02 ]\n", " [290. 26.3 31.2 12.48 4.3056]\n", " [340. 26.5 31.1 12.3778 4.6961]\n", " [363. 29. 33.5 12.73 4.4555]\n", " [430. 29. 34. 12.444 5.134 ]]\n" ] } ], "source": [ "print(fish_input[:5])" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "id": "aB2oHhojTfWE" }, "outputs": [], "source": [ "fish_target = fish['Species'].to_numpy()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "id": "dkllezAJW63K" }, "outputs": [], "source": [ "from sklearn.model_selection import train_test_split\n", "\n", "train_input, test_input, train_target, test_target = train_test_split(\n", " fish_input, fish_target, random_state=42)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "id": "H0ujq0BjXpfp" }, "outputs": [], "source": [ "from sklearn.preprocessing import StandardScaler\n", "\n", "ss = StandardScaler()\n", "ss.fit(train_input)\n", "train_scaled = ss.transform(train_input)\n", "test_scaled = ss.transform(test_input)" ] }, { "cell_type": "markdown", "metadata": { "id": "oAxk-V5kQcgc" }, "source": [ "### k-최근접 이웃 분류기의 확률 예측" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "BYWTNPOdXOfr", "outputId": "4cd37f3b-5241-447a-a9f2-5ccfa71218b0" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "0.8907563025210085\n", "0.85\n" ] } ], "source": [ "from sklearn.neighbors import KNeighborsClassifier\n", "\n", "kn = KNeighborsClassifier(n_neighbors=3)\n", "kn.fit(train_scaled, train_target)\n", "\n", "print(kn.score(train_scaled, train_target))\n", "print(kn.score(test_scaled, test_target))" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "a879-O42RhFO", "outputId": "d7fffbf6-fb8d-420e-8000-56ad09c65c91" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "['Bream' 'Parkki' 'Perch' 'Pike' 'Roach' 'Smelt' 'Whitefish']\n" ] } ], "source": [ "print(kn.classes_)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "EucmtF8HVOS_", "outputId": "a803d3da-7663-481d-88ef-24ddea427451" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "['Perch' 'Smelt' 'Pike' 'Perch' 'Perch']\n" ] } ], "source": [ "print(kn.predict(test_scaled[:5]))" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "OSDr8WSKXbUa", "outputId": "ecc49bd9-8a45-43b9-a9a2-19329f5c6bb8" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "[[0. 0. 1. 0. 0. 0. 0. ]\n", " [0. 0. 0. 0. 0. 1. 0. ]\n", " [0. 0. 0. 1. 0. 0. 0. ]\n", " [0. 0. 0.6667 0. 0.3333 0. 0. ]\n", " [0. 0. 0.6667 0. 0.3333 0. 0. ]]\n" ] } ], "source": [ "import numpy as np\n", "\n", "proba = kn.predict_proba(test_scaled[:5])\n", "print(np.round(proba, decimals=4))" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Hk-ywsfKkf7t", "outputId": "51bc04ca-95f0-480f-8558-3fce405c8756" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "[['Roach' 'Perch' 'Perch']]\n" ] } ], "source": [ "distances, indexes = kn.kneighbors(test_scaled[3:4])\n", "print(train_target[indexes])" ] }, { "cell_type": "markdown", "metadata": { "id": "Q9_wuI_0tEqL" }, "source": [ "## 로지스틱 회귀" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 449 }, "id": "8rdDSaZ5uji2", "outputId": "8ea6c0b2-1965-47df-be28-465fdfc493f1" }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAGwCAYAAABVdURTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA9y0lEQVR4nO3deXRU5eHG8Wcmy2QPhGxAAmHfIbIFXMFG44Z1p2gFqdJqkYr5tQouUK0aV6QqlYpraym4VK2CKKK4FAQE2WQNW0IgO8lknUlm7u+P1GjKYoAkd5bv55w5SW7uJc/MgcnDve99X4thGIYAAAB8hNXsAAAAAC2JcgMAAHwK5QYAAPgUyg0AAPAplBsAAOBTKDcAAMCnUG4AAIBPCTQ7QFtzu906dOiQIiMjZbFYzI4DAACawTAMVVRUqFOnTrJaT3xuxu/KzaFDh5ScnGx2DAAAcApyc3OVlJR0wn38rtxERkZKanhxoqKiTE4DAACaw263Kzk5ufH3+In4Xbn5/lJUVFQU5QYAAC/TnCElDCgGAAA+hXIDAAB8CuUGAAD4FMoNAADwKZQbAADgUyg3AADAp1BuAACAT6HcAAAAn2Jqufniiy80btw4derUSRaLRe++++5PHrNy5UoNHTpUNptNPXv21KuvvtrqOQEAgPcwtdxUVVVpyJAhmjdvXrP237dvny699FKNHTtWGzdu1PTp03XLLbfoo48+auWkAADAW5i6/MLFF1+siy++uNn7z58/X926ddNTTz0lSerXr5+++uorPf3008rIyDjmMQ6HQw6Ho/Fru91+eqEBAIBH86oxN6tXr1Z6enqTbRkZGVq9evVxj8nKylJ0dHTjgxXBAQDwbV5VbvLz85WQkNBkW0JCgux2u2pqao55zMyZM1VeXt74yM3NbYuoAAD4FbfbUKWjXofLa3So7Ni/k9uKz68KbrPZZLPZzI4BAIDHM4yGglJWXafSKqeOVDtVXlOnsur/PmqcstfUq7ymTvbaOtlrGh4VjnpVOuplGA1/Tlq3GC3+zWjTnodXlZvExEQVFBQ02VZQUKCoqCiFhoaalAoAAM/lchsqrXKqqMKhwopaFVU4VFTpUEmlUyWVDpVUOVX838+PVDtV5zJO6+cFWi2yWFoo/KlmMPfHn5zRo0dr6dKlTbYtX75co0eb1w4BADCLy22owF6rQ2U1OlReq8NlDZeE8u21KrA7VGCvVWGFQy73yRWW0KAAxYQHKzo0SO3DgxQdGqTo0Iav24UFKSokSFGhgf/9GKTIkMCGhy1IIUFWWUxuN6aWm8rKSmVnZzd+vW/fPm3cuFExMTHq0qWLZs6cqby8PP3tb3+TJN1666167rnndNddd+lXv/qVPv30U73xxhtasmSJWU8BAIBWYxiGyqrrdKC0WgdKqnSgpFoHj1Qrt7RGB8uqdbisVvXNKC4Wi9QhPFhxkSGKi7QpLsKm2IhgxUbY1CEiWDHhweoQ3vB5+7BghQYHtMGzaz2mlptvvvlGY8eObfw6MzNTkjRp0iS9+uqrOnz4sHJychq/361bNy1ZskR33nmn/vznPyspKUkvvvjicW8DBwDAGzjqXdpXXKW9RVXaU1ipvcVV2ltUqX3FVbLX1p/w2KAAixKjQ9QxOlSdokPUsV3Dx/ioECVEhSgxKkSxEcEKDPCqe4hOi8UwjNO7uOZl7Ha7oqOjVV5erqioKLPjAAD8iNtt6EBptbYftmtHfoV2F1RoV0GF9pdUn/DSUUKUTV1jwtWlQ5i6xIQpOSZUSe3DlNw+TPGRNlmtJg9yaQMn8/vbq8bcAADgLepcbu0qqNCWg+XaklfeWGiqna5j7h9pC1SP+Ah1jwtXj7gIdY8NV7e4cHWNCff6y0RtjXIDAMBpMgxDB4/UaEPOEX2bU6aNuWXadtguZ737qH1tgVb1SYxU38RI9U6IVK+ESPVOiFBiVIjpA3F9BeUGAICT5HIb2nbIrjX7SrRuf6k25JSpqMJx1H6RIYEanBStgZ2jNaBTtPp3jFRKh3C/Gv9iBsoNAAA/we02tO2wXf/JLtbXe0v0zf4jqnA0HegbFGBR/07RGtqlnVKT22lIUjt17RDG2RgTUG4AADiG/PJafbGrSF9mF2tVdrFKqpxNvh9pC9SIbjEa2S1Gw7u218DO0QoJYmyMJ6DcAACghktNmw6W6bMdhVqxvVDbDtubfD88OECjunfQ6B4dNKp7B/XrGKUAP7hLyRtRbgAAfstZ79bqvSVatvWwlm8rUHHlD2dnLBZpSFI7ndsrVmf3ilNqcjsFBzJWxhtQbgAAfsVZ79aXu4u0ZPNhfbK9oMkkeZG2QJ3bO07n943XmD5x6hDBwsveiHIDAPB5brehbw4c0Xsb87Rky2GVVdc1fi82wqaMAQm6aGCiRnXvoCDuZPJ6lBsAgM/KLa3Wm+sP6u31B5VXVtO4PS7SpssGd9QlgzpqaJf2jJ3xMZQbAIBPqa1z6eNtBXpjXa7+s6dY3y8yFGEL1EUDE3VFameN7tGBQuPDKDcAAJ+QV1ajf3x9QIvW5ar0R7dtn9Wzg64bnqyMAYncqu0nKDcAAK9lGIZW7ynRa6v3a/m2An2/9mRiVIiuG56ka4cnKzkmzNyQaHOUGwCA16l3ubVky2HN/3yvtv9oPpoze3TQxNEpSu8XzxIHfoxyAwDwGtXOer2xLlcLvtzXOEA4NChA1wxL0sTRXdUrIdLkhPAElBsAgMerctTr718f0Atf7G0cT9MhPFg3nZmiX47qqvbhwSYnhCeh3AAAPFa1s15/X31Af/1RqenaIUxTzumua4YlMUAYx0S5AQB4HGe9W/9Yc0DPfZrduGBl1w5h+t35vfTz1E6Mp8EJUW4AAB7DMAwt2XJYjy/bqZzSaklSl5gwTTu/p648ozOlBs1CuQEAeIQ1e0v0yIc7tCm3TFLDLMLT03vpuuHJLImAk0K5AQCY6nB5jR5ZukPvbzokSQoLDtBvzu2hW87ppnAbv6Zw8vhbAwAwhbPerZe+2qdnP92taqdLVov0i5FddGd6b8VFsho3Th3lBgDQ5v6TXaz7392qvcVVkqRhXdvrgcsHaGDnaJOTwRdQbgAAbaa8uk4PLdmmN9cflCTFRth0zyV9deUZnWWxsJAlWgblBgDQJj7ccliz/v2diiocslikG0d11e8z+igqJMjsaPAxlBsAQKsqrnTovne2atl3+ZKkHnHhevyawRrWNcbkZPBVlBsAQKv5ZFuB7n57s0qqnAq0WnTbmB6aOrYnMwujVVFuAAAtrspRr4eWbNc/1+ZIkvomRmrOdanq3ynK5GTwB5QbAECL2phbpumLvtX+kmpZLNItZ3fT/13Yh7M1aDOUGwBAizAMQy99tU+PfrhD9W5DnaJD9OR1Q3Rmj1izo8HPUG4AAKetvKZOd721SR99VyBJunRQRz1y1SBFh3InFNoe5QYAcFq2HCzXbxeuV25pjYICLLr/sv66cVRX5q2BaSg3AIBTtnhdju5/9zs5XW4ltQ/VX24YqsFJ7cyOBT9HuQEAnLQ6l1sPL9muV1ftlyRd0D9BT14zRNFhXIaC+Sg3AICTcqTKqakLN2jVnhJJ0p3pvTXt/J6yWrkMBc9AuQEANNvO/Ard8rd1yi2tUVhwgOZcl6qLBiaaHQtognIDAGiWL3cX6bbXN6jSUa/kmFAtmDhcfROZlA+eh3IDAPhJb36Tq5n/2qJ6t6G0bjGa/8thah8ebHYs4JgoNwCA4zIMQ8+syNbTn+ySJP08tZMev2awbIHMNgzPRbkBABxTncut+97ZqsXf5EqSbhvTQ3+4sA8Dh+HxKDcAgKPU1rl0+8IN+mR7oawW6cGfD9QvR3U1OxbQLJQbAEATVY56TfnbN1q1p0S2QKvmXT9U6f0TzI4FNBvlBgDQqLy6Tje9ulbf5pQpPDhAL900QqO6dzA7FnBSKDcAAElSUYVDN760RjvyKxQdGqTXfjVSqcntzI4FnDTKDQBABfZaTXjha+0trlJshE2v3zKSOWzgtSg3AODnCu21mrCgodh0bheq129JU7fYcLNjAaeMcgMAfqyowtFQbIoais2iX49SckyY2bGA02I1OwAAwBzFlQ5dv+Br7SmqUsfoEP1zCsUGvoFyAwB+qKTSoRsWrNHuwkolRjUUmy4dKDbwDZQbAPAzFbV1mvTKWu0sqFB8pE3//PUopTDGBj6EcgMAfqS2zqVbXvtGW/Ps6hAerIVTRjF4GD6HcgMAfqLe5dbtC7/Vmn2lirAF6rVfjVTP+AizYwEtjnIDAH7A7TZ099tb9Mn2AgUHWvXipOEa2Dna7FhAq6DcAICPMwxDDy/drrc3HFSA1aJ51w9lSQX4NMoNAPi4l77ap5e+2idJevzqwbqARTDh4yg3AODDPtxyWA8v3S5JuueSvrp6WJLJiYDWR7kBAB+1IeeIpi/eKMOQbhzVVVPO6W52JKBNmF5u5s2bp5SUFIWEhCgtLU1r16494f5z585Vnz59FBoaquTkZN15552qra1to7QA4B0OlFRpymvfyFHv1vl94zV7XH9ZLBazYwFtwtRys3jxYmVmZmr27NnasGGDhgwZooyMDBUWFh5z/4ULF2rGjBmaPXu2tm/frpdeekmLFy/WPffc08bJAcBzHalyavIr61RS5dTAzlF6dsIZCgww/f+yQJsx9W/7nDlzNGXKFE2ePFn9+/fX/PnzFRYWppdffvmY+69atUpnnXWWrr/+eqWkpOjCCy/UhAkTfvJsDwD4izqXW7e+vr5xhe+XJ41QuI01kuFfTCs3TqdT69evV3p6+g9hrFalp6dr9erVxzzmzDPP1Pr16xvLzN69e7V06VJdcsklx/05DodDdru9yQMAfNUD73/XOEnfyzeNUHxUiNmRgDZnWp0vLi6Wy+VSQkLTWxITEhK0Y8eOYx5z/fXXq7i4WGeffbYMw1B9fb1uvfXWE16WysrK0gMPPNCi2QHAE/1jzQG9/nWOLBbpz79IVZ/ESLMjAabwqouwK1eu1COPPKK//OUv2rBhg/71r39pyZIl+tOf/nTcY2bOnKny8vLGR25ubhsmBoC2sWZviWa/950k6fcX9tHP+jGXDfyXaWduYmNjFRAQoIKCgibbCwoKlJiYeMxj7r//ft1444265ZZbJEmDBg1SVVWVfv3rX+vee++V1Xp0V7PZbLLZbC3/BADAQ+SWVuu2f2xQvdvQuCGd9NsxPcyOBJjKtDM3wcHBGjZsmFasWNG4ze12a8WKFRo9evQxj6murj6qwAQEBEhqmF4cAPxNtbNev/77epX+986ox68ezC3f8HumDqHPzMzUpEmTNHz4cI0cOVJz585VVVWVJk+eLEmaOHGiOnfurKysLEnSuHHjNGfOHJ1xxhlKS0tTdna27r//fo0bN66x5ACAvzAMQ/e+s1XbD9sVGxGsF24crtBg3gsBU8vN+PHjVVRUpFmzZik/P1+pqalatmxZ4yDjnJycJmdq7rvvPlksFt13333Ky8tTXFycxo0bp4cfftispwAApnl9TY7e+TavcTHMTu1CzY4EeASL4WfXc+x2u6Kjo1VeXq6oqCiz4wDAKdmYW6Zr569SncvQPZf01a/PZZwNfNvJ/P72qrulAABSaZVTU/+xQXUuQxcNSGTNKOB/UG4AwIu43IamL96ovLIadYsN1+PXMoAY+F+UGwDwIs9+ultf7CpSSJBVz/9yqKJCgsyOBHgcyg0AeInVe0r0zIrdkqRHrhykvomMGwSOhXIDAF6gtMqp6Yu/lduQrhuepKuGJpkdCfBYlBsA8HCGYeiutzapwO5Qj7hw/fHyAWZHAjwa5QYAPNyrq/brk+2FCg606tkJQxUWbOoUZYDHo9wAgAfbmleurKU7JEn3XtJP/Tsxzgb4KZQbAPBQVY56Tfvnt3K63Lqgf4Imju5qdiTAK1BuAMBD/emDbdpXXKWO0SF64hrmswGai3IDAB5o+bYCLVqXK4tFmnNdqtqFBZsdCfAalBsA8DDFlQ7NeHuzJGnKOd01ukcHkxMB3oVyAwAexDAMzXh7s0qqnOqbGKn/u7C32ZEAr0O5AQAPsnhdbsNt3wFWPT0+VbbAALMjAV6HcgMAHuJASZUe/GCbJOn3Gb3VryO3fQOngnIDAB7A5TaU+cYmVTtdSusWo5vP7m52JMBrUW4AwAO88p99Wn/giCJsgXrquiEKsHLbN3CqKDcAYLK9RZV64qOdkqT7Lu2npPZhJicCvBvlBgBM5HIb+sNbm+Wod+ucXrEaPyLZ7EiA16PcAICJfnw56tGrmYUYaAmUGwAwyb7iqsbLUfdc0k+d24WanAjwDZQbADCBy23oD29ukqPerbN7xmrCSC5HAS2FcgMAJvjb6v365sARhQcHKOuqQVyOAloQ5QYA2lheWU3j5agZF/dVcgx3RwEtiXIDAG3IMAzd984WVTtdGt61vW5I62p2JMDnUG4AoA29v/mwPttZpOAAq7KuGiQrk/UBLY5yAwBtpKzaqQff/06S9NuxPdQrIdLkRIBvotwAQBt5eMl2FVc61TM+QreN6WF2HMBnUW4AoA2syi7Wm+sPSpIevWqQbIEBJicCfBflBgBaWW2dS/e8s0WS9MtRXTQ8JcbkRIBvo9wAQCv7y8o92l9SrYQom+66qK/ZcQCfR7kBgFa0t6hS81fukSTNumyAokKCTE4E+D7KDQC0EsMwNOu97+R0uXVu7zhdMijR7EiAX6DcAEAreX/zYX2VXazgQKsevHwASywAbYRyAwCtwF5bpz99sE2SdPvYnkqJDTc5EeA/KDcA0ArmfLxLRRUOdY8N12/O6252HMCvUG4AoIVtzSvX31bvlyT96YqBzGkDtDHKDQC0ILfb0H3vbpXbkC4f0kln9Yw1OxLgdyg3ANCC3tpwUBtzyxQeHKD7Lu1ndhzAL1FuAKCFlNfU6bEPd0iSpqf3VnxUiMmJAP9EuQGAFjL3k10qqWpYGPOms1LMjgP4LcoNALSAHfl2/W31AUnSH8cNUFAAb6+AWfjXBwCnyTAMzX7vO7nchi4emKizezGIGDAT5QYATtP7mw9rzb5ShQRZdS+DiAHTUW4A4DRUOer1yJLtkqSpY3oqqX2YyYkAUG4A4DQ8v3KP8u216hITpinnMhMx4AkoNwBwinJLq/XCl3slSfde2k8hQcxEDHgCyg0AnKKsD7fLWe/WmT066ML+CWbHAfBflBsAOAVf7y3R0i35slqkWeP6y2KxmB0JwH9RbgDgJLnchh54f5sk6fq0LuqbGGVyIgA/RrkBgJO0eF2uth+2KyokUJkX9DE7DoD/QbkBgJNQXlOnpz7eKalh/aiY8GCTEwH4X5QbADgJz67YrZIqp3rEhevG0V3NjgPgGCg3ANBM+4ur9Nrq/ZKk+y7rz/pRgIfiXyYANNNjy3aozmXo3N5xGtsn3uw4AI6DcgMAzbB2X6k+3Npw6/e9l7B+FODJKDcA8BPcbkMPLWm49fsXI7uoT2KkyYkAnIjp5WbevHlKSUlRSEiI0tLStHbt2hPuX1ZWpqlTp6pjx46y2Wzq3bu3li5d2kZpAfij9zblafPBckXYAnVnem+z4wD4CYFm/vDFixcrMzNT8+fPV1pamubOnauMjAzt3LlT8fFHX892Op264IILFB8fr7feekudO3fWgQMH1K5du7YPD8Av1DhdenxZw63fvx3bQ3GRNpMTAfgpppabOXPmaMqUKZo8ebIkaf78+VqyZIlefvllzZgx46j9X375ZZWWlmrVqlUKCgqSJKWkpLRlZAB+5sUv9+pwea06twvVr87qZnYcAM1g2mUpp9Op9evXKz09/YcwVqvS09O1evXqYx7z73//W6NHj9bUqVOVkJCggQMH6pFHHpHL5Truz3E4HLLb7U0eANAchfZaPf/5HknS3Rf3ZdVvwEuYVm6Ki4vlcrmUkNB0Jd2EhATl5+cf85i9e/fqrbfeksvl0tKlS3X//ffrqaee0kMPPXTcn5OVlaXo6OjGR3Jycos+DwC+6+lPdqna6VJqcjuNG9zR7DgAmsn0AcUnw+12Kz4+Xi+88IKGDRum8ePH695779X8+fOPe8zMmTNVXl7e+MjNzW3DxAC81a6CCi1e1/B+cd+l/Vj1G/Aipo25iY2NVUBAgAoKCppsLygoUGJi4jGP6dixo4KCghQQ8MOp4X79+ik/P19Op1PBwUev8WKz2WSzMQAQwMl59MMdchtSxoAEDU+JMTsOgJNg2pmb4OBgDRs2TCtWrGjc5na7tWLFCo0ePfqYx5x11lnKzs6W2+1u3LZr1y517NjxmMUGAE7Fqj3F+nRHoQKtFt19UV+z4wA4SaZelsrMzNSCBQv02muvafv27brttttUVVXVePfUxIkTNXPmzMb9b7vtNpWWluqOO+7Qrl27tGTJEj3yyCOaOnWqWU8BgI9xuw09snS7JOmGtC7qHhdhciIAJ8vUW8HHjx+voqIizZo1S/n5+UpNTdWyZcsaBxnn5OTIav2hfyUnJ+ujjz7SnXfeqcGDB6tz58664447dPfdd5v1FAD4mPc25Wlrnl2RtkD97me9zI4D4BRYDMMwzA7Rlux2u6Kjo1VeXq6oqCiz4wDwILV1Lv3sqc+VV1ajP2T00dSxPc2OBOC/Tub3t1fdLQUArenVVfuVV1ajjtEhuvlsJuwDvBXlBgAkHalyat5n2ZKk/7uwDxP2AV6McgMAkuZ9lq2K2nr1TYzUlWd0NjsOgNNAuQHg93JLq/W31QckSTMu7qsAKxP2Ad6McgPA781ZvktOl1tn9uig83rHmR0HwGmi3ADwa98dKte7G/MkSTMvZpkFwBdQbgD4tUc/3CHDkMYN6aRBSdFmxwHQAig3APzWV7uL9eXuYgUFWPSHC/uYHQdAC6HcAPBLbrehrA+/X2ahq7p0CDM5EYCWQrkB4Jfe33xI3x2yK8IWqGnnMxMx4EsoNwD8jrPerSc/3ilJ+s253dUhwmZyIgAtiXIDwO8sXHNAuaU1iou06eZzWGYB8DWUGwB+pdJRr2c/bVhm4Y6f9VJYcKDJiQC0NMoNAL+y4Iu9KqlyqltsuMaPSDY7DoBWQLkB4DeKKhxa8OVeSdIfMvooKIC3QMAX8S8bgN949tPdqna6NCQpWhcPTDQ7DoBWQrkB4BcOlFRp4ZocSdLdF/dlmQXAh1FuAPiFJz/epXq3ofN6x+nMHrFmxwHQiig3AHze1rxyvb/pkCTprotYZgHwdZQbAD7vsWU7JEk/T+2kAZ1YHBPwdZQbAD5tVfYPi2P+3wWctQH8QbNnr9q8ebMGDhwoq9WqzZs3n3DfwYMHn3YwADhdhmE0nrW5fmQXFscE/ESzy01qaqry8/MVHx+v1NRUWSwWGYbR+P3vv7ZYLHK5XK0SFgBOxodb87XpYLnCggN0+/m9zI4DoI00u9zs27dPcXFxjZ8DgCerd7n15EcNi2Peck53xUWyOCbgL5pdbrp27XrMzwHAE73xzUHtLa5STHiwprA4JuBXTnnFuN27d+uzzz5TYWGh3G53k+/NmjXrtIMBwKmqcbo095NdkqTbx/ZUZEiQyYkAtKVTKjcLFizQbbfdptjYWCUmJjaZ6dNisVBuAJjqlVX7VFjhUFL7UN0wqovZcQC0sVMqNw899JAefvhh3X333S2dBwBOS1m1U8+v3CNJyrygt2yBASYnAtDWTmmemyNHjujaa69t6SwAcNqeX7lHFbX16psYqZ+ndjY7DgATnFK5ufbaa/Xxxx+3dBYAOC2Hy2v06qr9khqWWQiwsjgm4I+afVnqmWeeafy8Z8+euv/++/X1119r0KBBCgpqOljvd7/7XcslBIBmmrt8txz1bo1MidHYPvFmxwFgEovx45n4TqBbt+bdSmmxWLR3797TCtWa7Ha7oqOjVV5erqioKLPjAGgh2YUVuvDpL+Q2pLdvO1PDurY3OxKAFnQyv79PahK/Y/m+G/34jikAaGtPfLRTbkO6oH8CxQbwc6e8cOZLL72kgQMHKiQkRCEhIRo4cKBefPHFlswGAM2yIeeIPvquQFaLdFcGi2MC/u6UbgWfNWuW5syZo2nTpmn06NGSpNWrV+vOO+9UTk6OHnzwwRYNCQDHYxiGHvuwYXHMq4cmqVdCpMmJAJit2WNufiwuLk7PPPOMJkyY0GT7P//5T02bNk3FxcUtFrClMeYG8C2f7SzU5FfWKTjQqs9+P0ad24WaHQlAKziZ39+ndFmqrq5Ow4cPP2r7sGHDVF9ffyp/JACcNLf7h7M2k0Z3pdgAkHSK5ebGG2/U888/f9T2F154QTfccMNphwKA5nhvU5525FcoMiRQvx3T0+w4ADzEKS+c+dJLL+njjz/WqFGjJElr1qxRTk6OJk6cqMzMzMb95syZc/opAeB/OOpdeurjhsUxbxvTQ+3Dg01OBMBTnFK52bp1q4YOHSpJ2rOnYQ2X2NhYxcbGauvWrY37cXs4gNbyj69zdPBIjRKibJp8ZvPm4QLgH06p3Hz22WctnQMAmq2itk7PfZYtSZqe3luhwSyOCeAHpzzPDQCYZcEXe1Va5VT3uHBdOyzJ7DgAPAzlBoBXKayo1YIvG2ZMvyujjwIDeBsD0BTvCgC8yjMrdqumzqXU5HbKGJBodhwAHohyA8Br7C2q1D/X5kqSZlzcl5sWABwT5QaA13jio51yuQ39rG+8RnXvYHYcAB6KcgPAK2zIOaIPt+bLapHuvriv2XEAeDDKDQCPZxiGHl3asMzCNcOS1JvFMQGcAOUGgMf7ZHuh1u4vlS3Qqjsv6G12HAAejnIDwKPVu9x6bFnDWZtfnd1NHaNZHBPAiVFuAHi0t9YfVHZhpdqFBenW83qYHQeAF6DcAPBYNU6Xnv6kYXHM28f2VHRokMmJAHgDyg0Aj/Xil3tVYHcoqX2obhzd1ew4ALwE5QaARyqqcGj+53skSX/I6CNbIItjAmgeyg0Aj/TnFbtU5XRpcFK0xg3uZHYcAF6EcgPA42QX/rDMwj2X9JPVyjILAJqPcgPA4zy2bIdcbkPp/VhmAcDJ84hyM2/ePKWkpCgkJERpaWlau3Zts45btGiRLBaLrrjiitYNCKDNrN1XquXbChRgtWgGyywAOAWml5vFixcrMzNTs2fP1oYNGzRkyBBlZGSosLDwhMft379fv//973XOOee0UVIArc0wDD28dLsk6RcjktUznmUWAJw808vNnDlzNGXKFE2ePFn9+/fX/PnzFRYWppdffvm4x7hcLt1www164IEH1L179zZMC6A1fbD5sDbllik8OEDT01lmAcCpMbXcOJ1OrV+/Xunp6Y3brFar0tPTtXr16uMe9+CDDyo+Pl4333zzT/4Mh8Mhu93e5AHA89TWuRqXWfjNeT0UF2kzOREAb2VquSkuLpbL5VJCQkKT7QkJCcrPzz/mMV999ZVeeuklLViwoFk/IysrS9HR0Y2P5OTk084NoOW9umq/Dh6pUWJUiG45p5vZcQB4MdMvS52MiooK3XjjjVqwYIFiY2ObdczMmTNVXl7e+MjNzW3llABOVkmlQ/M+zZbUMGFfWHCgyYkAeDNT30FiY2MVEBCggoKCJtsLCgqUmJh41P579uzR/v37NW7cuMZtbrdbkhQYGKidO3eqR4+mC+vZbDbZbJzeBjzZ3E92q8JRr4Gdo3TlGZ3NjgPAy5l65iY4OFjDhg3TihUrGre53W6tWLFCo0ePPmr/vn37asuWLdq4cWPj4/LLL9fYsWO1ceNGLjkBXmh3QYUWrs2RJN13aX8m7ANw2kw/95uZmalJkyZp+PDhGjlypObOnauqqipNnjxZkjRx4kR17txZWVlZCgkJ0cCBA5sc365dO0k6ajsA7/DI0u1yuQ1d2D+BCfsAtAjTy8348eNVVFSkWbNmKT8/X6mpqVq2bFnjIOOcnBxZrV41NAhAM32xq0if7SxSoNWimZf0MzsOAB9hMQzDMDtEW7Lb7YqOjlZ5ebmioqLMjgP4LZfb0CV//lI7Cyr0q7O6ada4/mZHAuDBTub3N6dEAJhi0boc7SyoUHRokH73s55mxwHgQyg3ANpceU2dnvp4lyRpenovtQsLNjkRAF9CuQHQ5p5ZsVulVU71jI/QL0d1NTsOAB9DuQHQpvYUVeq1VfslSfdf1l9BAbwNAWhZvKsAaFMPfbBN9W5DP+sbr/N6x5kdB4APotwAaDOf7SzUZzuLFBRg0b2Xcus3gNZBuQHQJupcbj30wTZJ0k1npqh7XITJiQD4KsoNgDbx99UHtKeoSh3CgzXtZ73MjgPAh1FuALS64kqHnv6k4dbv32f0UVRIkMmJAPgyyg2AVvf4sh2qqG1Y9fu64SxwC6B1UW4AtKpvc47ojW8OSpIeuHygAlj1G0Aro9wAaDVut6HZ//5OknT10CQN69re5EQA/AHlBkCreeObXG0+WK5IW6DuvriP2XEA+AnKDYBWUVbt1GPLdkiSpl/QW/GRISYnAuAvKDcAWsWc5bt0pLpOvRMiNHE060cBaDuUGwAt7rtD5Xr96wOSpD9ePoD1owC0Kd5xALQot9vQfe9ulduQLh3cUWf2iDU7EgA/Q7kB0KIWrcvVtzllCg8O0P2X9jc7DgA/RLkB0GKKKx2Ng4gzL+yjxGgGEQNoe5QbAC0ma+kOldfUqX/HKE1iEDEAk1BuALSINXtL9PaGg7JYpIevHKhABhEDMAnvPgBOm7Perfve3SpJmjCyi87owkzEAMxDuQFw2l76ap92F1aqQ3iw7s7oa3YcAH6OcgPgtOSUVOvPK3ZJku65pJ+iw4JMTgTA31FuAJwywzB077tbVFvn1ujuHXTV0M5mRwIAyg2AU/fOt3n6cnexbIFWZV01SBaLxexIAEC5AXBqSiod+tMH2yRJd6T3UkpsuMmJAKAB5QbAKfnTB9t0pLpO/TpGaco53c2OAwCNKDcATtrnu4r07sZDslqkR68axMKYADwK70gATkq1s173vrNFknTTmd00JLmduYEA4H9QbgCclCc/2qWDR2rUuV2o/u/C3mbHAYCjUG4ANNu6/aV6ZdU+SQ1LLITbAk1OBABHo9wAaJYap0t/eHOTDEO6bniSxvSJNzsSABwT5QZAszz58U7tL6lWYlSI7r20v9lxAOC4KDcAftI3+0v18n8aLkdlXT1I0aEssQDAc1FuAJxQbZ1Lf3hrswxDunZYksZyOQqAh6PcADihpz7eqX3FVUqIsum+y7gcBcDzUW4AHNeavSV68av/Xo66istRALwD5QbAMVXU1inzjU2Nl6PO75tgdiQAaBbKDYBjeuD9bcorq1FyTKhmXz7A7DgA0GyUGwBHWbb1sN5af1BWizTnulRFMFkfAC9CuQHQRGFFrWb+q2HtqFvP66ERKTEmJwKAk0O5AdDIMAzd9dZmHamuU/+OUZqeztpRALwP5QZAo9fX5GjlziIFB1o19xepCg7kLQKA9+GdC4AkaUe+XQ99sE2SNOOivuqdEGlyIgA4NZQbAKpxunT7wm/lqHdrbJ84TT4rxexIAHDKKDcA9OAH3ym7sFLxkTY9ee0QWSwWsyMBwCmj3AB+7oPNh/TPtbmyWKS541PVIcJmdiQAOC2UG8CP5ZZWa+bbDbd9Tx3TU2f2jDU5EQCcPsoN4Kec9W79btG3qnDUa1jX9pqe3svsSADQIig3gJ/K+nC7vs0pU1RIoP78i1QFBvB2AMA38G4G+KEPNh/SK//ZL0l66rpUJbUPMzcQALQgyg3gZ7ILK3T3W5slSbeN6aEL+rPaNwDfQrkB/EiVo163vr5BVU6XRnfvoP+7gOUVAPgeyg3gJwzD0Ix/bWmcz+aZCWcwzgaAT+KdDfATr67ar/c3HVKg1aK/3DBUcZHMZwPAN1FuAD+wKrtYDy3ZLkmacXFfDU+JMTkRALQejyg38+bNU0pKikJCQpSWlqa1a9ced98FCxbonHPOUfv27dW+fXulp6efcH/A3+WUVOu3CzfI5TZ05RmddfPZ3cyOBACtyvRys3jxYmVmZmr27NnasGGDhgwZooyMDBUWFh5z/5UrV2rChAn67LPPtHr1aiUnJ+vCCy9UXl5eGycHPF+lo163/G2dyqrrNCQpWllXDWLdKAA+z2IYhmFmgLS0NI0YMULPPfecJMntdis5OVnTpk3TjBkzfvJ4l8ul9u3b67nnntPEiRN/cn+73a7o6GiVl5crKirqtPMDnsrtNvSb19dr+bYCxUfa9O/bz1ZidIjZsQDglJzM729Tz9w4nU6tX79e6enpjdusVqvS09O1evXqZv0Z1dXVqqurU0zMsccQOBwO2e32Jg/AH8z9ZJeWbytQcIBV828cRrEB4DdMLTfFxcVyuVxKSGg6iVhCQoLy8/Ob9Wfcfffd6tSpU5OC9GNZWVmKjo5ufCQnJ592bsDTvbcxT898mi1JeuSqQRrapb3JiQCg7Zg+5uZ0PProo1q0aJHeeecdhYQc+3+lM2fOVHl5eeMjNze3jVMCbWvN3hL94c2GGYh/fW53XTMsyeREANC2As384bGxsQoICFBBQUGT7QUFBUpMTDzhsU8++aQeffRRffLJJxo8ePBx97PZbLLZmM8D/mFPUaV+/ff1crrcunhgomZc1NfsSADQ5kw9cxMcHKxhw4ZpxYoVjdvcbrdWrFih0aNHH/e4xx9/XH/605+0bNkyDR8+vC2iAh6vuNKhm15Zq/KaOp3RpZ2eHp8qq5U7owD4H1PP3EhSZmamJk2apOHDh2vkyJGaO3euqqqqNHnyZEnSxIkT1blzZ2VlZUmSHnvsMc2aNUsLFy5USkpK49iciIgIRUREmPY8ADPVOF265bVvlFtaoy4xYXpx4nCFBAWYHQsATGF6uRk/fryKioo0a9Ys5efnKzU1VcuWLWscZJyTkyOr9YcTTM8//7ycTqeuueaaJn/O7Nmz9cc//rEtowMeod7l1h2LvtXG3DK1CwvSq5NHqEMEl2IB+C/T57lpa8xzA19iGIbuemuz3lx/UMGBVr1+c5pGdmNpBQC+x2vmuQFw6gzD0CNLt+vN9QdltUjPTjiDYgMAotwAXuv5z/dowZf7JEmPXT1YGQNOfIchAPgLyg3ghRauydHjy3ZKku67tJ+uHc7klADwPcoN4GXe25ine9/dIkmaOraHbjmnu8mJAMCzUG4AL/L+pkO6c/FGGYZ0fVoX/f7CPmZHAgCPQ7kBvMSSzYc1ffFGuQ1p/PBkPfTzgbJYmKQPAP4X5QbwAh9uOazfLfpWLreha4YlKeuqQcw+DADHQbkBPNyyrfma9s+GYnPVGZ312NWDKTYAcAKmz1AM4Pje25inzDc2yeU2dEVqJz1x7RAFUGwA4IQoN4CHWrgmR/e+u0WGIV11Rmc9fs1gig0ANAPlBvBAL3yxR48s3SFJunFUVz1w+QAuRQFAM1FuAA9iGIaeXr5Lz3yaLUm6bUwP3ZXRh7uiAOAkUG4AD1HvcuuP73+n17/OkSTddVEf/XZMT5NTAYD3odwAHqDaWa9pC7/Vih2FslikBy8foBtHp5gdCwC8EuUGMFlRhUO3vLZOmw6WyxZo1Z9/cYYuGsgimABwqig3gIn2FFXqplfWKre0Ru3DgvTipBEa1rW92bEAwKtRbgCTfLW7WFMXblB5TZ26xITp1ckj1D0uwuxYAOD1KDdAGzMMQ6/8Z78eXrpdLreh1OR2enHScMVG2MyOBgA+gXIDtCFHvUv3vbNVb64/KEm6amhnPXLlIIUEBZicDAB8B+UGaCOF9lrd+vp6bcgpk9Ui3XNJP918djfmsAGAFka5AdrAquxi/W7RtyqudCoqJFDPXT9U5/aOMzsWAPgkyg3QilxuQ899mq25K3bJMKS+iZF6/pfD1C023OxoAOCzKDdAKymudGj6oo36KrtYkjR+eLL+ePkAhQYzvgYAWhPlBmgFX+wq0u/f3KTCCodCgwL00BUDdfWwJLNjAYBfoNwALai2zqVHP9yhV1ftlyT1jI/QX24Yqt4JkeYGAwA/QrkBWsjWvHJNX7xR2YWVkqSJo7tq5sX9uAwFAG2McgOcJme9W3/9fI+e+XS36lyG4iJteuKawRrTJ97saADglyg3wGnYlFumu9/erB35FZKkiwYk6pGrBikmPNjkZADgvyg3wCmodtZrzse79PJ/9sltSDHhwZp1WX/9PLUTk/IBgMkoN8BJ+nRHgWb/+zvlltZIkn6e2kmzLuuvDqwNBQAegXIDNNOBkio9+P42rdhRKEnqFB2ih64cqPP7JpicDADwY5Qb4CfUOF36y8ps/fWLvXLWuxVotejmc7pp2vm9FGHjnxAAeBremYHjcLkNvb3hoOZ8vEv59lpJ0jm9YjV73AD1jI8wOR0A4HgoN8D/MAxDK3cV6dGlO7SzoOEuqM7tQnX/Zf2UMSCRAcMA4OEoN8CPrD9wRE99vFOr9pRIkqJCAjXt/F66cXRXhQQxGR8AeAPKDSDp25wjevqT3fpiV5EkKTjAqpvOStFvx/RQuzDmrAEAb0K5gV/bkHNEz6zYrZU7G0pNgNWia4Ym6fbzeyo5JszkdACAU0G5gd9xuw2t3FWo+Z/v1dp9pZIaSs3VQzvr9rG91KUDpQYAvBnlBn7DUe/S+5sO64Uv9mhXQcPilkEBFl2R2lm3n99TXTuEm5wQANASKDfweYfLa7RwTY7+uTZHxZVOSVKELVA3pHXR5LO6KTE6xOSEAICWRLmBTzIMQ1/vLdXfv96vj74rkMttSJISo0I06cwU3TCqi6JCgkxOCQBoDZQb+JT88lq9veGg3vgmVwdKqhu3p3WL0aQzU3RB/wQFBVhNTAgAaG2UG3i92jqXPtleoH9tyNPKnYX670kaRdgCdXlqJ00c3VV9E6PMDQkAaDOUG3ilepdbq/aU6N2Nefr4uwJVOuobvzcipb2uG56sSwd3VFgwf8UBwN/wzg+v4ax3a/XeEi3bmq/l2/IbBwdLDcsj/Dy1k64elqQecaz7BAD+jHIDj1ZRW6evdhdr+bYCfbK9QPbaH87QtA8L0mWDO+nnqZ00rGt71nwCAEii3MDDGIahfcVV+mxnkT7dUaC1+0pV5zIavx8bEawLByTq4oGJGtW9A4ODAQBHodzAdKVVTv0nu1hf7S7WV9nFyiurafL9brHhGtsnXhcNTNSwru0VYOUMDQDg+Cg3aHOlVU6t3Veir/eWas2+Uu3It8v44eSMggIsGpESo/P7xuv8vvHqzhgaAMBJoNygVbndhvYWV2rDgTJtyDmi9QeOaHdh5VH79UmI1Nm9YnV2r1ildYvhLicAwCnjNwhajGEYyrfXavPBcm05WK7NeeXalFum8pq6o/btnRChtG4dlNY9RiO7xSg+kiUQAAAtg3KDU1LvcmtvcZW2HbJr+2G7th1u+Pjj27O/FxJk1eCkdhrapb2Gdmmn4SkxigkPNiE1AMAfUG5wQs56t3JKq5RdWKXdBRXaVVipXfkV2ltc2eQupu8FWC3qkxCpwUnRGpQUrcGd26lvx0juagIAtBnKDVTncivvSI0OlFbrQEmVDpRUa19xlfYWVSr3SE3jopP/Kzw4QH07Rql/xyj16xilfh0j1a9jlEKCAtr4GQAA8APKjR+orXMpv7xWh8prdLisVgeP1OjgkWrlHqnWwSM1Olxee9wCIzWUmO5xEeqVEKHeCZHqnRChXvGR6twuVFZuywYAeBjKjRerc7lVUulUUYVDRZW1KqpwKL/coYKKWhWU1yrfXqsCe+0xx8H8L1ugVV07hKlLTLhSOoQpJTZc3ePC1SMuQvGRNmb/BQB4DcqNhzAMQ5WOepVV16m8pk5Hqp0qrXLqSJVTpdV1DR+rnCqudKikyqmSSoeOVB99F9LxhAYFqGO7EHWKDlVS++8fYY0f4yNtnIUBAPgEyk0L+f4sSqWjTpUOl6oc9aqorVelo16VtXWqqK1XxX+32WvrZK+pk722vuFjTZ3KaupOeGnoeAKtFsVG2BQXaVNsRLASo0MUHxmixOgQJUTZlBDVUGjahQVx9gUA4Bc8otzMmzdPTzzxhPLz8zVkyBA9++yzGjly5HH3f/PNN3X//fdr//796tWrlx577DFdcsklbZj4aOsPHNEvXvj6tP+c4ECr2ocFqV1osGLCGx7tw4PUPixYHcKD1SHCpg4RwYqNsKlDeLDahwVzxgUAgB8xvdwsXrxYmZmZmj9/vtLS0jR37lxlZGRo586dio+PP2r/VatWacKECcrKytJll12mhQsX6oorrtCGDRs0cOBAE55BgwhboAKtFkWEBCo8OFARtsCGz22BigwJVFRIw7bIkCBFhQQqKjRIUSFBDR9DA9UuNFjtwoK40wgAgNNkMQzj5K+FtKC0tDSNGDFCzz33nCTJ7XYrOTlZ06ZN04wZM47af/z48aqqqtIHH3zQuG3UqFFKTU3V/Pnzj9rf4XDI4XA0fm2325WcnKzy8nJFRUW12PP4/mXk0g8AAC3PbrcrOjq6Wb+/TZ1Zzel0av369UpPT2/cZrValZ6ertWrVx/zmNWrVzfZX5IyMjKOu39WVpaio6MbH8nJyS33BH7EYrFQbAAA8ACmlpvi4mK5XC4lJCQ02Z6QkKD8/PxjHpOfn39S+8+cOVPl5eWNj9zc3JYJDwAAPJLpY25am81mk81mMzsGAABoI6aeuYmNjVVAQIAKCgqabC8oKFBiYuIxj0lMTDyp/QEAgH8xtdwEBwdr2LBhWrFiReM2t9utFStWaPTo0cc8ZvTo0U32l6Tly5cfd38AAOBfTL8slZmZqUmTJmn48OEaOXKk5s6dq6qqKk2ePFmSNHHiRHXu3FlZWVmSpDvuuEPnnXeennrqKV166aVatGiRvvnmG73wwgtmPg0AAOAhTC8348ePV1FRkWbNmqX8/HylpqZq2bJljYOGc3JyZLX+cILpzDPP1MKFC3XffffpnnvuUa9evfTuu++aOscNAADwHKbPc9PWTuY+eQAA4Bm8Zp4bAACAlka5AQAAPoVyAwAAfArlBgAA+BTKDQAA8CmUGwAA4FNMn+emrX1/57vdbjc5CQAAaK7vf283ZwYbvys3FRUVkqTk5GSTkwAAgJNVUVGh6OjoE+7jd5P4ud1uHTp0SJGRkbJYLGbHMZ3dbldycrJyc3OZ1LCV8Vq3LV7vtsNr3Xb8+bU2DEMVFRXq1KlTk5ULjsXvztxYrVYlJSWZHcPjREVF+d0/FLPwWrctXu+2w2vddvz1tf6pMzbfY0AxAADwKZQbAADgUyg3fs5ms2n27Nmy2WxmR/F5vNZti9e77fBatx1e6+bxuwHFAADAt3HmBgAA+BTKDQAA8CmUGwAA4FMoNwAAwKdQbnBMDodDqampslgs2rhxo9lxfM7+/ft18803q1u3bgoNDVWPHj00e/ZsOZ1Os6P5hHnz5iklJUUhISFKS0vT2rVrzY7kc7KysjRixAhFRkYqPj5eV1xxhXbu3Gl2LL/w6KOPymKxaPr06WZH8ViUGxzTXXfdpU6dOpkdw2ft2LFDbrdbf/3rX/Xdd9/p6aef1vz583XPPfeYHc3rLV68WJmZmZo9e7Y2bNigIUOGKCMjQ4WFhWZH8ymff/65pk6dqq+//lrLly9XXV2dLrzwQlVVVZkdzaetW7dOf/3rXzV48GCzo3g0bgXHUT788ENlZmbq7bff1oABA/Ttt98qNTXV7Fg+74knntDzzz+vvXv3mh3Fq6WlpWnEiBF67rnnJDWsJ5ecnKxp06ZpxowZJqfzXUVFRYqPj9fnn3+uc8891+w4PqmyslJDhw7VX/7yFz300ENKTU3V3LlzzY7lkThzgyYKCgo0ZcoU/f3vf1dYWJjZcfxKeXm5YmJizI7h1ZxOp9avX6/09PTGbVarVenp6Vq9erWJyXxfeXm5JPF3uBVNnTpVl156aZO/3zg2v1s4E8dnGIZuuukm3XrrrRo+fLj2799vdiS/kZ2drWeffVZPPvmk2VG8WnFxsVwulxISEppsT0hI0I4dO0xK5fvcbremT5+us846SwMHDjQ7jk9atGiRNmzYoHXr1pkdxStw5sYPzJgxQxaL5YSPHTt26Nlnn1VFRYVmzpxpdmSv1dzX+sfy8vJ00UUX6dprr9WUKVNMSg6cuqlTp2rr1q1atGiR2VF8Um5uru644w794x//UEhIiNlxvAJjbvxAUVGRSkpKTrhP9+7ddd111+n999+XxWJp3O5yuRQQEKAbbrhBr732WmtH9XrNfa2Dg4MlSYcOHdKYMWM0atQovfrqq7Ja+f/G6XA6nQoLC9Nbb72lK664onH7pEmTVFZWpvfee8+8cD7q9ttv13vvvacvvvhC3bp1MzuOT3r33Xd15ZVXKiAgoHGby+WSxWKR1WqVw+Fo8j1QbvAjOTk5stvtjV8fOnRIGRkZeuutt5SWlqakpCQT0/mevLw8jR07VsOGDdPrr7/Om1MLSUtL08iRI/Xss89Karhk0qVLF91+++0MKG5BhmFo2rRpeuedd7Ry5Ur16tXL7Eg+q6KiQgcOHGiybfLkyerbt6/uvvtuLgUeA2Nu0KhLly5Nvo6IiJAk9ejRg2LTwvLy8jRmzBh17dpVTz75pIqKihq/l5iYaGIy75eZmalJkyZp+PDhGjlypObOnauqqipNnjzZ7Gg+ZerUqVq4cKHee+89RUZGKj8/X5IUHR2t0NBQk9P5lsjIyKMKTHh4uDp06ECxOQ7KDWCC5cuXKzs7W9nZ2UcVR06mnp7x48erqKhIs2bNUn5+vlJTU7Vs2bKjBhnj9Dz//POSpDFjxjTZ/sorr+imm25q+0DAj3BZCgAA+BRGLwIAAJ9CuQEAAD6FcgMAAHwK5QYAAPgUyg0AAPAplBsAAOBTKDcAAMCnUG4AAIBPodwAAACfQrkBAAA+hXIDAAB8CuUGgNfbv3+/LBbLUY//XdQRgH9gVXAAXi85OVmHDx9u/Do/P1/p6ek699xzTUwFwCysCg7Ap9TW1mrMmDGKi4vTe++9J6uVE9SAv+HMDQCf8qtf/UoVFRVavnw5xQbwU5QbAD7joYce0kcffaS1a9cqMjLS7DgATMJlKQA+4e2339aECRP04Ycf6mc/+5nZcQCYiHIDwOtt3bpVaWlpyszM1NSpUxu3BwcHKyYmxsRkAMxAuQHg9V599VVNnjz5qO3nnXeeVq5c2faBAJiKcgMAAHwKtxIAAACfQrkBAAA+hXIDAAB8CuUGAAD4FMoNAADwKZQbAADgUyg3AADAp1BuAACAT6HcAAAAn0K5AQAAPoVyAwAAfMr/A/JLZgEUSZtJAAAAAElFTkSuQmCC\n" }, "metadata": {} } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "z = np.arange(-5, 5, 0.1)\n", "phi = 1 / (1 + np.exp(-z))\n", "\n", "plt.plot(z, phi)\n", "plt.xlabel('z')\n", "plt.ylabel('phi')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "1J6LGKpUJbFE" }, "source": [ "### 로지스틱 회귀로 이진 분류 수행하기" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "JeR5cA_fIe24", "outputId": "a84389ab-489b-4bac-f99e-1dd86b6a1b1e" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "['A' 'C']\n" ] } ], "source": [ "char_arr = np.array(['A', 'B', 'C', 'D', 'E'])\n", "print(char_arr[[True, False, True, False, False]])" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "id": "Khxh-3t5-2Tk" }, "outputs": [], "source": [ "bream_smelt_indexes = (train_target == 'Bream') | (train_target == 'Smelt')\n", "train_bream_smelt = train_scaled[bream_smelt_indexes]\n", "target_bream_smelt = train_target[bream_smelt_indexes]" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 75 }, "id": "jEzP0aeXANra", "outputId": "0d636b60-eda6-4ead-c2e2-162dc1c97b06" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "LogisticRegression()" ], "text/html": [ "
LogisticRegression()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ] }, "metadata": {}, "execution_count": 16 } ], "source": [ "from sklearn.linear_model import LogisticRegression\n", "\n", "lr = LogisticRegression()\n", "lr.fit(train_bream_smelt, target_bream_smelt)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "VtEWtsB7EIgm", "outputId": "6c374a95-a9f2-4983-faba-beb8aaf4c58e" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "['Bream' 'Smelt' 'Bream' 'Bream' 'Bream']\n" ] } ], "source": [ "print(lr.predict(train_bream_smelt[:5]))" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "3H_qieV-_CTt", "outputId": "f38633e8-1b98-4b17-f86b-95685099e372" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "[[0.99759855 0.00240145]\n", " [0.02735183 0.97264817]\n", " [0.99486072 0.00513928]\n", " [0.98584202 0.01415798]\n", " [0.99767269 0.00232731]]\n" ] } ], "source": [ "print(lr.predict_proba(train_bream_smelt[:5]))" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Mm60bpr7EQKU", "outputId": "1f439ee9-e3a5-44ff-a0b3-1462670728fb" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "['Bream' 'Smelt']\n" ] } ], "source": [ "print(lr.classes_)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "1mvoYhUVQmFY", "outputId": "a8eee751-d8f9-47d7-a890-0cb480ba03c2" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "[[-0.4037798 -0.57620209 -0.66280298 -1.01290277 -0.73168947]] [-2.16155132]\n" ] } ], "source": [ "print(lr.coef_, lr.intercept_)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "SxrRy9m8A5Hy", "outputId": "a092eee9-5329-4de9-ee2a-65c2782e36ce" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "[-6.02927744 3.57123907 -5.26568906 -4.24321775 -6.0607117 ]\n" ] } ], "source": [ "decisions = lr.decision_function(train_bream_smelt[:5])\n", "print(decisions)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "SeuhSRuiA9yZ", "outputId": "f9127243-4293-4dca-b0c6-4f81af5d0fe1" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "[0.00240145 0.97264817 0.00513928 0.01415798 0.00232731]\n" ] } ], "source": [ "from scipy.special import expit\n", "\n", "print(expit(decisions))" ] }, { "cell_type": "markdown", "metadata": { "id": "6ee-s4l7EuVo" }, "source": [ "### 로지스틱 회귀로 다중 분류 수행하기" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "7QugsbD2X8bf", "outputId": "1b5f1118-3b3a-43a6-b7d5-a5826475c001" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "0.9327731092436975\n", "0.925\n" ] } ], "source": [ "lr = LogisticRegression(C=20, max_iter=1000)\n", "lr.fit(train_scaled, train_target)\n", "\n", "print(lr.score(train_scaled, train_target))\n", "print(lr.score(test_scaled, test_target))" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "0taO0XnF9dha", "outputId": "e13af0b2-9a8f-4703-92f5-420bae40bc42" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "['Perch' 'Smelt' 'Pike' 'Roach' 'Perch']\n" ] } ], "source": [ "print(lr.predict(test_scaled[:5]))" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "pqZosYezZOi3", "outputId": "366bf3bc-5df7-4056-de6a-838320bc7cb7" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "[[0. 0.014 0.841 0. 0.136 0.007 0.003]\n", " [0. 0.003 0.044 0. 0.007 0.946 0. ]\n", " [0. 0. 0.034 0.935 0.015 0.016 0. ]\n", " [0.011 0.034 0.306 0.007 0.567 0. 0.076]\n", " [0. 0. 0.904 0.002 0.089 0.002 0.001]]\n" ] } ], "source": [ "proba = lr.predict_proba(test_scaled[:5])\n", "print(np.round(proba, decimals=3))" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "CXASv4WU87UF", "outputId": "6f8b2061-88b0-4cd9-9f11-cd907919ef24" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "['Bream' 'Parkki' 'Perch' 'Pike' 'Roach' 'Smelt' 'Whitefish']\n" ] } ], "source": [ "print(lr.classes_)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "1swPv6ZOZTjg", "outputId": "c52ceba6-b8ab-4f90-ecd6-38ebb6acbbef" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "(7, 5) (7,)\n" ] } ], "source": [ "print(lr.coef_.shape, lr.intercept_.shape)" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "s9iRz1iAd7Oe", "outputId": "07f4b83c-1211-45eb-f698-28a381388c57" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "[[ -6.5 1.03 5.16 -2.73 3.34 0.33 -0.63]\n", " [-10.86 1.93 4.77 -2.4 2.98 7.84 -4.26]\n", " [ -4.34 -6.23 3.17 6.49 2.36 2.42 -3.87]\n", " [ -0.68 0.45 2.65 -1.19 3.26 -5.75 1.26]\n", " [ -6.4 -1.99 5.82 -0.11 3.5 -0.11 -0.71]]\n" ] } ], "source": [ "decision = lr.decision_function(test_scaled[:5])\n", "print(np.round(decision, decimals=2))" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "49CcsDHZeJma", "outputId": "53f704df-743d-45ad-e76e-6729cecfbb03" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "[[0. 0.014 0.841 0. 0.136 0.007 0.003]\n", " [0. 0.003 0.044 0. 0.007 0.946 0. ]\n", " [0. 0. 0.034 0.935 0.015 0.016 0. ]\n", " [0.011 0.034 0.306 0.007 0.567 0. 0.076]\n", " [0. 0. 0.904 0.002 0.089 0.002 0.001]]\n" ] } ], "source": [ "from scipy.special import softmax\n", "\n", "proba = softmax(decision, axis=1)\n", "print(np.round(proba, decimals=3))" ] } ], "metadata": { "colab": { "name": "4-1 로지스틱 회귀.ipynb", "provenance": [] }, "kernelspec": { "display_name": "default:Python", "language": "python", "name": "conda-env-default-py" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.10" } }, "nbformat": 4, "nbformat_minor": 0 }