{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceType":"competition","sourceId":3362,"databundleVersionId":31148}],"dockerImageVersionId":31328,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2026-04-05T08:12:46.504892Z","iopub.execute_input":"2026-04-05T08:12:46.505144Z","iopub.status.idle":"2026-04-05T08:12:46.513431Z","shell.execute_reply.started":"2026-04-05T08:12:46.505123Z","shell.execute_reply":"2026-04-05T08:12:46.512356Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport shutil\nimport zipfile\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport cv2\nimport random\nfrom tqdm import tqdm\nfrom sklearn.svm import SVC\nfrom sklearn.metrics import classification_report, confusion_matrix, accuracy_score\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import StandardScaler\n\n# ─── STEP 1: Copy zip to working directory first ───────────────────────\nsrc = '/kaggle/input/competitions/dogs-vs-cats/train.zip'\ndst = '/kaggle/working/train.zip'\n\nprint(\"⏳ Copying zip file...\")\nshutil.copy(src, dst)\nprint(\"✅ Copied!\")\n\n# ─── STEP 2: Unzip ─────────────────────────────────────────────────────\nprint(\"⏳ Unzipping...\")\nwith zipfile.ZipFile(dst, 'r') as z:\n    z.extractall('/kaggle/working/train_data')\nprint(\"✅ Unzipped!\")\n\n# ─── STEP 3: Confirm structure ─────────────────────────────────────────\nfor dirname, _, filenames in os.walk('/kaggle/working/train_data'):\n    print(f\"{dirname} — {len(filenames)} files\")\n    break\n\n# ─── STEP 4: Settings ──────────────────────────────────────────────────\nIMG_SIZE = 64\nSAMPLE_SIZE = 2000\n\ntrain_dir = '/kaggle/working/train_data/train'\n\n# ─── STEP 5: Load Images ───────────────────────────────────────────────\nall_files = os.listdir(train_dir)\ncat_files = [f for f in all_files if f.startswith('cat')][:SAMPLE_SIZE//2]\ndog_files = [f for f in all_files if f.startswith('dog')][:SAMPLE_SIZE//2]\n\nprint(f\"\\n✅ Cat images: {len(cat_files)} | Dog images: {len(dog_files)}\")\n\ndef load_images_from_list(file_list, folder, label):\n    data = []\n    for fname in tqdm(file_list, desc=f\"Loading {'cats' if label==0 else 'dogs'}\"):\n        fpath = os.path.join(folder, fname)\n        img = cv2.imread(fpath)\n        if img is not None:\n            img = cv2.resize(img, (IMG_SIZE, IMG_SIZE))\n            img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)\n            data.append((img.flatten(), label))\n    return data\n\ncat_data = load_images_from_list(cat_files, train_dir, label=0)\ndog_data = load_images_from_list(dog_files, train_dir, label=1)\n\nall_data = cat_data + dog_data\nrandom.shuffle(all_data)\n\nX = np.array([item[0] for item in all_data])\ny = np.array([item[1] for item in all_data])\n\nprint(f\"\\n✅ Total: {X.shape[0]} | Cats: {sum(y==0)} | Dogs: {sum(y==1)}\")\n\n# ─── STEP 6: Scale + Split ─────────────────────────────────────────────\nscaler = StandardScaler()\nX_scaled = scaler.fit_transform(X)\n\nX_train, X_test, y_train, y_test = train_test_split(\n    X_scaled, y, test_size=0.2, random_state=42)\n\nprint(f\"✅ Train: {X_train.shape[0]} | Test: {X_test.shape[0]}\")\n\n# ─── STEP 7: Train SVM ─────────────────────────────────────────────────\nprint(\"\\n⏳ Training SVM... (may take 2-3 minutes)\")\nsvm = SVC(kernel='rbf', C=10, gamma='scale', random_state=42)\nsvm.fit(X_train, y_train)\nprint(\"✅ SVM Training Complete!\")\n\n# ─── STEP 8: Evaluate ──────────────────────────────────────────────────\ny_pred = svm.predict(X_test)\nacc = accuracy_score(y_test, y_pred)\n\nprint(f\"\\n✅ Accuracy: {acc * 100:.2f}%\")\nprint(\"\\nClassification Report:\")\nprint(classification_report(y_test, y_pred, target_names=['Cat', 'Dog']))\n\n# ─── STEP 9: Confusion Matrix ──────────────────────────────────────────\ncm = confusion_matrix(y_test, y_pred)\nplt.figure(figsize=(6, 5))\nsns.heatmap(cm, annot=True, fmt='d', cmap='Blues',\n            xticklabels=['Cat', 'Dog'],\n            yticklabels=['Cat', 'Dog'])\nplt.xlabel('Predicted')\nplt.ylabel('Actual')\nplt.title(f'Confusion Matrix — SVM Accuracy: {acc*100:.2f}%')\nplt.tight_layout()\nplt.show()\n\n# ─── STEP 10: Sample Predictions ───────────────────────────────────────\nlabel_names = {0: 'Cat', 1: 'Dog'}\nfig, axes = plt.subplots(2, 5, figsize=(14, 6))\n\nfor i, ax in enumerate(axes.flatten()):\n    img = X_test[i].reshape(IMG_SIZE, IMG_SIZE)\n    img = (img - img.min()) / (img.max() - img.min()) * 255\n    ax.imshow(img.astype(np.uint8), cmap='gray')\n    actual = label_names[y_test[i]]\n    predicted = label_names[y_pred[i]]\n    color = 'green' if y_test[i] == y_pred[i] else 'red'\n    ax.set_title(f'A:{actual} P:{predicted}', color=color, fontsize=9)\n    ax.axis('off')\n\nplt.suptitle('Sample Predictions (Green=Correct, Red=Wrong)', fontsize=12)\nplt.tight_layout()\nplt.show()\n\nprint(\"\\n🎉 Task 03 Complete!\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-05T08:12:46.514752Z","iopub.execute_input":"2026-04-05T08:12:46.515019Z","iopub.status.idle":"2026-04-05T08:13:10.217762Z","shell.execute_reply.started":"2026-04-05T08:12:46.514997Z","shell.execute_reply":"2026-04-05T08:13:10.216886Z"}},"outputs":[],"execution_count":null}]}