{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "kOukJxo36Tpt"
   },
   "source": [
    "# 04 분류하는 뉴런을 만듭니다"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Pb3VopoP6Tpu"
   },
   "source": [
    "이 노트북을 주피터 노트북 뷰어(nbviewer.jupyter.org)로 보거나 구글 코랩(colab.research.google.com)에서 실행할 수 있습니다.\n",
    "\n",
    "<table class=\"tfo-notebook-buttons\" align=\"left\">\n",
    "  <td>\n",
    "    <a target=\"_blank\" href=\"https://nbviewer.org/github/rickiepark/do-it-dl/blob/master/Ch04.ipynb\"><img src=\"https://jupyter.org/assets/share.png\" width=\"60\" />주피터 노트북 뷰어로 보기</a>\n",
    "  </td>\n",
    "  <td>\n",
    "    <a target=\"_blank\" href=\"https://colab.research.google.com/github/rickiepark/do-it-dl/blob/master/Ch04.ipynb\"><img src=\"https://www.tensorflow.org/images/colab_logo_32px.png\" />구글 코랩(Colab)에서 실행하기</a>\n",
    "  </td>\n",
    "</table>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "id": "PRvMuLoO6Tpv"
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "np.random.seed(42)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Fs6ia2Y_6Tpv"
   },
   "source": [
    "## 04-2 시그모이드 함수를 알아봅니다"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 279
    },
    "id": "9sns13BN6Tpw",
    "outputId": "7c750a5b-21e1-4a24-e76c-5eb0121aa172"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "probs = np.arange(0, 1, 0.01)\n",
    "odds = [p/(1-p) for p in probs]\n",
    "plt.plot(probs, odds)\n",
    "plt.xlabel('p')\n",
    "plt.ylabel('p/(1-p)')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 279
    },
    "id": "kbTarhzh6Tpw",
    "outputId": "f5455f48-22b9-47e9-a5ef-d17f70de1498"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "probs  = np.arange(0.001, 0.999, 0.001)\n",
    "logit = [np.log(p/(1-p)) for p in probs]\n",
    "plt.plot(probs, logit)\n",
    "plt.xlabel('p')\n",
    "plt.ylabel('log(p/(1-p))')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 279
    },
    "id": "IEs0YCZs6Tpx",
    "outputId": "2540a713-8dd1-464a-8c28-0daee01738e6",
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "zs = np.arange(-10., 10., 0.1)\n",
    "gs = [1/(1+np.exp(-z)) for z in zs]\n",
    "plt.plot(zs, gs)\n",
    "plt.xlabel('z')\n",
    "plt.ylabel('1/(1+e^-z)')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "V1dgq7rD6Tpx"
   },
   "source": [
    "## 04-4 분류용 데이터셋을 준비합니다"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "id": "Ts5Her_d6Tpx"
   },
   "outputs": [],
   "source": [
    "from sklearn.datasets import load_breast_cancer\n",
    "cancer = load_breast_cancer()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "hKR1I-fz6Tpy",
    "outputId": "8d7167b6-5d43-45a0-bf69-c8ef5a6a288d"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(569, 30) (569,)\n"
     ]
    }
   ],
   "source": [
    "print(cancer.data.shape, cancer.target.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "EeESRWoD6Tpy",
    "outputId": "36d5a0b1-cb46-4b60-a81c-a4e1b48fad8e",
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1.799e+01, 1.038e+01, 1.228e+02, 1.001e+03, 1.184e-01, 2.776e-01,\n",
       "        3.001e-01, 1.471e-01, 2.419e-01, 7.871e-02, 1.095e+00, 9.053e-01,\n",
       "        8.589e+00, 1.534e+02, 6.399e-03, 4.904e-02, 5.373e-02, 1.587e-02,\n",
       "        3.003e-02, 6.193e-03, 2.538e+01, 1.733e+01, 1.846e+02, 2.019e+03,\n",
       "        1.622e-01, 6.656e-01, 7.119e-01, 2.654e-01, 4.601e-01, 1.189e-01],\n",
       "       [2.057e+01, 1.777e+01, 1.329e+02, 1.326e+03, 8.474e-02, 7.864e-02,\n",
       "        8.690e-02, 7.017e-02, 1.812e-01, 5.667e-02, 5.435e-01, 7.339e-01,\n",
       "        3.398e+00, 7.408e+01, 5.225e-03, 1.308e-02, 1.860e-02, 1.340e-02,\n",
       "        1.389e-02, 3.532e-03, 2.499e+01, 2.341e+01, 1.588e+02, 1.956e+03,\n",
       "        1.238e-01, 1.866e-01, 2.416e-01, 1.860e-01, 2.750e-01, 8.902e-02],\n",
       "       [1.969e+01, 2.125e+01, 1.300e+02, 1.203e+03, 1.096e-01, 1.599e-01,\n",
       "        1.974e-01, 1.279e-01, 2.069e-01, 5.999e-02, 7.456e-01, 7.869e-01,\n",
       "        4.585e+00, 9.403e+01, 6.150e-03, 4.006e-02, 3.832e-02, 2.058e-02,\n",
       "        2.250e-02, 4.571e-03, 2.357e+01, 2.553e+01, 1.525e+02, 1.709e+03,\n",
       "        1.444e-01, 4.245e-01, 4.504e-01, 2.430e-01, 3.613e-01, 8.758e-02]])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cancer.data[:3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 279
    },
    "id": "YE9iODZV6Tpy",
    "outputId": "35fb8be6-1206-4916-8bb3-3eac1aa57419"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.boxplot(cancer.data)\n",
    "plt.xlabel('feature')\n",
    "plt.ylabel('value')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "R2EOkAaw6Tpz",
    "outputId": "64611f7f-2ea9-4919-ebe6-aae11738146e"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['mean area', 'area error', 'worst area'], dtype='<U23')"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cancer.feature_names[[3,13,23]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "1PphsijH6Tpz",
    "outputId": "af184516-5462-45a1-d3a5-5c08cece1692"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([0, 1]), array([212, 357]))"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.unique(cancer.target, return_counts=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "id": "K0pqkScD6Tpz"
   },
   "outputs": [],
   "source": [
    "x = cancer.data\n",
    "y = cancer.target"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "dHxZbcRz6Tpz"
   },
   "source": [
    "## 04-5 로지스틱 회귀로 모델을 만들어봅니다"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "id": "NFzSi38N6Tp0"
   },
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "id": "Bw-frXNV6Tp0"
   },
   "outputs": [],
   "source": [
    "x_train, x_test, y_train, y_test = train_test_split(x, y, stratify=y, \n",
    "                                                    test_size=0.2, random_state=42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "xFAMBGDo6Tp0",
    "outputId": "8d594b73-a56a-4ae9-f2c1-97442cb64807"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(455, 30) (114, 30)\n"
     ]
    }
   ],
   "source": [
    "print(x_train.shape, x_test.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "Mr3SBNBs6Tp0",
    "outputId": "3960a4a9-e987-407d-bc2d-e840bc05b0ae"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([0, 1]), array([170, 285]))"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.unique(y_train, return_counts=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "id": "g1g0LNZi6Tp1"
   },
   "outputs": [],
   "source": [
    "class LogisticNeuron:\n",
    "    \n",
    "    def __init__(self):\n",
    "        self.w = None\n",
    "        self.b = None\n",
    "\n",
    "    def forpass(self, x):\n",
    "        z = np.sum(x * self.w) + self.b  # 직선 방정식을 계산합니다\n",
    "        return z\n",
    "\n",
    "    def backprop(self, x, err):\n",
    "        w_grad = x * err    # 가중치에 대한 그래디언트를 계산합니다\n",
    "        b_grad = 1 * err    # 절편에 대한 그래디언트를 계산합니다\n",
    "        return w_grad, b_grad\n",
    "\n",
    "    def activation(self, z):\n",
    "        z = np.clip(z, -100, None) # 안전한 np.exp() 계산을 위해\n",
    "        a = 1 / (1 + np.exp(-z))  # 시그모이드 계산\n",
    "        return a\n",
    "        \n",
    "    def fit(self, x, y, epochs=100):\n",
    "        self.w = np.ones(x.shape[1])      # 가중치를 초기화합니다.\n",
    "        self.b = 0                        # 절편을 초기화합니다.\n",
    "        for i in range(epochs):           # epochs만큼 반복합니다\n",
    "            for x_i, y_i in zip(x, y):    # 모든 샘플에 대해 반복합니다\n",
    "                z = self.forpass(x_i)     # 정방향 계산\n",
    "                a = self.activation(z)    # 활성화 함수 적용\n",
    "                err = -(y_i - a)          # 오차 계산\n",
    "                w_grad, b_grad = self.backprop(x_i, err) # 역방향 계산\n",
    "                self.w -= w_grad          # 가중치 업데이트\n",
    "                self.b -= b_grad          # 절편 업데이트\n",
    "    \n",
    "    def predict(self, x):\n",
    "        z = [self.forpass(x_i) for x_i in x]    # 정방향 계산\n",
    "        a = self.activation(np.array(z))        # 활성화 함수 적용\n",
    "        return a > 0.5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "id": "sBj3gzgI6Tp1"
   },
   "outputs": [],
   "source": [
    "a = np.array([1,2,3])\n",
    "b = np.array([3,4,5])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "T21jnTH66Tp2",
    "outputId": "16544cc7-2eb2-4518-a19e-e2e844c2b259"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([4, 6, 8])"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a + b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "raaqs88K6Tp2",
    "outputId": "b980543b-b8d3-4267-dffe-997e279c3c1b"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 3,  8, 15])"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a * b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "Xm4-SR7T6Tp2",
    "outputId": "28af8261-6adb-4e22-8f59-f6580a0ff543"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "26"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.sum(a * b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "tm1OYFOA6Tp2",
    "outputId": "5c2049f0-1676-4ba8-f867-4d192e6ce529"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0., 0., 0.],\n",
       "       [0., 0., 0.]])"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.zeros((2, 3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "UTfQnrnN6Tp3",
    "outputId": "7766c30d-462f-4fd9-ea49-a98213b6617c"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[7, 7, 7],\n",
       "       [7, 7, 7]])"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.full((2,3), 7)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "Xq2u0BwH6Tp3",
    "outputId": "c7c471e6-e480-456b-cc33-edd793e2af9f"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0., 0., 0., 1., 1., 1.],\n",
       "       [0., 0., 0., 1., 1., 1.]])"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.c_[np.zeros((2,3)), np.ones((2,3))]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "id": "9cmKIlAW6Tp3"
   },
   "outputs": [],
   "source": [
    "neuron = LogisticNeuron()\n",
    "neuron.fit(x_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "FVWtqmWA6Tp4",
    "outputId": "7c3bf860-b9da-4353-b18a-0182d3b57d0d"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8245614035087719"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.mean(neuron.predict(x_test) == y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "HMp7rYgX6Tp4"
   },
   "source": [
    "## 04-6 단일층 신경망을 만들어 봅니다"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "id": "XqiLCxiy6Tp4"
   },
   "outputs": [],
   "source": [
    "class SingleLayer:\n",
    "    \n",
    "    def __init__(self):\n",
    "        self.w = None\n",
    "        self.b = None\n",
    "        self.losses = []\n",
    "\n",
    "    def forpass(self, x):\n",
    "        z = np.sum(x * self.w) + self.b  # 직선 방정식을 계산합니다\n",
    "        return z\n",
    "\n",
    "    def backprop(self, x, err):\n",
    "        w_grad = x * err    # 가중치에 대한 그래디언트를 계산합니다\n",
    "        b_grad = 1 * err    # 절편에 대한 그래디언트를 계산합니다\n",
    "        return w_grad, b_grad\n",
    "\n",
    "    def activation(self, z):\n",
    "        z = np.clip(z, -100, None) # 안전한 np.exp() 계산을 위해\n",
    "        a = 1 / (1 + np.exp(-z))  # 시그모이드 계산\n",
    "        return a\n",
    "        \n",
    "    def fit(self, x, y, epochs=100):\n",
    "        self.w = np.ones(x.shape[1])               # 가중치를 초기화합니다.\n",
    "        self.b = 0                                 # 절편을 초기화합니다.\n",
    "        for i in range(epochs):                    # epochs만큼 반복합니다\n",
    "            loss = 0\n",
    "            # 인덱스를 섞습니다\n",
    "            indexes = np.random.permutation(np.arange(len(x)))\n",
    "            for i in indexes:                      # 모든 샘플에 대해 반복합니다\n",
    "                z = self.forpass(x[i])             # 정방향 계산\n",
    "                a = self.activation(z)             # 활성화 함수 적용\n",
    "                err = -(y[i] - a)                  # 오차 계산\n",
    "                w_grad, b_grad = self.backprop(x[i], err) # 역방향 계산\n",
    "                self.w -= w_grad                   # 가중치 업데이트\n",
    "                self.b -= b_grad                   # 절편 업데이트\n",
    "                # 안전한 로그 계산을 위해 클리핑한 후 손실을 누적합니다\n",
    "                a = np.clip(a, 1e-10, 1-1e-10)\n",
    "                loss += -(y[i]*np.log(a)+(1-y[i])*np.log(1-a))\n",
    "            # 에포크마다 평균 손실을 저장합니다\n",
    "            self.losses.append(loss/len(y))\n",
    "    \n",
    "    def predict(self, x):\n",
    "        z = [self.forpass(x_i) for x_i in x]     # 정방향 계산\n",
    "        return np.array(z) > 0                   # 스텝 함수 적용\n",
    "    \n",
    "    def score(self, x, y):\n",
    "        return np.mean(self.predict(x) == y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "gc9C_8-q6Tp5",
    "outputId": "e7ea4851-702b-450b-d967-fa304fdc91b6"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9298245614035088"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "layer = SingleLayer()\n",
    "layer.fit(x_train, y_train)\n",
    "layer.score(x_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 279
    },
    "id": "uVLADHF-6Tp5",
    "outputId": "5ca51fad-1a93-4a8d-daae-c1e8e1cbdf00",
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(layer.losses)\n",
    "plt.xlabel('epoch')\n",
    "plt.ylabel('loss')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "po0gxcmk6Tp6"
   },
   "source": [
    "## 04-7 사이킷런의 경사 하강법을 사용해 봅니다"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "id": "cy3cXcZZ6Tp7"
   },
   "outputs": [],
   "source": [
    "from sklearn.linear_model import SGDClassifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "mKsbcZB46Tp7",
    "outputId": "41310703-bc1f-4f88-a768-60d20e4e59db"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8333333333333334"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sgd = SGDClassifier(loss='log', max_iter=100, tol=1e-3, random_state=42)\n",
    "sgd.fit(x_train, y_train)\n",
    "sgd.score(x_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "Clo3WD4d6Tp8",
    "outputId": "244e54df-9d5e-4115-fb99-4d6f48793486"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1, 0, 0, 0, 0, 1, 0, 0, 0])"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sgd.predict(x_test[0:10])"
   ]
  }
 ],
 "metadata": {
  "colab": {
   "name": "Ch04.ipynb",
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}