| { | |
| "cells": [ | |
| { | |
| "cell_type": "code", | |
| "execution_count": 86, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "import numpy as np\n", | |
| "from torchvision.datasets import MNIST\n", | |
| "from torchvision.transforms import transforms\n", | |
| "import matplotlib.pyplot as plt\n", | |
| "from sklearn.svm import SVC\n", | |
| "from sklearn.model_selection import GridSearchCV\n", | |
| "from sklearn.linear_model import LogisticRegression\n", | |
| "from sklearn.metrics import accuracy_score\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Load MNIST" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 8, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "MNIST_MEAN = 0.1307\n", | |
| "MNIST_STD = 0.3081\n", | |
| "\n", | |
| "transform = transforms.Compose([\n", | |
| " transforms.ToTensor(), \n", | |
| " transforms.Normalize((MNIST_MEAN,), (MNIST_STD,))\n", | |
| " ])\n", | |
| "\n", | |
| "train_dataset = MNIST(root='../data', train=True, download=True, transform=transform)\n", | |
| "test_dataset = MNIST(root='../data', train=False, download=True, transform=transform)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Show Image Function" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 183, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def show_image(image, title):\n", | |
| " plt.figure(figsize=(4, 4))\n", | |
| " plt.imshow(image, cmap='gray_r')\n", | |
| " plt.title(title)\n", | |
| " plt.axis('off')" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Train and Test data" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 188, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "X_train = np.array(train_dataset.data).reshape(-1, 28 * 28)[:1000]\n", | |
| "y_train = np.array(train_dataset.targets)[:1000]\n", | |
| "X_test = np.array(test_dataset.data).reshape(-1, 28 * 28)[:100]\n", | |
| "y_test = np.array(test_dataset.targets)[:100]" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 189, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Digit Count(train data)\n", | |
| "----- -----------------\n", | |
| "0 97\n", | |
| "1 116\n", | |
| "2 99\n", | |
| "3 93\n", | |
| "4 105\n", | |
| "5 92\n", | |
| "6 94\n", | |
| "7 117\n", | |
| "8 87\n", | |
| "9 100\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "digits, counts = np.unique(y_train, return_counts=True)\n", | |
| "print(\"Digit Count(train data)\")\n", | |
| "print(\"----- -----------------\")\n", | |
| "for digit, count in zip(digits, counts):\n", | |
| " print(f\"{digit:<8}{count}\")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Kernel: Linear" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 190, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Best Score: 0.88\n", | |
| "Best Parameters: {'C': 1e-06}\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "param_grid = {\n", | |
| " 'C': [1e-7, 1e-6, 1e-5, 1e-4, 0.01, 0.1, 1, 10]\n", | |
| "}\n", | |
| "\n", | |
| "svm = SVC(kernel='linear')\n", | |
| "\n", | |
| "grid_search_linear = GridSearchCV(svm, param_grid, cv=5)\n", | |
| "\n", | |
| "grid_search_linear.fit(X_train, y_train)\n", | |
| "\n", | |
| "print(f\"Best Score: {grid_search_linear.best_score_:.2f}\")\n", | |
| "print(f\"Best Parameters: {grid_search_linear.best_params_}\")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Kernel: RBF" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 125, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Best Score: 0.91\n", | |
| "Best Parameters: {'C': 10, 'gamma': 'scale'}\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "param_grid = {\n", | |
| " 'C': [0.01, 0.1, 1, 10, 100],\n", | |
| " 'gamma': ['scale', 'auto']\n", | |
| "}\n", | |
| "\n", | |
| "svm = SVC(kernel='rbf')\n", | |
| "\n", | |
| "grid_search_rbf = GridSearchCV(svm, param_grid, cv=5)\n", | |
| "\n", | |
| "grid_search_rbf.fit(X_train, y_train)\n", | |
| "\n", | |
| "print(f\"Best Score: {grid_search_rbf.best_score_:.2f}\")\n", | |
| "print(f\"Best Parameters: {grid_search_rbf.best_params_}\")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Kernel: Polynomial Degree 2" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 126, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Best Score: 0.89\n", | |
| "Best Parameters: {'C': 10, 'gamma': 'scale'}\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "param_grid = {\n", | |
| " 'C': [0.1, 1, 10, 100],\n", | |
| " 'gamma': ['scale', 'auto']\n", | |
| "}\n", | |
| "\n", | |
| "svm = SVC(kernel='poly', degree=2)\n", | |
| "\n", | |
| "grid_search_poly = GridSearchCV(svm, param_grid, cv=5)\n", | |
| "\n", | |
| "grid_search_poly.fit(X_train, y_train)\n", | |
| "\n", | |
| "\n", | |
| "print(f\"Best Score: {grid_search_poly.best_score_:.2f}\")\n", | |
| "print(f\"Best Parameters: {grid_search_poly.best_params_}\")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Best SVM" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 151, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Best Parameters: {'C': 10, 'gamma': 'scale'}\n", | |
| "SVM Train Accuracy: 1.00\n", | |
| "SVM Test Accuracy: 0.94\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "best_svm = grid_search_rbf.best_estimator_\n", | |
| "\n", | |
| "y_train_pred = best_svm.predict(X_train)\n", | |
| "y_test_pred = best_svm.predict(X_test)\n", | |
| "\n", | |
| "train_accuracy = accuracy_score(y_train, y_train_pred)\n", | |
| "test_accuracy = accuracy_score(y_test, y_test_pred)\n", | |
| "\n", | |
| "print(f\"Best Parameters: {grid_search_rbf.best_params_}\")\n", | |
| "print(f\"SVM Train Accuracy: {train_accuracy:.2f}\")\n", | |
| "print(f\"SVM Test Accuracy: {test_accuracy:.2f}\")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# SVM VS. Logistic Regression" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 152, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Logistic Regression Test Accuracy: 0.90\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "logistic = LogisticRegression(max_iter=300)\n", | |
| "logistic.fit(X_train, y_train)\n", | |
| "logistic_y_pred = logistic.predict(X_test)\n", | |
| "lr_accuracy = accuracy_score(y_test, logistic_y_pred)\n", | |
| "print(f\"Logistic Regression Test Accuracy: {lr_accuracy:.2f}\")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 184, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "image/png": "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956GDRumAwcOaPHixUFzycnJKiwsDLxjvGrVKlWvXr3UX/BPhYWFqV+/fnrllVeUmZmpFi1aBM71eNGkSRNJ8nxurrCwUA0aNCi1vOTQtbCwMGh5WbM//50S3377rZxzuvnmm9WuXbugPx999JG+++47SQr8w3Ix3nS4GLw+J4WFhYFTBD9Vr169895HbGys5s2bp1OnTmnSpEm67bbblJSUFHT+ORQX+hzGx8dr7969OnjwoPLy8tSuXbvApybi4uK0fft2HTt2THl5eapatao6deoU9PtlPV+hvrZq164d9HPJm38nTpyQpMDrpaznt6y/h8qoUp+DLEtERITGjBmjZcuWBc6Xlejevbtq1aqlrKwsxcXFKScnR3369Dnvx3X69eunOXPmKDMz85yfpyxLfHy8IiIitH79eg0aNOi887Vr11ZBQUGp5SUn7OvUqRO0PJQ9vDp16igsLEzLly8v853ukmV169aVdPbjI5cDr89J7dq19c0335SaK2tZWRITE5WYmKiTJ0/qo48+0sKFCzV+/Hg1bdo05D2inz6HP9/z9SI+Pl5PP/20Nm3apE2bNum2224L3FYSw82bNysvL0/R0dGlXsNlvS5CfW2dT8n8t99+W+o2r8/55a5S70H+9F2+n/r8888lld6DuuKKK5SUlKT3339fixYtUnFxsafD5UaNGmn48OHq0qWL+U60pUGDBkpOTtaGDRu0Zs2aMmf27dunHTt2SJISEhK0e/duffrpp0Eza9asUVhY2AV91q1z585yzungwYOKjo4u9afkXdgOHTqoZs2ayszMlDvHN3KUBPVifETpXBISEpSbm1vqsPfll19WZGSkbrzxRkln9wJ37dql3bt3B829+uqrId1ftWrVFBcXF/io2GeffRZYLnl7vLfccouqVKmiF198MaT7LhEbG6sqVapo3bp12rVrl+Li4gK31axZUzfccIPWrFmjAwcOeH5NXOzX1nXXXacGDRro9ddfD1qen58fOO1R2VXqPcjhw4ercePG6tKli1q2bCnnnLZv366lS5eqevXqGjp0aKnfSU5O1vLly/X000+rZcuWgfM65zNhwoRyb+fkyZO1f/9+paWl6b333lO3bt1Uv359fffdd3r//fe1atUqPfXUU2rTpo2GDRumNWvWaOTIkUpNTVWTJk2Uk5OjF154QYMGDdJ1111X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RiA0Bw8e9DzbuHFjz7N9+/b1PLtq1SrPs5eDDz/80PPs1q1bPc+2bt3a82z79u09z1599dWeZ1Fx2IMEAAOBBAADgQQAA4EEAAOBBAADgQQAA4EEAAOBBAADgQQAA4EEAAPfalgJDR8+vELW6/f7K2S9odi8ebPn2aFDh3qe3bt3r+fZEydOeJ4NRbdu3TzPrlu3rkK2AaFhDxIADAQSAAwEEgAMBBIADAQSAAwEEgAMBBIADAQSAAwEEgAMBBIADFxqWAkdOXLkUm9CSDIzMz3Pjh071vPsN99843k2lMsox4wZ43n27bff9jy7evVqz7Pr16/3PJuYmOh5FqFhDxIADAQSAAwEEgAMBBIADAQSAAwEEgAMBBIADAQSAAwEEgAMBBIADFxqiHIJ5fLBIUOGeJ49ffq059kRI0Z4nk1PT/c8e80113ie/fLLLz3PhmL+/PmeZ7nUsOKwBwkABgIJAAYCCQAGAgkABgIJAAYCCQAGAgkABgIJAAYCCQAGAgkABi41REAo35YYyrcP1qxZ0/NsWlqa59k///nPnmcrm6SkpEu9CRB7kABgIpAAYCCQAGAgkABgIJAAYCCQAGAgkABgIJAAYCCQAGAgkABg4FLDSmjYsGGeZzds2OB5dsGCBeXYmvML5dsHK9vlg865Cpnt3bt3eTYHFxl7kABgIJAAYCCQAGAgkABgIJAAYCCQAGAgkABgIJAAYCCQAGAgkABg4FLDSig5Odnz7Ny5cz3Pfvzxx+XZnPNq3rx5haz32LFjnmdPnDhRIdsQynMWGRnpeXbfvn2eZxs1auR5FqFhDxIADAQSAAwEEgAMBBIADAQSAAwEEgAMBBIADAQSAAwEEgAMBBIADFxqWAnVqlXL82zfvn09z1bUpYZ/+9vfPM9+8MEHnme3bNnieTaUS/cqyvTp0z3PxsbGVtyGwDP2IAHAQCABwEAgAcBAIAHAQCABwEAgAcBAIAHAQCABwEAgAcBAIAHAEOacc5d6I1BxiouLPc8uWLDA8+yUKVM8z4by7YOhCOWlGxYWViHb4PP5PM9+8sknnmcjIiLKszm4yNiDBAADgQQAA4EEAAOBBAADgQQAA4EEAAOBBAADgQQAA4EEAAOBBAADlxqiXLZv3+55dubMmZ5nly9f7nm2oi41vPbaaz3Ppqene54dOnSo51lcHtiDBAADgQQAA4EEAAOBBAADgQQAA4EEAAOBBAADgQQAA4EEAAOBBAADlxoCgIE9SAAwEEgAMBBIADAQSAAwEEgAMBBIADAQSAAwEEgAMBBIADAQSAAwEEgAMBBIADAQSAAwEEgAMBBIADAQSAAwEEgAMBBIADAQSAAwEEgAMBBIADAQSAAwEEgAMBBIADAQSAAwEEgAMBBIADAQSAAwEEgAMBBIADAQSAAwEEgAMBBIADAQSAAwEEgAMBBIADAQSAAwEEgAMBBIADAQSAAwEEgAMBBIADAQSAAwEEgAMBBIADAQSAAwEEgAMBBIADAQSAAwEEgAMBBIADAQSAAwEEgAMBBIADAQSAAwEEgAMBBIADAQSAAwEEgAMBBIADAQSAAwEEgAMBBIADAQSAAwEEgAMBBIADAQSAAwEEgAMBBIADAQSAAwEEgAMBBIADAQSAAwEEgAMBBIADD8P99P+LvQi/uFAAAAAElFTkSuQmCC", | |
| "text/plain": [ | |
| "<Figure size 400x400 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "np.random.seed(31)\n", | |
| "svm_pred = y_test_pred\n", | |
| "logistic_pred = logistic_y_pred\n", | |
| "svm_correct_logistic_wrong = X_test[(svm_pred == y_test) & (logistic_pred == y_test)]\n", | |
| "index = np.random.randint(0, len(svm_correct_logistic_wrong))\n", | |
| "image = svm_correct_logistic_wrong[index]\n", | |
| "\n", | |
| "\n", | |
| "show_image(image.reshape((28, 28, 1)), \"SVM Correct, Logistic Wrong\")\n", | |
| "plt.savefig(\"../assets/Q6.png\")\n", | |
| "plt.show()\n" | |
| ] | |
| } | |
| ], | |
| "metadata": { | |
| "kernelspec": { | |
| "display_name": "base", | |
| "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.11.5" | |
| } | |
| }, | |
| "nbformat": 4, | |
| "nbformat_minor": 2 | |
| } | |
Xet Storage Details
- Size:
- 16.9 kB
- Xet hash:
- 47ad9a89e0bcecf3bf5145b67bcddf9c1f0e66bb8258876ca58f0ad43201dba2
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.