{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import fetch_openml\n",
    "mnist= fetch_openml('mnist_784', version=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict_keys(['data', 'target', 'frame', 'categories', 'feature_names', 'target_names', 'DESCR', 'details', 'url'])"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mnist.keys()\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "mnist[\"DESCR\"]\n",
    "X,y=mnist[\"data\"], mnist[\"target\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib\n",
    "import matplotlib.pyplot as plt\n",
    "digit=X[0]\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "imgDigit=digit.reshape(28,28)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "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.imshow(imgDigit,cmap='binary')\n",
    "plt.axis='off'\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "y=y.astype(np.uint8)\n",
    "X_train,X_test,y_train,y_test = X[:60000],X[60000:],y[:60000],y[60000:]\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "#shuffled, but if in order do following to ensure digits fairly distributed\n",
    "#shuffle_index=np.random.permutation(60000)\n",
    "#X_train,y_train=X_train[shuffle_index],y_train[shuffle_index]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "#TRAIN A 5 digit classifier\n",
    "y_train_5=(y_train == 5) #find all fives -y_train_5 only true when digit is a five\n",
    "y_test_5=(y_test == 5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "SGDClassifier(random_state=42)"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#Geron trains a stochastic gradient descent classifier with these data\n",
    "from sklearn.linear_model import SGDClassifier\n",
    "sgd_clf=SGDClassifier(random_state=42) #make the random numbers reproducible by specifiying a seed value\n",
    "sgd_clf.fit(X_train,y_train_5) #training labels are either true or false  - this is a binary classifier\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ True])"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sgd_clf.predict([digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import cross_val_predict\n",
    "from sklearn.metrics import roc_curve\n",
    "y_scores = cross_val_predict(sgd_clf,X_train,y_train_5,cv=3,method=\"decision_function\")\n",
    "fpr,tpr,thresholds = roc_curve(y_train_5,y_scores)\n",
    "\n",
    "           "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "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": [
    "\n",
    "plt.plot(fpr,tpr,label=None)\n",
    "plt.plot([0,1],[0,1],'k--')\n",
    "plt.xlabel('False Positive Rate')\n",
    "plt.ylabel('True Positive Rate')\n",
    "\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9604938554008616"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#calc AUC\n",
    "from sklearn.metrics import roc_auc_score\n",
    "roc_auc_score(y_train_5,y_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[53892,   687],\n",
       "       [ 1891,  3530]], dtype=int64)"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#Confusion Matrix\n",
    "from sklearn.metrics import confusion_matrix\n",
    "#create some new unused prediction data using cross validation\n",
    "# performs K-fold cross-validation and returns predictions\n",
    "train_pred = cross_val_predict(sgd_clf,X_train,y_train_5,cv=3)\n",
    "#now use y_train_5 (actual true values) and train_pred (predicted output of classifier)\n",
    "confusion_matrix(y_train_5,train_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[54579,     0],\n",
       "       [    0,  5421]], dtype=int64)"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "confusion_matrix(y_train_5,y_train_5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "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.9.16"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
