diff --git a/TabDDPMAnalysis.ipynb b/TabDDPMAnalysis.ipynb new file mode 100644 index 00000000..870993c5 --- /dev/null +++ b/TabDDPMAnalysis.ipynb @@ -0,0 +1,213 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + } + }, + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 771 + }, + "id": "_8vQ99lZBSgv", + "outputId": "b1932d63-768a-40e0-bdaa-6b74b088e2fb" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Training shape: (4435, 37)\n", + "Testing shape: (2000, 37)\n", + "\n", + "Training TabDDPM...\n", + "Epoch 1, Loss: 0.7926\n", + "Epoch 2, Loss: 0.3590\n", + "Epoch 3, Loss: 0.2392\n", + "Epoch 4, Loss: 0.2303\n", + "Epoch 5, Loss: 0.2164\n", + "Epoch 6, Loss: 0.2065\n", + "Epoch 7, Loss: 0.2035\n", + "Epoch 8, Loss: 0.2030\n", + "Epoch 9, Loss: 0.2012\n", + "Epoch 10, Loss: 0.2020\n", + "\n", + "Evaluating model on test set...\n", + "\n", + "Denoising Evaluation Metrics:\n", + "- MSE: 0.1998\n", + "- R² Score: 0.7980\n", + "\n", + "Generating synthetic samples...\n", + "Synthetic data saved to synthetic_data.csv\n", + "\n", + "Plotting heatmaps...\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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8vz1oNtuu02TJ0+W5H6a8b/y5DWllStX6pprrlGVKlUUGhqq1q1b65NPPim6/mS9prjvqDt8+LBGjhyphg0bKjQ0VNWrV9dVV12ldevWFbsNTiYwMFAvvPCCmjZtqkmTJik7O7voujfffFPnn3++qlWrppCQEDVt2lQvv/yy288nJibqt99+0zfffFM0/mNj3rNnjx588EG1aNFCERERioqKUq9evfTzzz+fdFxbtmzRK6+8ogsuuOC4g3THxv3ggw+6fZpu2bJl6tWrl6KiohQREaEePXrohx9+cPu5Y9/v+80332jAgAGqVq1a0TpO9DpkXl6eRowYofr16yskJES1atXSkCFDjut9f+XJNpg/f77atGkjSUpJSSnajse6WHHfUZebm6sHHnhAtWrVUkhIiBo1aqRnn31WjuO45VwulwYOHKiPPvpIzZs3V0hIiJo1a6ZZs2adcNwAfIdP1OGMtHv3bvXq1Us33HCDbrnlFsXGxkr644k1IiJCqampioiI0Ndff63hw4crJydH48aNO+l633nnHe3fv1/9+/eXy+XS2LFjddVVV2n9+vWn9U6Va665RnfccYdmz56tJ598UpL0448/auHChbrhhhtUs2ZNZWRk6OWXX1a3bt20YsUKhYeHq0uXLho0aJBeeOEFPfLII0WnqDr239O5v59++qnq1q2rDh06eHQf7rzzTk2fPl3XXHONHnjgAS1atEhpaWn6/fff9eGHH7plV61apRtvvFH9+/dXv3791KhRo6LrRo8ereDgYD344IPKy8tTcHCwvv76a/Xq1UtJSUkaMWKEAgICiorfd999p7Zt25Y4Lk+2waOPPqrs7Gxt2bKl6J1VERERJa5zzpw56tWrl+rWrauRI0fq0KFDevHFF9WxY0ctXbr0uCJ03XXXqU6dOkpLS9PSpUv1+uuvq1q1an71jjMAAP6sf//+mjZtmlJSUjRo0CBt2LBBkyZN0rJly/T9998rKChIO3bs0IUXXqizzjpLDz/8sCpVqqSMjAzNnDlTknTWWWfp5Zdf1j/+8Q9deeWVuuqqqyRJZ5999imPi85EZwIA4EQSEhKUnp6uX3/9Vc2bNy8xd+utt6pfv37H5X788UetXr1ajz32mFv+ZK8H9e/fX9u2bSv2dOKerkOSfvvtN3Xs2FHx8fF6+OGHVbFiRb333nvq3bu3/u///k9XXnnlSXvNXxUUFOjSSy/V3LlzdcMNN+i+++7T/v379dVXX+nXX39VvXr1TNv4mMDAQN144416/PHHtWDBAl1yySWSpJdfflnNmjXT5ZdfrgoVKujTTz/VgAEDVFhYqHvuuUeSNGHCBN17772KiIjQo48+KklFr92tX79eH330ka699lrVqVNHWVlZeuWVV9S1a1etWLFCNWrUKHFMX3zxhY4ePapbb73Vo/vw22+/qXPnzoqKitKQIUMUFBSkV155Rd26ddM333yjdu3aueUHDBigs846S8OHD1dubm7R8uJehywsLNTll1+uBQsW6K677lKTJk30yy+/6Pnnn9fq1av10UcflTguT7ZBkyZN9MQTT2j48OG666671LlzZ0kqsZM6jqPLL79c8+bN0x133KFWrVrpyy+/1EMPPaStW7ce90nDBQsWaObMmRowYIAiIyP1wgsv6Oqrr9amTZtUtWpVj7YvAC9yAD92zz33OH+dpl27dnUkOVOmTDkuf/DgweOW9e/f3wkPD3cOHz5ctKxv375OQkJC0b83bNjgSHKqVq3q7Nmzp2j5xx9/7EhyPv300xOOc968eY4k5/333y8x07JlS6dy5conHGt6erojyXnrrbeKlr3//vuOJGfevHnH5T29v3+VnZ3tSHKuuOKKEjN/tnz5ckeSc+edd7otf/DBBx1Jztdff120LCEhwZHkzJo1yy17bBvVrVvXbdyFhYVOgwYNnOTkZKewsNDtvtWpU8e54IILipa9+eabjiRnw4YNbrm/Km4bXHLJJW6/82OO/e7ffPPNomWtWrVyqlWr5uzevbto2c8//+wEBAQ4ffr0KVo2YsQIR5Jz++23u63zyiuvdKpWrXrcbQEAUBr+2qe+++47R5Lz9ttvu+VmzZrltvzDDz90JDk//vhjieveuXOnI8kZMWKER2OhM9GZ/ozOBACwmj17thMYGOgEBgY67du3d4YMGeJ8+eWXTn5+vltu3759TmhoqDN06FC35YMGDXIqVqzoHDhwwHEc2+tBxb1GZV1Hjx49nBYtWrg99xYWFjodOnRwGjRoULTsRL2ma9euTteuXYv+PXXqVEeSM378+OOyf+4MxenatavTrFmzEq8/1gcnTpxYtKy4TpGcnOzUrVvXbVmzZs3cxnnM4cOHnYKCArdlGzZscEJCQpwnnnjihOMdPHiwI8lZtmzZCXPH9O7d2wkODnbWrVtXtGzbtm1OZGSk06VLl6Jlx7pTp06dnKNHj7qto6TXIf/5z386AQEBznfffee2fMqUKY4k5/vvvy9alpCQ4PTt27fo355ugx9//PG4/nXMX1/b/OijjxxJzpgxY9xy11xzjeNyuZy1a9cWLZPkBAcHuy37+eefHUnOiy++eNxtAfA9Tn2JM1JISIhSUlKOW/7n7/TYv3+/du3apc6dO+vgwYNauXLlSdd7/fXXq3LlykX/PvZulfXr15/2mCMiIrR///5ix3rkyBHt3r1b9evXV6VKlbR06VKP1nmq9/fYqZMiIyM9up3PP/9ckpSamuq2/IEHHpCk476XpU6dOkWnkfirvn37uo17+fLlWrNmjW666Sbt3r1bu3bt0q5du5Sbm6sePXro22+/PeGX457u7/yvtm/fruXLl+u2225TlSpVipafffbZuuCCC4q2xZ/dfffdbv/u3Lmzdu/eXbSdAQDwJ++//76io6N1wQUXFD3v7tq1S0lJSYqIiNC8efMkqeiUUv/5z3905MiRv218dKY/0JkAADjeBRdcoPT0dF1++eX6+eefNXbsWCUnJys+Pt7t9JHR0dG64oor9O9//7votH8FBQWaMWOGevfufdx3j3nj9aCTrWPPnj36+uuvdd111xU9F+/atUu7d+9WcnKy1qxZo61btxq3iPR///d/iomJ0b333nvcdcWdntPi2CfrS+pm2dnZ2rVrl7p27ar169e7nSKzJCEhIUXfu1tQUKDdu3crIiJCjRo1Omm3s3SzgoICzZ49W71791bdunWLllevXl033XSTFixYcFwH6devnwIDA4sd819fh3z//ffVpEkTNW7c2K1Tn3/++ZJU1KmLczrboCSff/65AgMDNWjQILflDzzwgBzH0RdffOG2vGfPnm6ftjz77LMVFRXllddAAdhx6kuckeLj44v98tzffvtNjz32mL7++uvjnmw9KQu1a9d2+/exgvXX72s5FQcOHHArEocOHVJaWprefPNNbd261e180Z6MVTr1+xsVFSXJvWidyMaNGxUQEKD69eu7LY+Li1OlSpW0ceNGt+V16tQpcV1/vW7NmjWS/ngxqiTZ2dluZffPTvd3/lfH7sufTz11TJMmTfTll18e94XCJ5o3x7Y1AAD+Ys2aNcrOznb7Hpc/27Fjh6Q/vtvl6quv1qhRo/T888+rW7du6t27t2666SaFhIT4bHx0puKvozMBAPCHNm3aaObMmcrPz9fPP/+sDz/8UM8//7yuueYaLV++XE2bNpUk9enTRzNmzNB3332nLl26aM6cOcrKyir2tIneeD3oZOtYu3atHMfR448/rscff7zYdezYsUPx8fEe36b0x/f2NWrUSBUqeP9l3gMHDkhyPzD2/fffa8SIEUpPTz/uu2azs7MVHR19wnUWFhZq4sSJeumll7Rhwwa378s92SkXLd1s586dOnjwYIldpbCwUJs3b1azZs2KlpfUzYp7HXLNmjX6/fffi76z+a+OderinM42KMnGjRtVo0aN4w5iHjtl6l976F/nq/THnPXGa6AA7DhQhzPSn9+9c8y+ffvUtWtXRUVF6YknnlC9evUUGhqqpUuXaujQoSd8h/Exxb1rRtJxX7pqdeTIEa1evdrtvOj33nuv3nzzTd1///1q3769oqOj5XK5dMMNN3g01tO5v1FRUapRo4Z+/fVX0/3w9J1Yxf1+Srru2DjHjRunVq1aFfszJX03ijd+597gq3kDAIAvFBYWqlq1anr77beLvf7Yiw0ul0sffPCBfvjhB3366af68ssvdfvtt+u5557TDz/8cMLvLjtVdKaSr6MzAQDgLjg4WG3atFGbNm3UsGFDpaSk6P3339eIESMkScnJyYqNjdW//vUvdenSRf/6178UFxennj17HrcubzxHnWwdx55vH3zwwRI/Uf/XN/uUtmMd6Ni41q1bpx49eqhx48YaP368atWqpeDgYH3++ed6/vnnPeoUTz31lB5//HHdfvvtGj16tKpUqaKAgADdf//9J/35xo0bS5J++eWXEvvQ6SipmxW3vLCwUC1atND48eOL/ZlatWqVeDunsw28hV4G+BcO1KHMmD9/vnbv3q2ZM2eqS5cuRcs3bNhQiqP6wwcffKBDhw65FbEPPvhAffv21XPPPVe07PDhw9q3b5/bz5b0Qs/p3t9LL71Ur776qtLT09W+ffsTZhMSElRYWKg1a9a4fXlxVlaW9u3bp4SEBI9uszjHPmYfFRVVbFk+Ecs28PQFs2P3ZdWqVcddt3LlSsXExBx3igwAAM4k9erV05w5c9SxY8cTHig65rzzztN5552nJ598Uu+8845uvvlmvfvuu7rzzjtP+3RKf0VnKhmdCQCAkrVu3VrSH6dmPiYwMFA33XSTpk2bpmeeeUYfffRRiac29MTp9p5jp18MCgo66XO55bbq1aunRYsW6ciRIwoKCjqtMf5ZQUGB3nnnHYWHh6tTp06SpE8//VR5eXn65JNP3D6RVdxpHku6Dx988IG6d++uN954w235vn37FBMTc8Ix9erVS4GBgfrXv/5V7Ccj/+yss85SeHh4iV0lICDghAfTTqZevXr6+eef1aNHD/Pc8HQbWNabkJCgOXPmaP/+/W6fqjt2ivPT6aEAfI/vqEOZcaxo/fmdH/n5+XrppZdKa0iSpJ9//ln333+/KleurHvuuadoeWBg4HHvUnnxxRfdPu4uqegFjr++GHW693fIkCGqWLGi7rzzTmVlZR13/bp16zRx4kRJ0sUXXyxJmjBhglvm2LuGLrnkEo9uszhJSUmqV6+enn322aJTKvzZzp07S/xZyzaoWLGiR6d1ql69ulq1aqXp06e7bfNff/1Vs2fPLtoWAACcqa677joVFBRo9OjRx1139OjRoue/vXv3HtdVjr1zOS8vT5IUHh4u6fieciroTCdGZwIA4I8DQsV94ufYd6P+9TSHt956q/bu3av+/fvrwIEDuuWWW075tkvqGp6qVq2aunXrpldeecXtgOIxf34ut9zW1VdfrV27dmnSpEnHXXeqn44qKCjQoEGD9Pvvv2vQoEFFp5wsrlNkZ2frzTffPG4dFStWLHb8xXW7999/36Pv56tVq5b69eun2bNn68UXXzzu+sLCQj333HPasmWLAgMDdeGFF+rjjz9WRkZGUSYrK0vvvPOOOnXqdFqn3r7uuuu0detWvfbaa8ddd+jQIeXm5pb4s55uA8s8uPjii1VQUHDcPHj++eflcrnUq1evk64DQOnhE3UoMzp06KDKlSurb9++GjRokFwul/75z3/+rR/Z/u6773T48OGiL4L9/vvv9cknnyg6Oloffvih4uLiirKXXnqp/vnPfyo6OlpNmzZVenq65syZc9y5qFu1aqXAwEA988wzys7OVkhIiM4///zTvr/16tXTO++8o+uvv15NmjRRnz591Lx5c+Xn52vhwoV6//33ddttt0mSWrZsqb59++rVV18tOnXS4sWLNX36dPXu3Vvdu3c/5W0WEBCg119/Xb169VKzZs2UkpKi+Ph4bd26VfPmzVNUVJQ+/fTTYn/Wsg2SkpI0Y8YMpaamqk2bNoqIiNBll11W7HrHjRunXr16qX379rrjjjt06NAhvfjii4qOjtbIkSNP+b4CAOAPunbtqv79+ystLU3Lly/XhRdeqKCgIK1Zs0bvv/++Jk6cqGuuuUbTp0/XSy+9pCuvvFL16tXT/v379dprrykqKqroIExYWJiaNm2qGTNmqGHDhqpSpYqaN2/udurK4tCZ7OhMAAD8cUrsgwcP6sorr1Tjxo2Lno9nzJihxMREpaSkuOXPOeccNW/eXO+//76aNGmic88995RvOykpSZI0aNAgJScnKzAwUDfccINpHZMnT1anTp3UokUL9evXT3Xr1lVWVpbS09O1ZcsW/fzzz5JK7jXFfcdwnz599NZbbyk1NVWLFy9W586dlZubqzlz5mjAgAG64oorTjim7Oxs/etf/5IkHTx4UGvXrtXMmTO1bt063XDDDW5v7rrwwgsVHBysyy67rOjg52uvvaZq1aodd/AxKSlJL7/8ssaMGaP69eurWrVqOv/883XppZfqiSeeUEpKijp06KBffvlFb7/9dtEnDk/mueee07p16zRo0CDNnDlTl156qSpXrqxNmzbp/fff18qVK4t+L2PGjNFXX32lTp06acCAAapQoYJeeeUV5eXlaezYsR7dXkluvfVWvffee7r77rs1b948dezYUQUFBVq5cqXee+89ffnll0Wf9PwrT7dBvXr1VKlSJU2ZMkWRkZGqWLGi2rVrV+x36V122WXq3r27Hn30UWVkZKhly5aaPXu2Pv74Y91///1FZ2cA4KccwI/dc889zl+nadeuXZ1mzZoVm//++++d8847zwkLC3Nq1KjhDBkyxPnyyy8dSc68efOKcn379nUSEhKK/r1hwwZHkjNu3Ljj1inJGTFixAnHOW/ePEdS0SUoKMg566yznC5dujhPPvmks2PHjuN+Zu/evU5KSooTExPjREREOMnJyc7KlSudhIQEp2/fvm7Z1157zalbt64TGBjodl88vb8nsnr1aqdfv35OYmKiExwc7ERGRjodO3Z0XnzxRefw4cNFuSNHjjijRo1y6tSp4wQFBTm1atVyhg0b5pZxHMdJSEhwLrnkkhK30fvvv1/sOJYtW+ZcddVVTtWqVZ2QkBAnISHBue6665y5c+cWZd58801HkrNhw4aiZZ5ugwMHDjg33XSTU6lSJUdS0e//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6+tr5s6dW+Lx+/TpY9q0aWP2799/w7L9+/ebtm3bmocffrhEY48ePdrcdttt5t///rd5++23TUREhOnRo0desU5OTjY2m63Ec//1DyebzVborTQlLDAwMK9Id+jQwYwZMybf8hdeeMHcc889JR7/zjvvNNOnTzfGGPPBBx+Y4OBgM23atLzlc+bMMc2bNy/x+JTgorm6CAOOoD8Vjv5UPFf2J2Nc26HoT0VzZYeiPxWN/lQ0+hOsgP5UNFd2KPpT8dz5NSj6U9Fc2aHoT0WjP8EdWOZAXWRkpHn33XcLXf7uu++aiIiIEo9frVo18+OPP+Z9bbfbzfDhw014eLg5cuRIqR+QW7duNbfddpsZN25c3hFuZxWlKlWqmO3btxtjfvk9du3alW/54cOHja+vb4nH9/X1zfeugYoVK5o9e/bkfX38+HHj5+dX4vGNMaZLly7mwQcfNGlpaTcsS0tLMw8++KDp2rVriccfOHCgiYmJMdu2bTPr1q0zLVu2NK1atTKpqanGmNK/GFG7dm0TGRmZ72az2UytWrVMZGSkiYqKKvHcK1WqlPfOh5iYGDN79ux8y+fPn29atGhR4vEbN26cV6zXr19vfHx8zBtvvJG3fMmSJSY6OrrE4/v7+5udO3cWunz79u3G39+/RGOHh4ebDRs25H197tw507p1a9O1a1dz9erVUj9uu3fvbnr06HHDk72zHruVKlXK+wOwevXqBT52S7pufh3/2LFjxphf9mkVK1bMt587cuRIqcanBBfN1UUYcAT9qXD0p+K5sj8Z49oORX8qmis7FP2paPSnotGfYAX0p6K5skPRn4rnzq9B0Z+K5soORX8qGv0J7sAyB+oWLFhgvL29zejRo81nn31mvv/+e/P999+bzz77zIwePdr4+vrm27lrBQQEmH379t1w/7PPPmtq165tNm7cWKoHjDHGXLp0yQwcONDccccd5qeffjIVK1Z0SlEaMGCAGTJkiDHGmEceecS88MIL+ZbPnDnTNG3atMTjR0VFmdWrVxtjjDl48KDx8PAwH330Ud7y//73vyYyMrLE4xvzSxn76aefCl3+448/lurFspo1a+Y7Ffrq1aumZ8+epnnz5ubChQulejJ95plnTPPmzW/YfpxVhIOCgszu3buNMb+U4F///avDhw+XqqgWVISv/784duxYqcavUqWK+frrrwtd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\n" + }, + "metadata": {} + } + ], + "source": [ + "import torch\n", + "import torch.nn as nn\n", + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "from sklearn.preprocessing import StandardScaler\n", + "from sklearn.metrics import mean_squared_error, r2_score\n", + "from torch.utils.data import DataLoader, TensorDataset\n", + "\n", + "# MLP for denoising network\n", + "def get_mlp(in_dim, out_dim):\n", + " return nn.Sequential(\n", + " nn.Linear(in_dim + 1, 128),\n", + " nn.ReLU(),\n", + " nn.Linear(128, 128),\n", + " nn.ReLU(),\n", + " nn.Linear(128, out_dim),\n", + " )\n", + "\n", + "class TabDDPM(nn.Module):\n", + " def __init__(self, input_dim, timesteps=1000):\n", + " super(TabDDPM, self).__init__()\n", + " self.input_dim = input_dim\n", + " self.timesteps = timesteps\n", + " self.model = get_mlp(input_dim, input_dim)\n", + "\n", + " betas = torch.linspace(1e-4, 0.02, timesteps)\n", + " self.register_buffer('betas', betas)\n", + " self.register_buffer('alphas', 1. - betas)\n", + " self.register_buffer('alphas_cumprod', torch.cumprod(1. - betas, dim=0))\n", + "\n", + " def forward(self, x, t):\n", + " t_embed = t.float().unsqueeze(1) / self.timesteps\n", + " x_in = torch.cat([x, t_embed], dim=1)\n", + " return self.model(x_in)\n", + "\n", + " def q_sample(self, x0, t):\n", + " noise = torch.randn_like(x0)\n", + " sqrt_alpha_cumprod = self.alphas_cumprod[t].sqrt().unsqueeze(1)\n", + " sqrt_one_minus_alpha_cumprod = (1 - self.alphas_cumprod[t]).sqrt().unsqueeze(1)\n", + " return sqrt_alpha_cumprod * x0 + sqrt_one_minus_alpha_cumprod * noise, noise\n", + "\n", + " def sample(self, num_samples):\n", + " x = torch.randn(num_samples, self.input_dim)\n", + " for t in reversed(range(self.timesteps)):\n", + " t_tensor = torch.full((num_samples,), t, dtype=torch.long)\n", + " pred_noise = self.forward(x, t_tensor)\n", + " beta = self.betas[t]\n", + " alpha = self.alphas[t]\n", + " alpha_hat = self.alphas_cumprod[t]\n", + " coef = 1 / alpha.sqrt()\n", + " noise = torch.randn_like(x) if t > 0 else 0\n", + " x = coef * (x - beta / (1 - alpha_hat).sqrt() * pred_noise) + beta.sqrt() * noise\n", + " return x\n", + "\n", + "# Load and preprocess your data\n", + "train_path = \"/content/sat_train.csv\"\n", + "test_path = \"/content/sat_test.csv\"\n", + "\n", + "# Load CSVs\n", + "train_df = pd.read_csv(train_path)\n", + "test_df = pd.read_csv(test_path)\n", + "\n", + "# Select numeric columns only\n", + "train_df = train_df.select_dtypes(include=[np.number]).dropna()\n", + "test_df = test_df.select_dtypes(include=[np.number]).dropna()\n", + "\n", + "print(f\"Training shape: {train_df.shape}\")\n", + "print(f\"Testing shape: {test_df.shape}\")\n", + "\n", + "# Normalize data\n", + "scaler = StandardScaler()\n", + "X_train = torch.tensor(scaler.fit_transform(train_df.values), dtype=torch.float32)\n", + "X_test = torch.tensor(scaler.transform(test_df.values), dtype=torch.float32)\n", + "\n", + "# Dataloader\n", + "train_loader = DataLoader(TensorDataset(X_train), batch_size=64, shuffle=True)\n", + "\n", + "# Initialize model\n", + "input_dim = X_train.shape[1]\n", + "model = TabDDPM(input_dim=input_dim)\n", + "optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)\n", + "loss_fn = nn.MSELoss()\n", + "\n", + "# === TRAINING LOOP ===\n", + "print(\"\\nTraining TabDDPM...\")\n", + "model.train()\n", + "for epoch in range(10):\n", + " total_loss = 0\n", + " for batch in train_loader:\n", + " x0 = batch[0]\n", + " t = torch.randint(0, model.timesteps, (x0.size(0),), dtype=torch.long)\n", + " xt, noise = model.q_sample(x0, t)\n", + " pred_noise = model(xt, t)\n", + " loss = loss_fn(pred_noise, noise)\n", + " optimizer.zero_grad()\n", + " loss.backward()\n", + " optimizer.step()\n", + " total_loss += loss.item()\n", + " print(f\"Epoch {epoch + 1}, Loss: {total_loss / len(train_loader):.4f}\")\n", + "\n", + "# === EVALUATION ===\n", + "print(\"\\nEvaluating model on test set...\")\n", + "model.eval()\n", + "with torch.no_grad():\n", + " t_test = torch.randint(0, model.timesteps, (X_test.size(0),), dtype=torch.long)\n", + " xt, true_noise = model.q_sample(X_test, t_test)\n", + " pred_noise = model(xt, t_test)\n", + "\n", + " mse = mean_squared_error(true_noise.numpy(), pred_noise.numpy())\n", + " r2 = r2_score(true_noise.numpy(), pred_noise.numpy())\n", + " print(f\"\\nDenoising Evaluation Metrics:\\n- MSE: {mse:.4f}\\n- R² Score: {r2:.4f}\")\n", + "\n", + "# === GENERATE SYNTHETIC DATA ===\n", + "print(\"\\nGenerating synthetic samples...\")\n", + "with torch.no_grad():\n", + " samples = model.sample(100).numpy()\n", + " samples_rescaled = scaler.inverse_transform(samples)\n", + " df_synth = pd.DataFrame(samples_rescaled, columns=train_df.columns)\n", + " df_synth.to_csv(\"synthetic_data.csv\", index=False)\n", + " print(\"Synthetic data saved to synthetic_data.csv\")\n", + "\n", + "# === HEATMAPS ===\n", + "print(\"\\nPlotting heatmaps...\")\n", + "fig, axes = plt.subplots(1, 3, figsize=(18, 5))\n", + "\n", + "sns.heatmap(train_df.corr(), ax=axes[0], cmap=\"coolwarm\", annot=False)\n", + "axes[0].set_title(\"Train Data Correlation\")\n", + "\n", + "sns.heatmap(test_df.corr(), ax=axes[1], cmap=\"coolwarm\", annot=False)\n", + "axes[1].set_title(\"Test Data Correlation\")\n", + "\n", + "sns.heatmap(df_synth.corr(), ax=axes[2], cmap=\"coolwarm\", annot=False)\n", + "axes[2].set_title(\"Synthetic Data Correlation\")\n", + "\n", + "plt.tight_layout()\n", + "plt.show()\n" + ] + } + ] +} \ No newline at end of file diff --git a/TabDDPM_Guide.pdf b/TabDDPM_Guide.pdf new file mode 100644 index 00000000..036481fa Binary files /dev/null and b/TabDDPM_Guide.pdf differ diff --git a/TabPFNAnalysis.ipynb b/TabPFNAnalysis.ipynb new file mode 100644 index 00000000..3465f48a --- /dev/null +++ b/TabPFNAnalysis.ipynb @@ -0,0 +1,433 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "id": "54da7a65-9787-4e26-b6fe-d798ec27e0e1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: tabpfn in c:\\users\\r.parsad\\anaconda3\\envs\\tddpm\\lib\\site-packages (2.0.8)\n", + "Requirement already satisfied: torch<3,>=2.1 in c:\\users\\r.parsad\\anaconda3\\envs\\tddpm\\lib\\site-packages (from tabpfn) (2.6.0)\n", + "Requirement already satisfied: scikit-learn<1.7,>=1.2.0 in c:\\users\\r.parsad\\anaconda3\\envs\\tddpm\\lib\\site-packages (from tabpfn) (1.6.1)\n", + "Requirement already satisfied: typing_extensions>=4.4.0 in c:\\users\\r.parsad\\anaconda3\\envs\\tddpm\\lib\\site-packages (from tabpfn) (4.13.1)\n", + "Requirement already satisfied: scipy<2,>=1.11.1 in c:\\users\\r.parsad\\anaconda3\\envs\\tddpm\\lib\\site-packages (from tabpfn) (1.13.1)\n", + "Requirement already satisfied: pandas<3,>=1.4.0 in c:\\users\\r.parsad\\anaconda3\\envs\\tddpm\\lib\\site-packages (from tabpfn) (2.2.3)\n", + "Requirement already satisfied: einops<0.9,>=0.2.0 in c:\\users\\r.parsad\\anaconda3\\envs\\tddpm\\lib\\site-packages (from tabpfn) (0.8.1)\n", + "Requirement already satisfied: huggingface-hub<1,>=0.0.1 in c:\\users\\r.parsad\\anaconda3\\envs\\tddpm\\lib\\site-packages (from tabpfn) (0.30.1)\n", + "Requirement already satisfied: filelock in c:\\users\\r.parsad\\anaconda3\\envs\\tddpm\\lib\\site-packages (from huggingface-hub<1,>=0.0.1->tabpfn) (3.18.0)\n", + "Requirement already satisfied: fsspec>=2023.5.0 in c:\\users\\r.parsad\\anaconda3\\envs\\tddpm\\lib\\site-packages (from huggingface-hub<1,>=0.0.1->tabpfn) (2025.3.2)\n", + "Requirement already satisfied: packaging>=20.9 in c:\\users\\r.parsad\\anaconda3\\envs\\tddpm\\lib\\site-packages (from huggingface-hub<1,>=0.0.1->tabpfn) (24.2)\n", + "Requirement already satisfied: pyyaml>=5.1 in c:\\users\\r.parsad\\anaconda3\\envs\\tddpm\\lib\\site-packages (from huggingface-hub<1,>=0.0.1->tabpfn) (5.4.1)\n", + "Requirement already satisfied: requests in c:\\users\\r.parsad\\anaconda3\\envs\\tddpm\\lib\\site-packages (from huggingface-hub<1,>=0.0.1->tabpfn) (2.32.3)\n", + "Requirement already satisfied: tqdm>=4.42.1 in c:\\users\\r.parsad\\anaconda3\\envs\\tddpm\\lib\\site-packages (from huggingface-hub<1,>=0.0.1->tabpfn) (4.62.3)\n", + "Requirement already satisfied: numpy>=1.22.4 in c:\\users\\r.parsad\\anaconda3\\envs\\tddpm\\lib\\site-packages (from pandas<3,>=1.4.0->tabpfn) (2.0.2)\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in c:\\users\\r.parsad\\anaconda3\\envs\\tddpm\\lib\\site-packages (from pandas<3,>=1.4.0->tabpfn) (2.9.0.post0)\n", + "Requirement already satisfied: pytz>=2020.1 in c:\\users\\r.parsad\\anaconda3\\envs\\tddpm\\lib\\site-packages (from pandas<3,>=1.4.0->tabpfn) (2025.2)\n", + "Requirement already satisfied: tzdata>=2022.7 in c:\\users\\r.parsad\\anaconda3\\envs\\tddpm\\lib\\site-packages (from pandas<3,>=1.4.0->tabpfn) (2025.2)\n", + "Requirement already satisfied: joblib>=1.2.0 in c:\\users\\r.parsad\\anaconda3\\envs\\tddpm\\lib\\site-packages (from scikit-learn<1.7,>=1.2.0->tabpfn) (1.4.2)\n", + "Requirement already satisfied: threadpoolctl>=3.1.0 in c:\\users\\r.parsad\\anaconda3\\envs\\tddpm\\lib\\site-packages (from scikit-learn<1.7,>=1.2.0->tabpfn) (3.6.0)\n", + "Requirement already satisfied: networkx in c:\\users\\r.parsad\\anaconda3\\envs\\tddpm\\lib\\site-packages (from torch<3,>=2.1->tabpfn) (3.2.1)\n", + "Requirement already satisfied: jinja2 in c:\\users\\r.parsad\\anaconda3\\envs\\tddpm\\lib\\site-packages (from torch<3,>=2.1->tabpfn) (3.1.6)\n", + "Requirement already satisfied: sympy==1.13.1 in c:\\users\\r.parsad\\anaconda3\\envs\\tddpm\\lib\\site-packages (from torch<3,>=2.1->tabpfn) (1.13.1)\n", + "Requirement already satisfied: mpmath<1.4,>=1.1.0 in c:\\users\\r.parsad\\anaconda3\\envs\\tddpm\\lib\\site-packages (from sympy==1.13.1->torch<3,>=2.1->tabpfn) (1.3.0)\n", + "Requirement already satisfied: six>=1.5 in c:\\users\\r.parsad\\anaconda3\\envs\\tddpm\\lib\\site-packages (from python-dateutil>=2.8.2->pandas<3,>=1.4.0->tabpfn) (1.17.0)\n", + "Requirement already satisfied: colorama in c:\\users\\r.parsad\\anaconda3\\envs\\tddpm\\lib\\site-packages (from tqdm>=4.42.1->huggingface-hub<1,>=0.0.1->tabpfn) (0.4.6)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in c:\\users\\r.parsad\\anaconda3\\envs\\tddpm\\lib\\site-packages (from jinja2->torch<3,>=2.1->tabpfn) (3.0.2)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in c:\\users\\r.parsad\\anaconda3\\envs\\tddpm\\lib\\site-packages (from requests->huggingface-hub<1,>=0.0.1->tabpfn) (3.4.1)\n", + "Requirement already satisfied: idna<4,>=2.5 in c:\\users\\r.parsad\\anaconda3\\envs\\tddpm\\lib\\site-packages (from requests->huggingface-hub<1,>=0.0.1->tabpfn) (3.10)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in c:\\users\\r.parsad\\anaconda3\\envs\\tddpm\\lib\\site-packages (from requests->huggingface-hub<1,>=0.0.1->tabpfn) (2.3.0)\n", + "Requirement already satisfied: certifi>=2017.4.17 in c:\\users\\r.parsad\\anaconda3\\envs\\tddpm\\lib\\site-packages (from requests->huggingface-hub<1,>=0.0.1->tabpfn) (2025.1.31)\n" + ] + } + ], + "source": [ + "!pip3 install tabpfn" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "78678943-2bec-4967-9308-79ec88e50267", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "from sklearn.preprocessing import LabelEncoder\n", + "from sklearn.model_selection import train_test_split\n", + "import torch\n", + "\n", + "# Load your dataset\n", + "df = pd.read_csv(\"C:/Users/R.Parsad/Downloads/TabPFN/Car/car.csv\")\n", + "\n", + "# Separate features and target\n", + "X = df.drop(\"Class\", axis=1)\n", + "y = df[\"Class\"]\n", + "\n", + "# Encode categorical features (simple label encoding)\n", + "for col in X.select_dtypes(include=['object', 'category']).columns:\n", + " X[col] = LabelEncoder().fit_transform(X[col])\n", + "\n", + "# Encode target if it's categorical\n", + "if y.dtype == \"object\" or str(y.dtype).startswith(\"category\"):\n", + " y = LabelEncoder().fit_transform(y)\n", + "\n", + "X_train, X_test, y_train, y_test = train_test_split(X.values, y, test_size=0.2, random_state=42)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "71e4ce51-efb2-4ad2-a187-6442736308e4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Accuracy: 0.9855491329479769\n" + ] + } + ], + "source": [ + "from tabpfn import TabPFNClassifier\n", + "from sklearn.metrics import accuracy_score\n", + "\n", + "import os\n", + "os.environ[\"TABPFN_ALLOW_CPU_LARGE_DATASET\"] = \"1\"\n", + "\n", + "# Initialize model\n", + "clf = TabPFNClassifier(device='cuda' if torch.cuda.is_available() else 'cpu')\n", + "\n", + "# Fit on training data\n", + "clf.fit(X_train, y_train)\n", + "\n", + "# Predict\n", + "y_pred = clf.predict(X_test)\n", + "\n", + "# Evaluate\n", + "print(\"Accuracy:\", accuracy_score(y_test, y_pred))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c82731dd-527f-4b66-a1ac-8d74c61345e3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Accuracy: 0.9855491329479769\n", + "Precision (macro): 0.9426482571516221\n", + "Recall (macro): 0.9732459248759744\n", + "F1 Score (macro): 0.9562612870946512\n", + "\n", + "Classification Report:\n", + " precision recall f1-score support\n", + "\n", + " 0 0.99 0.95 0.97 83\n", + " 1 0.85 1.00 0.92 11\n", + " 2 1.00 1.00 1.00 235\n", + " 3 0.94 0.94 0.94 17\n", + "\n", + " accuracy 0.99 346\n", + " macro avg 0.94 0.97 0.96 346\n", + "weighted avg 0.99 0.99 0.99 346\n", + "\n", + "Confusion Matrix:\n", + " [[ 79 2 1 1]\n", + " [ 0 11 0 0]\n", + " [ 0 0 235 0]\n", + " [ 1 0 0 16]]\n" + ] + } + ], + "source": [ + "from sklearn.metrics import (\n", + " accuracy_score, precision_score, recall_score,\n", + " f1_score, classification_report, confusion_matrix\n", + ")\n", + "\n", + "# Predictions\n", + "y_pred = clf.predict(X_test)\n", + "\n", + "# Metrics\n", + "print(\"Accuracy:\", accuracy_score(y_test, y_pred))\n", + "print(\"Precision (macro):\", precision_score(y_test, y_pred, average='macro'))\n", + "print(\"Recall (macro):\", recall_score(y_test, y_pred, average='macro'))\n", + "print(\"F1 Score (macro):\", f1_score(y_test, y_pred, average='macro'))\n", + "print(\"\\nClassification Report:\\n\", classification_report(y_test, y_pred))\n", + "print(\"Confusion Matrix:\\n\", confusion_matrix(y_test, y_pred))\n" + ] + }, + { + "cell_type": "markdown", + "id": "d9efaa0f-d474-4a43-93a3-ee9cf5649690", + "metadata": {}, + "source": [ + "## Testing a custom neural network\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "d05b3c1e-8808-4464-bb30-d5006eeba7fd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/20 - Loss: 1.2180\n", + "Epoch 2/20 - Loss: 0.9277\n", + "Epoch 3/20 - Loss: 0.7940\n", + "Epoch 4/20 - Loss: 0.7315\n", + "Epoch 5/20 - Loss: 0.7117\n", + "Epoch 6/20 - Loss: 0.6826\n", + "Epoch 7/20 - Loss: 0.6696\n", + "Epoch 8/20 - Loss: 0.6537\n", + "Epoch 9/20 - Loss: 0.6395\n", + "Epoch 10/20 - Loss: 0.6202\n", + "Epoch 11/20 - Loss: 0.6068\n", + "Epoch 12/20 - Loss: 0.5867\n", + "Epoch 13/20 - Loss: 0.5679\n", + "Epoch 14/20 - Loss: 0.5472\n", + "Epoch 15/20 - Loss: 0.5256\n", + "Epoch 16/20 - Loss: 0.5187\n", + "Epoch 17/20 - Loss: 0.4980\n", + "Epoch 18/20 - Loss: 0.4788\n", + "Epoch 19/20 - Loss: 0.4665\n", + "Epoch 20/20 - Loss: 0.4462\n", + "\n", + "Classification Report:\n", + " precision recall f1-score support\n", + "\n", + " 0 0.62 0.58 0.60 83\n", + " 1 0.00 0.00 0.00 11\n", + " 2 0.87 0.98 0.92 235\n", + " 3 1.00 0.24 0.38 17\n", + "\n", + " accuracy 0.82 346\n", + " macro avg 0.62 0.45 0.48 346\n", + "weighted avg 0.79 0.82 0.79 346\n", + "\n", + "Confusion Matrix:\n", + " [[ 48 0 35 0]\n", + " [ 11 0 0 0]\n", + " [ 5 0 230 0]\n", + " [ 13 0 0 4]]\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\Users\\R.Parsad\\anaconda3\\envs\\tddpm\\lib\\site-packages\\sklearn\\metrics\\_classification.py:1565: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n", + "c:\\Users\\R.Parsad\\anaconda3\\envs\\tddpm\\lib\\site-packages\\sklearn\\metrics\\_classification.py:1565: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n", + "c:\\Users\\R.Parsad\\anaconda3\\envs\\tddpm\\lib\\site-packages\\sklearn\\metrics\\_classification.py:1565: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n" + ] + } + ], + "source": [ + "import torch\n", + "import torch.nn as nn\n", + "import torch.optim as optim\n", + "from torch.utils.data import DataLoader, TensorDataset\n", + "from sklearn.metrics import classification_report, confusion_matrix\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.preprocessing import StandardScaler, LabelEncoder\n", + "import pandas as pd\n", + "import numpy as np\n", + "\n", + "# Load your dataset\n", + "df = pd.read_csv(\"C:/Users/R.Parsad/Downloads/TabPFN/Car/car.csv\")\n", + "X = df.drop(\"Class\", axis=1)\n", + "y = df[\"Class\"]\n", + "\n", + "# Encode categorical features\n", + "for col in X.select_dtypes(include=[\"object\", \"category\"]).columns:\n", + " X[col] = LabelEncoder().fit_transform(X[col])\n", + "if y.dtype == \"object\" or str(y.dtype).startswith(\"category\"):\n", + " y = LabelEncoder().fit_transform(y)\n", + "\n", + "# Normalize features\n", + "scaler = StandardScaler()\n", + "X = scaler.fit_transform(X)\n", + "\n", + "# Train-test split\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n", + "\n", + "# Convert to PyTorch tensors\n", + "X_train_tensor = torch.tensor(X_train, dtype=torch.float32)\n", + "y_train_tensor = torch.tensor(y_train, dtype=torch.long)\n", + "X_test_tensor = torch.tensor(X_test, dtype=torch.float32)\n", + "y_test_tensor = torch.tensor(y_test, dtype=torch.long)\n", + "\n", + "train_loader = DataLoader(TensorDataset(X_train_tensor, y_train_tensor), batch_size=64, shuffle=True)\n", + "\n", + "# Define the neural network\n", + "class SimpleNN(nn.Module):\n", + " def __init__(self, input_dim, num_classes):\n", + " super(SimpleNN, self).__init__()\n", + " self.model = nn.Sequential(\n", + " nn.Linear(input_dim, 64),\n", + " nn.ReLU(),\n", + " nn.Dropout(0.3),\n", + " nn.Linear(64, 32),\n", + " nn.ReLU(),\n", + " nn.Linear(32, num_classes)\n", + " )\n", + "\n", + " def forward(self, x):\n", + " return self.model(x)\n", + "\n", + "model = SimpleNN(input_dim=X.shape[1], num_classes=len(np.unique(y)))\n", + "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n", + "model.to(device)\n", + "\n", + "# Training\n", + "criterion = nn.CrossEntropyLoss()\n", + "optimizer = optim.Adam(model.parameters(), lr=0.001)\n", + "\n", + "epochs = 20\n", + "model.train()\n", + "for epoch in range(epochs):\n", + " running_loss = 0.0\n", + " for xb, yb in train_loader:\n", + " xb, yb = xb.to(device), yb.to(device)\n", + " optimizer.zero_grad()\n", + " outputs = model(xb)\n", + " loss = criterion(outputs, yb)\n", + " loss.backward()\n", + " optimizer.step()\n", + " running_loss += loss.item()\n", + " print(f\"Epoch {epoch+1}/{epochs} - Loss: {running_loss/len(train_loader):.4f}\")\n", + "\n", + "# Evaluation\n", + "model.eval()\n", + "with torch.no_grad():\n", + " outputs = model(X_test_tensor.to(device))\n", + " _, y_pred = torch.max(outputs, 1)\n", + " y_pred = y_pred.cpu().numpy()\n", + "\n", + "# Metrics\n", + "print(\"\\nClassification Report:\\n\", classification_report(y_test, y_pred))\n", + "print(\"Confusion Matrix:\\n\", confusion_matrix(y_test, y_pred))\n" + ] + }, + { + "cell_type": "markdown", + "id": "e120ef1f-a4dc-4af6-a54d-fe12eaf97621", + "metadata": {}, + "source": [ + "### Testing SVM on the dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "26186a50-4f20-4d40-815a-ef4e7ec2d306", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Classification Report:\n", + " precision recall f1-score support\n", + "\n", + " 0 0.79 0.81 0.80 83\n", + " 1 0.44 0.36 0.40 11\n", + " 2 0.95 0.96 0.96 235\n", + " 3 0.94 0.88 0.91 17\n", + "\n", + " accuracy 0.90 346\n", + " macro avg 0.78 0.75 0.77 346\n", + "weighted avg 0.90 0.90 0.90 346\n", + "\n", + "Confusion Matrix:\n", + " [[ 67 5 11 0]\n", + " [ 6 4 0 1]\n", + " [ 10 0 225 0]\n", + " [ 2 0 0 15]]\n" + ] + } + ], + "source": [ + "from sklearn.svm import SVC\n", + "from sklearn.preprocessing import StandardScaler, LabelEncoder\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.metrics import classification_report, confusion_matrix\n", + "import pandas as pd\n", + "\n", + "# Load dataset\n", + "df = pd.read_csv(\"C:/Users/R.Parsad/Downloads/TabPFN/Car/car.csv\")\n", + "X = df.drop(\"Class\", axis=1)\n", + "y = df[\"Class\"]\n", + "\n", + "# Encode categorical features\n", + "for col in X.select_dtypes(include=[\"object\", \"category\"]).columns:\n", + " X[col] = LabelEncoder().fit_transform(X[col])\n", + "\n", + "# Encode target if necessary\n", + "if y.dtype == \"object\" or str(y.dtype).startswith(\"category\"):\n", + " y = LabelEncoder().fit_transform(y)\n", + "\n", + "# Scale features\n", + "scaler = StandardScaler()\n", + "X = scaler.fit_transform(X)\n", + "\n", + "# Train-test split\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n", + "\n", + "# Initialize and train SVM\n", + "svm_clf = SVC(kernel='rbf', C=1.0, gamma='scale') # try kernel='linear' or 'poly' too\n", + "svm_clf.fit(X_train, y_train)\n", + "\n", + "# Predict\n", + "y_pred = svm_clf.predict(X_test)\n", + "\n", + "# Metrics\n", + "print(\"Classification Report:\\n\", classification_report(y_test, y_pred))\n", + "print(\"Confusion Matrix:\\n\", confusion_matrix(y_test, y_pred))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0be30d5a-455a-4495-847d-8386f1f3054f", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "tddpm", + "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.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/TabPFN_Guide.pdf b/TabPFN_Guide.pdf new file mode 100644 index 00000000..cc191cbd Binary files /dev/null and b/TabPFN_Guide.pdf differ