{"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":[{"sourceId":3004,"databundleVersionId":861823,"sourceType":"competition"}],"dockerImageVersionId":31259,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport pandas as pd\n\nDATA_DIR = \"/kaggle/input/digit-recognizer\"\nprint(\"Files:\", os.listdir(DATA_DIR))\n\ntrain_path = f\"{DATA_DIR}/train.csv\"\ntest_path  = f\"{DATA_DIR}/test.csv\"\n\ntrain_df = pd.read_csv(train_path)\ntest_df  = pd.read_csv(test_path)\n\nprint(\"train shape:\", train_df.shape)\nprint(\"test shape:\", test_df.shape)\n\ntrain_df.head()\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2026-01-26T15:55:31.802773Z","iopub.execute_input":"2026-01-26T15:55:31.803126Z","iopub.status.idle":"2026-01-26T15:55:37.418269Z","shell.execute_reply.started":"2026-01-26T15:55:31.803084Z","shell.execute_reply":"2026-01-26T15:55:37.416735Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"Columns:\", train_df.columns[:5].tolist(), \"...\", train_df.columns[-5:].tolist())\nprint(\"First column name:\", train_df.columns[0])\nprint(\"Unique labels:\", sorted(train_df[\"label\"].unique()))\nprint(\"Pixel min/max:\", train_df.drop(columns=[\"label\"]).values.min(),\n      train_df.drop(columns=[\"label\"]).values.max())\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-26T16:01:50.546043Z","iopub.execute_input":"2026-01-26T16:01:50.546588Z","iopub.status.idle":"2026-01-26T16:01:50.798329Z","shell.execute_reply.started":"2026-01-26T16:01:50.546551Z","shell.execute_reply":"2026-01-26T16:01:50.797349Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\n\ny = train_df[\"label\"].values          \nX = train_df.drop(columns=[\"label\"]).values  \n\nX_test = test_df.values\n\nprint(\"X shape:\", X.shape)\nprint(\"y shape:\", y.shape)\nprint(\"X_test shape:\", X_test.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-26T16:02:22.027679Z","iopub.execute_input":"2026-01-26T16:02:22.027994Z","iopub.status.idle":"2026-01-26T16:02:22.119985Z","shell.execute_reply.started":"2026-01-26T16:02:22.027970Z","shell.execute_reply":"2026-01-26T16:02:22.118834Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\ndef show_digit(X, y, idx):\n    img = X[idx].reshape(28, 28)\n    plt.imshow(img, cmap=\"gray\")\n    plt.title(f\"Label: {y[idx]}\")\n    plt.axis(\"off\")\n    plt.show()\n\nshow_digit(X, y, idx=0)\nshow_digit(X, y, idx=1)\nshow_digit(X, y, idx=10)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-26T16:25:06.418256Z","iopub.execute_input":"2026-01-26T16:25:06.418632Z","iopub.status.idle":"2026-01-26T16:25:06.630013Z","shell.execute_reply.started":"2026-01-26T16:25:06.418602Z","shell.execute_reply":"2026-01-26T16:25:06.629129Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X = X.astype(\"float32\") / 255.0\nX_test = X_test.astype(\"float32\") / 255.0\n\nprint(\"X min/max:\", X.min(), X.max())\nprint(\"X_test min/max:\", X_test.min(), X_test.max())\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-26T16:04:39.018389Z","iopub.execute_input":"2026-01-26T16:04:39.019809Z","iopub.status.idle":"2026-01-26T16:04:39.279466Z","shell.execute_reply.started":"2026-01-26T16:04:39.019759Z","shell.execute_reply":"2026-01-26T16:04:39.278645Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-26T16:05:21.660138Z","iopub.execute_input":"2026-01-26T16:05:21.661024Z","iopub.status.idle":"2026-01-26T16:05:21.804349Z","shell.execute_reply.started":"2026-01-26T16:05:21.660992Z","shell.execute_reply":"2026-01-26T16:05:21.803265Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\nX_train, X_val, y_train, y_val = train_test_split(\n    X, y,\n    test_size=0.2,\n    random_state=42,\n    stratify=y\n)\n\nprint(\"X_train:\", X_train.shape, \"y_train:\", y_train.shape)\nprint(\"X_val:  \", X_val.shape,   \"y_val:  \", y_val.shape)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-26T16:28:08.142250Z","iopub.execute_input":"2026-01-26T16:28:08.143279Z","iopub.status.idle":"2026-01-26T16:28:08.549005Z","shell.execute_reply.started":"2026-01-26T16:28:08.143232Z","shell.execute_reply":"2026-01-26T16:28:08.548042Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.linear_model import LogisticRegression\nfrom sklearn.metrics import accuracy_score, classification_report\n\nclf = LogisticRegression(max_iter=1000, n_jobs=-1)\n\nclf.fit(X_train, y_train)\n\n# checking for val\nval_pred = clf.predict(X_val)\nacc = accuracy_score(y_val, val_pred)\n\nprint(\"Validation accuracy:\", acc)\n\nprint(classification_report(y_val, val_pred))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-26T16:31:29.732926Z","iopub.execute_input":"2026-01-26T16:31:29.734328Z","iopub.status.idle":"2026-01-26T16:32:04.424990Z","shell.execute_reply.started":"2026-01-26T16:31:29.734275Z","shell.execute_reply":"2026-01-26T16:32:04.423498Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\n\nmlp = keras.Sequential([\n    layers.Input(shape=(784,)),\n    layers.Dense(256, activation=\"relu\"),\n    layers.Dropout(0.2),\n    layers.Dense(128, activation=\"relu\"),\n    layers.Dropout(0.2),\n    layers.Dense(10, activation=\"softmax\"),\n])\n\nmlp.compile(\n    optimizer=\"adam\",\n    loss=\"sparse_categorical_crossentropy\",\n    metrics=[\"accuracy\"]\n)\n\ncallbacks = [\n    keras.callbacks.EarlyStopping(patience=3, restore_best_weights=True)\n]\n\nhistory = mlp.fit(\n    X_train, y_train,\n    validation_data=(X_val, y_val),\n    epochs=20,\n    batch_size=128,\n    callbacks=callbacks,\n    verbose=1\n)\n\nval_loss, val_acc = mlp.evaluate(X_val, y_val, verbose=0)\nprint(\"MLP Validation accuracy:\", val_acc)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-26T16:35:37.109015Z","iopub.execute_input":"2026-01-26T16:35:37.109953Z","iopub.status.idle":"2026-01-26T16:36:22.675061Z","shell.execute_reply.started":"2026-01-26T16:35:37.109915Z","shell.execute_reply":"2026-01-26T16:36:22.674014Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_train_cnn = X_train.reshape(-1, 28, 28, 1)\nX_val_cnn   = X_val.reshape(-1, 28, 28, 1)\nX_test_cnn  = X_test.reshape(-1, 28, 28, 1)\n\nprint(X_train_cnn.shape, X_val_cnn.shape, X_test_cnn.shape)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-26T16:45:11.305378Z","iopub.execute_input":"2026-01-26T16:45:11.306140Z","iopub.status.idle":"2026-01-26T16:45:11.314036Z","shell.execute_reply.started":"2026-01-26T16:45:11.306052Z","shell.execute_reply":"2026-01-26T16:45:11.312413Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tensorflow import keras\nfrom tensorflow.keras import layers\n\ncnn = keras.Sequential([\n    layers.Input(shape=(28, 28, 1)),\n\n    layers.Conv2D(32, (3, 3), activation=\"relu\"),\n    layers.MaxPooling2D((2, 2)),\n\n    layers.Conv2D(64, (3, 3), activation=\"relu\"),\n    layers.MaxPooling2D((2, 2)),\n\n    layers.Flatten(),\n    layers.Dense(128, activation=\"relu\"),\n    layers.Dropout(0.3),\n\n    layers.Dense(10, activation=\"softmax\")\n])\n\ncnn.compile(\n    optimizer=\"adam\",\n    loss=\"sparse_categorical_crossentropy\",\n    metrics=[\"accuracy\"]\n)\n\ncnn.summary()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-26T16:46:07.846419Z","iopub.execute_input":"2026-01-26T16:46:07.846948Z","iopub.status.idle":"2026-01-26T16:46:07.926156Z","shell.execute_reply.started":"2026-01-26T16:46:07.846897Z","shell.execute_reply":"2026-01-26T16:46:07.925276Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"callbacks = [\n    keras.callbacks.EarlyStopping(patience=3, restore_best_weights=True)\n]\n\nhistory = cnn.fit(\n    X_train_cnn, y_train,\n    validation_data=(X_val_cnn, y_val),\n    epochs=15,\n    batch_size=128,\n    callbacks=callbacks,\n    verbose=1\n)\n\nval_loss, val_acc = cnn.evaluate(X_val_cnn, y_val, verbose=0)\nprint(\"CNN Validation accuracy:\", val_acc)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-26T16:46:15.535104Z","iopub.execute_input":"2026-01-26T16:46:15.535514Z","iopub.status.idle":"2026-01-26T16:48:43.232599Z","shell.execute_reply.started":"2026-01-26T16:46:15.535487Z","shell.execute_reply":"2026-01-26T16:48:43.231103Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_probs = cnn.predict(X_test_cnn)\ntest_pred = test_probs.argmax(axis=1)\n\nimport pandas as pd\n\nsubmission = pd.DataFrame({\n    \"ImageId\": range(1, len(test_pred) + 1),\n    \"Label\": test_pred\n})\n\nsubmission.to_csv(\"submission.csv\", index=False)\nsubmission.head()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-26T16:49:06.024233Z","iopub.execute_input":"2026-01-26T16:49:06.024736Z","iopub.status.idle":"2026-01-26T16:49:11.945789Z","shell.execute_reply.started":"2026-01-26T16:49:06.024703Z","shell.execute_reply":"2026-01-26T16:49:11.944751Z"}},"outputs":[],"execution_count":null}]}