{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Handling binary data columns\n", "\n", "The CISS-VAE model can handle binary and categorical variables in addition to continuous ones. Categorical variables must be represented with binary dummy variables ([pandas `get_dummies`](https://pandas.pydata.org/docs/reference/api/pandas.get_dummies.html) can do this) and the new dummy variables must be linked back to the original categorical label by passing a dictionary via categorical_column_map. \n", "\n", "When imputing binary data, the model applies a sigmoid activation function at the end of the forward pass to convert to a probability (this means that the end imputed result is the probability that the imputed value should be 1. The user will need to change these values after running). \n", "\n", "Because some datasets have both binary and continuous variables, you can include a binary variable mask (boolean vector) to tell the model which variables are binary so it acts accordingly. \n", "\n", "## Example dataset\n", "\n", "The example dataset below has both binary and continuous variables in it: " ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "X matrix:\n", " feat1 feat2 feat3 feat4 feat5 bf1 bf2 bf3 bf4 bf5\n", "0 52 2.0 6.0 4.0 2.0 NaN NaN NaN NaN 0.0\n", "1 93 1.0 7.0 NaN 2.0 NaN 1.0 1.0 1.0 1.0\n", "2 15 4.0 NaN 4.0 2.0 0.0 0.0 1.0 0.0 NaN\n", "3 72 4.0 3.0 NaN 1.0 NaN 1.0 NaN 1.0 NaN\n", "4 61 NaN 1.0 NaN 1.0 0.0 NaN NaN NaN 0.0\n", ".. ... ... ... ... ... ... ... ... ... ...\n", "95 85 NaN NaN 6.0 2.0 0.0 0.0 1.0 NaN 1.0\n", "96 80 1.0 NaN 7.0 2.0 0.0 NaN 1.0 NaN 1.0\n", "97 82 2.0 4.0 NaN 1.0 0.0 NaN 1.0 NaN NaN\n", "98 53 4.0 3.0 7.0 7.0 NaN 0.0 0.0 0.0 1.0\n", "99 24 4.0 1.0 3.0 NaN 0.0 1.0 1.0 1.0 0.0\n", "\n", "[100 rows x 10 columns]\n" ] } ], "source": [ "import pandas as pd\n", "import numpy as np\n", "\n", "np.random.seed(42)\n", "\n", "n_rows = 100\n", "prop_mask = 0.3\n", "\n", "X = pd.DataFrame({\n", " \"feat1\": np.random.choice(np.arange(1, n_rows + 1), size=n_rows, replace=True),\n", " \"feat2\": np.random.choice(np.arange(1, 6), size=n_rows, replace=True),\n", " \"feat3\": np.random.choice(np.arange(1, 8), size=n_rows, replace=True),\n", " \"feat4\": np.random.choice(np.arange(1, 8), size=n_rows, replace=True),\n", " \"feat5\": np.random.choice(np.arange(1, 8), size=n_rows, replace=True),\n", " ## now add some binary features\n", " \"bf1\": np.random.binomial(1, 0.25, size=n_rows),\n", " \"bf2\": np.random.binomial(1, 0.5, size=n_rows),\n", " \"bf3\": np.random.binomial(1, 0.75, size=n_rows),\n", " \"bf4\": np.random.binomial(1, 0.33, size=n_rows),\n", " \"bf5\": np.random.binomial(1, 0.66, size=n_rows),\n", "})\n", "\n", "X_raw = X.copy()\n", "\n", "for col in X.columns[1:]: # skip feat1\n", " idx = np.where(~X[col].isna())[0] # indices of non-NA entries\n", " n_mask = int(np.ceil(len(idx) * prop_mask))\n", " if n_mask > 0:\n", " mask_idx = np.random.choice(idx, size=n_mask, replace=False)\n", " X.loc[mask_idx, col] = np.nan\n", "\n", "print(f\"X matrix:\\n{X}\")\n", "\n", "\n", "## choosing random clusters for now \n", "clusters = np.random.choice([1, 2, 3], size=n_rows, replace=True)\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Preparing Binary Vector\n", "\n", "The binary vector `binary_feature_mask` is of length p for an n x p data matrix and is `True` for binary columns and `False` for continuous columns. " ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "binary_vector = [False, False, False, False, False, True, True, True, True, True]\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Using `run_cissvae()` with binary matrix\n", "\n", "Pass the binary vector to the `run_cissvae()` function using the `binary_feature_mask` argument. Note: even if columns are ignored via `columns_ignore`, those columns must be accounted for in the `binary_feature_mask`. " ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\\\\VPensBST\\BstShared\\Biostatistics\\Danielle\\Repos\\CISS_VAE\\CISS-VAE-python\\src\\ciss_vae\\__init__.py\n", "The successfully imputed dataset:\n", " feat1 feat2 feat3 feat4 feat5 bf1 bf2 bf3 \\\n", "0 52.0 2.0 6.00000 4.000000 2.0 0.302485 0.404743 0.636127 \n", "1 93.0 1.0 7.00000 4.189552 2.0 0.110679 1.000000 1.000000 \n", "2 15.0 4.0 3.44211 4.000000 2.0 0.000000 0.000000 1.000000 \n", "\n", " bf4 bf5 \n", "0 0.443553 0.00000 \n", "1 1.000000 1.00000 \n", "2 0.000000 0.57127 \n", "\n", "\n" ] } ], "source": [ "import ciss_vae\n", "\n", "from ciss_vae.training.run_cissvae import run_cissvae\n", "from ciss_vae.utils.helpers import plot_vae_architecture\n", "print(ciss_vae.__file__)\n", "\n", "imputed_data, vae, ds, history = run_cissvae(data = X,\n", "## Dataset params\n", " columns_ignore = X.columns[0], ## columns to ignore when selecting validation dataset (and clustering if you do not provide clusters). For example, demographic columns with no missingness.\n", " clusters = clusters,\n", " print_dataset = False,\n", " binary_feature_mask = binary_vector,\n", "## VAE model params\n", " hidden_dims = [150, 120, 60], ## Dimensions of hidden layers, in order. One number per layer. \n", " latent_dim = 15, ## Dimensions of latent embedding\n", " layer_order_enc = [\"unshared\", \"unshared\", \"unshared\"], ## order of shared vs unshared layers for encode (can use u or s instead of unshared, shared)\n", " layer_order_dec=[\"shared\", \"shared\", \"shared\"], ## order of shared vs unshared layers for decode\n", " latent_shared=False, \n", " output_shared=False, \n", " batch_size = 4000, ## batch size for data loader\n", " return_model = True, ## if true, outputs imputed dataset and model, otherwise just outputs imputed dataset. Set to true to return model for `plot_vae_architecture`\n", "\n", "## Initial Training params\n", " epochs = 5, ## default \n", "\n", "## Other params\n", " return_history = True, ## if true, will return training MSE history as pandas dataframe\n", " return_dataset=True\n", ")\n", "\n", "print(f\"The successfully imputed dataset:\\n{imputed_data.head(3)}\\n\\n\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that we have an imputed dataset, we need to convert the probabilities to true binary values. " ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The successfully imputed dataset:\n", " feat1 feat2 feat3 feat4 feat5 bf1 bf2 bf3 bf4 bf5\n", "0 52.0 2.0 6.00000 4.000000 2.0 0 0 1 0 0\n", "1 93.0 1.0 7.00000 4.189552 2.0 0 1 1 1 1\n", "2 15.0 4.0 3.44211 4.000000 2.0 0 0 1 0 1\n", "\n", "\n" ] } ], "source": [ "bf_cols = [col for col in imputed_data.columns if col.startswith('bf')]\n", "imputed_data[bf_cols] = (imputed_data[bf_cols] > 0.5).astype(int)\n", "\n", "print(f\"The successfully imputed dataset:\\n{imputed_data.head(3)}\\n\\n\")" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "History \n", " epoch train_loss train_mse train_bce train_ce imputation_error \\\n", "0 0 6.945113 347.701630 346.802612 0.0 320.539062 \n", "1 1 6.810024 340.168030 340.817749 0.0 344.425415 \n", "2 2 6.712993 339.692535 331.558289 0.0 345.298767 \n", "3 3 6.597640 334.835938 324.817261 0.0 334.807343 \n", "4 4 6.465297 325.737579 320.526825 0.0 337.141022 \n", "5 4 NaN NaN NaN NaN 347.181915 \n", "6 9 NaN NaN NaN NaN 271.728943 \n", "7 0 5.920253 281.688995 309.766754 0.0 NaN \n", "8 1 6.260298 318.909790 306.554749 0.0 NaN \n", "9 2 5.865682 278.205566 307.714355 0.0 NaN \n", "10 3 5.694291 265.898407 302.624420 0.0 NaN \n", "11 4 5.658046 259.660370 305.226379 0.0 NaN \n", "12 14 NaN NaN NaN NaN 377.688629 \n", "13 0 5.380131 233.666336 303.406342 0.0 NaN \n", "14 1 9.380676 620.381714 315.344940 0.0 NaN \n", "15 2 5.336485 226.872391 305.304321 0.0 NaN \n", "16 3 5.540195 241.228027 311.292175 0.0 NaN \n", "17 4 5.593123 246.618195 310.927979 0.0 NaN \n", "18 19 NaN NaN NaN NaN 370.147614 \n", "19 0 5.478112 237.671204 307.676208 0.0 NaN \n", "20 1 5.940436 279.735870 311.661987 0.0 NaN \n", "21 2 5.405255 234.999435 302.320129 0.0 NaN \n", "22 3 5.558175 249.377594 302.137451 0.0 NaN \n", "23 4 4.837627 180.613281 298.911987 0.0 NaN \n", "\n", " val_mse val_bce val_ce lr phase loop \n", "0 319.861664 0.677406 0.0 0.010000 NaN NaN \n", "1 343.775421 0.649993 0.0 0.009990 NaN NaN \n", "2 344.682617 0.616162 0.0 0.009980 NaN NaN \n", "3 334.233856 0.573492 0.0 0.009970 NaN NaN \n", "4 336.607391 0.533642 0.0 0.009960 NaN NaN \n", "5 346.653839 0.528070 0.0 0.009950 refit 0.0 \n", "6 271.148407 0.580540 0.0 0.009900 refit 1.0 \n", "7 NaN NaN NaN 0.009950 refit_training NaN \n", "8 NaN NaN NaN 0.009940 refit_training NaN \n", "9 NaN NaN NaN 0.009930 refit_training NaN \n", "10 NaN NaN NaN 0.009920 refit_training NaN \n", "11 NaN NaN NaN 0.009910 refit_training NaN \n", "12 377.069336 0.619285 0.0 0.009851 refit 2.0 \n", "13 NaN NaN NaN 0.009900 refit_training NaN \n", "14 NaN NaN NaN 0.009891 refit_training NaN \n", "15 NaN NaN NaN 0.009881 refit_training NaN \n", "16 NaN NaN NaN 0.009871 refit_training NaN \n", "17 NaN NaN NaN 0.009861 refit_training NaN \n", "18 369.551239 0.596373 0.0 0.009802 refit 3.0 \n", "19 NaN NaN NaN 0.009851 refit_training NaN \n", "20 NaN NaN NaN 0.009841 refit_training NaN \n", "21 NaN NaN NaN 0.009831 refit_training NaN \n", "22 NaN NaN NaN 0.009822 refit_training NaN \n", "23 NaN NaN NaN 0.009812 refit_training NaN \n" ] } ], "source": [ "print(f\"History \\n{history}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As always, the vae architecture can be printed. " ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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qP8yTGXixIk3PP748eMWx7do0cJi21SqVq2akZiYaPHYX375JcPNzS3X41X55ptvzMfGxcVl3H///dc91vTasbGxFq/x9ttv53psw4YNM0qVKmXe/vDDDy0eN27cuAwXF5frvlatWrUyzp07Z/GYChUqmO9v2rRphrOzs8VjoqKi6H8AAAB2OkbetGmTxTHt27e/q7Hl0aNH9Rj6eo+55557LI5XY2cnJ6frHu/j46PfR3abN2/O8Pb2znGsh4dHRtu2bc3bapyb3aFDhzIqVqx43ddyd3fPmDFjhsVj1HjbdH/x4sUzatSocd2xPwAAJqSfAgDcNnWFWURERK5T7gMCAnLsV7MTGjVqJB06dJDly5fL2rVr9f7Dhw/L3Llz9QwMZcOGDfLiiy+a8w27uLjoGR01atTQV5Fde2Xbq6++KqtWrTJvt2/fXpo2baqfR033N722Ok7N5lA2b94sX3zxhfkx6qo2deVaXFycvhIsOTk51/e8bt06GTRokLltTZo00Vesqdkdv/32m/489u3bp58rNDQ01+dYv369nnXSr18/KVeunGzfvl1fgQYAAAD7pMbA99xzj56Roaixq5ppvHHjxtseW6rHPfzww3oMnf351Yxl03NmnwWsXmvw4MHqYla9rWZM9O7dW497J06cKAkJCTpV1qOPPipHjhzRs6nVsWrmiDpGUTMo+vTpo2dRzJo1S68Tkhv1+o888oiesa2UKFFCP87f31+Py9VYWo2z1ftp0KCBnoV9LfWeVVGzmps3by7h4eFSqlSpPPxrAADshjm8AQDALV6Fdr1iusrr2pkawcHBGVeuXNH3qduSJUua7xs8eLD5dXr06GHer64oW7VqlUU7kpOTM8LCwnQ9IiLCYtZDz549LY5V26b71HHqeOWll16y2H/w4EHzYyZPnmzR7uwzNR555BHz/tatW2ekpaVd9wq8nTt35jpTQ73e1q1b6WcAAAAONJs5+7hUlYsXL97R2HL+/PkW+1988cWM9PT0HDM5TLp3724+tkiRIhkXLlww37do0aJcZ0SsX7/eYv+wYcPMj7l8+bKeTZHbTI158+ZZjHnVrA2T1NTUjLp165rvf/3113OdqaHKa6+9dsd/DwCA42BNDQBAvnv++ef1WheKus2eWzgqKspcV7MqTNSsjpYtW1o8j8rJq/LrKps2bdJXhJn079/f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H68ekbHBrOXrYMXviMuXL48an36vTJIyxaR6vhsA66J3795pYePYrEGDdN72xKKlS2PwiBFONUXbj3953325hEaySPjAX/witpbQICP9eNny5Wn5oli4fFQIkH1iZACA9dftyG65+tP/93QsXbK00s//fcu/K03d1LJjy0qjNcqnpUq88Z+1r39Yvfrqy+/JdMNf5P3h7+fqUz6YEvNmrRolUrukdjTdctUN32t7/YVzF8bol0ev9XdWq7762+DKFVVnKmIjNSCjZs6dGy+8994a+5M52sunNllXyQfst/faK/763/+m29/9y1/ShWm32XLL+HD69HjyjTfiwQsv/MLfMWHmzHht3Li0PnnWrNz+1z/8MBqUlOSmaKlXp85XahtVW6H144vvvjtufeaZ3B31vznhhJj48cdpSZTUqhW7dVxz8TCKWyH148llZXHolVdG7332iZ3btYvNGzWKMVOnxh+eeCJ3zC7t23+lNgEAAFRFx/742Pjfff+L+bPnx6TRk+KKY6+II845IkrqlcSLj74Yg/41KHfsyb86OX3cotMWlZIeJfVLYurYqZWOrah+k1U3rSVGvTQqXhv4WjpKpFVpq0rrXSSe6PtENGnRJDZvu3k8eP2Duf1dDuuSW08jef0P3/4wrd/8g5tjr2P2iv/1X/U3rE0yhVW5/937v6heo3pasr62hqQGmTBs2LD0sVu31RnUYjfwrbfS8lnvXH99tG/+1efY+9W3vpVelHtn4sT4eO7c9OJuuXabbfalz//fu+/GObffvsb+5MJc+cW59W0bVVeh9eMnXnstV5+9YEGc+uc/V/p58jtG3HjjV24XVVuh9eOps2fHH558cq0/a1hSElcb+cgGNH/B8vjrPR/Fw0/PjBHvzY/5C5fHls3rxA7b1IteR7eIE49qEbVrr7o77d5/T48/3TEp3nx31R1nu2zXIP7fd9ukx7B+xMgAAOtv8zabx0/v+mlcf+r1aVJg5PMj0/LZG89O+91p0fXwrul2l0O7pEmHmRNnpiMp7vj5Hen+Ntu2SRMjn5Xsb9KySTqqYvqH0+OqE65K959767lx0CkHVTo2GQly+08rX1sraVASp/z6lNz2oWccGi89+lJaf+fZd9JSo2aNNNmRJFc+a4f9d8iNOBl81+C0JB6Y80BkmemnyIThw4enhY0nWQD5v5ddFr88/vjY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x4rlK+K/d/43zrrhrDz9NYXLQuEQEWPGjImePXvGFVdcEZ98snoBy6rioZdfztXP/cY3KiU0yjVv1CiaNWgQL773Xm7fnltvvdb6CxWOobBccMEFcfLJJ8err74aVY1+XDyGDBkShx56aPz1r3+NJUuWRFWjLxeGvn37pmVjWbBgQfTq1Sv69OkTH3744UZ7HQAAyEqMnHjppZfS73u33HJLLFq0KKqaFx58IVc/qs9RlRIa5Ro3bxwNmzWMd196N7dv2z23XWv93RdXH8NqkhpkQteuXdOysYwcOTKefvrp+NWvfhUdOnSoUsmNeYsWVVpHY59ttvnC4yfMXJVNTrRo1ChXb96wYa6erMFBYbrvvvuiX79+6b+XY445psokN/Tj4vLcc8/Ff//73/jBD34QW2+9dZVKbujLxWP27Nnx8MMPx6233pr24+9///uSG2QuRgYA2BhJjeT73vnnnx9bbbVVlUpuLJy3sNI6Gtvts90XHj9jwurrdY1bNF5db766nqzBwZpMP8WXWrp0ad4vJu2www7p4/z58zfK7z/44IPjH//4R1x11VUxevToNLnx+9//Ps4777z0zvdmzZpFVs1ZuLDS9hZNmnzh8fMXL87Va9esudZ6xWOyYuXKlelds1XdgAED0n6cJDf+/e9/p+WII46Iyy67LPbee+/IKv14tcWLF8eyZcuiKjv33HOjTp06ceONN8aECRPS5Mbvfve7+OlPf5peGE5+llX68irJEOuFn/n/KR//ljZmbNG4ceP0honkRolBgwbF//3f/8Udd9wRp556alx66aVpogO+rm7dujmJAFCFJNffkutwVTVGTpx55plRrVq1uP7662Py5MlpciO5jnHRRRelo5zr1q0bWbVgTuXrTsl6Gl9k8fzV19dq1qq51vqi+VUj4bOhSWrwhUaMGBGHHXZYlRm18FXvsEwuol199dUxceLE2HLLLSOLGn3mP4Ops2fHtq1afe7x9evUSRcETyyu8B/pkgoXUZNjsiYZtfD4449HMXryySfTklwoTu6AyCL9eJVHHnkkTj/99LwnmvMh+Rz+0Y9+lCady8rK0iA4i/TlSO/C2nnnneP999+PQnDhhRdustdKEpJ33nlnWu6666445ZRTNtlrAwBQ2AYOHBi9e/cuiFELmzJGTkyZMiV+8pOfxK9//euYO3duZr/v1WtU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AGSCpAYAAAAAAJAJkhoAAAAAAEAmSGoAAAAAAACZIKkBAAAAAABkgqQGAAAAAACQCZIaAAAAAABAJkhqAAAAAAAAmSCpAQAAAAAAZIKkBgAAAAAAkAmSGgAAAAAAQCZIagAAAAAAAJkgqQEAAAAAAGSCpAYAAAAAAJAJkhoAAAAAAEAmSGoAAAAAAACZIKkBAAAAAABkgqQGAAAAAACQCZIaAAAAAABAJkhqAAAAAAAAmSCpAQAAAAAAZIKkBgAAAAAAkAmSGgAAAAAAQCZIagAAAAAAAJkgqQEAAAAAAGSCpAYAAAAAAJAJkhoAAAAAAEAmSGoAAAAAAACZIKkBAAAAAABkgqQGAAAAAACQCZIaAAAAAABAJkhqAAAAAAAAmSCpAQAAAAAAZIKkBgAAAAAAkAmSGgAAAAAAQCZIagAAAAAAAJkgqQEAAAAAAGSCpAYAAAAAAJAJkhoAAAAAAEAmSGoAAAAAAACZIKkBAAAAAABkgqQGAAAAAACQCZIaAAAAAABAJkhqAAAAAAAAmSCpAQAAAAAAZIKkBgAAAAAAkAmSGgAAAAAAQCZIagAAAAAAAJkgqQEAAAAAAGSCpAYAAAAAAJAJkhoAAAAAAEAmSGoAAAAAAACZIKkBAAAAAABkgqQGAAAAAACQCZIaAAAAAABAJkhqAAAAAAAAmSCpAQAAAAAAZIKkBgAAAAAAkAmSGgAAAAAAQCZIagAAAAAAAJkgqQEAAAAAAGSCpAYAAAAAAJAJkhoAAAAAAEAmSGoAAAAAAACZIKkBAAAAAABkgqQGAAAAAACQCZIaAAAAAABAJkhqAAAAAAAAmSCpAQAAAAAAZIKkBgAAAAAAkAmSGgAAAAAAQGTB/wc+jO7wWbWaxgAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_vae_architecture(model = vae,\n", " title = None, ## Set title of plot\n", " ## Colors below are default\n", " color_shared = \"skyblue\", \n", " color_unshared =\"lightcoral\",\n", " color_latent = \"gold\", # xx fix\n", " color_input = \"lightgreen\",\n", " color_output = \"lightgreen\",\n", " figsize=(16, 8),\n", " return_fig = False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Using Binary Feature Mask with Autotune\n", "\n", "To use a `binary_feature_mask` with `autotune()`, pass the use the `binary_feature_mask` parameter when initializing the `ClusterDataset` object. " ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[Warning] CUDA requested but not available. Falling back to CPU.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\u001b[32m[I 2026-04-01 09:56:56,124]\u001b[0m Using an existing study with name 'vae_autotune' instead of creating a new one.\u001b[0m\n", "\\\\VPensBST\\BstShared\\Biostatistics\\Danielle\\Repos\\CISS_VAE\\CISS-VAE-python\\src\\ciss_vae\\training\\autotune.py:652: ExperimentalWarning: optuna.study.study.Study.set_metric_names is experimental (supported from v3.2.0). The interface can change in the future.\n", " study.set_metric_names([\"Total Imputation Error\"])\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Starting Optuna optimization with 20 trials...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\u001b[32m[I 2026-04-01 09:57:11,614]\u001b[0m Trial 23 finished with value: {'Total Imputation Error': 280.91204833984375} and parameters: {'num_hidden_layers': 2, 'hidden_dim_0': 32, 'hidden_dim_1': 16, 'encoder_shared_placement': 'at_end', 'decoder_shared_placement': 'at_start'}. Best is trial 21 with value: 202.40597534179688.\u001b[0m\n", "\u001b[32m[I 2026-04-01 09:57:25,087]\u001b[0m Trial 24 finished with value: {'Total Imputation Error': 213.1970672607422} and parameters: {'num_hidden_layers': 2, 'hidden_dim_0': 32, 'hidden_dim_1': 16, 'encoder_shared_placement': 'at_end', 'decoder_shared_placement': 'at_start'}. Best is trial 21 with value: 202.40597534179688.\u001b[0m\n", "\u001b[32m[I 2026-04-01 09:57:38,223]\u001b[0m Trial 25 finished with value: {'Total Imputation Error': 313.8942565917969} and parameters: {'num_hidden_layers': 2, 'hidden_dim_0': 32, 'hidden_dim_1': 16, 'encoder_shared_placement': 'at_end', 'decoder_shared_placement': 'at_start'}. Best is trial 21 with value: 202.40597534179688.\u001b[0m\n", "\u001b[32m[I 2026-04-01 09:57:48,507]\u001b[0m Trial 26 finished with value: {'Total Imputation Error': 378.0359191894531} and parameters: {'num_hidden_layers': 2, 'hidden_dim_0': 32, 'hidden_dim_1': 16, 'encoder_shared_placement': 'at_end', 'decoder_shared_placement': 'at_end'}. Best is trial 21 with value: 202.40597534179688.\u001b[0m\n", "\u001b[32m[I 2026-04-01 09:57:58,126]\u001b[0m Trial 27 finished with value: {'Total Imputation Error': 291.3521423339844} and parameters: {'num_hidden_layers': 1, 'hidden_dim_0': 32, 'encoder_shared_placement': 'at_start', 'decoder_shared_placement': 'at_start'}. Best is trial 21 with value: 202.40597534179688.\u001b[0m\n", "\u001b[32m[I 2026-04-01 09:58:08,416]\u001b[0m Trial 28 finished with value: {'Total Imputation Error': 270.27435302734375} and parameters: {'num_hidden_layers': 2, 'hidden_dim_0': 32, 'hidden_dim_1': 16, 'encoder_shared_placement': 'alternating', 'decoder_shared_placement': 'at_start'}. Best is trial 21 with value: 202.40597534179688.\u001b[0m\n", "\u001b[32m[I 2026-04-01 09:58:19,106]\u001b[0m Trial 29 finished with value: {'Total Imputation Error': 256.9208068847656} and parameters: {'num_hidden_layers': 2, 'hidden_dim_0': 16, 'hidden_dim_1': 16, 'encoder_shared_placement': 'at_end', 'decoder_shared_placement': 'at_end'}. Best is trial 21 with value: 202.40597534179688.\u001b[0m\n", "\u001b[32m[I 2026-04-01 09:58:30,824]\u001b[0m Trial 30 finished with value: {'Total Imputation Error': 278.3486633300781} and parameters: {'num_hidden_layers': 2, 'hidden_dim_0': 32, 'hidden_dim_1': 16, 'encoder_shared_placement': 'random', 'decoder_shared_placement': 'at_end'}. Best is trial 21 with value: 202.40597534179688.\u001b[0m\n", "\u001b[32m[I 2026-04-01 09:58:41,303]\u001b[0m Trial 31 finished with value: {'Total Imputation Error': 318.2501220703125} and parameters: {'num_hidden_layers': 2, 'hidden_dim_0': 6, 'hidden_dim_1': 6, 'encoder_shared_placement': 'at_start', 'decoder_shared_placement': 'random'}. Best is trial 21 with value: 202.40597534179688.\u001b[0m\n", "\u001b[32m[I 2026-04-01 09:58:55,522]\u001b[0m Trial 32 finished with value: {'Total Imputation Error': 193.67373657226562} and parameters: {'num_hidden_layers': 2, 'hidden_dim_0': 32, 'hidden_dim_1': 16, 'encoder_shared_placement': 'at_end', 'decoder_shared_placement': 'at_start'}. Best is trial 32 with value: 193.67373657226562.\u001b[0m\n", "\u001b[32m[I 2026-04-01 09:59:06,457]\u001b[0m Trial 33 finished with value: {'Total Imputation Error': 323.4795837402344} and parameters: {'num_hidden_layers': 2, 'hidden_dim_0': 32, 'hidden_dim_1': 16, 'encoder_shared_placement': 'at_end', 'decoder_shared_placement': 'at_start'}. Best is trial 32 with value: 193.67373657226562.\u001b[0m\n", "\u001b[32m[I 2026-04-01 09:59:30,637]\u001b[0m Trial 34 finished with value: {'Total Imputation Error': 148.54522705078125} and parameters: {'num_hidden_layers': 2, 'hidden_dim_0': 32, 'hidden_dim_1': 16, 'encoder_shared_placement': 'at_end', 'decoder_shared_placement': 'at_start'}. Best is trial 34 with value: 148.54522705078125.\u001b[0m\n", "\u001b[32m[I 2026-04-01 09:59:41,609]\u001b[0m Trial 35 finished with value: {'Total Imputation Error': 252.63011169433594} and parameters: {'num_hidden_layers': 2, 'hidden_dim_0': 32, 'hidden_dim_1': 16, 'encoder_shared_placement': 'at_end', 'decoder_shared_placement': 'at_start'}. Best is trial 34 with value: 148.54522705078125.\u001b[0m\n", "\u001b[32m[I 2026-04-01 09:59:52,709]\u001b[0m Trial 36 finished with value: {'Total Imputation Error': 261.8629150390625} and parameters: {'num_hidden_layers': 2, 'hidden_dim_0': 32, 'hidden_dim_1': 16, 'encoder_shared_placement': 'at_end', 'decoder_shared_placement': 'at_start'}. Best is trial 34 with value: 148.54522705078125.\u001b[0m\n", "\u001b[32m[I 2026-04-01 10:00:03,830]\u001b[0m Trial 37 finished with value: {'Total Imputation Error': 402.05194091796875} and parameters: {'num_hidden_layers': 2, 'hidden_dim_0': 6, 'hidden_dim_1': 16, 'encoder_shared_placement': 'random', 'decoder_shared_placement': 'at_start'}. Best is trial 34 with value: 148.54522705078125.\u001b[0m\n", "\u001b[32m[I 2026-04-01 10:00:10,947]\u001b[0m Trial 38 finished with value: {'Total Imputation Error': 293.0616760253906} and parameters: {'num_hidden_layers': 1, 'hidden_dim_0': 32, 'encoder_shared_placement': 'alternating', 'decoder_shared_placement': 'at_start'}. Best is trial 34 with value: 148.54522705078125.\u001b[0m\n", "\u001b[32m[I 2026-04-01 10:00:19,768]\u001b[0m Trial 39 finished with value: {'Total Imputation Error': 280.6060485839844} and parameters: {'num_hidden_layers': 2, 'hidden_dim_0': 32, 'hidden_dim_1': 16, 'encoder_shared_placement': 'at_start', 'decoder_shared_placement': 'at_start'}. Best is trial 34 with value: 148.54522705078125.\u001b[0m\n", "\u001b[32m[I 2026-04-01 10:00:29,228]\u001b[0m Trial 40 finished with value: {'Total Imputation Error': 208.51077270507812} and parameters: {'num_hidden_layers': 2, 'hidden_dim_0': 16, 'hidden_dim_1': 32, 'encoder_shared_placement': 'at_end', 'decoder_shared_placement': 'at_start'}. Best is trial 34 with value: 148.54522705078125.\u001b[0m\n", "\u001b[32m[I 2026-04-01 10:00:37,311]\u001b[0m Trial 41 finished with value: {'Total Imputation Error': 421.8951416015625} and parameters: {'num_hidden_layers': 2, 'hidden_dim_0': 6, 'hidden_dim_1': 16, 'encoder_shared_placement': 'random', 'decoder_shared_placement': 'random'}. Best is trial 34 with value: 148.54522705078125.\u001b[0m\n", "\u001b[32m[I 2026-04-01 10:00:44,687]\u001b[0m Trial 42 finished with value: {'Total Imputation Error': 282.4975280761719} and parameters: {'num_hidden_layers': 2, 'hidden_dim_0': 16, 'hidden_dim_1': 32, 'encoder_shared_placement': 'at_end', 'decoder_shared_placement': 'at_start'}. Best is trial 34 with value: 148.54522705078125.\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Optimization complete. Best trial: 34 (Total Imputation Error: 148.545227)\n", "Training final model with best parameters...\n", "Final model training complete.\n" ] }, { "data": { "text/plain": [ "( feat1 feat2 feat3 feat4 feat5 bf1 bf2 \\\n", " 0 52.0 2.000000 6.000000 4.000000 2.000000 0.603871 0.159842 \n", " 1 93.0 1.000000 7.000000 -0.439109 2.000000 0.000002 1.000000 \n", " 2 15.0 4.000000 3.687330 4.000000 2.000000 0.000000 0.000000 \n", " 3 72.0 4.000000 3.000000 3.249043 1.000000 0.004010 1.000000 \n", " 4 61.0 2.255670 1.000000 2.768236 1.000000 0.000000 0.018236 \n", " .. ... ... ... ... ... ... ... \n", " 95 85.0 0.962307 3.369231 6.000000 2.000000 0.000000 0.000000 \n", " 96 80.0 1.000000 3.238206 7.000000 2.000000 0.000000 0.000018 \n", " 97 82.0 2.000000 4.000000 6.498518 1.000000 0.000000 0.000099 \n", " 98 53.0 4.000000 3.000000 7.000000 7.000000 0.000504 0.000000 \n", " 99 24.0 4.000000 1.000000 3.000000 2.768066 0.000000 1.000000 \n", " \n", " bf3 bf4 bf5 \n", " 0 0.517981 2.188087e-02 0.000000 \n", " 1 1.000000 1.000000e+00 1.000000 \n", " 2 1.000000 0.000000e+00 0.966626 \n", " 3 1.000000 1.000000e+00 0.999973 \n", " 4 0.761495 1.825549e-01 0.000000 \n", " .. ... ... ... \n", " 95 1.000000 8.229457e-10 1.000000 \n", " 96 1.000000 5.805393e-11 1.000000 \n", " 97 1.000000 4.715938e-10 0.994726 \n", " 98 0.000000 0.000000e+00 1.000000 \n", " 99 1.000000 1.000000e+00 0.000000 \n", " \n", " [100 rows x 10 columns],\n", " CISSVAE(input_dim=10, latent_dim=10, latent_shared=True, output_shared=True,num_clusters=3)\n", " Encoder Layers:\n", " [0] UNSHARED 10 → 32\n", " [1] SHARED 32 → 16\n", " \n", " Latent Layer:\n", " SHARED 16 → 10\n", " \n", " Decoder Layers:\n", " [0] SHARED 10 → 16\n", " [1] UNSHARED 16 → 32\n", " \n", " Final Output Layer:\n", " SHARED 32 → 10,\n", " ,\n", " trial_number imputation_error num_hidden_layers hidden_dim_0 \\\n", " 0 0 471.357300 2 6 \n", " 1 1 281.187469 2 32 \n", " 2 2 335.337006 2 6 \n", " 3 3 294.416748 1 6 \n", " 4 4 208.593140 2 32 \n", " 5 5 290.728394 2 16 \n", " 6 6 352.566742 2 16 \n", " 7 7 316.873352 2 16 \n", " 8 8 342.178864 2 6 \n", " 9 9 355.935516 2 6 \n", " 10 10 322.344818 1 32 \n", " 11 11 325.406799 1 32 \n", " 12 12 353.754150 2 32 \n", " 13 13 376.329926 2 32 \n", " 14 14 317.611389 1 32 \n", " 15 15 319.031525 2 32 \n", " 16 16 384.458893 2 32 \n", " 17 17 204.753601 2 32 \n", " 18 18 313.878571 1 32 \n", " 19 19 248.689560 2 32 \n", " 20 20 359.694733 2 16 \n", " 21 21 202.405975 2 32 \n", " 22 22 NaN 2 32 \n", " 23 23 280.912048 2 32 \n", " 24 24 213.197067 2 32 \n", " 25 25 313.894257 2 32 \n", " 26 26 378.035919 2 32 \n", " 27 27 291.352142 1 32 \n", " 28 28 270.274353 2 32 \n", " 29 29 256.920807 2 16 \n", " 30 30 278.348663 2 32 \n", " 31 31 318.250122 2 6 \n", " 32 32 193.673737 2 32 \n", " 33 33 323.479584 2 32 \n", " 34 34 148.545227 2 32 \n", " 35 35 252.630112 2 32 \n", " 36 36 261.862915 2 32 \n", " 37 37 402.051941 2 6 \n", " 38 38 293.061676 1 32 \n", " 39 39 280.606049 2 32 \n", " 40 40 208.510773 2 16 \n", " 41 41 421.895142 2 6 \n", " 42 42 282.497528 2 16 \n", " \n", " hidden_dim_1 encoder_shared_placement decoder_shared_placement \\\n", " 0 32.0 random at_end \n", " 1 32.0 at_start alternating \n", " 2 16.0 random at_start \n", " 3 NaN alternating random \n", " 4 16.0 at_end at_end \n", " 5 6.0 random random \n", " 6 16.0 random alternating \n", " 7 16.0 at_start at_end \n", " 8 6.0 at_start alternating \n", " 9 6.0 at_start at_start \n", " 10 NaN at_end at_end \n", " 11 NaN at_end alternating \n", " 12 32.0 at_end at_end \n", " 13 32.0 alternating alternating \n", " 14 NaN at_end at_end \n", " 15 16.0 at_start alternating \n", " 16 32.0 at_end random \n", " 17 16.0 at_start at_start \n", " 18 NaN alternating at_start \n", " 19 16.0 at_end at_start \n", " 20 16.0 at_start at_start \n", " 21 16.0 at_end at_start \n", " 22 16.0 at_end at_start \n", " 23 16.0 at_end at_start \n", " 24 16.0 at_end at_start \n", " 25 16.0 at_end at_start \n", " 26 16.0 at_end at_end \n", " 27 NaN at_start at_start \n", " 28 16.0 alternating at_start \n", " 29 16.0 at_end at_end \n", " 30 16.0 random at_end \n", " 31 6.0 at_start random \n", " 32 16.0 at_end at_start \n", " 33 16.0 at_end at_start \n", " 34 16.0 at_end at_start \n", " 35 16.0 at_end at_start \n", " 36 16.0 at_end at_start \n", " 37 16.0 random at_start \n", " 38 NaN alternating at_start \n", " 39 16.0 at_start at_start \n", " 40 32.0 at_end at_start \n", " 41 16.0 random random \n", " 42 32.0 at_end at_start \n", " \n", " layer_order_enc_used layer_order_dec_used \n", " 0 U,S U,S \n", " 1 S,U S,U \n", " 2 S,U S,U \n", " 3 S S \n", " 4 U,S U,S \n", " 5 S,U S,U \n", " 6 U,S S,U \n", " 7 S,U U,S \n", " 8 S,U S,U \n", " 9 S,U S,U \n", " 10 S S \n", " 11 S S \n", " 12 U,S U,S \n", " 13 S,U S,U \n", " 14 S S \n", " 15 S,U S,U \n", " 16 U,S U,S \n", " 17 S,U S,U \n", " 18 S S \n", " 19 U,S S,U \n", " 20 S,U S,U \n", " 21 U,S S,U \n", " 22 None None \n", " 23 U,S S,U \n", " 24 U,S S,U \n", " 25 U,S S,U \n", " 26 U,S U,S \n", " 27 S S \n", " 28 S,U S,U \n", " 29 U,S U,S \n", " 30 S,U U,S \n", " 31 S,U S,U \n", " 32 U,S S,U \n", " 33 U,S S,U \n", " 34 U,S S,U \n", " 35 U,S S,U \n", " 36 U,S S,U \n", " 37 U,S S,U \n", " 38 S S \n", " 39 S,U S,U \n", " 40 U,S S,U \n", " 41 U,S U,S \n", " 42 U,S S,U )" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from ciss_vae.classes.cluster_dataset import ClusterDataset\n", "from ciss_vae.training.autotune import autotune, SearchSpace\n", "cd = ClusterDataset(\n", " X, cluster_labels = clusters, binary_feature_mask=binary_vector\n", ")\n", "\n", "ss = SearchSpace(\n", " num_hidden_layers = [1, 2],\n", " hidden_dims = [6, 16, 32],\n", " latent_dim=10,\n", " latent_shared=True,\n", " output_shared = True,\n", " lr = 0.01,\n", " decay_factor=0.999,\n", " num_epochs = 100,\n", " num_shared_encode = 1,\n", " num_shared_decode = 1,\n", " epochs_per_loop=100,\n", " reset_lr_refit=False\n", "\n", ")\n", "autotune(search_space = ss, train_dataset = cd, optuna_dashboard_db = \"sqlite:///optuna_study_test_binary.db\", debug = False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Handling Categorical Data Columns\n", "When using one-hot encoding to handle categorical data, the validation data must be structured such that if one dummy variable from a given category is added to the validation dataset, all dummy variables of that category must be added. In order to achieve this, one can create a `categorical_column_map` dictionary for which the keys are the original categorical column names and the entries are the corresponding dummy variable column names. Note: When using `categorical_column_map`, the `binary_feature_mask` must also be given. \n", "\n", "To illustrate this, we will use a high hold-out proportion of 0.5, which is less realistic in real-world situations but helps illustrate the use of `categorical_column_map`. " ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "X matrix:\n", " feat1 feat2 feat3 feat4 feat5 c11 c12 c21 c22 b1\n", "0 52 2.0 6.0 4.0 2.0 NaN NaN NaN NaN NaN\n", "1 93 1.0 7.0 NaN 2.0 0.0 1.0 1.0 1.0 NaN\n", "2 15 4.0 NaN 4.0 2.0 0.0 0.0 1.0 0.0 1.0\n", "3 72 4.0 3.0 NaN 1.0 1.0 1.0 NaN NaN NaN\n", "4 61 NaN 1.0 NaN 1.0 NaN NaN NaN NaN 0.0\n", ".. ... ... ... ... ... ... ... ... ... ...\n", "95 85 NaN NaN 6.0 2.0 0.0 0.0 1.0 0.0 1.0\n", "96 80 1.0 NaN 7.0 2.0 NaN NaN 1.0 1.0 1.0\n", "97 82 2.0 4.0 NaN 1.0 NaN NaN 1.0 1.0 1.0\n", "98 53 4.0 3.0 7.0 7.0 0.0 0.0 0.0 0.0 NaN\n", "99 24 4.0 1.0 3.0 NaN 0.0 1.0 1.0 1.0 0.0\n", "\n", "[100 rows x 10 columns]\n" ] } ], "source": [ "import pandas as pd\n", "import numpy as np\n", "\n", "np.random.seed(42)\n", "\n", "n_rows = 100\n", "prop_mask = 0.30 \n", "\n", "X = pd.DataFrame({\n", " \"feat1\": np.random.choice(np.arange(1, n_rows + 1), size=n_rows, replace=True),\n", " \"feat2\": np.random.choice(np.arange(1, 6), size=n_rows, replace=True),\n", " \"feat3\": np.random.choice(np.arange(1, 8), size=n_rows, replace=True),\n", " \"feat4\": np.random.choice(np.arange(1, 8), size=n_rows, replace=True),\n", " \"feat5\": np.random.choice(np.arange(1, 8), size=n_rows, replace=True),\n", " ## now add some categorical and binary features\n", " \"c11\": np.random.binomial(1, 0.25, size=n_rows),\n", " \"c12\": np.random.binomial(1, 0.5, size=n_rows),\n", " \"c21\": np.random.binomial(1, 0.75, size=n_rows),\n", " \"c22\": np.random.binomial(1, 0.33, size=n_rows),\n", " \"b1\": np.random.binomial(1, 0.66, size=n_rows),\n", "})\n", "\n", "X_raw = X.copy()\n", "\n", "## define categorical groups\n", "categorical_groups = {\n", " \"c1\": [\"c11\", \"c12\"],\n", " \"c2\": [\"c21\", \"c22\"],\n", "}\n", "\n", "grouped_cols = {col for group in categorical_groups.values() for col in group}\n", "independent_cols = [col for col in X.columns[1:] if col not in grouped_cols] # skip feat1\n", "\n", "## mask independent columns\n", "for col in independent_cols:\n", " idx = np.where(~X[col].isna())[0]\n", " n_mask = int(np.ceil(len(idx) * prop_mask))\n", " if n_mask > 0:\n", " mask_idx = np.random.choice(idx, size=n_mask, replace=False)\n", " X.loc[mask_idx, col] = np.nan\n", "\n", "## mask grouped categoricals\n", "for group_name, cols in categorical_groups.items():\n", " ## rows eligible only if ALL dummy cols are observed\n", " group_data = X[cols]\n", " eligible = group_data.notna().all(axis=1)\n", " idx = np.where(eligible)[0]\n", "\n", " n_mask = int(np.ceil(len(idx) * prop_mask))\n", " if n_mask > 0:\n", " mask_idx = np.random.choice(idx, size=n_mask, replace=False)\n", " X.loc[mask_idx, cols] = np.nan\n", "\n", "print(f\"X matrix:\\n{X}\")\n", "\n", "\n", "## choosing random clusters for now \n", "clusters = np.random.choice([1, 2, 3], size=n_rows, replace=True)\n", "\n", "binary_feature_mask = [False, False, False, False, False, True, True, True, True, True]\n", "\n", "## create categorical column map\n", "\n", "ccm = {\n", " 'c1': ['c11', 'c12'],\n", " 'c2': ['c21', 'c22']\n", "}\n", "\n", "cd = ClusterDataset(\n", " X, cluster_labels = clusters, binary_feature_mask=binary_feature_mask, categorical_column_map = ccm, val_proportion = 0.5\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As we can see from the validation dataset printed below, c11 and c12 are masked together and c21 and c22 are masked together. " ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " feat1 feat2 feat3 feat4 feat5 c11 c12 c21 c22 b1\n", "0 52.0 2.0 6.0 4.0 2.0 NaN NaN NaN NaN NaN\n", "1 93.0 1.0 7.0 NaN NaN 0.0 1.0 1.0 1.0 NaN\n", "2 NaN NaN NaN 4.0 NaN NaN NaN 1.0 0.0 1.0\n", "3 72.0 NaN 3.0 NaN NaN 1.0 1.0 NaN NaN NaN\n", "4 NaN NaN NaN NaN 1.0 NaN NaN NaN NaN 0.0\n", "5 NaN NaN 5.0 NaN 1.0 0.0 1.0 NaN NaN NaN\n", "6 83.0 1.0 NaN NaN NaN NaN NaN NaN NaN NaN\n", "7 NaN NaN NaN 3.0 NaN NaN NaN 1.0 1.0 NaN\n", "8 75.0 NaN NaN NaN NaN NaN NaN 1.0 0.0 0.0\n", "9 75.0 1.0 NaN NaN 5.0 0.0 1.0 1.0 0.0 NaN\n", "10 88.0 NaN 2.0 2.0 NaN NaN NaN 1.0 0.0 NaN\n", "11 NaN NaN NaN 6.0 NaN NaN NaN 1.0 1.0 NaN\n", "12 24.0 1.0 NaN NaN NaN 0.0 1.0 NaN NaN 1.0\n", "13 3.0 NaN 6.0 NaN NaN 0.0 1.0 NaN NaN 1.0\n", "14 22.0 NaN NaN 6.0 2.0 0.0 1.0 1.0 0.0 NaN\n", "15 53.0 3.0 NaN 3.0 1.0 NaN NaN NaN NaN 1.0\n", "16 2.0 NaN NaN NaN NaN 0.0 0.0 NaN NaN 1.0\n", "17 88.0 3.0 1.0 NaN 4.0 NaN NaN 1.0 0.0 NaN\n", "18 NaN NaN 3.0 4.0 NaN NaN NaN NaN NaN NaN\n", "19 38.0 NaN NaN 1.0 NaN NaN NaN 1.0 1.0 NaN\n" ] } ], "source": [ "# Convert val_data tensor to numpy\n", "val_data_np = cd.val_data.cpu().numpy()\n", "\n", "# Reconstruct DataFrame with original column names\n", "val_df = pd.DataFrame(val_data_np, columns=cd.feature_names)\n", "\n", "# Print nicely\n", "print(val_df.head(20))" ] } ], "metadata": { "language_info": { "name": "python" } }, "nbformat": 4, "nbformat_minor": 2 }