From 99044c6a6d02655c1a876f7046513650e270510d Mon Sep 17 00:00:00 2001 From: samyarpotlapalli Date: Mon, 31 Mar 2025 22:09:31 -0400 Subject: [PATCH 1/2] fixed assessment metrics --- ...m_binary_classification_model_import.ipynb | 1065 ++++++++++++++--- .../pzmm_generate_complete_model_card.ipynb | 605 ++++++++-- src/sasctl/pzmm/write_json_files.py | 31 +- 3 files changed, 1402 insertions(+), 299 deletions(-) diff --git a/examples/pzmm_binary_classification_model_import.ipynb b/examples/pzmm_binary_classification_model_import.ipynb index a2bc57c3..aca38579 100644 --- a/examples/pzmm_binary_classification_model_import.ipynb +++ b/examples/pzmm_binary_classification_model_import.ipynb @@ -111,7 +111,7 @@ } ], "source": [ - "hmeq_data = pd.read_csv(\"data/hmeq.csv\", sep= \",\")\n", + "hmeq_data = pd.read_csv(\"data/hmeq.csv\", sep=\",\")\n", "hmeq_data.shape" ] }, @@ -274,9 +274,20 @@ "metadata": { "Collapsed": "false" }, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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LPLy8gAY9oOlOu7LL7+U2kt3d3eN5eqOIPqo7yawt7fHN998g6+//hrr16/HDz/8gKNHj8LGxgaPP/44Xn75ZURFReGFF16o85jqans4M+mjIRNCiEd9EERERERERERERJaMY7IRERERERERERGZqF5JNk9PT8hkMp0PXYOuVlRUYN68efDy8kKLFi3Qvn17TJkyRRo3QZcvvvgC/fv3h0KhQOvWrfHSSy+hqKhIb/wPP/yA4cOHo1WrVlAoFBgwYAA2b95cn+oREREREREREREZpd436To7O+Pdd9/VKvf09NR4rlKp8Morr0CpVGLAgAF47bXXUFxcjLS0NOzevRsHDhzQGmhwwYIFiI+Ph4eHB95++22UlpZi06ZNGDhwIHbv3g1fX1+N+D179iA4OBgtWrTAm2++CUdHR2zduhVjx47FhQsXMGPGjPpWk4iIiIiIiIiIqE71GpNNnUg7e/ZsnbHp6emYNGkSQkND8cUXX0gDDn7++eeIjo7GlClTsHLlSim+uLgYTz/9NDp16oTvv/8ezs7OAIAjR45gwIAB6NSpE3766SfY2DzohHf//n1069YNFy9exIEDB9C7d28AwK1bt9C/f3+cPXsWJ0+ehIeHh7HVJCIiIiIiIiIiMkiDj8m2evVqAMCiRYs0ZvSYOnUqOnXqhC+++EJjJrb09HTcv38fH374oZRgA4DevXsjNDQUx48fx759+6Ty7777Dr/++ivGjRsnJdiABz3tPvjgA9y7dw9r165twBoSEREREREREZG1q3eSraKiAhkZGVi4cCGWL1+OgwcPasXcvXsXBw8eRNeuXbV6kslkMgQGBqK8vByHDh2SytVT6QYFBWltLzg4GACQn59f73giIiIiIiIiIiJzq/eYbFevXkVkZKRGWb9+/bBx40Z07twZAPDrr79CpVLBy8tL5zbU5cXFxRg8eLD0fwcHB7Rr167WeDX1/3Xto127dnBwcNCIr6miogIVFRXSc5VKhevXr6Nt27YaPe+IqHESQqC0tBTt27eXbiOnv6hUKly+fBmOjo5s04gsANs0/dieEVkWtmf6sT0jsjyGtmn1SrJFRkZi8ODB6NmzJxwcHHDy5El88sknWL9+PYYOHYqjR4/C0dERt27dAgCN2z6rc3JyAgApTv3/xx57zKj4uvZRPb6mRYsWYe7cuXqXE5FluHDhAjp0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ZCIm2YiIiIiIiIiIiEzEJBsREREREREREZGJmGQjIiIiIiIiIiIyEZNsREREREREREREJmKSjYiIiIiIiIiIyERMshEREREREREREZmISTYiIiIiIiIiIiITMclGRERERERERERkIibZiIiIiIiIiIiITMQkGxERERERERERkYnMkmRLTk6GTCaDTCbDgQMHtJaXlJRg+vTp8PDwgFwuh6enJ95//32UlZXp3J5KpUJqaiq8vb1hb28PV1dXhIaG4vTp03qPQalUwt/fH46OjnByckJAQAB2795tjuoRERERERERERHVyuQk208//YSEhAQoFAqdy8vLy+Hv74+UlBR069YN7733Hrp27YqlS5fihRdewN27d7XWmTp1KmJjYyGEQGxsLEJCQvDVV1+hX79+KC4u1orPzMxESEgIjh8/joiICISHh+PYsWMIDAzEl19+aWoViYiIiIiIiIiIamVSkq2yshLh4eHo3bs3Ro8erTNmyZIlOHLkCOLi4qBUKrF48WIolUrExcXhhx9+QEpKikb8nj17kJaWBj8/PxQVFSE5ORnr16/Htm3bcP36dcTExGjE37hxA9OmTYOLiwuKioqQmpqK1NRUFBUVoW3btoiOjkZpaakp1SQiIiIiIiIiIqqVSUm2BQsW4NixY1izZg2aNWumtVwIgbS0NDg4OGDOnDkay+bMmQMHBwekpaVplK9evRoAkJSUBDs7O6n8xRdfxJAhQ5CTk4Pz589L5Vu2bMHNmzcxbdo0dOjQQSrv0KEDYmJi8Oeff+Lrr782pZpERERERERERES1qneSraioCAsWLEBCQgKefvppnTHFxcW4fPkyfH19tW4nVSgU8PX1xenTp3HhwgWpPC8vT1pWU3BwMAAgPz9fIx4AgoKCDIonIiIiIiIiIiIyt+b1WamiogITJ05E7969MXPmTL1x6vHTvLy8dC738vKCUqlEcXEx3N3dUV5ejitXrqBnz546e8apt1N9XLba9qErXlddKioqpOclJSUAHtwKW1lZqXc9dQwAyG1ErXHGqmu/VD/q15Wvr2Uw9HzxfBIREREREVFjUK8k20cffYTi4mL8+OOPOpNhardu3QIAODs761zu5OSkEWdsfF3r6IqvadGiRZg7d65WeU5ODlq2bKl3veqS+qoMijNUdna2WbdHmnJzcx/1IZAR6jpft2/frve2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nPoW0XXr1uGNN95AZmamzgQbAMhkMkRFRaGsrAxJSUkay5KSklBWVobJkydrlE+ZMgUAMGfOHNy7d08q37lzJ/Ly8hAUFAQPDw+pfMyYMXB2dkZqaiouXrwolV+8eBHLly+Hi4sLRo8ebXK9iYiIiBoTTnxAREREZOHmzZuHtWvXwsHBAV26dMH8+fO1YkaNGoXevXsDAGbOnInt27cjOTkZhw8fho+PD4qKipCTk4N+/frh3Xff1Vg3ICAAUVFRSEtLg4+PD0aMGIErV64gKysLbdq0QWpqqkZ869atsXz5coSFhcHHxwdjx44FAGRlZeHatWvIysqCo6Njg7wWRERERI8Kk2xEREREFu7s2bMAgLKyMixYsEBnjKenp5RkUygUyM/PR2JiIrZu3Yo9e/bAzc0NM2bMQEJCAuzt7bXWX7lyJby9vbFq1SosW7YMDg4OGD16NBYsWIDOnTtrxU+YMAEuLi5YuHAh0tPTIZPJ0KdPH8THx2PYsGFmqzsRERFRY8EkGxEREZGFy8jIQEZGhlHrODs7IyUlBSkpKQbF29jYIDY2FrGxsQbvIyQkBCEhIUYdFxEREZGl4phsREREREREREREJmKSjYiIiIiIiIiIyERMshEREREREREREZmISTYiIiIiIiIiIiITMclGRERERERERERkIibZiIiIiIiIiIiITMQkGxERERERERERkYmYZCMiIiIiIiIiIjIRk2xEREREREREREQmYpKNiIiIiIiIiIjIREyyERERERERERERmaj5oz4AIiIiIiIiInq4PGftMPs2zy4eYfZtElkS9mQjIiIiIiIiIiIyEZNsREREREREREREJmKSjYiIiIiIiIiIyERMshEREREREREREZmISTYiIiIiIiIiIiITMclGREREREREjcalS5fw6aefIigoCE8++STs7OzQrl07vPbaazh48KDOdUpKSjB9+nR4eHhALpfD09MT77//PsrKynTGq1QqpKamwtvbG/b29nB1dUVoaChOnz6t97iUSiX8/f3h6OgIJycnBAQEYPfu3WapMxE1DUYn2e7evYvp06fDz88P7du3R4sWLdCuXTv4+voiPT0dlZWVWuuwwSMiIiIiIiJDpKam4r333sPp06cRFBSEGTNmYNCgQdi+fTsGDhyIrKwsjfjy8nL4+/sjJSUF3bp1w3vvvYeuXbti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wyMiMgp75xIRERGZF5NsRERERFaIvXOJiIiIzItJNiIiIiIrxN65RERERObFPvpEREREREREREQmYpKNiIiIiIiIiIjIREyyERERERERERERmYhjshERERERERGRyTxn7TDLduTNBJb0B3omKlFRJcPZxSPMsl2ihsaebERERERERERERCZiko2IiIiIiIiIiMhETLIRERERERERERGZiEk2IiIiIiIiIiIiEzHJRkREREREREREZCIm2YiIiIiIiIiIiEzEJBsREREREREREZGJmGQjIiIiIiIiIiIyEZNsREREREREREREJmKSjYiIiIiIiIiIyERMshEREREREREREZmISTYiIiIiIiIiIiITMclGRERERERERERkIibZiIiIiIiIiIiITNT8UR8AERFRU+c5a4fZt3l28Qizb5OIiIiIiOqPPdmIiIiIiIiIiIhMxCQbERERERERERGRiZhkIyIiIiIiIiIiMhGTbERERERERERERCZiko2IiIiIiIiIiMhEnF2UiIjIAhk6Y6m8mcCS/kDPRCUqqmR1xnPWUiKqjblnS1a3UURERE0Be7IRERERERERERGZiEk2IiIiIiIiIiIiE/F2USIiIiIieqQMvaXdGLz9nYiIHjYm2YiIiIiIiIio0TL3eJAAE/HUMJrM7aI//PADhg8fjlatWkGhUGDAgAHYvHnzoz4sIqJ6YZtGRE0F2zMiakrYphFRbZpET7Y9e/YgODgYLVq0wJtvvglHR0ds3boVY8eOxYULFzBjxoxHfYhERAZjm0ZETQXbMyJqStimEVFdLL4n2/379zF58mTY2NigoKAAq1atwt///nf85z//QZcuXfDBBx/g3Llzj/owiYgMwjaNiJoKtmdE1JSwTSMiQ1h8T7bvvvsOv/76KyIjI9G7d2+p3NnZGR988AEiIiKwdu1afPTRR4/uIImIDMQ2jZqihhhHBeBYKo0d2zMiakrYphGRISw+yZaXlwcACAoK0loWHBwMAMjPz9e7fkVFBSoqKqTnt27dAgBcv34dlZWVte67srISt2/fRvNKG1SpzDcb0rVr18y2LfqL+nxdu3YNtra2j/pwmpTm98vNv02VwO3bqjrPV2lpKQBACGH2Y3gUHnabVv1z0RDnsbFRv6/M3W43ZsbW+am/mX9cmYa62NB3rHIbgfhnVej94VeoaCTn+eDs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Pw2trvdG9c/urVu3xP/8z/+Ifv36CVdXV9G8eXPh6Ogo+vfvL5YsWVLrhfbOnTvF4MGDhUKhEA4ODsLf31/k5ubqjT9x4oR4/fXXRZs2bYRcLhfe3t5ixYoVepNHN2/eFO+++65wd3cXtra24sknnxQzZszQ+jVOCCHy8vLEmDFjhJeXl3BychLNmzcX7dq1E6+88opQKpU6t1+fvyuZmZmib9++wt7eXjg7O4vhw4eLH3/8UW+8se+Jy5cvi0mTJonHH39c2NnZCS8vL5GUlKTxK6CufQAQ/fv31xvTVM4zPXyNpV2zFMa0v2rGfgbq83ebn2Pj6UuyCcFzZokeZVtmjddlQvz1vvf09BQ2NjbCxsZG2NraWs01Ws06tGnTRgAQzz77rN59NMXzb67vmDIhatysS0REREREREREREbhxAdEREREREREREQmYpKNiIiIiIiIiIjIREyyERERERERERERmYhJNiIiIiIiIiIiIhMxyUZERERERERERGQiJtmIiIiIiIiIiIhMxCQbERERERERERGRiZhkIyIiIiIiIiIiMhGTbERERERERERERCZiko2IiIiIiIiIiMhETLIRERERERERERGZiEk2IiIiIiIiIiIiEzHJRkREREREREREZCIm2YiIiIiIiIiIiEzEJBsREREREREREZGJmGQjIiIiIiIiIiIyEZNsREREREREREREJmKSjYiIiIiIiIiIyERMshEREREREREREZmISTayCK+88gpkMhmef/55VFVV1Rr7z3/+EzKZDE5OTjh37pxU/ssvv2DGjBno1asXWrduDblcjieeeAIvv/wy0tPTcf/+fb3bzMvLg0wmg0wmM1udiKhxGzJkiPS5Vz9atGiBxx9/HL169UJERATWrl2L27dv692Gp6en1jZ0PTw9PTXWO3v2rM646u3Wli1bDK7L7t27ERkZiaeeegoODg5QKBTo3LkzwsPDkZuba/B2SktL8Y9//AMvvfQS3N3d0bJlS9jb2+OJJ55AUFAQkpKS8Msvvxi8PSIiIiJz+fXXXzF79mw899xzeOyxx2BrawtnZ2f06tUL0dHRKCgo0IhPTEyETCbDkCFDTNqvv7+/dK22b98+g9erqKjAmjVr8Prrr6Njx45wdHSEXC7H448/Dn9/f3zwwQf48ccfda6bkZFh0DWmTCZDRkaGSfUjIwki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f/xxPPXUU3jhhRfg5OTU6DbKy8ubvBOpv/izxm9/+1tERUXh/fffR2pqKiIiIgyexO3duzfy8vJQUFCA7OxsHD58GOXl5RAEAf3798ezzz6LefPmISQkpMl9hYeH45lnnsG2bduQn5+P//u//8MPP/wAQRDQt29fTJw4ERMmTMDcuXPF8TCJqONo7xsGfn5+jc70vmrVKqxatcqSQzFLKpUiOTkZCxcuFK/dTPHw8MCRI0cwa9YsfPvtt3j22WfRu3dvDB48GFqtFuXl5bh79y66deuGFStWYP369RbNUk9E7aN79+5IT0/HH//4RyiVSnz11Vdisr1Xr14YNmwYxo8fj5deesnkBHf3799v8kn8+/fvIysrC0D9NZElbz7NnTsXf/rTn3D79m3s27cPL730krhMoVCgoqIC2dnZyM3NxXfffYeffvoJ9+/fR+/evTFmzBg8+eSTmDNnjvhEnCkajQalpaWN1uN3v/tdk3Ul25EIfAmYqEn79u3D888/j4ceekh88o2IiIioo5s0aZLR7MD6GwYeHh4W3TDw9vbGpUuXLNrfhQsX4O3tDQC4ePGixTNyJiUlITk52WCdhtsCgKysLCxYsADDhg0TJyN4UF1dHR577DGcOXPGYLumCIKAffv2Yc+ePTh69Cj+85//GNzw2LhxI1auXGlR/YmIiAAm2YgskpiYiLfeeguTJk1CUVFRe1eHiIiIiFqBTqfDwoULsX37djg6OuLAgQOc8ICIiCzG556JmnDixAls2bIFAMy+C09ERERE9s/BwQEff/wxFi5cCK1Wi+effx7FxcXtXS0iIrITfJKNyIxly5ZBpVLhp59+gk6nw8iRI/HNN980OfYSEREREdk3QRDw/vvv48aNG3BxccHy5cvFiRGIiIjMYZKNyIxJkybhyJEjePjhh/Hss8/i9ddfR58+fdq7WkRERERERETUATHJRkRERERERERE1EIck42IiIioE/D29oZEIjH5N2nSJKN4jUaDN998Ez4+PujZsycGDBiAxYsX49///rfZfXzyyScYO3YsZDIZ+vTpg6effhplZWVm47/99ltMnz4dvXv3hkwmw7hx47Bnzx5bHC4RERFRh9O9vSvQ0eh0Oly9ehUuLi6QSCTtXR0iaoIgCKipqcGAAQPg4MD7Bg9in0ZkX1rap7m5uWH58uVG5d7e3gafdTodnn32WahUKowbNw6zZs1CeXk5lEolCgsLcfToUbi7uxusk5qaioSEBHh5eeGVV15BTU0Ndu/ejfHjx6OwsBABAQEG8UVFRQgJCUHPnj3x4osvwsXFBfv27cOcOXNQWVmJFStWWHVs7M+I7Auv0cxjf0Zkfyzu0wQyUFlZKQDgH//4Z2d/lZWV7d19dEjs0/jHP/v8a06f5uXlJXh5eVkU+/HHHwsAhLCwMEGn04nlH3zwgQBAWLx4sUH8+fPnhe7duwtDhw4Vbt++LZafOHFCkEqlwogRI4S6ujqxXKvVCkOGDBGkUqlw4sQJsfz27dvC0KFDhR49eggXL1606vjYn/GPf/b5x2s0Y+zP+Mc/+/1rqk/jk2wPcHFxAQBUVlbC1dW10VitVov8/HwoFAo4Ojq2RfXISjxHHV9Lz1F1dTU8PT3F7y4ZsrRP43fFvvB82Rdrzldb9Wlbt24FAKxfv97gKYolS5bg7bffxieffIL33ntPnFF727ZtuH//Pl5//XW4ubmJ8aNHj0ZYWBiysrJw+PBhBAYGAgC++uor/PTTT1iwYAFGjx4txru5uWHNmjWIjIzE9u3b8cYbb1hcZ16j2Q7bp3FsH/M6Yn9mj9ifdVxs77ZnL21uaZ/GJNsD9Bearq6uFnV4vXr1gqura4f+x9CV8Rx1fLY6R3zU3jRL+zR+V+wLz5d9ac75am6fptFokJWVhatXr8LV1RX+/v74/e9/bxBz9+5dHDt2DMOGDYOXl5fRfoODg7FlyxYcP34cEydOBAAUFxcDABQKhdE+Q0JCkJWVhZKSEjHJ1lQ8AJSUlFh1bLxGsx22T+PYPua1ZX/WmbE/67jY3m3P3tq8qT6NSTYiIiKiTuL69etYsGCBQZm/vz927dqFIUOGAAB++ukn6HQ6+Pj4mNyGvry8vFxMspWXl8PZ2Rn9+/dvNF5P/9+m9tG/f384OzsbxJui0Wig0WjEz9XV1QDqL8a1Wm2j6+qXNxXXVbF9Gsf2Mc+atmH7EVFXxCQbERERUSewYMECTJw4ESNHjoSzszPOnz+Pd999Fzt37sSUKVNw6tQpuLi4oKqqCgAMXvtsSP9UhT5O/98PPfSQVfFN7aNhvCnr16/H2rVrjcrz8/PRq1evRtfVKygosCiuq2L7NI7tY54lbXPnzp02qAkRUcfCJBsRERFRJ5CUlGTwefTo0dixYwcAYOfOndi6dStiY2Pbo2rNEh8fb1Bf/VgoCoXCoterCgoKEBwcbBevnrQ1tk/j2D7mWdM2+qdPiYi6EibZiIiIiDqxJUuWYOfOnSgtLUVsbKz4dJm5J8n0P4wbPoXm5uZmdXxT++jTp0+j9ZZKpZBKpUbljo6OFic+rIntitg+jWP7mGdJ27DtiKgrcmjvChARERFR65HL5QAAtVoNABg8eDAcHBzMjolmajw1Hx8f1NbW4vr16xbHN1zW0PXr11FbW2t2TDgiIiIie8UkGxEREVEnduzYMQCAt7c3AMDJyQljx47FDz/8gEuXLhnECoKAgoICyGQyjBkzRiwPCgoCUD8e2oNUKpVBTHPiiYiIiDoDJtmIiIiI7Ny5c+dMDjJ+7tw5xMXFAQDmzp0rli9evBhA/bhngiCI5Vu2bEFFRQVeeuklODk5ieULFixA9+7dkZqaavAK6MmTJ7Fr1y6MGDECEyZMEMunTJmCwYMH49NPP8XJkyfF8qqqKqxbtw49evTA/PnzW37gRERERB0Ix2QjIiIisnO7d+/Gu+++i8DAQHh5eUEmk+H8+fPIzc2FVqtFfHw8AgMDxfiIiAjk5ORg165duHDhAoKCgvDjjz/i888/x6BBg/DWW28ZbH/o0KFITk5GQkICRo0ahVmzZqGmpga7d+8GAGzduhUODv+9d9u9e3colUqEhIQgMDAQL774IlxcXLBv3z5cunQJmzZtEp+sIyIiIuosmGSzgZHJKmjqJDbb3sUNM2y2LSIia9i6PwPYpxG1hcmTJ+Ps2bM4ceIEvv76a9y5cwdyuRzTp0/Hq6++CoVCYRDv4OCAgwcPYsOGDdi5cyfS09PRt29fvPzyy3jrrbfg7u5utI/XX38d3t7eeO+99/DBBx+gR48emDhxIlJSUuDn52eyTocPH0ZSUhJycnKg1Wrh6+uLtLQ0zJkzp9XaoiFeoxERmee9+gubb5P9JHV1TLIRERER2bmgoCCrxziTSqVISkpCUlKSxeu89NJLeOmllyyOHzt2LPLy8qyqFxEREZG94phsRERERERERERELcQkGxERERERERERUQsxyUZERERERERERNRCTLIRERERERERERG1EJNsRERERERERERELcQkGxERERERERERUQsxyUZERERERERERNRCTLIRERERERERERG1EJNsRERERERERERELcQkGxERERERERERUQsxyUZERERERERERNRCTLIRERERERERERG1EJNsRERERERERERELcQkGxERERERERERUQsxyUZERERERERERNRCTLIRERERERERERG1EJNsRERERERE1GH8/PPPeO+996BQKPDwww+jR48e6N+/P2bNmoVjx44ZxScnJ0MikZj9u3jxosn9qFQqBAUFwcXFBa6urpg8eTIKCwvN1uv8+fOYPXs25HI5nJycMGrUKHzwwQcQBMFWh05Edq57e1eAiIiIiIiISC8jIwNpaWkYMmQIFAoF3N3dUV5ejgMHDuDAgQP49NNPMWfOHKP1IiIi4O3tbVTeu3dvo7Ls7GyEh4fD3d0dkZGRAICcnBwEBwdjz549eP755w3iz5w5g/Hjx+PXX3/F7NmzMWDAAHzxxRd49dVXcebMGWRkZNji0InIzjHJRkRERERERB3G2LFjUVxcjKCgIIPyr7/+GlOmTMHSpUvx3HPPQSqVGiyPjIzEpEmTmtz+rVu3sGzZMsjlcpSVlWHgwIEAgLi4ODz++ONYunQpQkJC4OLiIq6zdOlSVFVVITc3F9OmTQMApKSkYOrUqcjMzMTcuXPx5JNPtvDIicje8XVRIqIHpKWlia8XHD161Gh5dXU1YmNj4eXlBalUCm9vb6xcuRK1tbUmt6fT6ZCRkQFfX184OTnB3d0dYWFhqKioMFsHa19fICIiIuos/vCHPxgl2ABg4sSJmDx5Mm7duoVTp041e/t79+7F7du3sWzZMjHBBgADBw5EdHQ0bty4gf3794vl58+fx6FDhzB58mQxwQYAPXr0QEpKCgBg69atza4PEXUeTLIRETXw/fffIykpCTKZzORytVqNoKAgpKenY/jw4XjttdcwbNgwbNq0CU899RTu3r1rtM6SJUsQExMDQRAQExOD0NBQfP755/D390d5eblRfHZ2NkJDQ3H27FlERkYiIiICp0+fRnBwMD777DObHzMRERGRvXB0dAQAdO9u/FLWoUOHkJaWhrfffhsHDhwwewO0uLgYAKBQKIyWhYSEAABKSkosip8wYQJkMplBPBF1XXxdlIjo/9FqtYiIiMDo0aPh4+OD7Oxso5iNGzfi5MmTiIuLw4YNG8Ty1atXIy0tDenp6YiPjxfLi4qKoFQqERgYiIKCAvTo0QMAMHfuXEyfPh3R0dFQqVRi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523YsGEIDAxEUVER8vLyxPJ79+4hMTERABAVFdUah0dERERERERERCSy+j1KpVKJw4cPAwBOnTollhUXFwMAJkyYgKioKNy8eRPDhw+Hv78/RowYgf79++Nf//oXvvzyS1y5cgW+vr54++23Dbbdp08fZGZmIjw8HH5+fpgzZw4AICcnBzdv3kROTo7R+Gp//vOfERAQgOeeew5z5syBh4cHvvjiC5w+fRrR0dEYP3681Y1CRERERERERERkDauTbIcPH8b27dsNykpLS1FaWip+joqKQt++ffHqq6/im2++QW5uLm7dugUnJyeMGDECMTExiI6OhpOTk9H2582bB7lcjnXr1mHbtm2QSCR44oknkJCQgKlTpxrFP/roozh27BgSEhLwxRdfQK1WY+jQoXj//fexdOlSaw+PiIiIiIiIiIjIalYn2bKyspCVldVknKurKzIzM5tTJ4SGhiI0NNTi+GHDhmHv3r3N2hcREREREREREVFLtdvsokRERERERERERJ0Fk2xEREREREREREQtxCQbERERERERERFRCzHJRkRERERERB3Gzz//jPfeew8KhQIPP/wwevTogf79+2PWrFk4duyYyXWqq6sRGxsLLy8vSKVSeHt7Y+XKlaitrTUZr9PpkJGRAV9fXzg5OcHd3R1hYWGoqKgwWy+VSoWgoCC4uLjA1dUVkydPRmFhoU2OmYg6BybZiIiIiIiIqMPIyMjAa6+9hoqKCigUCqxYsQITJkzAwYMHMX78eOTk5BjEq9VqBAUFIT09HcOHD8drr72GYcOGYdOmTXjqqadw9+5do30sWbIEMTExEAQBMTExCA0Nxeeffw5/f3+Ul5cbxWdnZyM0NBRnz55FZGQkIiIicPr0aQQHB+Ozzz5rtbYgIvti9eyiRERERERERK1l7NixKC4uRlBQkEH5119/jSlTpmDp0qV47rnnIJVKAQAbN27EyZMnERcXhw0bNojxq1evRlpaGtLT0xEfHy+WFxUVQalUIjAwEAUFBejRowcAYO7cuZg+fTqio6OhUqnE+Fu3bmHZsmWQy+UoKyvDwIEDAQBxcXF4/PHHsXTpUoSEhMDFxaXV2oSI7AOfZCMiIiIiIqIO4w9/+INRgg0AJk6ciMmTJ+PWrVs4deoUAEAQBCiVSjg7OyMxMdEgPjExEc7OzlAqlQblW7duBQCkpKSI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IiIiIiIiaiEm2YiIiIiIiIiIiFqISTYiIiIiIiIiIqIW6t7eFSAios7Ne/UXNt/mxQ0zbL5NIiIiIiKilmCSjaiFWiOBADCJQERERERERGRP+LooERERERERERFRCzHJRkRERERERERE1EJMshEREREREREREbUQk2xEREREREREREQtxCQbERERERERERFRCzHJRkRERERERERE1EJMshEREREREREREbUQk2xEREREREREREQt1L29K0BEREREZA+8V3/RKtu9uGFGq2yXiIiI2hafZCMiIiIiIiIiImohPslGRERERNSOWuMJOT4dR0SdCftJshdMshF1UPwfCREREREREZH9YJKNiIjsDsdFIiIiIiKijoZjshEREREREREREbVQp0myffvtt5g+fTp69+4NmUyGcePGYc+ePe1dLSKiZmGfRkSdBfszIupM2KcRUWM6xeuiRUVFCAkJQc+ePfHiiy/CxcUF+/btw5w5c1BZWYkVK1a0dxWJiCzGPo2IOgv2Z0TUmbBPI6Km2P2TbPfv38eiRYvg4OCAQ4cO4aOPPsI777yDf/7znxg6dCjWrFmDS5cutXc1iYgswj6NiDoL9mdE1JmwTyMiS9j9k2xfffUVfvrpJyxYsACjR48Wy93c3LBmzRpERkZi+/bteOONN9qvkkREFmKf1r44oQKR7bA/I6LOhH0aEVnC7pNsxcXFAACFQmG0LCQkBABQUlLSllUi6rCYQOj42KcRUWfB/qx9Nfb/fGk3ARvHAiOTVdDUSdqwVubxWoI6OvZpZCn+5ura7D7JVl5eDgDw8fExWta/f384OzuLMaZoNBpoNBrxc1VVFQDgl19+gVarbXTfWq0Wd+7cQXetA+p0HeMChQx11wm4c0fHc9TKfven5g/2KnUQkPC4DqNf/xyaB87RsfgpTa5fU1MDABAEodl16Ejaq09jf9a6WvIdMaWx701XYkkf0RHov183b96Eo6Njo7GdqU/jNVrH1RGvj27evNneVRBZ853tarpqfwa0rE9jf9Yxmbo+s8U1VmslWTpSP2lL9tLnWtqn2X2STd9Bubm5mVzu6uoqxpiyfv16rF271qh80KBBtqkgtbu57V0BapK5cyR/x/Jt1NTUmO0H7An7NLIU+zbr+gh70xn6NPZnHVtH60M68/e5q+sM/RnQsj6N/Zl96Wj9ox77yY6h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OwoMDNTWrVu1cOFCdevWzSqmU6dOevjhh/XJJ58oOzvbKedNTExUXFycjh07pt/97nd27XvlyhWNGTNG58+fV//+/bVr1y7LK2f1unTpoqysLK1du1aStHLlShUWFjql7gDaRmBgoBITE/Xuu+8qJydHkrR8+XK774da69Zbb9WyZcskSSdOnND+/fvb5Lz1JkyYIOnq02yGYdi1r7v6dgCAdyPJBo9wyy23aMKECTIMQxkZGU49dmRkpH75y19Kkn71q1+ptra2xfv+7ne/0zfffKPw8HD94Q9/UPv2jb9hnZ6errvvvlt1dXXKyspytNoAvEBVVZUlwf7cc8/pvvvuazLeZDJp3rx5Tjl3hw4dtGDBAklSTk6OLly40OJ9CwsLtX//fgUEBGjt2rUKCwtrNPaxxx7TY489JknKzMxscg44AJ4rIyNDw4cPlyRL39EWrp1H7fLly212Xulqv9ylSxft27dP69evb/F+7uzbAQDejSQbPMaCBQsUFBSkoqKiVs+d0ZjZs2fre9/7ng4cOKA1a9a0eL833nhD0tUn7aKiopqMNZlM+sUvfiFJ2r59u/7xj3+0vsIAvMKWLVt09uxZBQQEKC0trc3PP378ePXt21enT5/Wiy++2OL96vu2lJQU3Xzzzc3G1881+be//U1//vOfW1VXAO5X30/95S9/0bFjx9rknB999JGkqwMDrph3tymdO3e2DN7Onz9fNTU1LdrP3X07AMB7kWSDx4iJidFTTz0lSZo7d65Tjx0aGmoZYczKylJ1dXWz+5w9e1Z//etfJckyUW9zrh3pLC0tbUVNAXiT+lfDb7311iYnC3eVgIAAyytgeXl5LU7u19e7pX3bgAEDLE+70bcB3uvee++1vBa+e/dul52ntrZWJ0+etCxqJV0d8IyIiHDZORsza9Ysff/739dXX32llStXtmgfd/ftAADvRZINHuX5559XeHi4Pv74Y23atMmpx54+fbp69uyp48ePa8WKFc3GnzhxwvL/LR15jYqKstxAXrs/AN9U/znv1auX2+rwH//xHxo0aJAqKytbNCdQRUWFKioqJLW8bwsICLC0kb4N8F6dO3dWeHi4JOmbb75psH3y5MkymUyNfjW1gnrPnj0tce3bt9f3v/99TZkyRdHR0Xr99dctr1+2tY4dO1qm8cjOzlZVVVWz+3hC3w4A8E4k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ZMkopx8TAAAAQOvxJBsAAAAAAADgIJJsAAAAAAAAgINIsgEAAAAAAAAOIskGAAAAAAAAOIgkGwAAAAAAAOAgkmwAAAAAAACAg0iyAQAAAAAAAA4iyQYAAAAAAAA4iCQbAAAAAAAA4CCSbAAAAAAAAICDSLIBAAAAAAAADiLJBgAAAAAAADiIJBsAAAAAAADgIJJsAAAAAAAAgINIsgEAAAAAAAAOIskGAAAAAAAAOIgkGwDYIS4uTiaTyebXkCFDGsRXV1dr4cKFio+PV8eOHdW9e3dNmzZN//jHPxo9xx//+EcNHDhQISEh6tKli3784x+rrKzMha0CAAAAADiqvbsrAADeJiIiQk8//XSD8ri4OKvv6+rq9JOf/ERms1l33XWXHn74YZWXl6ugoEDbt2/Xnj17FBUVZbXPokWLNG/ePMXGxurnP/+5Lly4oPXr1+uee+7R9u3bNWjQIBe2DAAAAADQWiTZPFDc3PdcctwjS0a55LiAv+ncubOysrKajVuzZo3MZrPGjRunP/7xjzKZTJKk3//+95oxY4bmzZunV1991RJfXl6urKws3XTTTfr4448VEREhSXryySd11113aerUqfr8888VEMBDyAAAAADgafhLDQBcZOXKlZKkxYsXWxJskjR9+nT16tVLf/zjH/Xdd99ZyletWqUrV67oV7/6lSXBJkm33367xo0bpwMHDmjXrl1t1wAAAAAAQIuRZAMAO1VXV2v16tXKycnRihUr9NFHHzWIuXTpkj766CP16dNHsbGxVttMJpNGjBihqqoqffrpp5by4uJiSVJycnKD46WkpEiSSkpKnNgSAAAAAICz8LooANjp66+/1uTJk63KBgwYoDfffFO9e/eWJH311Veqq6tTfHy8zWPUl5eXl+vee++1/H9oaKi6devWZHxTqqurVV1dbfm+oqJCklRTU6OamppG96vf1lRMawW1M5x+TGcICjCs/uttWnOtXHmdPZW3tdlb6gkAAICG7E6yrVu3Th9++KH+/Oc/67PPPtPly5e1atUqTZo0yWZ8RUWFsrKytGnTJn399deKjo7Wo48+qszMTIWGhjaIr6ur08svv6zXXntNBw8eVGhoqIYPH65FixapV69eNs9hNpuVk5OjsrIymUwm3XnnnZo3b56GDRtmb/MAoEmTJ0/Wvffeq759+yo0NFRffvmlfvvb32rt2rUaNmyYPvvsM4WFhen8+fOSZPXa57XCw8MlyRJX///f+973Whxvy+LFi7VgwYIG5UVFRerUqVOz7du2bVuzMfZaOtDph3Sq7P517q5Cq2zZsqXV+7riOns6b2nzxYsX3V0FAAAAtJLdSbZ58+bp6NGjioyMVHR0tI4ePdpobFVVlZKSkrRv3z4lJydr3Lhx2rt3r5YtW6aSkhLt3LlTHTt2tNpn+vTpKigo0K233qq0tDSdPHlSGzZsUFFRkfbs2dPgqZB169YpNTVVUVFRlkRfYWGhRowYoQ0bNuiRRx6xt4kA0KjMzEyr72+//Xa9/vrrkqS1a9dq5cqVmj17tjuqJknKyMiwOn9FRYViYmKUnJxsSdTZUlNTo23btmnEiBEKDAx0ap36ZpmdejxnCQowlN2/TvM/DVB1nan5HTzM51kpdu/jyuvsqbytzfVPn7YGA6EAAADuZXeSraCgQPHx8YqNjdWSJUuUkZHRaOzSpUu1b98+paena8mSJZbyuXPnKjc3V3l5eVb779ixQwUFBUpMTNS2bdvUoUMHSdLjjz+uBx54QDNnzpTZ/K8/1s6dO6dZs2YpMjJSZWVl6tGjhyQpPT1dd9xxh2bMmKGUlBSFhYXZ20wAsMv06dO1du1alZaWavbs2ZYn2Bp78qz+D+lrn3SLiIiwK96WoKAgBQUFNSgPDAxsUYKhpXH2qK717ARWdZ3J4+toiyPXyRXX2dN5S5sdqSMDoQAAAO5l98IHw4cPbzCJty2GYaigoEChoaGaP3++1bb58+crNDRUBQUFVuX1K/FlZ2dbEmySdP/992vIkCEqKirSsWPHLOUbN27Ut99+q1mzZlkSbJLUo0cPzZw5U6dPn9Y777xjbxMBwG6RkZGSrv7hKkm9evVSQEBAo3Oo1Zdf+0dpfHy8Kisr9fXXX7coHgCuVVBQoCNHjuif//ynfv7znzcZe+1AqNls1pIlS2Q2m5Wenq5PPvlEeXl5VvHXDoSWlZUpNzdXa9eu1ebNm3X27FnNnDnTKv76gdD8/Hzl5+errKxMXbt21YwZM3ThwgWn/wwAAADcyWWri5aXl+vkyZMaNGiQQkJCrLaFhIRo0KBBOnTokI4fP24pLy4utmy7nq2V9ViJD4CnqF9hNC4uTpIUHBysgQMH6m9/+1uDp0kMw9C2bdsUEhKi/v37W8qTkpIkXZ0/7Xr1T/HWxwDA9RgIBQAAcC+XrS7a3FMX8fHxMpvNKi8vV0xMjKqqqnTq1Cn17dtX7dq1sxl/7XGbO4erV+Krj5G8Z2U6Z65Y5m2rtTmbP7ff09relvX44osvdOONNzZYQOCLL75Qenq6pKuvt9ebNm2a9uzZo4yMDP3xj3+UyXT1lcRXX31Vhw4d0rRp0xQcHGyJnzx5spYtW6ZFixbpJz/5ieXV0H379unNN9/ULbfcosGDB7u6mQB8XP1AaEpKSqMDoWazWcePH1dMTIyk5gdCi4uLVVJSotTUVEu81PhAaFZWlkpKSjRhwoRG6+lPqyV7yu/UtuZp9xSwrbXXiesKwB+5LMlm78p6rV2Jr7F92molPsl7VqZzZCW6xnjLam2u4s/t95S2t+VKfOvXr9dvf/tbJSYmKjY2ViEhIfryyy+1ZcsW1dTUKCMjQ4mJiZb4iRMnqrCwUG+++aYOHz6spKQkHTx4UG+//bZ69uypX//611bHv+mmm5SVlaV58+bptttu08MPP6wLFy5o/fr1kq4+SRIQ4LIHkAH4CW8ZCPWn1ZJdcY/mTTzlngJNs/c6sVoyAH/ksiSbt2jtSnzSv1Ys85aV6VqzEl1jvG21Nmfz5/Z7WtsdWYnPXkOHDtWBAwe0d+9effjhh7p48aIiIyP1wAMP6Mknn2zwxEZAQIDeffddLVmyRGvXrlVeXp5uuOEG/exnP9Ovf/1rRUVFNTjHr371K8XFxemll17SK6+8og4dOujee+9Vdna2EhIS2qqpAHyYtwyE+tNqyc68R/MmnnZPAdtae53a8h4NADyFy5Js9q6s19qV+Or36dq1a7Pxtji6Ep/kPSvTueLmxVtWa3MVf26/p7S9LeuQlJRk95xoQUFByszMVGZmZov3+elPf6qf/vSn9lYPAHyKP62W7Am/T93JU+4p0DR7rxPXFIA/ctl7R829CnD9awQhISGKjo7W4cOHVVtb22x8c+dgJT4AAICG2nogtCXxAAAAvsClSbbu3burtLRUVVVVVtuqqqpUWlqqnj17WibUla4+JVK/7Xr1K+tdO98RK/EBAADYh4FQAAAA13BZks1kMmnKlCmqrKxUdna21bbs7GxVVlZq6tSpVuXTpk2TdHX5+MuXL1vKt27dquLiYiUnJ1stTT9mzBhFREQoPz9fJ06csJSfOHFCK1asUGRkpEaPHu2K5gEAAHglBkIBAABcw+4kW0FBgSZNmqRJkyZp48aNDcoKCgossc8995xuu+025ebmKiUlRRkZGUpJSVFubq4GDBigp59+2urYQ4cO1ZQpU7Rz504lJCQoPT1dEyZM0EMPPaQbbrhB+fn5VvFdunTRihUrdPr0aSUkJGjWrFmaNWuWEhISdObMGf3ud79TWFhYK34sAAAAvomBUAAAANewe+GDXbt2ac2aNVZlpaWlViObU6ZMkXT19YKSkhJlZWVp06ZN2rFjh6KjozVnzhxlZmYqODi4wfFfffVV9evXT6+99pqWL1+u0NBQjR49WosWLVLv3r0bxI8fP16RkZHKycnRqlWrZDKZdOedd2revHkaPny4vc0DAADwSgUFBdq1a5ck6bPPPrOUFRcXS5IGDx5suUd77rnn9O677yo3N1d79+5VQkKCysrKVFRU1ORAaEFBgRISEjRq1CidOnVKhYWFTQ6EpqamKiEhQWPHjpUkFRYW6syZMyosLGQgFAAA+By7k2yrV6/W6tWrWxwfERGhvLw85eXltSg+ICBAaWlpSktLa/E5Ro4cqZEjR7Y4HgAAwNcwEAoAAOBedifZAAAA4HkYCAUAAHAvly18AAAAAAAAAPgLkmwAAAAAAACAg0iyAQAAAAAAAA4iyQYAAAAAAAA4iIUPAAAWfbPMqq41ubsaAAAAAOB1eJINAAAAAAAAcBBJNgAAAAAAAMBBJNkAAAAAAAAAB5FkAwAAAAAAABxEkg0AAAAAAABwEEk2AAAAAAAAwEEk2QAAAAAAAAAHkWQDAAAAAAAAHESSDQAAAAAAAHBQe3dXAAAA2C9u7nt27xPUztDSgVLfLLOqa002Y44sGeVo1QAAAAC/xJNsAAAAAAAAgINIsgEAAAAAAAAOIskGAAAAAAAAOIg52QAAAAA3as0ci81hfkUAANoeT7IBAAAAAAAADiLJBgAAAAAAADiIJBsAAAAAAADgIJJsAAAAAAAAgINIsgEAAAAAAAAOIskGAAAAAAAAOIgkGwAAAAAAAOAgkmwAAAAAAACAg0iyAQAAAAAAAA4iyQYAAAAAAAA4iCQbAAAAAAAA4CCSbAAAAAAAAICDSLIBAAAAAAAADmrv7goAAADPETf3Pacf88iSUU4/JgAAAOBpeJINAAAAAAAAcBBPsgEAAMDn9M0yq7rW5O5qAAAAP0KSzY848xWgoHaGlg68egP7t0U/dtpxAQAAAAAAvBGviwIAAAAAAAAOIskGAAAAAAAAOIgkGwAAAAAAAOAg5mQDAAAu5cw5Qa91ZMkolxwXAAAAaA2eZAMAAAAAAAAcRJINAAAAAAAAcJDPJNk++eQTPfDAA+rcubNCQkJ01113acOGDe6uFgC0Cn0aAF9BfwYAAPyFT8zJtmPHDqWkpKhjx4567LHHFBYWpk2bNmns2LE6fvy45syZ4+4qAkCL0acB8BX0ZwAAwJ94fZLtypUrmjp1qgICArRz507dfvvtkqQXXnhBAwcO1PPPP69HHnlEsbGx7q0o7MIk2fBX9GkAfAX9GQAA8Dden2T74IMP9NVXX2ny5MmWmzdJioiI0PPPP69JkyZpzZo1euGFF9xXSR/nqoQY4I/o0wD4CvozAADgb7w+yVZcXCxJSk5ObrAtJSVFklRSUtKWVYIHc1ZCMKidoaUDpb5ZZv1t0Y+dckxAok8D4DvozwAAgL/x+iRbeXm5JCk+Pr7Btm7duik0NNQSY0t1dbWqq6st358/f16SdPbsWdXU1DR57pqaGl28eFHtawJUW2dqTfW9Vvs6Qxcv1vll2yXr9p85c8bd1WlT9f/uz5w5o8DAQHdXRxcuXJAkGYbh5po4h7v6NH/sz/yxH/O1Nrek/7W3z/rR4u3OqFoDH2UMa1GcL/Vp9Gfu9e+/dM3iEi39t9wSnnZPAdtae518qT8DgJby+iRb/Q1XRESEze3h4eGWGFsWL16sBQsWNCjv2bOncyrowx53dwXcrL79kS+6tRr4XxcuXGi0H/Am9Gltyx/7MV9qc+Rv3F2DlrO3rr7Qp9Gf+SZv+tzBM/hCfwYALeX1STZHZWRkaPbs2Zbv6+rqdPbsWXXt2lUmU9OjnxUVFYqJidHx48cVHh7u6qp6FH9uu+Tf7fe0thuGoQsXLqh79+7uropHaG2f5mnXtS3QZtrsiejT/oX+zPdxrbxDa68T/RkAf+T1Sbb6UZHGRkIrKirUpUuXRvcPCgpSUFCQVVnnzp3tqkN4eLjf3hj4c9sl/26/J7Xdl0ZH3d2nedJ1bSu02T94U5t9pU+jP0NLca28Q2uuk6/0ZwDQUgHuroCj6uf5sDWnx9dff63Kykqbc4EAgCeiTwPgK+jPAACAv/H6JFtSUpIkqaioqME2s9lsFQMAno4+DYCvoD8DAAD+xuuTbMOGDVOvXr30xhtvaN++fZby8+fPKycnRx06dNCECRNccu6goCBlZmY2eJXBH/hz2yX/br8/t70tuKtP88frSpv9gz+22VPQn6E5XCvvwHUCgJYzGT6wpvKOHTuUkpKijh076rHHHlNYWJg2bdqko0ePatmyZZozZ467qwgALUafBsBX0J8BAAB/4hNJNkn6+OOPlZmZqT/96U+qqalRv379NHv2bI0dO9bdVQMAu9GnAfAV9GcAAMBf+EySDQAAAAAAAHAXr5+TDQAAAAAAAHA3kmwAAAAAAACAg0iyAQAAAAAAAA4iydYKn3zyiR544AF17txZISEhuuuuu7RhwwZ3V6tNxMXFyWQy2fwaMmSIu6vnFOvWrdP06dPVv39/BQUFyWQyafXq1Y3GV1RUaPbs2YqNjVVQUJDi4uL07LPPqrKysu0q7ST2tD0rK6vRfwsmk0lHjhxp07qjdXyxP/v73/+ul156ScnJybrxxhvVoUMHdevWTQ8//LA++ugjm/v40ue4Xm5uruXzuGfPngbbfanN77zzjkaMGKGuXbuqY8eO6tmzp8aNG6fjx49bxflSm9GQL/Znns7V90x1dXXKz89Xv379FBwcrKioKI0bN06HDh1yUYt8U1v8XuRaAcBV7d1dAW/T2FL0Y8eO1fHjx/1iKfqIiAg9/fTTDcrj4uLavC6uMG/ePB09elSRkZGKjo7W0aNHG42tqqpSUlKS9u3bp+TkZI0bN0579+7VsmXLVFJSop07d6pjx45tWHvH2NP2ehMnTrR57Tt37uz8CsKpfLU/y8/PV25urnr37q3k5GRFRUWpvLxcmzdv1ubNm/XGG29YrWroa59jSfr888+VmZmpkJAQVVVVNdjuK202DEM///nP9dprr6l3796Wf8cnT55USUmJjh49qpiYGEm+02bY5qv9madz9T3T9OnTVVBQoFtvvVVpaWk6efKkNmzYoKKiIu3Zs0fx8fGubqJPaIvfi1wrAPhfBlqspqbG6N27txEUFGTs3bvXUv7tt98aN910k9GhQwfjyJEj7qtgG4iNjTViY2PdXQ2X2rZtm+U6Ll682JBkrFq1ymbsCy+8YEgy0tPTrcrT09MNSUZOTo6rq+tU9rQ9MzPTkGTs2LGj7SoIp/Hl/mzTpk1GcXFxg/KdO3cagYGBRpcuXYxLly5Zyn3tc3z58mUjISHB+NGPfmSMHz/ekGTs3r3bKsZX2vzSSy8Zkownn3zSuHLlSoPtNTU1lv/3lTajIV/uzzydK++ZPvjgA0OSkZiYaFRXV1vKt2zZYkgykpOTndsYH+bq34tcKwD4F5JsdjCbzYYkY/LkyQ22rV692pBkLFiwwA01azv+kGS7VlM3jHV1dUb37t2N0NBQo7Ky0mpbZWWlERoaavTq1auNaup8JNl8m7/2Z8nJyYYk45NPPjEMwzc/x5mZmUZQUJCxf/9+Y+LEiQ2SbL7S5osXLxpdunQxevXqZZVMs8VX2gzb/LU/8zTOvmcaN26cIckoKSlpcLwhQ4YYkoyjR486tQ3+yBm/F7lWAPAvzMlmh+LiYklScnJyg20pKSmSpJKSkraskltUV1dr9erVysnJ0YoVKxqdy8HXlZeX6+TJkxo0aJBCQkKstoWEhGjQoEE6dOhQgzmBfM3OnTuVm5urF198UZs3b2ZuIy/hr/1ZYGCgJKl9+6uzJfja57isrEyLFi1SZmamfvCDH9iM8ZU2FxUV6dy5c3rooYdUW1urt99+W0uWLNHvf/97HTx40CrWV9oM2/y1P/MmrfkMFhcXW7Zdj+vqPM74vci1AoB/Iclmh/LyckmyOadAt27dFBoaaonxZV9//bUmT56sX/3qV5o1a5buuusuDRw4UF999ZW7q9ammvr3cG25r/+byMzM1Ny5c/Xcc89p9OjRiomJ0euvv+7uaqEZ/tifHTt2TO+//76io6PVr18/Sb71Oa6urtaECRN0++2367nnnms0zlfa/Oc//1mS1K5dO/3whz/Uww8/rIyMDM2YMUN9+vTRL3/5S0usr7QZtvljf+Zt7P0MVlVV6dSpU+rZs6fatWvXbDxaxxm/F7lWAGCNJJsdzp8/L+nqxP+2hIeHW2J81eTJk7V9+3Z98803qqqq0t69e5WamqpPPvlEw4YN04ULF9xdxTbTkn8P18b5mttuu01/+MMfdOjQIX333Xc6fPiw8vPzZTKZNGnSJP3nf/6nu6uIJvhbf1ZTU6PU1FRVV1crNzfX8oeAL32OX3jhBZWXl2vVqlU2/9Cp5ytt/sc//iFJ+u1vf6uIiAh9/PHHunDhgnbu3KmbbrpJv/nNb/TKK69I8p02wzZ/68+8kb2fQT6zrues34tcKwCwRpINdsnMzNR9992n733ve+rUqZNuv/12vf7660pNTdXRo0e1cuVKd1cRbWT06NGaPHmyevbsqY4dOyouLk4zZ87Uxo0bJV1dcQzwBHV1dZo0aZJ27typqVOnKjU11d1Vcrrdu3dr2bJlmjdvnvr27evu6rSJuro6SVKHDh20efNmDRgwQKGhobr33nu1ceNGBQQE6De/+Y2bawkAnscffi8CgLuQZLND/QhNYyMxFRUVjY7i+Lrp06dLkkpLS91ck7bTkn8P18b5i2HDhql379767LPPLD8DeB5/6c/q6ur0xBNP6I033tD48eP1+9//3mq7L3yOr1y5ookTJ+qHP/yh5s6d22y8L7RZ+lf9+vfvr+7du1tt69u3r3r16qWvvvpK3377rc+0Gbb5S3/mzez9DPKZdR1n/17kWgGANZJsdmhqToGvv/5alZWVjc5f4OsiIyMlXZ2XwV80N8dEc3Na+LL6fw8XL150c03QGH/oz+rq6jR58mStWbNG48aN0+rVqxUQYP1rzxc+x5WVlSovL9e+ffvUoUMHmUwmy9eaNWskSXfffbdMJpM2b97sE22WpD59+kiSOnfubHN7ffl3333nM22Gbf7Qn3k7ez+DISEhio6O1uHDh1VbW9tsPFrGFb8XuVYAYI0kmx2SkpIkXV3R7Hpms9kqxt/UrzAaFxfn3oq0ofj4eHXv3l2lpaUNkotVVVUqLS1Vz549FRMT46YaukdVVZX279+vkJAQS7INnsfX+7P6PyRef/11jR07VmvXrm10QmZv/xwHBQXpZz/7mc2v+j9qHnzwQf3sZz9TXFycT7RZkoYOHSpJOnDgQINtNTU1OnjwoEJCQhQVFeUzbYZtvt6f+YLWfAaTkpIs265Xf10TExNdW3Ef4srfi1wrALiGgRarqakxevXqZQQFBRl79+61lH/77bfGTTfdZHTo0ME4fPiw2+rnagcOHDCqqqpslnfr1s2QZJSUlLihZq6zePFiQ5KxatUqm9tfeOEFQ5KRnp5uVZ6enm5IMnJyctqglq7RVNsrKiqMv/3tbw3KL168aIwbN86QZEyePLkNaonW8uX+rLa21pg4caIhyXj00UeNmpqaJuN9+XNc/3PYvXu3VbmvtDk5OdmQZKxcudKqfOHChYYkY/z48ZYyX2kzGvLl/sybOPue6YMPPjAkGYmJiUZ1dbWlfMuWLYYkIzk52elt8FWu/r3ItQKAfzEZhmG0VULPF+zYsUMpKSnq2LGjHnvsMYWFhWnTpk06evSoli1bpjlz5ri7ii6TlZWl3/72t0pMTFRsbKxCQkL05ZdfasuWLaqpqVFGRoZycnLcXU2HFRQUaNeuXZKkzz77TGVlZRo0aJD+/d//XZI0ePBgTZkyRdLVEb1BgwbpL3/5i5KTk5WQkKCysjIVFRVpwIABKikpUXBwsNvaYq+Wtv3IkSPq1auXBgwYoFtuuUXdunXTN998o/fff18nTpxQv379tGPHDnXt2tWdzUEzfLU/y8rK0oIFCxQaGqpf/OIXat++fYOYhx56SLfffrsk3/scX2vSpElas2aNdu/erbvuustS7itt/uqrr3TPPffoH//4h0aNGqWbb75Ze/fu1QcffKDY2Fjt2bNH3bp1k+Q7bYZtvtqfeTpX3zNNnTpVBQUFuvXWWzVq1CidOnVKhYWFCg0N1e7du3XTTTe1bYO9VFv8XuRaAcD/cneWzxt99NFHxsiRI43w8HAjODjYGDhwoLF+/Xp3V8vliouLjTFjxhjx8fFGeHi40b59e6Nbt27GT37yE8NsNru7ek5TP9LX2NfEiROt4r/99lvj6aefNmJiYozAwEDjxhtvNObMmWNUVFS4pwEOaGnbz58/bzz11FPGgAEDjKioKKN9+/ZGWFiYMXDgQGPp0qXGxYsX3dsQtJgv9mfN/TuWjSctfOlzfK3GnmQzDN9p87Fjx4xJkyYZ3bp1MwIDA42YmBjjqaeeMr755psGsb7SZtjmi/2Zp3P1PVNtba2xfPly49ZbbzWCgoKMrl27GmPHjjUOHjzYBq3zHW3xe5FrBQBX8SQbAAAAAAAA4CAWPgAAAAAAAAAcRJINAAAAAAAAcBBJNgAAAAAAAMBBJNkAAAAAAAAAB5FkAwAAAAAAABxEkg0AAAAAAABwEEk2AAAAAAAAwEEk2QAAAAAAAAAHkWQDAAAAAAAAHESSDQAAAAAAAHAQSTYAAAAAAADAQSTZAAAAAAAAAAf9f1nxrQ+9Q0a8AAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ - "hmeq_data.hist(figsize=(15,15), layout=(4, 4));" + "hmeq_data.hist(figsize=(15, 15), layout=(4, 4));" ] }, { @@ -320,13 +331,26 @@ }, "outputs": [], "source": [ - "predictor_columns = [\"LOAN\", \"MORTDUE\", \"VALUE\", \"YOJ\", \"DEROG\", \"DELINQ\", \"CLAGE\", \"NINQ\", \"CLNO\", \"DEBTINC\"]\n", + "predictor_columns = [\n", + " \"LOAN\",\n", + " \"MORTDUE\",\n", + " \"VALUE\",\n", + " \"YOJ\",\n", + " \"DEROG\",\n", + " \"DELINQ\",\n", + " \"CLAGE\",\n", + " \"NINQ\",\n", + " \"CLNO\",\n", + " \"DEBTINC\",\n", + "]\n", "\n", "target_column = \"BAD\"\n", "x = hmeq_data[predictor_columns]\n", "y = hmeq_data[target_column]\n", "\n", - "x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=42)" + "x_train, x_test, y_train, y_test = train_test_split(\n", + " x, y, test_size=0.3, random_state=42\n", + ")" ] }, { @@ -359,13 +383,28 @@ }, "outputs": [], "source": [ - "dtc = DecisionTreeClassifier(max_depth=7, min_samples_split=2, min_samples_leaf=2, max_leaf_nodes=500)\n", + "dtc = DecisionTreeClassifier(\n", + " max_depth=7, min_samples_split=2, min_samples_leaf=2, max_leaf_nodes=500\n", + ")\n", "dtc = dtc.fit(x_train, y_train)\n", "\n", - "rfc = RandomForestClassifier(n_estimators=120, max_depth=9, max_leaf_nodes=850, min_samples_split=5, min_samples_leaf=4)\n", + "rfc = RandomForestClassifier(\n", + " n_estimators=120,\n", + " max_depth=9,\n", + " max_leaf_nodes=850,\n", + " min_samples_split=5,\n", + " min_samples_leaf=4,\n", + ")\n", "rfc = rfc.fit(x_train, y_train)\n", "\n", - "gbc = GradientBoostingClassifier(learning_rate=0.1, n_estimators=600, max_depth=4, min_samples_leaf=1, min_samples_split=2, max_leaf_nodes=500)\n", + "gbc = GradientBoostingClassifier(\n", + " learning_rate=0.1,\n", + " n_estimators=600,\n", + " max_depth=4,\n", + " min_samples_leaf=1,\n", + " min_samples_split=2,\n", + " max_leaf_nodes=500,\n", + ")\n", "gbc = gbc.fit(x_train, y_train)" ] }, @@ -377,11 +416,13 @@ }, "outputs": [], "source": [ - "# Calculate the importance of a predictor \n", + "# Calculate the importance of a predictor\n", "def sort_feature_importance(model, data):\n", " features = {}\n", - " for importance, name in sorted(zip(model.feature_importances_, data.columns), reverse=True):\n", - " features[name] = str(np.round(importance*100, 2)) + \"%\"\n", + " for importance, name in sorted(\n", + " zip(model.feature_importances_, data.columns), reverse=True\n", + " ):\n", + " features[name] = str(np.round(importance * 100, 2)) + \"%\"\n", " return features" ] }, @@ -421,63 +462,63 @@ " \n", " \n", " DEBTINC\n", - " 36.16%\n", - " 26.14%\n", - " 51.18%\n", + " 58.35%\n", + " 34.74%\n", + " 39.53%\n", " \n", " \n", - " CLAGE\n", - " 12.6%\n", - " 10.87%\n", - " 7.76%\n", + " DELINQ\n", + " 18.57%\n", + " 15.89%\n", + " 12.29%\n", " \n", " \n", - " DELINQ\n", - " 12.18%\n", - " 9.82%\n", - " 14.68%\n", + " CLAGE\n", + " 8.07%\n", + " 9.27%\n", + " 10.37%\n", " \n", " \n", - " VALUE\n", - " 7.16%\n", - " 9.42%\n", - " 4.77%\n", + " DEROG\n", + " 4.86%\n", + " 9.38%\n", + " 6.32%\n", " \n", " \n", - " LOAN\n", - " 6.97%\n", - " 8.98%\n", - " 3.54%\n", + " VALUE\n", + " 3.07%\n", + " 5.51%\n", + " 7.33%\n", " \n", " \n", " YOJ\n", - " 6.75%\n", - " 6.88%\n", - " 2.04%\n", + " 2.7%\n", + " 3.67%\n", + " 3.77%\n", " \n", " \n", " MORTDUE\n", - " 6.15%\n", - " 8.46%\n", - " 2.03%\n", + " 1.59%\n", + " 5.04%\n", + " 6.38%\n", " \n", " \n", - " CLNO\n", - " 5.97%\n", - " 8.16%\n", - " 4.2%\n", + " NINQ\n", + " 1.41%\n", + " 3.92%\n", + " 2.78%\n", " \n", " \n", - " DEROG\n", - " 3.46%\n", - " 6.47%\n", - " 7.65%\n", + " CLNO\n", + " 1.2%\n", + " 5.77%\n", + " 5.85%\n", " \n", " \n", - " NINQ\n", - " 2.59%\n", - " 4.8%\n", - " 2.15%\n", + " LOAN\n", + " 0.17%\n", + " 6.79%\n", + " 5.37%\n", " \n", " \n", "\n", @@ -485,16 +526,16 @@ ], "text/plain": [ " DecisionTree RandomForest GradientBoosting\n", - "DEBTINC 36.16% 26.14% 51.18%\n", - "CLAGE 12.6% 10.87% 7.76%\n", - "DELINQ 12.18% 9.82% 14.68%\n", - "VALUE 7.16% 9.42% 4.77%\n", - "LOAN 6.97% 8.98% 3.54%\n", - "YOJ 6.75% 6.88% 2.04%\n", - "MORTDUE 6.15% 8.46% 2.03%\n", - "CLNO 5.97% 8.16% 4.2%\n", - "DEROG 3.46% 6.47% 7.65%\n", - "NINQ 2.59% 4.8% 2.15%" + "DEBTINC 58.35% 34.74% 39.53%\n", + "DELINQ 18.57% 15.89% 12.29%\n", + "CLAGE 8.07% 9.27% 10.37%\n", + "DEROG 4.86% 9.38% 6.32%\n", + "VALUE 3.07% 5.51% 7.33%\n", + "YOJ 2.7% 3.67% 3.77%\n", + "MORTDUE 1.59% 5.04% 6.38%\n", + "NINQ 1.41% 3.92% 2.78%\n", + "CLNO 1.2% 5.77% 5.85%\n", + "LOAN 0.17% 6.79% 5.37%" ] }, "execution_count": 11, @@ -503,9 +544,15 @@ } ], "source": [ - "importances = pd.DataFrame.from_dict(sort_feature_importance(dtc, x_train), orient=\"index\").rename(columns={0: \"DecisionTree\"})\n", - "importances[\"RandomForest\"] = pd.DataFrame.from_dict(sort_feature_importance(rfc, x_train), orient=\"index\")\n", - "importances[\"GradientBoosting\"] = pd.DataFrame.from_dict(sort_feature_importance(gbc, x_train), orient=\"index\")\n", + "importances = pd.DataFrame.from_dict(\n", + " sort_feature_importance(dtc, x_train), orient=\"index\"\n", + ").rename(columns={0: \"DecisionTree\"})\n", + "importances[\"RandomForest\"] = pd.DataFrame.from_dict(\n", + " sort_feature_importance(rfc, x_train), orient=\"index\"\n", + ")\n", + "importances[\"GradientBoosting\"] = pd.DataFrame.from_dict(\n", + " sort_feature_importance(gbc, x_train), orient=\"index\"\n", + ")\n", "importances" ] }, @@ -520,18 +567,18 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[1427 14]\n", - " [ 272 75]]\n", + "[[1428 13]\n", + " [ 279 68]]\n", " precision recall f1-score support\n", "\n", " 0 0.84 0.99 0.91 1441\n", - " 1 0.84 0.22 0.34 347\n", + " 1 0.84 0.20 0.32 347\n", "\n", " accuracy 0.84 1788\n", - " macro avg 0.84 0.60 0.63 1788\n", - "weighted avg 0.84 0.84 0.80 1788\n", + " macro avg 0.84 0.59 0.61 1788\n", + "weighted avg 0.84 0.84 0.79 1788\n", "\n", - "Decision Tree Model Accuracy = 84.0%\n" + "Decision Tree Model Accuracy = 83.67%\n" ] } ], @@ -540,7 +587,11 @@ "y_dtc_proba = dtc.predict_proba(x_test)\n", "print(confusion_matrix(y_test, y_dtc_predict))\n", "print(classification_report(y_test, y_dtc_predict))\n", - "print(\"Decision Tree Model Accuracy = \" + str(np.round(dtc.score(x_test, y_test)*100,2)) + \"%\")" + "print(\n", + " \"Decision Tree Model Accuracy = \"\n", + " + str(np.round(dtc.score(x_test, y_test) * 100, 2))\n", + " + \"%\"\n", + ")" ] }, { @@ -555,17 +606,17 @@ "output_type": "stream", "text": [ "[[1440 1]\n", - " [ 246 101]]\n", + " [ 254 93]]\n", " precision recall f1-score support\n", "\n", " 0 0.85 1.00 0.92 1441\n", - " 1 0.99 0.29 0.45 347\n", + " 1 0.99 0.27 0.42 347\n", "\n", " accuracy 0.86 1788\n", - " macro avg 0.92 0.65 0.69 1788\n", - "weighted avg 0.88 0.86 0.83 1788\n", + " macro avg 0.92 0.63 0.67 1788\n", + "weighted avg 0.88 0.86 0.82 1788\n", "\n", - "Random Forest Model Accuracy = 86.19%\n" + "Random Forest Model Accuracy = 85.74%\n" ] } ], @@ -574,7 +625,11 @@ "y_rfc_proba = rfc.predict_proba(x_test)\n", "print(confusion_matrix(y_test, y_rfc_predict))\n", "print(classification_report(y_test, y_rfc_predict))\n", - "print(\"Random Forest Model Accuracy = \" + str(np.round(rfc.score(x_test, y_test)*100,2)) + \"%\")" + "print(\n", + " \"Random Forest Model Accuracy = \"\n", + " + str(np.round(rfc.score(x_test, y_test) * 100, 2))\n", + " + \"%\"\n", + ")" ] }, { @@ -606,7 +661,11 @@ "y_gbc_proba = gbc.predict_proba(x_test)\n", "print(confusion_matrix(y_test, y_gbc_predict))\n", "print(classification_report(y_test, y_gbc_predict))\n", - "print(\"Gradient Boosting Model Accuracy = \" + str(np.round(gbc.score(x_test, y_test)*100,2)) + \"%\")" + "print(\n", + " \"Gradient Boosting Model Accuracy = \"\n", + " + str(np.round(gbc.score(x_test, y_test) * 100, 2))\n", + " + \"%\"\n", + ")" ] }, { @@ -629,9 +688,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "Model DecisionTreeClassifier was successfully pickled and saved to ~\\data\\hmeqModels\\DecisionTreeClassifier\\DecisionTreeClassifier.pickle.\n", - "Model RandomForest was successfully pickled and saved to ~\\data\\hmeqModels\\RandomForest\\RandomForest.pickle.\n", - "Model GradientBoosting was successfully pickled and saved to ~\\data\\hmeqModels\\GradientBoosting\\GradientBoosting.pickle.\n" + "Model DecisionTreeClassifier was successfully pickled and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\DecisionTreeClassifier\\DecisionTreeClassifier.pickle.\n", + "Model RandomForest was successfully pickled and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\RandomForest\\RandomForest.pickle.\n", + "Model GradientBoosting was successfully pickled and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\GradientBoosting\\GradientBoosting.pickle.\n" ] } ], @@ -639,19 +698,19 @@ "# Model names within SAS Model Manager\n", "model_prefix = [\"DecisionTreeClassifier\", \"RandomForest\", \"GradientBoosting\"]\n", "# Directory location for the model files\n", - "zip_folder = [Path.cwd() / \"data/hmeqModels/DecisionTreeClassifier/\",\n", - " Path.cwd() / \"data/hmeqModels/RandomForest/\",\n", - " Path.cwd() / \"data/hmeqModels/GradientBoosting\"] # Changes required by user\n", + "zip_folder = [\n", + " Path.cwd() / \"data/hmeqModels/DecisionTreeClassifier/\",\n", + " Path.cwd() / \"data/hmeqModels/RandomForest/\",\n", + " Path.cwd() / \"data/hmeqModels/GradientBoosting\",\n", + "] # Changes required by user\n", "model = [dtc, rfc, gbc]\n", "# Output variables expected in SAS Model Manager. If a classification value is expected to be output, it should be the first metric.\n", "score_metrics = [\"EM_CLASSIFICATION\", \"EM_EVENTPROBABILITY\"]\n", "\n", "# Serialize the models to a pickle format\n", - "for (mod, prefix, path) in zip(model, model_prefix, zip_folder):\n", + "for mod, prefix, path in zip(model, model_prefix, zip_folder):\n", " pzmm.PickleModel.pickle_trained_model(\n", - " model_prefix=prefix,\n", - " trained_model=mod,\n", - " pickle_path=path\n", + " model_prefix=prefix, trained_model=mod, pickle_path=path\n", " )" ] }, @@ -666,45 +725,53 @@ "name": "stdout", "output_type": "stream", "text": [ - "inputVar.json was successfully written and saved to ~\\data\\hmeqModels\\DecisionTreeClassifier\\inputVar.json\n", - "outputVar.json was successfully written and saved to ~\\data\\hmeqModels\\DecisionTreeClassifier\\outputVar.json\n", - "ModelProperties.json was successfully written and saved to ~\\data\\hmeqModels\\DecisionTreeClassifier\\ModelProperties.json\n", - "fileMetadata.json was successfully written and saved to ~\\data\\hmeqModels\\DecisionTreeClassifier\\fileMetadata.json\n", - "inputVar.json was successfully written and saved to ~\\data\\hmeqModels\\RandomForest\\inputVar.json\n", - "outputVar.json was successfully written and saved to ~\\data\\hmeqModels\\RandomForest\\outputVar.json\n", - "ModelProperties.json was successfully written and saved to ~\\data\\hmeqModels\\RandomForest\\ModelProperties.json\n", - "fileMetadata.json was successfully written and saved to ~\\data\\hmeqModels\\RandomForest\\fileMetadata.json\n", - "inputVar.json was successfully written and saved to ~\\data\\hmeqModels\\GradientBoosting\\inputVar.json\n", - "outputVar.json was successfully written and saved to ~\\data\\hmeqModels\\GradientBoosting\\outputVar.json\n", - "ModelProperties.json was successfully written and saved to ~\\data\\hmeqModels\\GradientBoosting\\ModelProperties.json\n", - "fileMetadata.json was successfully written and saved to ~\\data\\hmeqModels\\GradientBoosting\\fileMetadata.json\n" + "inputVar.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\DecisionTreeClassifier\\inputVar.json\n", + "outputVar.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\DecisionTreeClassifier\\outputVar.json\n", + "ModelProperties.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\DecisionTreeClassifier\\ModelProperties.json\n", + "fileMetadata.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\DecisionTreeClassifier\\fileMetadata.json\n", + "inputVar.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\RandomForest\\inputVar.json\n", + "outputVar.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\RandomForest\\outputVar.json\n", + "ModelProperties.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\RandomForest\\ModelProperties.json\n", + "fileMetadata.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\RandomForest\\fileMetadata.json\n", + "inputVar.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\GradientBoosting\\inputVar.json\n", + "outputVar.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\GradientBoosting\\outputVar.json\n", + "ModelProperties.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\GradientBoosting\\ModelProperties.json\n", + "fileMetadata.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\GradientBoosting\\fileMetadata.json\n" ] } ], "source": [ - "def write_json_files(data, predict, target, path, prefix): \n", + "def write_json_files(data, predict, target, path, prefix):\n", " # Write input variable mapping to a json file\n", - " pzmm.JSONFiles.write_var_json(input_data=data[predict], is_input=True, json_path=path)\n", - " \n", + " pzmm.JSONFiles.write_var_json(\n", + " input_data=data[predict], is_input=True, json_path=path\n", + " )\n", + "\n", " # Set output variables and assign an event threshold, then write output variable mapping\n", - " output_var = pd.DataFrame(columns=score_metrics, data=[[\"A\", 0.5]]) # data argument includes example expected types for outputs\n", + " output_var = pd.DataFrame(\n", + " columns=score_metrics, data=[[\"A\", 0.5]]\n", + " ) # data argument includes example expected types for outputs\n", " pzmm.JSONFiles.write_var_json(output_var, is_input=False, json_path=path)\n", - " \n", + "\n", " # Write model properties to a json file\n", " pzmm.JSONFiles.write_model_properties_json(\n", - " model_name=prefix, \n", - " target_variable=target, # Target variable to make predictions about (BAD in this case)\n", - " target_values=[\"1\", \"0\"], # Possible values for the target variable (1 or 0 for binary classification of BAD)\n", - " json_path=path, \n", + " model_name=prefix,\n", + " target_variable=target, # Target variable to make predictions about (BAD in this case)\n", + " target_values=[\n", + " \"1\",\n", + " \"0\",\n", + " ], # Possible values for the target variable (1 or 0 for binary classification of BAD)\n", + " json_path=path,\n", " model_desc=f\"Description for the {prefix} model.\",\n", " model_algorithm=\"\",\n", " modeler=\"sasdemo\",\n", " )\n", - " \n", + "\n", " # Write model metadata to a json file so that SAS Model Manager can properly identify all model files\n", " pzmm.JSONFiles.write_file_metadata_json(model_prefix=prefix, json_path=path)\n", "\n", - "for (prefix, path) in zip(model_prefix, zip_folder):\n", + "\n", + "for prefix, path in zip(model_prefix, zip_folder):\n", " write_json_files(hmeq_data, predictor_columns, target_column, path, prefix)" ] }, @@ -726,49 +793,696 @@ "name": "stdout", "output_type": "stream", "text": [ - "dmcas_fitstat.json was successfully written and saved to ~\\data\\hmeqModels\\DecisionTreeClassifier\\dmcas_fitstat.json\n", - "dmcas_roc.json was successfully written and saved to ~\\data\\hmeqModels\\DecisionTreeClassifier\\dmcas_roc.json\n", - "dmcas_lift.json was successfully written and saved to ~\\data\\hmeqModels\\DecisionTreeClassifier\\dmcas_lift.json\n", - "dmcas_fitstat.json was successfully written and saved to ~\\data\\hmeqModels\\RandomForest\\dmcas_fitstat.json\n", - "dmcas_roc.json was successfully written and saved to ~\\data\\hmeqModels\\RandomForest\\dmcas_roc.json\n", - "dmcas_lift.json was successfully written and saved to ~\\data\\hmeqModels\\RandomForest\\dmcas_lift.json\n", - "dmcas_fitstat.json was successfully written and saved to ~\\data\\hmeqModels\\GradientBoosting\\dmcas_fitstat.json\n", - "dmcas_roc.json was successfully written and saved to ~\\data\\hmeqModels\\GradientBoosting\\dmcas_roc.json\n", - "dmcas_lift.json was successfully written and saved to ~\\data\\hmeqModels\\GradientBoosting\\dmcas_lift.json\n" + "Selected Rows from Table ROC\n", + "\n", + " _Column_ _Event_ _Cutoff_ _TP_ _FP_ _FN_ _TN_ _Sensitivity_ _Specificity_ _KS_ _KS2_ _FHALF_ _FPR_ _ACC_ _FDR_ _F1_ _C_ _GINI_ _GAMMA_ _TAU_ _MiscEvent_ _FNR_\n", + "0 actual 1 0.00 814.0 0.0 0.0 0.0 1.000000 NaN 1.0 NaN 1.000000 NaN 1.000000 0.0 1.000000 NaN NaN NaN NaN 0.000000 0.000000\n", + "1 actual 1 0.01 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "2 actual 1 0.02 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "3 actual 1 0.03 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "4 actual 1 0.04 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "5 actual 1 0.05 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "6 actual 1 0.06 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "7 actual 1 0.07 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "8 actual 1 0.08 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "9 actual 1 0.09 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "10 actual 1 0.10 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "11 actual 1 0.11 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "12 actual 1 0.12 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "13 actual 1 0.13 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "14 actual 1 0.14 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "15 actual 1 0.15 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "16 actual 1 0.16 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "17 actual 1 0.17 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "18 actual 1 0.18 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "19 actual 1 0.19 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "20 actual 1 0.20 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "21 actual 1 0.21 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "22 actual 1 0.22 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "23 actual 1 0.23 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "24 actual 1 0.24 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "25 actual 1 0.25 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "26 actual 1 0.26 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "27 actual 1 0.27 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "28 actual 1 0.28 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "29 actual 1 0.29 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "30 actual 1 0.30 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "31 actual 1 0.31 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "32 actual 1 0.32 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "33 actual 1 0.33 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "34 actual 1 0.34 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "35 actual 1 0.35 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "36 actual 1 0.36 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "37 actual 1 0.37 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "38 actual 1 0.38 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "39 actual 1 0.39 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "40 actual 1 0.40 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "41 actual 1 0.41 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "42 actual 1 0.42 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "43 actual 1 0.43 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "44 actual 1 0.44 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "45 actual 1 0.45 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "46 actual 1 0.46 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "47 actual 1 0.47 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "48 actual 1 0.48 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "49 actual 1 0.49 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "50 actual 1 0.50 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "51 actual 1 0.51 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "52 actual 1 0.52 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "53 actual 1 0.53 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "54 actual 1 0.54 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "55 actual 1 0.55 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "56 actual 1 0.56 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "57 actual 1 0.57 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "58 actual 1 0.58 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "59 actual 1 0.59 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "60 actual 1 0.60 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "61 actual 1 0.61 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "62 actual 1 0.62 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "63 actual 1 0.63 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "64 actual 1 0.64 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "65 actual 1 0.65 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "66 actual 1 0.66 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "67 actual 1 0.67 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "68 actual 1 0.68 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "69 actual 1 0.69 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "70 actual 1 0.70 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "71 actual 1 0.71 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "72 actual 1 0.72 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "73 actual 1 0.73 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "74 actual 1 0.74 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "75 actual 1 0.75 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "76 actual 1 0.76 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "77 actual 1 0.77 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "78 actual 1 0.78 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "79 actual 1 0.79 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "80 actual 1 0.80 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "81 actual 1 0.81 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "82 actual 1 0.82 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "83 actual 1 0.83 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "84 actual 1 0.84 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "85 actual 1 0.85 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "86 actual 1 0.86 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "87 actual 1 0.87 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "88 actual 1 0.88 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "89 actual 1 0.89 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "90 actual 1 0.90 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "91 actual 1 0.91 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "92 actual 1 0.92 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "93 actual 1 0.93 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "94 actual 1 0.94 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "95 actual 1 0.95 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "96 actual 1 0.96 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "97 actual 1 0.97 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "98 actual 1 0.98 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "99 actual 1 0.99 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", + "Selected Rows from Table ROC\n", + "\n", + " _Column_ _Event_ _Cutoff_ _TP_ _FP_ _FN_ _TN_ _Sensitivity_ _Specificity_ _KS_ _KS2_ _FHALF_ _FPR_ _ACC_ _FDR_ _F1_ _C_ _GINI_ _GAMMA_ _TAU_ _MiscEvent_ _FNR_\n", + "0 actual 1 0.00 81.0 0.0 0.0 0.0 1.000000 NaN 1.0 NaN 1.000000 NaN 1.000000 0.0 1.000000 NaN NaN NaN NaN 0.000000 0.000000\n", + "1 actual 1 0.01 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "2 actual 1 0.02 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "3 actual 1 0.03 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "4 actual 1 0.04 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "5 actual 1 0.05 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "6 actual 1 0.06 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "7 actual 1 0.07 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "8 actual 1 0.08 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "9 actual 1 0.09 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "10 actual 1 0.10 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "11 actual 1 0.11 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "12 actual 1 0.12 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "13 actual 1 0.13 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "14 actual 1 0.14 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "15 actual 1 0.15 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "16 actual 1 0.16 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "17 actual 1 0.17 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "18 actual 1 0.18 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "19 actual 1 0.19 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "20 actual 1 0.20 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "21 actual 1 0.21 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "22 actual 1 0.22 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "23 actual 1 0.23 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "24 actual 1 0.24 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "25 actual 1 0.25 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "26 actual 1 0.26 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "27 actual 1 0.27 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "28 actual 1 0.28 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "29 actual 1 0.29 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "30 actual 1 0.30 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "31 actual 1 0.31 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "32 actual 1 0.32 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "33 actual 1 0.33 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "34 actual 1 0.34 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "35 actual 1 0.35 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "36 actual 1 0.36 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "37 actual 1 0.37 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "38 actual 1 0.38 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "39 actual 1 0.39 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "40 actual 1 0.40 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "41 actual 1 0.41 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "42 actual 1 0.42 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "43 actual 1 0.43 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "44 actual 1 0.44 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "45 actual 1 0.45 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "46 actual 1 0.46 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "47 actual 1 0.47 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "48 actual 1 0.48 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "49 actual 1 0.49 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "50 actual 1 0.50 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "51 actual 1 0.51 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "52 actual 1 0.52 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "53 actual 1 0.53 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "54 actual 1 0.54 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "55 actual 1 0.55 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "56 actual 1 0.56 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "57 actual 1 0.57 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "58 actual 1 0.58 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "59 actual 1 0.59 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "60 actual 1 0.60 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "61 actual 1 0.61 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "62 actual 1 0.62 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "63 actual 1 0.63 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "64 actual 1 0.64 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "65 actual 1 0.65 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "66 actual 1 0.66 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "67 actual 1 0.67 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "68 actual 1 0.68 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "69 actual 1 0.69 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "70 actual 1 0.70 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "71 actual 1 0.71 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "72 actual 1 0.72 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "73 actual 1 0.73 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "74 actual 1 0.74 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "75 actual 1 0.75 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "76 actual 1 0.76 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "77 actual 1 0.77 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "78 actual 1 0.78 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "79 actual 1 0.79 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "80 actual 1 0.80 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "81 actual 1 0.81 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "82 actual 1 0.82 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "83 actual 1 0.83 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "84 actual 1 0.84 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "85 actual 1 0.85 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "86 actual 1 0.86 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "87 actual 1 0.87 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "88 actual 1 0.88 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "89 actual 1 0.89 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "90 actual 1 0.90 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "91 actual 1 0.91 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "92 actual 1 0.92 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "93 actual 1 0.93 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "94 actual 1 0.94 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "95 actual 1 0.95 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "96 actual 1 0.96 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "97 actual 1 0.97 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "98 actual 1 0.98 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "99 actual 1 0.99 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", + "dmcas_fitstat.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\DecisionTreeClassifier\\dmcas_fitstat.json\n", + "dmcas_roc.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\DecisionTreeClassifier\\dmcas_roc.json\n", + "dmcas_lift.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\DecisionTreeClassifier\\dmcas_lift.json\n", + "None\n", + "Selected Rows from Table ROC\n", + "\n", + " _Column_ _Event_ _Cutoff_ _TP_ _FP_ _FN_ _TN_ _Sensitivity_ _Specificity_ _KS_ _KS2_ _FHALF_ _FPR_ _ACC_ _FDR_ _F1_ _C_ _GINI_ _GAMMA_ _TAU_ _MiscEvent_ _FNR_\n", + "0 actual 1 0.00 587.0 0.0 0.0 0.0 1.000000 NaN 1.0 NaN 1.000000 NaN 1.000000 0.0 1.000000 NaN NaN NaN NaN 0.000000 0.000000\n", + "1 actual 1 0.01 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "2 actual 1 0.02 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "3 actual 1 0.03 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "4 actual 1 0.04 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "5 actual 1 0.05 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "6 actual 1 0.06 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "7 actual 1 0.07 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "8 actual 1 0.08 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "9 actual 1 0.09 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "10 actual 1 0.10 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "11 actual 1 0.11 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "12 actual 1 0.12 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "13 actual 1 0.13 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "14 actual 1 0.14 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "15 actual 1 0.15 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "16 actual 1 0.16 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "17 actual 1 0.17 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "18 actual 1 0.18 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "19 actual 1 0.19 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "20 actual 1 0.20 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "21 actual 1 0.21 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "22 actual 1 0.22 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "23 actual 1 0.23 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "24 actual 1 0.24 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "25 actual 1 0.25 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "26 actual 1 0.26 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "27 actual 1 0.27 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "28 actual 1 0.28 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "29 actual 1 0.29 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "30 actual 1 0.30 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "31 actual 1 0.31 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "32 actual 1 0.32 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "33 actual 1 0.33 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "34 actual 1 0.34 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "35 actual 1 0.35 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "36 actual 1 0.36 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "37 actual 1 0.37 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "38 actual 1 0.38 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "39 actual 1 0.39 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "40 actual 1 0.40 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "41 actual 1 0.41 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "42 actual 1 0.42 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "43 actual 1 0.43 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "44 actual 1 0.44 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "45 actual 1 0.45 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "46 actual 1 0.46 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "47 actual 1 0.47 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "48 actual 1 0.48 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "49 actual 1 0.49 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "50 actual 1 0.50 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "51 actual 1 0.51 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "52 actual 1 0.52 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "53 actual 1 0.53 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "54 actual 1 0.54 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "55 actual 1 0.55 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "56 actual 1 0.56 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "57 actual 1 0.57 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "58 actual 1 0.58 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "59 actual 1 0.59 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "60 actual 1 0.60 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "61 actual 1 0.61 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "62 actual 1 0.62 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "63 actual 1 0.63 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "64 actual 1 0.64 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "65 actual 1 0.65 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "66 actual 1 0.66 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "67 actual 1 0.67 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "68 actual 1 0.68 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "69 actual 1 0.69 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "70 actual 1 0.70 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "71 actual 1 0.71 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "72 actual 1 0.72 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "73 actual 1 0.73 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "74 actual 1 0.74 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "75 actual 1 0.75 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "76 actual 1 0.76 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "77 actual 1 0.77 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "78 actual 1 0.78 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "79 actual 1 0.79 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "80 actual 1 0.80 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "81 actual 1 0.81 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "82 actual 1 0.82 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "83 actual 1 0.83 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "84 actual 1 0.84 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "85 actual 1 0.85 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "86 actual 1 0.86 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "87 actual 1 0.87 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "88 actual 1 0.88 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "89 actual 1 0.89 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "90 actual 1 0.90 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "91 actual 1 0.91 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "92 actual 1 0.92 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "93 actual 1 0.93 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "94 actual 1 0.94 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "95 actual 1 0.95 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "96 actual 1 0.96 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "97 actual 1 0.97 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "98 actual 1 0.98 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "99 actual 1 0.99 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", + "Selected Rows from Table ROC\n", + "\n", + " _Column_ _Event_ _Cutoff_ _TP_ _FP_ _FN_ _TN_ _Sensitivity_ _Specificity_ _KS_ _KS2_ _FHALF_ _FPR_ _ACC_ _FDR_ _F1_ _C_ _GINI_ _GAMMA_ _TAU_ _MiscEvent_ _FNR_\n", + "0 actual 1 0.00 94.0 0.0 0.0 0.0 1.000000 NaN 1.0 NaN 1.000000 NaN 1.000000 0.0 1.000000 NaN NaN NaN NaN 0.000000 0.000000\n", + "1 actual 1 0.01 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "2 actual 1 0.02 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "3 actual 1 0.03 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "4 actual 1 0.04 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "5 actual 1 0.05 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "6 actual 1 0.06 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "7 actual 1 0.07 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "8 actual 1 0.08 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "9 actual 1 0.09 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "10 actual 1 0.10 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "11 actual 1 0.11 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "12 actual 1 0.12 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "13 actual 1 0.13 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "14 actual 1 0.14 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "15 actual 1 0.15 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "16 actual 1 0.16 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "17 actual 1 0.17 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "18 actual 1 0.18 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "19 actual 1 0.19 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "20 actual 1 0.20 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "21 actual 1 0.21 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "22 actual 1 0.22 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "23 actual 1 0.23 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "24 actual 1 0.24 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "25 actual 1 0.25 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "26 actual 1 0.26 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "27 actual 1 0.27 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "28 actual 1 0.28 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "29 actual 1 0.29 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "30 actual 1 0.30 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "31 actual 1 0.31 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "32 actual 1 0.32 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "33 actual 1 0.33 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "34 actual 1 0.34 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "35 actual 1 0.35 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "36 actual 1 0.36 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "37 actual 1 0.37 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "38 actual 1 0.38 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "39 actual 1 0.39 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "40 actual 1 0.40 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "41 actual 1 0.41 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "42 actual 1 0.42 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "43 actual 1 0.43 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "44 actual 1 0.44 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "45 actual 1 0.45 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "46 actual 1 0.46 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "47 actual 1 0.47 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "48 actual 1 0.48 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "49 actual 1 0.49 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "50 actual 1 0.50 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "51 actual 1 0.51 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "52 actual 1 0.52 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "53 actual 1 0.53 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "54 actual 1 0.54 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "55 actual 1 0.55 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "56 actual 1 0.56 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "57 actual 1 0.57 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "58 actual 1 0.58 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "59 actual 1 0.59 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "60 actual 1 0.60 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "61 actual 1 0.61 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "62 actual 1 0.62 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "63 actual 1 0.63 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "64 actual 1 0.64 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "65 actual 1 0.65 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "66 actual 1 0.66 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "67 actual 1 0.67 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "68 actual 1 0.68 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "69 actual 1 0.69 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "70 actual 1 0.70 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "71 actual 1 0.71 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "72 actual 1 0.72 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "73 actual 1 0.73 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "74 actual 1 0.74 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "75 actual 1 0.75 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "76 actual 1 0.76 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "77 actual 1 0.77 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "78 actual 1 0.78 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "79 actual 1 0.79 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "80 actual 1 0.80 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "81 actual 1 0.81 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "82 actual 1 0.82 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "83 actual 1 0.83 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "84 actual 1 0.84 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "85 actual 1 0.85 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "86 actual 1 0.86 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "87 actual 1 0.87 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "88 actual 1 0.88 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "89 actual 1 0.89 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "90 actual 1 0.90 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "91 actual 1 0.91 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "92 actual 1 0.92 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "93 actual 1 0.93 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "94 actual 1 0.94 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "95 actual 1 0.95 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "96 actual 1 0.96 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "97 actual 1 0.97 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "98 actual 1 0.98 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "99 actual 1 0.99 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", + "dmcas_fitstat.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\RandomForest\\dmcas_fitstat.json\n", + "dmcas_roc.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\RandomForest\\dmcas_roc.json\n", + "dmcas_lift.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\RandomForest\\dmcas_lift.json\n", + "None\n", + "Selected Rows from Table ROC\n", + "\n", + " _Column_ _Event_ _Cutoff_ _TP_ _FP_ _FN_ _TN_ _Sensitivity_ _Specificity_ _KS_ _KS2_ _FHALF_ _FPR_ _ACC_ _FDR_ _F1_ _C_ _GINI_ _GAMMA_ _TAU_ _MiscEvent_ _FNR_\n", + "0 actual 1 0.00 842.0 0.0 0.0 0.0 1.000000 NaN 1.0 NaN 1.000000 NaN 1.000000 0.0 1.000000 NaN NaN NaN NaN 0.000000 0.000000\n", + "1 actual 1 0.01 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "2 actual 1 0.02 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "3 actual 1 0.03 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "4 actual 1 0.04 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "5 actual 1 0.05 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "6 actual 1 0.06 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "7 actual 1 0.07 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "8 actual 1 0.08 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "9 actual 1 0.09 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "10 actual 1 0.10 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "11 actual 1 0.11 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "12 actual 1 0.12 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "13 actual 1 0.13 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "14 actual 1 0.14 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "15 actual 1 0.15 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "16 actual 1 0.16 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "17 actual 1 0.17 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "18 actual 1 0.18 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "19 actual 1 0.19 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "20 actual 1 0.20 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "21 actual 1 0.21 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "22 actual 1 0.22 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "23 actual 1 0.23 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "24 actual 1 0.24 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "25 actual 1 0.25 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "26 actual 1 0.26 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "27 actual 1 0.27 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "28 actual 1 0.28 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "29 actual 1 0.29 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "30 actual 1 0.30 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "31 actual 1 0.31 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "32 actual 1 0.32 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "33 actual 1 0.33 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "34 actual 1 0.34 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "35 actual 1 0.35 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "36 actual 1 0.36 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "37 actual 1 0.37 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "38 actual 1 0.38 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "39 actual 1 0.39 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "40 actual 1 0.40 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "41 actual 1 0.41 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "42 actual 1 0.42 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "43 actual 1 0.43 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "44 actual 1 0.44 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "45 actual 1 0.45 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "46 actual 1 0.46 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "47 actual 1 0.47 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "48 actual 1 0.48 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "49 actual 1 0.49 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "50 actual 1 0.50 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "51 actual 1 0.51 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "52 actual 1 0.52 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "53 actual 1 0.53 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "54 actual 1 0.54 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "55 actual 1 0.55 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "56 actual 1 0.56 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "57 actual 1 0.57 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "58 actual 1 0.58 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "59 actual 1 0.59 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "60 actual 1 0.60 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "61 actual 1 0.61 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "62 actual 1 0.62 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "63 actual 1 0.63 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "64 actual 1 0.64 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "65 actual 1 0.65 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "66 actual 1 0.66 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "67 actual 1 0.67 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "68 actual 1 0.68 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "69 actual 1 0.69 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "70 actual 1 0.70 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "71 actual 1 0.71 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "72 actual 1 0.72 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "73 actual 1 0.73 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "74 actual 1 0.74 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "75 actual 1 0.75 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "76 actual 1 0.76 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "77 actual 1 0.77 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "78 actual 1 0.78 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "79 actual 1 0.79 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "80 actual 1 0.80 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "81 actual 1 0.81 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "82 actual 1 0.82 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "83 actual 1 0.83 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "84 actual 1 0.84 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "85 actual 1 0.85 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "86 actual 1 0.86 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "87 actual 1 0.87 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "88 actual 1 0.88 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "89 actual 1 0.89 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "90 actual 1 0.90 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "91 actual 1 0.91 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "92 actual 1 0.92 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "93 actual 1 0.93 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "94 actual 1 0.94 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "95 actual 1 0.95 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "96 actual 1 0.96 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "97 actual 1 0.97 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "98 actual 1 0.98 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "99 actual 1 0.99 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", + "Selected Rows from Table ROC\n", + "\n", + " _Column_ _Event_ _Cutoff_ _TP_ _FP_ _FN_ _TN_ _Sensitivity_ _Specificity_ _KS_ _KS2_ _FHALF_ _FPR_ _ACC_ _FDR_ _F1_ _C_ _GINI_ _GAMMA_ _TAU_ _MiscEvent_ _FNR_\n", + "0 actual 1 0.00 149.0 0.0 0.0 0.0 1.000000 NaN 1.0 NaN 1.000000 NaN 1.000000 0.0 1.000000 NaN NaN NaN NaN 0.000000 0.000000\n", + "1 actual 1 0.01 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "2 actual 1 0.02 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "3 actual 1 0.03 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "4 actual 1 0.04 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "5 actual 1 0.05 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "6 actual 1 0.06 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "7 actual 1 0.07 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "8 actual 1 0.08 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "9 actual 1 0.09 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "10 actual 1 0.10 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "11 actual 1 0.11 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "12 actual 1 0.12 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "13 actual 1 0.13 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "14 actual 1 0.14 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "15 actual 1 0.15 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "16 actual 1 0.16 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "17 actual 1 0.17 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "18 actual 1 0.18 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "19 actual 1 0.19 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "20 actual 1 0.20 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "21 actual 1 0.21 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "22 actual 1 0.22 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "23 actual 1 0.23 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "24 actual 1 0.24 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "25 actual 1 0.25 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "26 actual 1 0.26 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "27 actual 1 0.27 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "28 actual 1 0.28 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "29 actual 1 0.29 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "30 actual 1 0.30 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "31 actual 1 0.31 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "32 actual 1 0.32 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "33 actual 1 0.33 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "34 actual 1 0.34 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "35 actual 1 0.35 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "36 actual 1 0.36 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "37 actual 1 0.37 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "38 actual 1 0.38 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "39 actual 1 0.39 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "40 actual 1 0.40 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "41 actual 1 0.41 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "42 actual 1 0.42 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "43 actual 1 0.43 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "44 actual 1 0.44 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "45 actual 1 0.45 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "46 actual 1 0.46 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "47 actual 1 0.47 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "48 actual 1 0.48 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "49 actual 1 0.49 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "50 actual 1 0.50 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "51 actual 1 0.51 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "52 actual 1 0.52 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "53 actual 1 0.53 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "54 actual 1 0.54 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "55 actual 1 0.55 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "56 actual 1 0.56 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "57 actual 1 0.57 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "58 actual 1 0.58 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "59 actual 1 0.59 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "60 actual 1 0.60 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "61 actual 1 0.61 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "62 actual 1 0.62 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "63 actual 1 0.63 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "64 actual 1 0.64 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "65 actual 1 0.65 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "66 actual 1 0.66 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "67 actual 1 0.67 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "68 actual 1 0.68 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "69 actual 1 0.69 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "70 actual 1 0.70 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "71 actual 1 0.71 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "72 actual 1 0.72 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "73 actual 1 0.73 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "74 actual 1 0.74 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "75 actual 1 0.75 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "76 actual 1 0.76 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "77 actual 1 0.77 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "78 actual 1 0.78 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "79 actual 1 0.79 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "80 actual 1 0.80 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "81 actual 1 0.81 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "82 actual 1 0.82 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "83 actual 1 0.83 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "84 actual 1 0.84 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "85 actual 1 0.85 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "86 actual 1 0.86 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "87 actual 1 0.87 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "88 actual 1 0.88 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "89 actual 1 0.89 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "90 actual 1 0.90 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "91 actual 1 0.91 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "92 actual 1 0.92 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "93 actual 1 0.93 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "94 actual 1 0.94 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "95 actual 1 0.95 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "96 actual 1 0.96 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "97 actual 1 0.97 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "98 actual 1 0.98 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "99 actual 1 0.99 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", + "dmcas_fitstat.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\GradientBoosting\\dmcas_fitstat.json\n", + "dmcas_roc.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\GradientBoosting\\dmcas_roc.json\n", + "dmcas_lift.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\GradientBoosting\\dmcas_lift.json\n", + "None\n" ] } ], "source": [ "import getpass\n", - "def write_model_stats(x_train, y_train, test_predict, test_proba, y_test, model, path, prefix):\n", + "\n", + "\n", + "def write_model_stats(\n", + " x_train, y_train, test_predict, test_proba, y_test, model, path, prefix\n", + "):\n", " # Calculate train predictions\n", " train_predict = model.predict(x_train)\n", " train_proba = model.predict_proba(x_train)\n", - " \n", + "\n", " # Assign data to lists of actual and predicted values\n", - " train_data = pd.concat([y_train.reset_index(drop=True), pd.Series(train_predict), pd.Series(data=train_proba[:,1])], axis=1)\n", - " test_data = pd.concat([y_test.reset_index(drop=True), pd.Series(test_predict), pd.Series(data=test_proba[:,1])], axis=1)\n", - " \n", + " train_data = pd.concat(\n", + " [\n", + " y_train.reset_index(drop=True),\n", + " pd.Series(train_predict),\n", + " pd.Series(data=train_proba[:, 1]),\n", + " ],\n", + " axis=1,\n", + " )\n", + " test_data = pd.concat(\n", + " [\n", + " y_test.reset_index(drop=True),\n", + " pd.Series(test_predict),\n", + " pd.Series(data=test_proba[:, 1]),\n", + " ],\n", + " axis=1,\n", + " )\n", + "\n", " # Calculate the model statistics, ROC chart, and Lift chart; then write to json files\n", " pzmm.JSONFiles.calculate_model_statistics(\n", - " target_value=1, \n", - " prob_value=0.5, \n", - " train_data=train_data, \n", - " test_data=test_data, \n", - " json_path=path\n", + " target_value=1,\n", + " train_data=train_data,\n", + " test_data=test_data,\n", + " json_path=path,\n", " )\n", "\n", - " full_training_data = pd.concat([y_train.reset_index(drop=True), x_train.reset_index(drop=True)], axis=1)\n", - " \n", + " full_training_data = pd.concat(\n", + " [y_train.reset_index(drop=True), x_train.reset_index(drop=True)], axis=1\n", + " )\n", + " \n", + " \n", + "\n", + "\n", "username = getpass.getpass()\n", "password = getpass.getpass()\n", - "host = \"demo.sas.com\" # Changes required by user\n", - "sess = Session(host, username, password, protocol=\"http\") # For TLS-enabled servers, change protocol value to \"https\"\n", - "conn = sess.as_swat() # Connect to SWAT through the sasctl authenticated connection\n", + "host = \"demo.sas.com\" # Changes required by user\n", + "sess = Session(\n", + " host, username, password, protocol=\"http\"\n", + ") # For TLS-enabled servers, change protocol value to \"https\"\n", + "conn = sess.as_swat() # Connect to SWAT through the sasctl authenticated connection\n", "\n", "test_predict = [y_dtc_predict, y_rfc_predict, y_gbc_predict]\n", "test_proba = [y_dtc_proba, y_rfc_proba, y_gbc_proba]\n", - "for (mod, pred, proba, path, prefix) in zip(model, test_predict, test_proba, zip_folder, model_prefix):\n", + "for mod, pred, proba, path, prefix in zip(\n", + " model, test_predict, test_proba, zip_folder, model_prefix\n", + "):\n", " write_model_stats(x_train, y_train, pred, proba, y_test, mod, path, prefix)" ] }, @@ -783,43 +1497,74 @@ "name": "stderr", "output_type": "stream", "text": [ - "~\\sasctl\\pzmm\\write_score_code.py:1059: UserWarning: Due to the ambiguity of the provided metrics and prediction return types, the score code assumes that a classification and the target event probability should be returned.\n", - " warn(\n", - "~\\sasctl\\pzmm\\import_model.py:45: UserWarning: No project with the name or UUID HMEQModels was found.\n", - " warn(f\"No project with the name or UUID {project} was found.\")\n" + "c:\\Users\\sapotl\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\sasctl\\pzmm\\write_score_code.py:1501: UserWarning: Due to the ambiguity of the provided metrics and prediction return types, the score code assumes that a classification and the target event probability should be returned.\n", + " warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model score code was written successfully to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\DecisionTreeClassifier\\score_DecisionTreeClassifier.py and uploaded to SAS Model Manager.\n", + "All model files were zipped to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\DecisionTreeClassifier.\n", + "Model was successfully imported into SAS Model Manager as DecisionTreeClassifier with the following UUID: bfc9dd0c-ca5e-49ce-bae0-e0eda9cfe61c.\n", + "Model score code was written successfully to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\RandomForest\\score_RandomForest.py and uploaded to SAS Model Manager.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\Users\\sapotl\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\sasctl\\pzmm\\write_score_code.py:1501: UserWarning: Due to the ambiguity of the provided metrics and prediction return types, the score code assumes that a classification and the target event probability should be returned.\n", + " warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "All model files were zipped to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\RandomForest.\n", + "Model was successfully imported into SAS Model Manager as RandomForest with the following UUID: 351f0465-813d-41d1-90e3-e0f8f49d9418.\n", + "Model score code was written successfully to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\GradientBoosting\\score_GradientBoosting.py and uploaded to SAS Model Manager.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\Users\\sapotl\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\sasctl\\pzmm\\write_score_code.py:1501: UserWarning: Due to the ambiguity of the provided metrics and prediction return types, the score code assumes that a classification and the target event probability should be returned.\n", + " warn(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "Model score code was written successfully to ~\\data\\hmeqModels\\DecisionTreeClassifier\\score_DecisionTreeClassifier.py and uploaded to SAS Model Manager.\n", - "All model files were zipped to ~\\data\\hmeqModels\\DecisionTreeClassifier.\n", - "A new project named HMEQModels was created.\n", - "Model was successfully imported into SAS Model Manager as DecisionTreeClassifier with the following UUID: 82cf6fb7-c845-48ad-8f0c-9e572104335d.\n", - "Model score code was written successfully to ~\\data\\hmeqModels\\RandomForest\\score_RandomForest.py and uploaded to SAS Model Manager.\n", - "All model files were zipped to ~\\data\\hmeqModels\\RandomForest.\n", - "Model was successfully imported into SAS Model Manager as RandomForest with the following UUID: 44bfd538-8e02-4d04-99cd-fe1dacbabdfd.\n", - "Model score code was written successfully to ~\\data\\hmeqModels\\GradientBoosting\\score_GradientBoosting.py and uploaded to SAS Model Manager.\n", - "All model files were zipped to ~\\data\\hmeqModels\\GradientBoosting.\n", - "Model was successfully imported into SAS Model Manager as GradientBoosting with the following UUID: a248bde8-f767-4c05-8791-63700efd9288.\n" + "All model files were zipped to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\GradientBoosting.\n", + "Model was successfully imported into SAS Model Manager as GradientBoosting with the following UUID: 4408283e-2c93-4ae8-8450-3b727aafc049.\n" ] } ], "source": [ - "for (prefix, path) in zip(model_prefix, zip_folder):\n", + "for prefix, path in zip(model_prefix, zip_folder):\n", " pzmm.ImportModel.import_model(\n", - " model_files=path, # Where are the model files?\n", - " model_prefix=prefix, # What is the model name?\n", - " project=\"HMEQModels\", # What is the project name?\n", - " input_data=x, # What does example input data look like?\n", - " predict_method=[dtc.predict_proba, [int, int]], # What is the predict method and what does it return?\n", - " score_metrics=score_metrics, # What are the output variables?\n", - " overwrite_model=True, # Overwrite the model if it already exists?\n", - " target_values=[\"0\", \"1\"], # What are the expected values of the target variable?\n", - " target_index=1, # What is the index of the target value in target_values?\n", - " model_file_name=prefix + \".pickle\", # How was the model file serialized?\n", - " missing_values=True # Does the data include missing values?\n", + " model_files=path, # Where are the model files?\n", + " model_prefix=prefix, # What is the model name?\n", + " project=\"HMEQModels\", # What is the project name?\n", + " input_data=x, # What does example input data look like?\n", + " predict_method=[\n", + " dtc.predict_proba,\n", + " [int, int],\n", + " ], # What is the predict method and what does it return?\n", + " score_metrics=score_metrics, # What are the output variables?\n", + " overwrite_model=True, # Overwrite the model if it already exists?\n", + " target_values=[\n", + " \"0\",\n", + " \"1\",\n", + " ], # What are the expected values of the target variable?\n", + " target_index=1, # What is the index of the target value in target_values?\n", + " model_file_name=prefix + \".pickle\", # How was the model file serialized?\n", + " missing_values=True, # Does the data include missing values?\n", " )\n", " # Reinitialize the score_code variable when writing more than one model's score code\n", " pzmm.ScoreCode.score_code = \"\"" @@ -842,7 +1587,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.18" + "version": "3.11.0" }, "latex_envs": { "LaTeX_envs_menu_present": true, diff --git a/examples/pzmm_generate_complete_model_card.ipynb b/examples/pzmm_generate_complete_model_card.ipynb index 525958cf..60bed6b1 100644 --- a/examples/pzmm_generate_complete_model_card.ipynb +++ b/examples/pzmm_generate_complete_model_card.ipynb @@ -84,7 +84,7 @@ } ], "source": [ - "adult = pd.read_csv(\"data/adult.csv\", sep= \",\")\n", + "adult = pd.read_csv(\"data/adult.csv\", sep=\",\")\n", "\n", "print(\"Shape of data:\", adult.shape)" ] @@ -299,7 +299,7 @@ } ], "source": [ - "adult.hist(figsize=(15,15), layout=(4, 4));" + "adult.hist(figsize=(15, 15), layout=(4, 4));" ] }, { @@ -458,12 +458,12 @@ ], "source": [ "print(\"Unique Values: \")\n", - "print(adult[adult.select_dtypes(include=['object']).columns].nunique())\n", + "print(adult[adult.select_dtypes(include=[\"object\"]).columns].nunique())\n", "print(\"--------------------------------\")\n", "print(\"Value Counts: \")\n", - "for i in adult.select_dtypes(include=['object']).columns:\n", - " print(adult[i].value_counts())\n", - " print(\"--------------------------------\")" + "for i in adult.select_dtypes(include=[\"object\"]).columns:\n", + " print(adult[i].value_counts())\n", + " print(\"--------------------------------\")" ] }, { @@ -481,12 +481,17 @@ "source": [ "df = adult.copy()\n", "df = df.dropna().reset_index()\n", - "cat_vals = df[[\"WorkClass\", \"Education\", \"MartialStatus\", \"Relationship\", \"Race\", \"Sex\"]]\n", - "df = pd.get_dummies(df, columns=[\"WorkClass\", \"Education\", \"MartialStatus\", \"Relationship\", \"Race\", \"Sex\"])\n", - "df.columns = df.columns.str.replace(' ', '')\n", - "df.columns = df.columns.str.replace('-', '_')\n", - "df = df.drop(['Sex_Male'], axis=1)\n", - "df = pd.concat([df, cat_vals], axis=1).drop('index', axis=1)\n" + "cat_vals = df[\n", + " [\"WorkClass\", \"Education\", \"MartialStatus\", \"Relationship\", \"Race\", \"Sex\"]\n", + "]\n", + "df = pd.get_dummies(\n", + " df,\n", + " columns=[\"WorkClass\", \"Education\", \"MartialStatus\", \"Relationship\", \"Race\", \"Sex\"],\n", + ")\n", + "df.columns = df.columns.str.replace(\" \", \"\")\n", + "df.columns = df.columns.str.replace(\"-\", \"_\")\n", + "df = df.drop([\"Sex_Male\"], axis=1)\n", + "df = pd.concat([df, cat_vals], axis=1).drop(\"index\", axis=1)" ] }, { @@ -535,16 +540,34 @@ } ], "source": [ - "df[\"Education_Some_HS\"] = df[\"Education_9th\"] | df[\"Education_10th\"] | df[\"Education_11th\"] | df[\"Education_12th\"]\n", + "df[\"Education_Some_HS\"] = (\n", + " df[\"Education_9th\"]\n", + " | df[\"Education_10th\"]\n", + " | df[\"Education_11th\"]\n", + " | df[\"Education_12th\"]\n", + ")\n", "df[\"Education_Assoc\"] = df[\"Education_Assoc_voc\"] | df[\"Education_Assoc_acdm\"]\n", - "df[\"Education_Adv_Degree\"] = df[\"Education_Masters\"] | df[\"Education_Prof_school\"] | df[\"Education_Doctorate\"]\n", - "df[\"Education_No_HS\"] = df[\"Education_Preschool\"] | df[\"Education_1st_4th\"] | df[\"Education_5th_6th\"] | df[\"Education_7th_8th\"]\n", + "df[\"Education_Adv_Degree\"] = (\n", + " df[\"Education_Masters\"] | df[\"Education_Prof_school\"] | df[\"Education_Doctorate\"]\n", + ")\n", + "df[\"Education_No_HS\"] = (\n", + " df[\"Education_Preschool\"]\n", + " | df[\"Education_1st_4th\"]\n", + " | df[\"Education_5th_6th\"]\n", + " | df[\"Education_7th_8th\"]\n", + ")\n", "\n", "df[\"WorkClass_Self\"] = df[\"WorkClass_Self_emp_inc\"] | df[\"WorkClass_Self_emp_not_inc\"]\n", - "df[\"WorkClass_Gov\"] = df[\"WorkClass_Federal_gov\"] | df[\"WorkClass_Local_gov\"] | df[\"WorkClass_State_gov\"]\n", - "df[\"WorkClass_Other\"] = df[\"WorkClass_Without_pay\"] # df[\"WorkClass_Never_worked\"] is fully dropped when all NA values removed\n", + "df[\"WorkClass_Gov\"] = (\n", + " df[\"WorkClass_Federal_gov\"] | df[\"WorkClass_Local_gov\"] | df[\"WorkClass_State_gov\"]\n", + ")\n", + "df[\"WorkClass_Other\"] = df[\n", + " \"WorkClass_Without_pay\"\n", + "] # df[\"WorkClass_Never_worked\"] is fully dropped when all NA values removed\n", "\n", - "df[\"MartialStatus_Other\"] = df[\"MartialStatus_Married_spouse_absent\"] | df[\"MartialStatus_Married_AF_spouse\"]\n", + "df[\"MartialStatus_Other\"] = (\n", + " df[\"MartialStatus_Married_spouse_absent\"] | df[\"MartialStatus_Married_AF_spouse\"]\n", + ")\n", "\n", "df.columns" ] @@ -623,19 +646,62 @@ "metadata": {}, "outputs": [], "source": [ - "original_columns = ['Age', 'WorkClass', 'Education', 'MartialStatus', \n", - " 'Relationship', 'Race', 'Sex', 'HoursPerWeek', 'GE50K']\n", + "original_columns = [\n", + " \"Age\",\n", + " \"WorkClass\",\n", + " \"Education\",\n", + " \"MartialStatus\",\n", + " \"Relationship\",\n", + " \"Race\",\n", + " \"Sex\",\n", + " \"HoursPerWeek\",\n", + " \"GE50K\",\n", + "]\n", "\n", - "original_inputs = ['Age', 'WorkClass', 'Education', 'MartialStatus', \n", - " 'Relationship', 'Race', 'Sex', 'HoursPerWeek']\n", + "original_inputs = [\n", + " \"Age\",\n", + " \"WorkClass\",\n", + " \"Education\",\n", + " \"MartialStatus\",\n", + " \"Relationship\",\n", + " \"Race\",\n", + " \"Sex\",\n", + " \"HoursPerWeek\",\n", + "]\n", "\n", - "predictor_columns = ['Age', 'HoursPerWeek', 'WorkClass_Private', 'WorkClass_Self', 'WorkClass_Gov', \n", - " 'WorkClass_Other', 'Education_HS_grad', 'Education_Some_HS', 'Education_Assoc', 'Education_Some_college',\n", - " 'Education_Bachelors', 'Education_Adv_Degree', 'Education_No_HS', 'MartialStatus_Married_civ_spouse',\n", - " 'MartialStatus_Never_married', 'MartialStatus_Divorced', 'MartialStatus_Separated', 'MartialStatus_Widowed',\n", - " 'MartialStatus_Other', 'Relationship_Husband', 'Relationship_Not_in_family', 'Relationship_Own_child', 'Relationship_Unmarried',\n", - " 'Relationship_Wife', 'Relationship_Other_relative', 'Race_White', 'Race_Black', 'Race_Asian_Pac_Islander',\n", - " 'Race_Amer_Indian_Eskimo', 'Race_Other', 'Sex_Female']\n", + "predictor_columns = [\n", + " \"Age\",\n", + " \"HoursPerWeek\",\n", + " \"WorkClass_Private\",\n", + " \"WorkClass_Self\",\n", + " \"WorkClass_Gov\",\n", + " \"WorkClass_Other\",\n", + " \"Education_HS_grad\",\n", + " \"Education_Some_HS\",\n", + " \"Education_Assoc\",\n", + " \"Education_Some_college\",\n", + " \"Education_Bachelors\",\n", + " \"Education_Adv_Degree\",\n", + " \"Education_No_HS\",\n", + " \"MartialStatus_Married_civ_spouse\",\n", + " \"MartialStatus_Never_married\",\n", + " \"MartialStatus_Divorced\",\n", + " \"MartialStatus_Separated\",\n", + " \"MartialStatus_Widowed\",\n", + " \"MartialStatus_Other\",\n", + " \"Relationship_Husband\",\n", + " \"Relationship_Not_in_family\",\n", + " \"Relationship_Own_child\",\n", + " \"Relationship_Unmarried\",\n", + " \"Relationship_Wife\",\n", + " \"Relationship_Other_relative\",\n", + " \"Race_White\",\n", + " \"Race_Black\",\n", + " \"Race_Asian_Pac_Islander\",\n", + " \"Race_Amer_Indian_Eskimo\",\n", + " \"Race_Other\",\n", + " \"Sex_Female\",\n", + "]\n", "\n", "target_column = \"GE50K\"\n", "\n", @@ -643,8 +709,12 @@ "\n", "y = df[target_column]\n", "\n", - "x_train_full, x_test_full, y_train, y_test = train_test_split(x, y, test_size=.2, random_state=42)\n", - "x_train_full, x_val_full, y_train, y_val = train_test_split(x_train_full, y_train, test_size=.2, random_state=42)\n", + "x_train_full, x_test_full, y_train, y_test = train_test_split(\n", + " x, y, test_size=0.2, random_state=42\n", + ")\n", + "x_train_full, x_val_full, y_train, y_val = train_test_split(\n", + " x_train_full, y_train, test_size=0.2, random_state=42\n", + ")\n", "\n", "x_train = x_train_full[predictor_columns]\n", "x_test = x_test_full[predictor_columns]\n", @@ -666,7 +736,9 @@ "metadata": {}, "outputs": [], "source": [ - "dtc = DecisionTreeClassifier(max_depth=7, min_samples_split=2, min_samples_leaf=2, max_leaf_nodes=500)\n", + "dtc = DecisionTreeClassifier(\n", + " max_depth=7, min_samples_split=2, min_samples_leaf=2, max_leaf_nodes=500\n", + ")\n", "dtc = dtc.fit(x_train, y_train)" ] }, @@ -694,15 +766,20 @@ } ], "source": [ - "y_axis =np.array([\"Training\", \"Testing\", \"Validation\"])\n", - "x_axis = np.array([(dtc.score(x_train, y_train)), (dtc.score(x_test, y_test)), (dtc.score(x_val, y_val))])\n", + "y_axis = np.array([\"Training\", \"Testing\", \"Validation\"])\n", + "x_axis = np.array(\n", + " [\n", + " (dtc.score(x_train, y_train)),\n", + " (dtc.score(x_test, y_test)),\n", + " (dtc.score(x_val, y_val)),\n", + " ]\n", + ")\n", "\n", "fig, ax = plt.subplots()\n", - "p = ax.bar(x = y_axis, height = x_axis)\n", - "ax.bar_label(p, label_type='center')\n", - "ax.set_title('Decision Tree Accuarcy Across Each Set')\n", - "plt.show()\n", - "\n" + "p = ax.bar(x=y_axis, height=x_axis)\n", + "ax.bar_label(p, label_type=\"center\")\n", + "ax.set_title(\"Decision Tree Accuarcy Across Each Set\")\n", + "plt.show()" ] }, { @@ -738,15 +815,15 @@ "outputs": [], "source": [ "# Step 1: Update variables below to fit your needs\n", - "output_directory = 'outputs'\n", - "model_prefix = 'dtc'\n", + "output_directory = \"outputs\"\n", + "model_prefix = \"dtc\"\n", "model_object = dtc\n", - "target= \"GE50K\"\n", + "target = \"GE50K\"\n", "algorithm = \"Decision Tree\"\n", "description = \"SKLearn Decision Tree Model\"\n", - "assess_bias_var = 'Sex'\n", - "cat_columns = ['WorkClass', 'Education', 'MartialStatus', 'Relationship', 'Race', 'Sex']\n", - "interval_columns = ['Age', 'HoursPerWeek']\n", + "assess_bias_var = \"Sex\"\n", + "cat_columns = [\"WorkClass\", \"Education\", \"MartialStatus\", \"Relationship\", \"Race\", \"Sex\"]\n", + "interval_columns = [\"Age\", \"HoursPerWeek\"]\n", "mm_project = \"Salary Classification\"" ] }, @@ -767,8 +844,10 @@ "username = input(\"Username: \")\n", "password = getpass.getpass(\"Password: \")\n", "host = input(\"Viya Environment URL: \")\n", - "sess = Session(host, username, password, protocol=\"http\") # For TLS-enabled servers, change protocol value to \"https\"\n", - "conn = sess.as_swat() # Connect to SWAT through the sasctl authenticated connection\n" + "sess = Session(\n", + " host, username, password, protocol=\"http\"\n", + ") # For TLS-enabled servers, change protocol value to \"https\"\n", + "conn = sess.as_swat() # Connect to SWAT through the sasctl authenticated connection" ] }, { @@ -784,37 +863,42 @@ "metadata": {}, "outputs": [], "source": [ - "# Step 3: Create folder for output files. \n", + "# Step 3: Create folder for output files.\n", "output_path = Path.cwd() / output_directory / model_prefix\n", "if not os.path.exists(output_path):\n", " os.makedirs(output_path)\n", "\n", "# Step 4: Pickle model\n", "pzmm.PickleModel.pickle_trained_model(\n", - " model_prefix=model_prefix,\n", - " trained_model=model_object,\n", - " pickle_path=output_path)\n", + " model_prefix=model_prefix, trained_model=model_object, pickle_path=output_path\n", + ")\n", "\n", "# Step 5: Write input variables file\n", - "pzmm.JSONFiles.write_var_json(input_data=x[original_inputs], is_input=True, json_path=output_path)\n", + "pzmm.JSONFiles.write_var_json(\n", + " input_data=x[original_inputs], is_input=True, json_path=output_path\n", + ")\n", "\n", "# Step 6: Write output variables file\n", - "output_var = pd.DataFrame(columns=[\"EM_CLASSIFICATION\", \"EM_EVENTPROBABILITY\"], data=[[\"A\", 0.5]])\n", + "output_var = pd.DataFrame(\n", + " columns=[\"EM_CLASSIFICATION\", \"EM_EVENTPROBABILITY\"], data=[[\"A\", 0.5]]\n", + ")\n", "pzmm.JSONFiles.write_var_json(output_var, is_input=False, json_path=output_path)\n", "\n", "# Step 7: Write model properties files\n", "pzmm.JSONFiles.write_model_properties_json(\n", - " model_name=model_prefix, \n", - " target_variable=target, \n", - " target_values=[\"1\", \"0\"], \n", - " json_path=output_path, \n", + " model_name=model_prefix,\n", + " target_variable=target,\n", + " target_values=[\"1\", \"0\"],\n", + " json_path=output_path,\n", " model_desc=description,\n", " model_algorithm=algorithm,\n", " modeler=username,\n", ")\n", "\n", "# Step 8: Write file metadata file\n", - "pzmm.JSONFiles.write_file_metadata_json(model_prefix=model_prefix, json_path=output_path)\n" + "pzmm.JSONFiles.write_file_metadata_json(\n", + " model_prefix=model_prefix, json_path=output_path\n", + ")" ] }, { @@ -830,33 +914,45 @@ "metadata": {}, "outputs": [], "source": [ - "# Step 9: Score training, testing, and validation data \n", - "t1 = 'P_' + target + '1'\n", - "t0 = 'P_' + target + '0'\n", - "ti = 'I_'+ target\n", - "\n", - "train_scored = pd.DataFrame({t1: model_object.predict_proba(x_train)[:,1], \n", - " t0: model_object.predict_proba(x_train)[:,0], \n", - " ti: model_object.predict(x_train), \n", - " target: y_train, \n", - " assess_bias_var: x_train_full[assess_bias_var], \n", - " 'Split': 'Train'})\n", - "\n", - "test_scored = pd.DataFrame({t1: model_object.predict_proba(x_test)[:,1], \n", - " t0: model_object.predict_proba(x_test)[:,0], \n", - " ti: model_object.predict(x_test),\n", - " target: y_test, \n", - " assess_bias_var: x_test_full[assess_bias_var], \n", - " 'Split': 'Testing'})\n", - "\n", - "val_scored = pd.DataFrame({t1: model_object.predict_proba(x_val)[:,1], \n", - " t0: model_object.predict_proba(x_val)[:,0], \n", - " ti: model_object.predict(x_val),\n", - " target: y_val, \n", - " assess_bias_var: x_val_full[assess_bias_var], \n", - " 'Split': 'Validation'})\n", - "\n", - "scored = pd.concat([train_scored, test_scored, val_scored])\n" + "# Step 9: Score training, testing, and validation data\n", + "t1 = \"P_\" + target + \"1\"\n", + "t0 = \"P_\" + target + \"0\"\n", + "ti = \"I_\" + target\n", + "\n", + "train_scored = pd.DataFrame(\n", + " {\n", + " t1: model_object.predict_proba(x_train)[:, 1],\n", + " t0: model_object.predict_proba(x_train)[:, 0],\n", + " ti: model_object.predict(x_train),\n", + " target: y_train,\n", + " assess_bias_var: x_train_full[assess_bias_var],\n", + " \"Split\": \"Train\",\n", + " }\n", + ")\n", + "\n", + "test_scored = pd.DataFrame(\n", + " {\n", + " t1: model_object.predict_proba(x_test)[:, 1],\n", + " t0: model_object.predict_proba(x_test)[:, 0],\n", + " ti: model_object.predict(x_test),\n", + " target: y_test,\n", + " assess_bias_var: x_test_full[assess_bias_var],\n", + " \"Split\": \"Testing\",\n", + " }\n", + ")\n", + "\n", + "val_scored = pd.DataFrame(\n", + " {\n", + " t1: model_object.predict_proba(x_val)[:, 1],\n", + " t0: model_object.predict_proba(x_val)[:, 0],\n", + " ti: model_object.predict(x_val),\n", + " target: y_val,\n", + " assess_bias_var: x_val_full[assess_bias_var],\n", + " \"Split\": \"Validation\",\n", + " }\n", + ")\n", + "\n", + "scored = pd.concat([train_scored, test_scored, val_scored])" ] }, { @@ -874,13 +970,13 @@ "source": [ "# Step 10: Write model statistics files\n", "pzmm.JSONFiles.calculate_model_statistics(\n", - " target_value=1, \n", - " prob_value=0.5, \n", - " train_data=train_scored[[target, ti, t1]], \n", - " test_data=test_scored[[target, ti, t1]],\n", - " validate_data=test_scored[[target, ti, t1]],\n", - " json_path=output_path\n", - " )" + " target_value=1,\n", + " prob_value=0.5,\n", + " train_data=train_scored[[target, ti, t1]],\n", + " test_data=test_scored[[target, ti, t1]],\n", + " validate_data=test_scored[[target, ti, t1]],\n", + " json_path=output_path,\n", + ")" ] }, { @@ -898,14 +994,14 @@ "source": [ "# Step 11: Assess Model Bias\n", "dfs = pzmm.JSONFiles.assess_model_bias(\n", - " score_table=test_scored,\n", - " actual_values=target, \n", - " sensitive_values=assess_bias_var, \n", - " prob_values=[t1, t0], \n", - " levels=['1', '0'], \n", - " json_path=output_path, \n", - " return_dataframes=True \n", - " )" + " score_table=test_scored,\n", + " actual_values=target,\n", + " sensitive_values=assess_bias_var,\n", + " prob_values=[t1, t0],\n", + " levels=[\"1\", \"0\"],\n", + " json_path=output_path,\n", + " return_dataframes=True,\n", + ")" ] }, { @@ -1612,30 +1708,37 @@ ], "source": [ "print(\"Group Metrics: \")\n", - "display(dfs['groupMetricsData'])\n", + "display(dfs[\"groupMetricsData\"])\n", "print(\"-------------------------------------------\")\n", "print(\"Max Differences: \")\n", - "display(dfs['maxDifferencesData'])\n", + "display(dfs[\"maxDifferencesData\"])\n", "print(\"-------------------------------------------\")\n", "print(\"Bias Metrics : \")\n", - "display(dfs['biasMetricsData'])\n", + "display(dfs[\"biasMetricsData\"])\n", "\n", "print(\"-------------------------------------------\")\n", - "y_axis =np.array([\"Male\", \"Female\"])\n", - "x_axis = np.array([(dfs['groupMetricsData']['_acc_'][0]), (dfs['groupMetricsData']['_acc_'][1])])\n", + "y_axis = np.array([\"Male\", \"Female\"])\n", + "x_axis = np.array(\n", + " [(dfs[\"groupMetricsData\"][\"_acc_\"][0]), (dfs[\"groupMetricsData\"][\"_acc_\"][1])]\n", + ")\n", "\n", "fig, ax = plt.subplots()\n", - "p = ax.bar(x = y_axis, height = x_axis)\n", - "ax.set_title('Model Accuracy')\n", + "p = ax.bar(x=y_axis, height=x_axis)\n", + "ax.set_title(\"Model Accuracy\")\n", "plt.show()\n", "\n", "print(\"-------------------------------------------\")\n", - "y_axis =np.array([\"Male\", \"Female\"])\n", - "x_axis = np.array([(dfs['groupMetricsData']['PREDICTED_EVENT'][0]), (dfs['groupMetricsData']['PREDICTED_EVENT'][1])])\n", + "y_axis = np.array([\"Male\", \"Female\"])\n", + "x_axis = np.array(\n", + " [\n", + " (dfs[\"groupMetricsData\"][\"PREDICTED_EVENT\"][0]),\n", + " (dfs[\"groupMetricsData\"][\"PREDICTED_EVENT\"][1]),\n", + " ]\n", + ")\n", "\n", "fig, ax = plt.subplots()\n", - "p = ax.bar(x = y_axis, height = x_axis)\n", - "ax.set_title('Predicted Probability for Salary > $50K')\n", + "p = ax.bar(x=y_axis, height=x_axis)\n", + "ax.set_title(\"Predicted Probability for Salary > $50K\")\n", "plt.show()" ] }, @@ -1652,19 +1755,21 @@ "metadata": {}, "outputs": [], "source": [ - "# Step 12: Generate Model Card Function \n", + "# Step 12: Generate Model Card Function\n", "train_predict = model_object.predict(x_train)\n", "\n", "pzmm.JSONFiles.generate_model_card(\n", - " model_prefix = model_prefix,\n", - " model_files = output_path,\n", - " algorithm = algorithm,\n", - " train_data = x_train_full[original_columns], # changed to x_train_full with original variables (non-OHE'd)\n", - " train_predictions = train_scored[ti],\n", - " target_type='classification',\n", + " model_prefix=model_prefix,\n", + " model_files=output_path,\n", + " algorithm=algorithm,\n", + " train_data=x_train_full[\n", + " original_columns\n", + " ], # changed to x_train_full with original variables (non-OHE'd)\n", + " train_predictions=train_scored[ti],\n", + " target_type=\"classification\",\n", " target_value=1,\n", - " class_vars=cat_columns, \n", - " interval_vars=interval_columns\n", + " class_vars=cat_columns,\n", + " interval_vars=interval_columns,\n", ")" ] }, @@ -1672,6 +1777,197 @@ "cell_type": "markdown", "metadata": {}, "source": [ +<<<<<<< Updated upstream:examples/pzmm_generate_complete_model_card.ipynb +======= + "I'm going to write the score code myself because I want to include all the data preprocessing we did earlier, but that is not a requirement. If you prefer that this score code be automatically written, I'll provide example code before the conclusion you can use instead. " + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "# Step 13: Write score code\n", + "sn = \"score_\" + model_prefix + \".py\"\n", + "sc = Path.cwd() / output_path / sn" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%writefile $sc\n", + "\n", + "import math\n", + "import pickle\n", + "import pandas as pd\n", + "import numpy as np\n", + "from pathlib import Path\n", + "\n", + "import settings\n", + "\n", + "with open(Path(settings.pickle_path) / \"dtc.pickle\", \"rb\") as pickle_model:\n", + " model = pickle.load(pickle_model)\n", + "\n", + "def score(Age, WorkClass, Education, MartialStatus, Relationship, Race, Sex, HoursPerWeek): \n", + " \"Output: EM_EVENTPROBABILITY, EM_CLASSIFICATION\" \n", + "\n", + " # Check if pickle file is loaded, load if unavailable\n", + " try:\n", + " global model\n", + " except NameError:\n", + " with open(settings.pickle_path + 'dtc.pickle', 'rb') as _pFile:\n", + " model = pickle.load(_pFile)\n", + "\n", + " # Encode WorkClass\n", + " WorkClass_Private = 0\n", + " WorkClass_Self = 0\n", + " WorkClass_Gov = 0 \n", + " WorkClass_Other = 0\n", + " if \"Private\" in WorkClass: WorkClass_Private = 1\n", + " elif \"Self-emp-not-inc\" in WorkClass: WorkClass_Self = 1\n", + " elif \"Self-emp-inc\" in WorkClass: WorkClass_Self = 1\n", + " elif \"Local-gov\" in WorkClass: WorkClass_Gov = 1\n", + " elif \"State-gov\" in WorkClass: WorkClass_Gov = 1\n", + " elif \"Federal-gov\" in WorkClass: WorkClass_Gov = 1\n", + " else: WorkClass_Other = 1\n", + "\n", + "\n", + " # Encode Education\n", + " Education_HS_grad = 0\n", + " Education_Some_HS = 0\n", + " Education_Assoc = 0\n", + " Education_Some_college = 0\n", + " Education_Bachelors = 0\n", + " Education_Adv_Degree = 0\n", + " Education_No_HS = 0\n", + "\n", + " if \"HS-grad\" in Education: Education_HS_grad = 1\n", + " elif \"11th\" in Education: Education_Some_HS = 1\n", + " elif \"10th\" in Education: Education_Some_HS = 1\n", + " elif \"9th\" in Education: Education_Some_HS = 1\n", + " elif \"12th\" in Education: Education_Some_HS = 1\n", + " elif \"Assoc-voc\" in Education: Education_Assoc = 1\n", + " elif \"Assoc-acdm\" in Education: Education_Assoc = 1\n", + " elif \"Some-college\" in Education: Education_Some_college = 1\n", + " elif \"Bachelors\" in Education: Education_Bachelors = 1\n", + " elif \"Masters\" in Education: Education_Adv_Degree = 1\n", + " elif \"Prof-school\" in Education: Education_Adv_Degree = 1\n", + " elif \"Doctorate\" in Education: Education_Adv_Degree = 1\n", + " else:Education_No_HS = 1\n", + " \n", + " # Encode MaritalStatus\n", + " MartialStatus_Married_civ_spouse = 0\n", + " MartialStatus_Never_married = 0\n", + " MartialStatus_Divorced = 0\n", + " MartialStatus_Separated = 0 \n", + " MartialStatus_Widowed = 0 \n", + " MartialStatus_Other = 0\n", + " if \"Married-civ-spouse\" in MartialStatus: MartialStatus_Married_civ_spouse = 1\n", + " elif \"Never-married\" in MartialStatus: MartialStatus_Never_married = 1\n", + " elif \"Divorced\" in MartialStatus: MartialStatus_Divorced = 1\n", + " elif \"Separated\" in MartialStatus: MartialStatus_Separated = 1\n", + " elif \"Widowed\" in MartialStatus: MartialStatus_Widowed = 1\n", + " else: MartialStatus_Other = 1\n", + " \n", + " # Encode Relationship\n", + " Relationship_Husband = 0\n", + " Relationship_Not_in_family = 0\n", + " Relationship_Own_child= 0\n", + " Relationship_Unmarried = 0 \n", + " Relationship_Wife = 0\n", + " Relationship_Other_relative = 0\n", + " if \"Husband\" in Relationship: Relationship_Husband = 1\n", + " elif \"Not-in-family\" in Relationship: Relationship_Not_in_family = 1\n", + " elif \"Own-child\" in Relationship: Relationship_Own_child = 1\n", + " elif \"Unmarried\" in Relationship: Relationship_Unmarried = 1\n", + " elif \"Wife\" in Relationship: Relationship_Wife = 1\n", + " else: Relationship_Other_relative = 1\n", + "\n", + " # Encode Race\n", + " Race_White = 0\n", + " Race_Black = 0\n", + " Race_Asian_Pac_Islander = 0\n", + " Race_Amer_Indian_Eskimo = 0\n", + " Race_Other = 0\n", + " if \"White\" in Race: Race_White = 1\n", + " elif \"Black\" in Race: Race_Black = 1\n", + " elif \"Asian-Pac-Islander\" in Race: Race_Asian_Pac_Islander = 1\n", + " elif \"Amer-Indian-Eskimo\" in Race: Race_Amer_Indian_Eskimo = 1\n", + " else: Race_Other = 1\n", + "\n", + " # Encode Sex\n", + " Sex_Female = 0\n", + " if \"Female\" in Sex: Sex_Female = 1\n", + "\n", + " try: \n", + " input_array = pd.DataFrame([[Age, HoursPerWeek, WorkClass_Private, WorkClass_Self, WorkClass_Gov, WorkClass_Other, \n", + " Education_HS_grad, Education_Some_HS, Education_Assoc, Education_Some_college, \n", + " Education_Bachelors, Education_Adv_Degree, Education_No_HS, \n", + " MartialStatus_Married_civ_spouse, MartialStatus_Never_married, \n", + " MartialStatus_Divorced, MartialStatus_Separated, MartialStatus_Widowed, \n", + " MartialStatus_Other, Relationship_Husband, Relationship_Not_in_family, \n", + " Relationship_Own_child, Relationship_Unmarried, Relationship_Wife, \n", + " Relationship_Other_relative, Race_White, Race_Black, Race_Asian_Pac_Islander, \n", + " Race_Amer_Indian_Eskimo, Race_Other, Sex_Female]], \n", + " columns = ['Age', 'HoursPerWeek', 'WorkClass_Private', 'WorkClass_Self', 'WorkClass_Gov', 'WorkClass_Other', \n", + " 'Education_HS_grad', 'Education_Some_HS', 'Education_Assoc', 'Education_Some_college', \n", + " 'Education_Bachelors','Education_Adv_Degree', 'Education_No_HS', \n", + " 'MartialStatus_Married_civ_spouse', 'MartialStatus_Never_married', \n", + " 'MartialStatus_Divorced', 'MartialStatus_Separated', 'MartialStatus_Widowed', \n", + " 'MartialStatus_Other', 'Relationship_Husband', 'Relationship_Not_in_family', \n", + " 'Relationship_Own_child', 'Relationship_Unmarried', 'Relationship_Wife', \n", + " 'Relationship_Other_relative', 'Race_White', 'Race_Black', 'Race_Asian_Pac_Islander', \n", + " 'Race_Amer_Indian_Eskimo', 'Race_Other','Sex_Female'], \n", + " dtype = float)\n", + " except ValueError:\n", + " input_array = pd.DataFrame([[1.0, Age, HoursPerWeek, WorkClass_Private, WorkClass_Self, WorkClass_Gov, WorkClass_Other, \n", + " Education_HS_grad, Education_Some_HS, Education_Assoc, Education_Some_college, \n", + " Education_Bachelors, Education_Adv_Degree, Education_No_HS, \n", + " MartialStatus_Married_civ_spouse, MartialStatus_Never_married, \n", + " MartialStatus_Divorced, MartialStatus_Separated, MartialStatus_Widowed, \n", + " MartialStatus_Other, Relationship_Husband, Relationship_Not_in_family, \n", + " Relationship_Own_child, Relationship_Unmarried, Relationship_Wife, \n", + " Relationship_Other_relative, Race_White, Race_Black, Race_Asian_Pac_Islander, \n", + " Race_Amer_Indian_Eskimo, Race_Other, Sex_Female]], \n", + " columns = ['const', 'Age', 'HoursPerWeek', 'WorkClass_Private', 'WorkClass_Self', 'WorkClass_Gov', 'WorkClass_Other', \n", + " 'Education_HS_grad', 'Education_Some_HS', 'Education_Assoc', 'Education_Some_college', \n", + " 'Education_Bachelors', 'Education_Adv_Degree', 'Education_No_HS', \n", + " 'MartialStatus_Married_civ_spouse', 'MartialStatus_Never_married', \n", + " 'MartialStatus_Divorced', 'MartialStatus_Separated', 'MartialStatus_Widowed', \n", + " 'MartialStatus_Other', 'Relationship_Husband','Relationship_Not_in_family', \n", + " 'Relationship_Own_child', 'Relationship_Unmarried', 'Relationship_Wife', \n", + " 'Relationship_Other_relative', 'Race_White', 'Race_Black', 'Race_Asian_Pac_Islander', \n", + " 'Race_Amer_Indian_Eskimo', 'Race_Other','Sex_Female'], \n", + " dtype = float)\n", + "\n", + " prediction = model.predict_proba(input_array).tolist()\n", + "\n", + " # Check for numpy values and convert to a CAS readable representation\n", + " if isinstance(prediction, np.ndarray):\n", + " prediction = prediction.tolist()\n", + "\n", + " if input_array.shape[0] == 1:\n", + " if prediction[0][1] > 0.5:\n", + " EM_CLASSIFICATION = \"1\"\n", + " else:\n", + " EM_CLASSIFICATION = \"0\"\n", + " return EM_CLASSIFICATION, prediction[0][1]\n", + " else:\n", + " df = pd.DataFrame(prediction)\n", + " proba = df[1]\n", + " classifications = np.where(df[1] > 0.5, '1', '0')\n", + " return pd.DataFrame({'EM_CLASSIFICATION': classifications, 'EM_EVENTPROBABILITY': proba})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ +>>>>>>> Stashed changes:examples/pzmm_generate_complete_mode_card.ipynb "To document the requirements for our score code, lets create a requirements file. Since scikit-learn is installed as scikit-learn but imported as sklearn, we're going to tweak the requirements file to make sure we are referencing scikit-learn correctly. " ] }, @@ -1720,12 +2016,15 @@ "requirements_json = pzmm.JSONFiles.create_requirements_json(output_path)\n", "\n", "import json\n", + "\n", "print(json.dumps(requirements_json, sort_keys=True, indent=4))\n", "\n", "for requirement in requirements_json:\n", - " if 'sklearn' in requirement['step']:\n", - " requirement['command'] = requirement[\"command\"].replace('sklearn', 'scikit-learn')\n", - " requirement['step'] = requirement['step'].replace('sklearn', 'scikit-learn')\n", + " if \"sklearn\" in requirement[\"step\"]:\n", + " requirement[\"command\"] = requirement[\"command\"].replace(\n", + " \"sklearn\", \"scikit-learn\"\n", + " )\n", + " requirement[\"step\"] = requirement[\"step\"].replace(\"sklearn\", \"scikit-learn\")\n", "\n", "print(json.dumps(requirements_json, sort_keys=True, indent=4))\n", "\n", @@ -1746,6 +2045,7 @@ "metadata": {}, "outputs": [], "source": [ +<<<<<<< Updated upstream:examples/pzmm_generate_complete_model_card.ipynb "# Step 14: Automatically generate score code and import model \n", "pzmm.ImportModel.import_model(\n", " model_files=output_path, # Where are the model files?\n", @@ -1763,6 +2063,65 @@ " preprocess_function=preprocess_function # What do we want to do to the data before we score it?\n", " )\n", " # Reinitialize the score_code variable when writing more than one model's score code\n", +======= + "# Step 15: Import model into SAS Model Manager\n", + "zipIOFile = pzmm.ZipModel.zip_files(\n", + " model_files=output_path, model_prefix=model_prefix, is_viya4=True\n", + ")\n", + "\n", + "mr.create_project(mm_project, \"Public\")\n", + "\n", + "mr.import_model_from_zip(model_prefix, mm_project, zipIOFile)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And now your model is available in SAS Model Manager where you can run the scoring test, update the model usage properties, add Key Performance Indicators (KPIs) thresholds, and run performance monitoring against the model. Managing the rest of the model lifecycle in SAS Model Manager will complete the rest of the model card.\n", + "\n", + "Instead of writing the score code manually and importing the model, you can run the following function to automatically generate the score code and import the model into SAS Model Manager in one step. Automatically generating the score code makes things easy, but manually writing allows greater customization and control. Only run the block below if you don't want to run steps 13 and 15. \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Alternate to Step 13 and Step 15: Automatically generate score code and import model\n", + "pzmm.ImportModel.import_model(\n", + " model_files=output_path, # Where are the model files?\n", + " model_prefix=model_prefix, # What is the model name?\n", + " project=mm_project, # What is the project name?\n", + " input_data=x_train_full[\n", + " [\n", + " \"Age\",\n", + " \"WorkClass\",\n", + " \"Education\",\n", + " \"MartialStatus\",\n", + " \"Relationship\",\n", + " \"Race\",\n", + " \"Sex\",\n", + " \"HoursPerWeek\",\n", + " ]\n", + " ], # What does example input data look like?\n", + " predict_method=[\n", + " dtc.predict_proba,\n", + " [int, int],\n", + " ], # What is the predict method and what does it return?\n", + " score_metrics=[\n", + " \"EM_CLASSIFICATION\",\n", + " \"EM_EVENTPROBABILITY\",\n", + " ], # What are the output variables?\n", + " overwrite_model=True, # Overwrite the model if it already exists?\n", + " target_values=[\"0\", \"1\"], # What are the expected values of the target variable?\n", + " target_index=1, # What is the index of the target value in target_values?\n", + " model_file_name=model_prefix + \".pickle\", # How was the model file serialized?\n", + " missing_values=False, # Does the data include missing values?\n", + ")\n", + "# Reinitialize the score_code variable when writing more than one model's score code\n", +>>>>>>> Stashed changes:examples/pzmm_generate_complete_mode_card.ipynb "pzmm.ScoreCode.score_code = \"\"" ] }, diff --git a/src/sasctl/pzmm/write_json_files.py b/src/sasctl/pzmm/write_json_files.py index 6e751781..a982dd06 100644 --- a/src/sasctl/pzmm/write_json_files.py +++ b/src/sasctl/pzmm/write_json_files.py @@ -165,7 +165,7 @@ def write_var_json( @staticmethod def generate_variable_properties( - input_data: Union[DataFrame, Series] + input_data: Union[DataFrame, Series], ) -> List[dict]: """ Generate a list of dictionaries of variable properties given an input dataframe. @@ -1192,7 +1192,6 @@ def bias_dataframes_to_json( def calculate_model_statistics( cls, target_value: Union[str, int, float], - prob_value: Union[int, float, None] = None, validate_data: Union[DataFrame, List[list], Type["numpy.ndarray"]] = None, train_data: Union[DataFrame, List[list], Type["numpy.ndarray"]] = None, test_data: Union[DataFrame, List[list], Type["numpy.ndarray"]] = None, @@ -1211,8 +1210,7 @@ def calculate_model_statistics( Datasets must contain the actual and predicted values and may optionally contain the predicted probabilities. If no probabilities are provided, a dummy probability dataset is generated based on the predicted values and normalized by - the target value. If a probability threshold value is not provided, the - threshold value is set at 0.5. + the target value. Datasets can be provided in the following forms, with the assumption that data is ordered as `actual`, `predict`, and `probability` respectively: @@ -1229,9 +1227,6 @@ def calculate_model_statistics( ---------- target_value : str, int, or float Target event value for model prediction events. - prob_value : int or float, optional - The threshold value for model predictions to indicate an event occurred. The - default value is 0.5. validate_data : pandas.DataFrame, list of list, or numpy.ndarray, optional Dataset pertaining to the validation data. The default value is None. train_data : pandas.DataFrame, list of list, or numpy.ndarray, optional @@ -1284,19 +1279,23 @@ def calculate_model_statistics( continue data = cls.stat_dataset_to_dataframe(data, target_value, target_type) + data["predict_proba2"] = 1 - data["predict_proba"] - conn.upload( + out = conn.upload( data, - casout={"name": "assess_dataset", "replace": True, "caslib": "Public"}, + casout={"caslib": "Public", "name": "assess_dataset", "replace": True}, ) + if target_type == "classification": - conn.percentile.assess( + output = conn.percentile.assess( table={"name": "assess_dataset", "caslib": "Public"}, - response="predict", - pVar="predict_proba", - event=str(target_value), - pEvent=str(prob_value) if prob_value else str(0.5), inputs="actual", + response="predict_proba", + event="1", + pvar="predict_proba2", + pevent="0", + includeLift=True, + cutstep=0.2, fitStatOut={"name": "FitStat", "replace": True, "caslib": "Public"}, rocOut={"name": "ROC", "replace": True, "caslib": "Public"}, casout={"name": "Lift", "replace": True, "caslib": "Public"}, @@ -1306,8 +1305,8 @@ def calculate_model_statistics( table={"name": "assess_dataset", "caslib": "Public"}, response="predict", inputs="actual", - fitStatOut={"name": "FitStat", "replace": True, "caslib": "Public"}, - casout={"name": "Lift", "replace": True, "caslib": "Public"}, + fitStatOut={"caslib": "Public", "name": "FitStat", "replace": True}, + casout={"caslib": "Public", "name": "Lift", "replace": True}, ) fitstat_dict = ( From 294ed96a19a2f0f136f1008cb1dd98cf9cde010a Mon Sep 17 00:00:00 2001 From: djm21 Date: Mon, 7 Apr 2025 17:32:05 -0700 Subject: [PATCH 2/2] fix: update write_json_files and examples to properly generate ROC chart (EDMMMX-12439) --- ...m_binary_classification_model_import.ipynb | 1064 +++-------------- .../pzmm_generate_complete_model_card.ipynb | 606 ++-------- src/sasctl/pzmm/write_json_files.py | 13 +- 3 files changed, 288 insertions(+), 1395 deletions(-) diff --git a/examples/pzmm_binary_classification_model_import.ipynb b/examples/pzmm_binary_classification_model_import.ipynb index aca38579..940787ab 100644 --- a/examples/pzmm_binary_classification_model_import.ipynb +++ b/examples/pzmm_binary_classification_model_import.ipynb @@ -111,7 +111,7 @@ } ], "source": [ - "hmeq_data = pd.read_csv(\"data/hmeq.csv\", sep=\",\")\n", + "hmeq_data = pd.read_csv(\"data/hmeq.csv\", sep= \",\")\n", "hmeq_data.shape" ] }, @@ -274,20 +274,9 @@ "metadata": { "Collapsed": "false" }, - "outputs": [ - { - "data": { - "image/png": "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LPLy8gAY9oOlOu7LL7+U2kt3d3eN5eqOIPqo7yawt7fHN998g6+//hrr16/HDz/8gKNHj8LGxgaPP/44Xn75ZURFReGFF16o85jqans4M+mjIRNCiEd9EERERERERERERJaMY7IRERERERERERGZqF5JNk9PT8hkMp0PXYOuVlRUYN68efDy8kKLFi3Qvn17TJkyRRo3QZcvvvgC/fv3h0KhQOvWrfHSSy+hqKhIb/wPP/yA4cOHo1WrVlAoFBgwYAA2b95cn+oREREREREREREZpd436To7O+Pdd9/VKvf09NR4rlKp8Morr0CpVGLAgAF47bXXUFxcjLS0NOzevRsHDhzQGmhwwYIFiI+Ph4eHB95++22UlpZi06ZNGDhwIHbv3g1fX1+N+D179iA4OBgtWrTAm2++CUdHR2zduhVjx47FhQsXMGPGjPpWk4iIiIiIiIiIqE71GpNNnUg7e/ZsnbHp6emYNGkSQkND8cUXX0gDDn7++eeIjo7GlClTsHLlSim+uLgYTz/9NDp16oTvv/8ezs7OAIAjR45gwIAB6NSpE3766SfY2DzohHf//n1069YNFy9exIEDB9C7d28AwK1bt9C/f3+cPXsWJ0+ehIeHh7HVJCIiIiIiIiIiMkiDj8m2evVqAMCiRYs0ZvSYOnUqOnXqhC+++EJjJrb09HTcv38fH374oZRgA4DevXsjNDQUx48fx759+6Ty7777Dr/++ivGjRsnJdiABz3tPvjgA9y7dw9r165twBoSEREREREREZG1q3eSraKiAhkZGVi4cCGWL1+OgwcPasXcvXsXBw8eRNeuXbV6kslkMgQGBqK8vByHDh2SytVT6QYFBWltLzg4GACQn59f73giIiIiIiIiIiJzq/eYbFevXkVkZKRGWb9+/bBx40Z07twZAPDrr79CpVLBy8tL5zbU5cXFxRg8eLD0fwcHB7Rr167WeDX1/3Xto127dnBwcNCIr6miogIVFRXSc5VKhevXr6Nt27YaPe+IqHESQqC0tBTt27eXbiOnv6hUKly+fBmOjo5s04gsANs0/dieEVkWtmf6sT0jsjyGtmn1SrJFRkZi8ODB6NmzJxwcHHDy5El88sknWL9+PYYOHYqjR4/C0dERt27dAgCN2z6rc3JyAgApTv3/xx57zKj4uvZRPb6mRYsWYe7cuXqXE5FluHDhAjp0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ZCIm2YiIiIiIiIiIiEzEJBsREREREREREZGJmGQjIiIiIiIiIiIyEZNsREREREREREREJmKSjYiIiIiIiIiIyERMshEREREREREREZmISTYiIiIiIiIiIiITMclGRERERERERERkIibZiIiIiIiIiIiITMQkGxERERERERERkYnMkmRLTk6GTCaDTCbDgQMHtJaXlJRg+vTp8PDwgFwuh6enJ95//32UlZXp3J5KpUJqaiq8vb1hb28PV1dXhIaG4vTp03qPQalUwt/fH46OjnByckJAQAB2795tjuoRERERERERERHVyuQk208//YSEhAQoFAqdy8vLy+Hv74+UlBR069YN7733Hrp27YqlS5fihRdewN27d7XWmTp1KmJjYyGEQGxsLEJCQvDVV1+hX79+KC4u1orPzMxESEgIjh8/joiICISHh+PYsWMIDAzEl19+aWoViYiIiIiIiIiIamVSkq2yshLh4eHo3bs3Ro8erTNmyZIlOHLkCOLi4qBUKrF48WIolUrExcXhhx9+QEpKikb8nj17kJaWBj8/PxQVFSE5ORnr16/Htm3bcP36dcTExGjE37hxA9OmTYOLiwuKioqQmpqK1NRUFBUVoW3btoiOjkZpaakp1SQiIiIiIiIiIqqVSUm2BQsW4NixY1izZg2aNWumtVwIgbS0NDg4OGDOnDkay+bMmQMHBwekpaVplK9evRoAkJSUBDs7O6n8xRdfxJAhQ5CTk4Pz589L5Vu2bMHNmzcxbdo0dOjQQSrv0KEDYmJi8Oeff+Lrr782pZpERERERERERES1qneSraioCAsWLEBCQgKefvppnTHFxcW4fPkyfH19tW4nVSgU8PX1xenTp3HhwgWpPC8vT1pWU3BwMAAgPz9fIx4AgoKCDIonIiIiIiIiIiIyt+b1WamiogITJ05E7969MXPmTL1x6vHTvLy8dC738vKCUqlEcXEx3N3dUV5ejitXrqBnz546e8apt1N9XLba9qErXlddKioqpOclJSUAHtwKW1lZqXc9dQwAyG1ErXHGqmu/VD/q15Wvr2Uw9HzxfBIREREREVFjUK8k20cffYTi4mL8+OOPOpNhardu3QIAODs761zu5OSkEWdsfF3r6IqvadGiRZg7d65WeU5ODlq2bKl3veqS+qoMijNUdna2WbdHmnJzcx/1IZAR6jpft2/frve2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nPoW0XXr1uGNN95AZmamzgQbAMhkMkRFRaGsrAxJSUkay5KSklBWVobJkydrlE+ZMgUAMGfOHNy7d08q37lzJ/Ly8hAUFAQPDw+pfMyYMXB2dkZqaiouXrwolV+8eBHLly+Hi4sLRo8ebXK9iYiIiBoTTnxAREREZOHmzZuHtWvXwsHBAV26dMH8+fO1YkaNGoXevXsDAGbOnInt27cjOTkZhw8fho+PD4qKipCTk4N+/frh3Xff1Vg3ICAAUVFRSEtLg4+PD0aMGIErV64gKysLbdq0QWpqqkZ869atsXz5coSFhcHHxwdjx44FAGRlZeHatWvIysqCo6Njg7wWRERERI8Kk2xEREREFu7s2bMAgLKyMixYsEBnjKenp5RkUygUyM/PR2JiIrZu3Yo9e/bAzc0NM2bMQEJCAuzt7bXWX7lyJby9vbFq1SosW7YMDg4OGD16NBYsWIDOnTtrxU+YMAEuLi5YuHAh0tPTIZPJ0KdPH8THx2PYsGFmqzsRERFRY8EkGxEREZGFy8jIQEZGhlHrODs7IyUlBSkpKQbF29jYIDY2FrGxsQbvIyQkBCEhIUYdFxEREZGl4phsREREREREREREJmKSjYiIiIiIiIiIyERMshEREREREREREZmISTYiIiIiIiIiIiITMclGRERERERERERkIibZiIiIiIiIiIiITMQkGxERERERERERkYmYZCMiIiIiIiIiIjIRk2xEREREREREREQmYpKNiIiIiIiIiIjIREyyERERERERERERmaj5oz4AIiIiIiIiInq4PGftMPs2zy4eYfZtElkS9mQjIiIiIiIiIiIyEZNsREREREREREREJmKSjYiIiIiIiIiIyERMshEREREREREREZmISTYiIiIiIiIiIiITMclGREREREREjcalS5fw6aefIigoCE8++STs7OzQrl07vPbaazh48KDOdUpKSjB9+nR4eHhALpfD09MT77//PsrKynTGq1QqpKamwtvbG/b29nB1dUVoaChOnz6t97iUSiX8/f3h6OgIJycnBAQEYPfu3WapMxE1DUYn2e7evYvp06fDz88P7du3R4sWLdCuXTv4+voiPT0dlZWVWuuwwSMiIiIiIiJDpKam4r333sPp06cRFBSEGTNmYNCgQdi+fTsGDhyIrKwsjfjy8nL4+/sjJSUF3bp1w3vvvYeuXbti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wyMiMgp75xIRERGZF5NsRERERFaIvXOJiIiIzItJNiIiIiIrxN65RERERObFPvpEREREREREREQmYpKNiIiIiIiIiIjIREyyERERERERERERmYhjshERERERERGRyTxn7TDLduTNBJb0B3omKlFRJcPZxSPMsl2ihsaebERERERERERERCZiko2IiIiIiIiIiMhETLIRERERERERERGZiEk2IiIiIiIiIiIiEzHJRkREREREREREZCIm2YiIiIiIiIiIiEzEJBsREREREREREZGJmGQjIiIiIiIiIiIyEZNsREREREREREREJmKSjYiIiIiIiIiIyERMshEREREREREREZmISTYiIiIiIiIiIiITMclGRERERERERERkIibZiIiIiIiIiIiITNT8UR8AERFRU+c5a4fZt3l28Qizb5OIiIiIiOqPPdmIiIiIiIiIiIhMxCQbERERERERERGRiZhkIyIiIiIiIiIiMhGTbERERERERERERCZiko2IiIiIiIiIiMhEnF2UiIjIAhk6Y6m8mcCS/kDPRCUqqmR1xnPWUiKqjblnS1a3UURERE0Be7IRERERERERERGZiEk2IiIiIiIiIiIiE/F2USIiIiIieqQMvaXdGLz9nYiIHjYm2YiIiIiIiIio0TL3eJAAE/HUMJrM7aI//PADhg8fjlatWkGhUGDAgAHYvHnzoz4sIqJ6YZtGRE0F2zMiakrYphFRbZpET7Y9e/YgODgYLVq0wJtvvglHR0ds3boVY8eOxYULFzBjxoxHfYhERAZjm0ZETQXbMyJqStimEVFdLL4n2/379zF58mTY2NigoKAAq1atwt///nf85z//QZcuXfDBBx/g3Llzj/owiYgMwjaNiJoKtmdE1JSwTSMiQ1h8T7bvvvsOv/76KyIjI9G7d2+p3NnZGR988AEiIiKwdu1afPTRR4/uIImIDMQ2jZqihhhHBeBYKo0d2zMiakrYphGRISw+yZaXlwcACAoK0loWHBwMAMjPz9e7fkVFBSoqKqTnt27dAgBcv34dlZWVte67srISt2/fRvNKG1SpzDcb0rVr18y2LfqL+nxdu3YNtra2j/pwmpTm98vNv02VwO3bqjrPV2lpKQBACGH2Y3gUHnabVv1z0RDnsbFRv6/M3W43ZsbW+am/mX9cmYa62NB3rHIbgfhnVej94VeoaCTn+eDs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Pw2trvdG9c/urVu3xP/8z/+Ifv36CVdXV9G8eXPh6Ogo+vfvL5YsWVLrhfbOnTvF4MGDhUKhEA4ODsLf31/k5ubqjT9x4oR4/fXXRZs2bYRcLhfe3t5ixYoVepNHN2/eFO+++65wd3cXtra24sknnxQzZszQ+jVOCCHy8vLEmDFjhJeXl3BychLNmzcX7dq1E6+88opQKpU6t1+fvyuZmZmib9++wt7eXjg7O4vhw4eLH3/8UW+8se+Jy5cvi0mTJonHH39c2NnZCS8vL5GUlKTxK6CufQAQ/fv31xvTVM4zPXyNpV2zFMa0v2rGfgbq83ebn2Pj6UuyCcFzZokeZVtmjddlQvz1vvf09BQ2NjbCxsZG2NraWs01Ws06tGnTRgAQzz77rN59NMXzb67vmDIhatysS0REREREREREREbhxAdEREREREREREQmYpKNiIiIiIiIiIjIREyyERERERERERERmYhJNiIiIiIiIiIiIhMxyUZERERERERERGQiJtmIiIiIiIiIiIhMxCQbERERERERERGRiZhkIyIiIiIiIiIiMhGTbERERERERERERCZiko2IiIiIiIiIiMhETLIRERERERERERGZiEk2IiIiIiIiIiIiEzHJRkREREREREREZCIm2YiIiIiIiIiIiEzEJBsREREREREREZGJmGQjIiIiIiIiIiIyEZNsREREREREREREJmKSjYiIiIiIiIiIyERMshEREREREREREZmISTayCK+88gpkMhmef/55VFVV1Rr7z3/+EzKZDE5OTjh37pxU/ssvv2DGjBno1asXWrduDblcjieeeAIvv/wy0tPTcf/+fb3bzMvLg0wmg0wmM1udiKhxGzJkiPS5Vz9atGiBxx9/HL169UJERATWrl2L27dv692Gp6en1jZ0PTw9PTXWO3v2rM646u3Wli1bDK7L7t27ERkZiaeeegoODg5QKBTo3LkzwsPDkZuba/B2SktL8Y9//AMvvfQS3N3d0bJlS9jb2+OJJ55AUFAQkpKS8Msvvxi8PSIiIiJz+fXXXzF79mw899xzeOyxx2BrawtnZ2f06tUL0dHRKCgo0IhPTEyETCbDkCFDTNqvv7+/dK22b98+g9erqKjAmjVr8Prrr6Njx45wdHSEXC7H448/Dn9/f3zwwQf48ccfda6bkZFh0DWmTCZDRkaGSfUjIwki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f/xxPPXUU3jhhRfg5OTU6DbKy8ubvBOpv/izxm9/+1tERUXh/fffR2pqKiIiIgyexO3duzfy8vJQUFCA7OxsHD58GOXl5RAEAf3798ezzz6LefPmISQkpMl9hYeH45lnnsG2bduQn5+P//u//8MPP/wAQRDQt29fTJw4ERMmTMDcuXPF8TCJqONo7xsGfn5+jc70vmrVKqxatcqSQzFLKpUiOTkZCxcuFK/dTPHw8MCRI0cwa9YsfPvtt3j22WfRu3dvDB48GFqtFuXl5bh79y66deuGFStWYP369RbNUk9E7aN79+5IT0/HH//4RyiVSnz11Vdisr1Xr14YNmwYxo8fj5deesnkBHf3799v8kn8+/fvIysrC0D9NZElbz7NnTsXf/rTn3D79m3s27cPL730krhMoVCgoqIC2dnZyM3NxXfffYeffvoJ9+/fR+/evTFmzBg8+eSTmDNnjvhEnCkajQalpaWN1uN3v/tdk3Ul25EIfAmYqEn79u3D888/j4ceekh88o2IiIioo5s0aZLR7MD6GwYeHh4W3TDw9vbGpUuXLNrfhQsX4O3tDQC4ePGixTNyJiUlITk52WCdhtsCgKysLCxYsADDhg0TJyN4UF1dHR577DGcOXPGYLumCIKAffv2Yc+ePTh69Cj+85//GNzw2LhxI1auXGlR/YmIiAAm2YgskpiYiLfeeguTJk1CUVFRe1eHiIiIiFqBTqfDwoULsX37djg6OuLAgQOc8ICIiCzG556JmnDixAls2bIFAMy+C09ERERE9s/BwQEff/wxFi5cCK1Wi+effx7FxcXtXS0iIrITfJKNyIxly5ZBpVLhp59+gk6nw8iRI/HNN980OfYSEREREdk3QRDw/vvv48aNG3BxccHy5cvFiRGIiIjMYZKNyIxJkybhyJEjePjhh/Hss8/i9ddfR58+fdq7WkRERERERETUATHJRkRERERERERE1EIck42IiIioE/D29oZEIjH5N2nSJKN4jUaDN998Ez4+PujZsycGDBiAxYsX49///rfZfXzyyScYO3YsZDIZ+vTpg6effhplZWVm47/99ltMnz4dvXv3hkwmw7hx47Bnzx5bHC4RERFRh9O9vSvQ0eh0Oly9ehUuLi6QSCTtXR0iaoIgCKipqcGAAQPg4MD7Bg9in0ZkX1rap7m5uWH58uVG5d7e3gafdTodnn32WahUKowbNw6zZs1CeXk5lEolCgsLcfToUbi7uxusk5qaioSEBHh5eeGVV15BTU0Ndu/ejfHjx6OwsBABAQEG8UVFRQgJCUHPnj3x4osvwsXFBfv27cOcOXNQWVmJFStWWHVs7M+I7Auv0cxjf0Zkfyzu0wQyUFlZKQDgH//4Z2d/lZWV7d19dEjs0/jHP/v8a06f5uXlJXh5eVkU+/HHHwsAhLCwMEGn04nlH3zwgQBAWLx4sUH8+fPnhe7duwtDhw4Vbt++LZafOHFCkEqlwogRI4S6ujqxXKvVCkOGDBGkUqlw4sQJsfz27dvC0KFDhR49eggXL1606vjYn/GPf/b5x2s0Y+zP+Mc/+/1rqk/jk2wPcHFxAQBUVlbC1dW10VitVov8/HwoFAo4Ojq2RfXISjxHHV9Lz1F1dTU8PT3F7y4ZsrRP43fFvvB82Rdrzldb9Wlbt24FAKxfv97gKYolS5bg7bffxieffIL33ntPnFF727ZtuH//Pl5//XW4ubmJ8aNHj0ZYWBiysrJw+PBhBAYGAgC++uor/PTTT1iwYAFGjx4txru5uWHNmjWIjIzE9u3b8cYbb1hcZ16j2Q7bp3FsH/M6Yn9mj9ifdVxs77ZnL21uaZ/GJNsD9Bearq6uFnV4vXr1gqura4f+x9CV8Rx1fLY6R3zU3jRL+zR+V+wLz5d9ac75am6fptFokJWVhatXr8LV1RX+/v74/e9/bxBz9+5dHDt2DMOGDYOXl5fRfoODg7FlyxYcP34cEydOBAAUFxcDABQKhdE+Q0JCkJWVhZKSEjHJ1lQ8AJSUlFh1bLxGsx22T+PYPua1ZX/WmbE/67jY3m3P3tq8qT6NSTYiIiKiTuL69etYsGCBQZm/vz927dqFIUOGAAB++ukn6HQ6+Pj4mNyGvry8vFxMspWXl8PZ2Rn9+/dvNF5P/9+m9tG/f384OzsbxJui0Wig0WjEz9XV1QDqL8a1Wm2j6+qXNxXXVbF9Gsf2Mc+atmH7EVFXxCQbERERUSewYMECTJw4ESNHjoSzszPOnz+Pd999Fzt37sSUKVNw6tQpuLi4oKqqCgAMXvtsSP9UhT5O/98PPfSQVfFN7aNhvCnr16/H2rVrjcrz8/PRq1evRtfVKygosCiuq2L7NI7tY54lbXPnzp02qAkRUcfCJBsRERFRJ5CUlGTwefTo0dixYwcAYOfOndi6dStiY2Pbo2rNEh8fb1Bf/VgoCoXCoterCgoKEBwcbBevnrQ1tk/j2D7mWdM2+qdPiYi6EibZiIiIiDqxJUuWYOfOnSgtLUVsbKz4dJm5J8n0P4wbPoXm5uZmdXxT++jTp0+j9ZZKpZBKpUbljo6OFic+rIntitg+jWP7mGdJ27DtiKgrcmjvChARERFR65HL5QAAtVoNABg8eDAcHBzMjolmajw1Hx8f1NbW4vr16xbHN1zW0PXr11FbW2t2TDgiIiIie8UkGxEREVEnduzYMQCAt7c3AMDJyQljx47FDz/8gEuXLhnECoKAgoICyGQyjBkzRiwPCgoCUD8e2oNUKpVBTHPiiYiIiDoDJtmIiIiI7Ny5c+dMDjJ+7tw5xMXFAQDmzp0rli9evBhA/bhngiCI5Vu2bEFFRQVeeuklODk5ieULFixA9+7dkZqaavAK6MmTJ7Fr1y6MGDECEyZMEMunTJmCwYMH49NPP8XJkyfF8qqqKqxbtw49evTA/PnzW37gRERERB0Ix2QjIiIisnO7d+/Gu+++i8DAQHh5eUEmk+H8+fPIzc2FVqtFfHw8AgMDxfiIiAjk5ORg165duHDhAoKCgvDjjz/i888/x6BBg/DWW28ZbH/o0KFITk5GQkICRo0ahVmzZqGmpga7d+8GAGzduhUODv+9d9u9e3colUqEhIQgMDAQL774IlxcXLBv3z5cunQJmzZtEp+sIyIiIuosmGSzgZHJKmjqJDbb3sUNM2y2LSIia9i6PwPYpxG1hcmTJ+Ps2bM4ceIEvv76a9y5cwdyuRzTp0/Hq6++CoVCYRDv4OCAgwcPYsOGDdi5cyfS09PRt29fvPzyy3jrrbfg7u5utI/XX38d3t7eeO+99/DBBx+gR48emDhxIlJSUuDn52eyTocPH0ZSUhJycnKg1Wrh6+uLtLQ0zJkzp9XaoiFeoxERmee9+gubb5P9JHV1TLIRERER2bmgoCCrxziTSqVISkpCUlKSxeu89NJLeOmllyyOHzt2LPLy8qyqFxEREZG94phsRERERERERERELcQkGxERERERERERUQsxyUZERERERERERNRCTLIRERERERERERG1EJNsRERERERERERELcQkGxERERERERERUQsxyUZERERERERERNRCTLIRERERERERERG1EJNsRERERERERERELcQkGxERERERERERUQsxyUZERERERERERNRCTLIRERERERERERG1EJNsRERERERERERELcQkGxERERERERERUQsxyUZERERERERERNRCTLIRERERERERERG1EJNsRERERERE1GH8/PPPeO+996BQKPDwww+jR48e6N+/P2bNmoVjx44ZxScnJ0MikZj9u3jxosn9qFQqBAUFwcXFBa6urpg8eTIKCwvN1uv8+fOYPXs25HI5nJycMGrUKHzwwQcQBMFWh05Edq57e1eAiIiIiIiISC8jIwNpaWkYMmQIFAoF3N3dUV5ejgMHDuDAgQP49NNPMWfOHKP1IiIi4O3tbVTeu3dvo7Ls7GyEh4fD3d0dkZGRAICcnBwEBwdjz549eP755w3iz5w5g/Hjx+PXX3/F7NmzMWDAAHzxxRd49dVXcebMGWRkZNji0InIzjHJRkRERERERB3G2LFjUVxcjKCgIIPyr7/+GlOmTMHSpUvx3HPPQSqVGiyPjIzEpEmTmtz+rVu3sGzZMsjlcpSVlWHgwIEAgLi4ODz++ONYunQpQkJC4OLiIq6zdOlSVFVVITc3F9OmTQMApKSkYOrUqcjMzMTcuXPx5JNPtvDIicje8XVRIqIHpKWlia8XHD161Gh5dXU1YmNj4eXlBalUCm9vb6xcuRK1tbUmt6fT6ZCRkQFfX184OTnB3d0dYWFhqKioMFsHa19fICIiIuos/vCHPxgl2ABg4sSJmDx5Mm7duoVTp041e/t79+7F7du3sWzZMjHBBgADBw5EdHQ0bty4gf3794vl58+fx6FDhzB58mQxwQYAPXr0QEpKCgBg69atza4PEXUeTLIRETXw/fffIykpCTKZzORytVqNoKAgpKenY/jw4XjttdcwbNgwbNq0CU899RTu3r1rtM6SJUsQExMDQRAQExOD0NBQfP755/D390d5eblRfHZ2NkJDQ3H27FlERkYiIiICp0+fRnBwMD777DObHzMRERGRvXB0dAQAdO9u/FLWoUOHkJaWhrfffhsHDhwwewO0uLgYAKBQKIyWhYSEAABKSkosip8wYQJkMplBPBF1XXxdlIjo/9FqtYiIiMDo0aPh4+OD7Oxso5iNGzfi5MmTiIuLw4YNG8Ty1atXIy0tDenp6YiPjxfLi4qKoFQqERgYiIKCAvTo0QMAMHfuXEyfPh3R0dFQqVRifHNeXyAiIiLqCi5fvowvv/wSHh4e8PX1NVqelJRk8Ll3797YvHkz5s+fb1Cuv8np4+NjtA19WcMboY3Fd+vWDYMGDcKZM2dw//59k8k/jUYDjUYjfq6urgZQf+2p1WpNH+z/o1/eVFxzSLvZfsKG1qhnW2rN9ibT7KXNLa0fk2xERP9PamoqTp8+jbKyMmzcuNFouSAIUCqVcHZ2RmJiosGyxMREvP/++1AqlQZJNv2rAykpKWKCDQCmTZuGSZMmIT8/H5cvX8bDDz8M4L+vL6xdu9bk6wvJycnYv3+/0cUiERERUWem1WoRHh4OjUaDtLQ0dOvWTVw2atQofPzxx5g0aRI8PDxw/fp1/O1vf8Mbb7yByMhI9O7dG88884wYX1VVBQBwc3Mz2o+rq6tBTFPx+nV0Oh1qamrQp08fo+Xr16/H2rVrjcrz8/PRq1cvSw4fBQUFFsVZY+NYm28Subm5tt9oO2iN9qbGdfQ2v3PnjkVxTLIREQEoKytDamoq3nzzTTzyyCMmY8rLy3H16lWEhIQYvU4qk8kQEBAAlUqFyspKeHp6Aqh/vUC/7EEhISEoLi5GSUkJwsPDxXjA/OsLycnJKCkpMZtka+6dUv0yqQPvaNoDe7njR/WsOV88p0RExnQ6HSIjI3Ho0CEsWrRIvG7SmzlzpsFnb29vREdHY8SIEQgODkZCQoJBkq2txcfHIzY2VvxcXV0NT09PKBQKMalnjlarRUFBAYKDg8VXZW1lZLKq6SArfZ8cYvNttqXWbG8yzV7aXP+7qilMshFRl6fRaDB//nyMHj0aq1atMhvX2KsC+nKVSoXy8nJ4enpCrVbj2rVrGDlypMHd1obxDbfb1D5MxT+opXdKU8bomoyxVme5o9kRdfQ7fmTIkvNl6V1SIqKuQqfTYeHChfj0008xb948fPjhhxavO2XKFAwZMgSnTp1CdXW1mNDSP5FWVVWFfv36Gayj/yHd8Km1hvGmVFdXQyKRmB3OQyqVGs2ECtSPL2dpUsGaWEtp6iQ23R6ADp0ksUZrtDc1rqO3uaV1Y5KNiLq8N954A+Xl5fjuu+9MJsP0LHlVoGGctfFNrWMq/kHNvVOqv4OUeNwBGp1tL7js/Y5mR2Qvd/yonjXny9K7pEREXYFOp8OCBQuwY8cOhIWFISsrCw4O1s3dJ5fL8eOPP+LOnTvitZCPjw+OHz+O8vJyoySbqRuejd3orKurw4ULFzBo0CCT47ERUdfCXoCIurQjR45g06ZNSE5OxsiRI9u7Oi3W0julGp3E5nc1mQRqPR39jh8ZsuR88XwSEdVrmGCbM2cOdu7c2ejNUFPUajVOnz4NmUwGuVwulgcFBWHXrl3Iz8/HuHHjDNbRT0gVFBRkEA/UvxmwevVqg/jDhw+Ls88TEVl3G4CIqBO5f/8+IiIi8NhjjxldMJliyasCDeOsjW9qHVPxRERERJ2N/hXRHTt24IUXXkB2drbZBFtNTQ3Onz9vVP7rr79i0aJFqKmpwezZsw2eMps9ezbc3NyQkZGBK1euiOVXrlxBZmYm5HK5wThvw4YNQ2BgIIqKipCXlyeW37t3T5wMKyoqqsXHTUT2j0+yEVGXVVtbKz7233Dmz4aefPJJAMD+/fvFCRHMjYn24OsFMpkMHh4euHDhAurq6owuDs29jmDN6wtEREREnc2bb76J7du3w9nZGUOHDsVbb71lFPPcc89h9OjRuHnzJoYPHw5/f3+MGDEC/fv3x7/+9S98+eWXuHLlCnx9ffH2228brNunTx9kZmYiPDwcfn5+mDNnDgAgJycHN2/eRE5OjtH4an/+858REBCA5557DnPmzIGHhwe++OILnD59GtHR0Rg/fnzrNQgR2Q0m2Yioy5JKpXj55ZdNLjt06BDKy8vxzDPPwN3dHd7e3vDx8cGAAQNQWloKtVptMMOoWq1GaWkpBg0aJM4sCtS/XrB7926UlpYiMDDQYB/61xEallv7+gIRERFRZ3Px4kUA9TdEU1NTTcZ4e3tj9OjR6Nu3L1599VV88803yM3Nxa1bt+Dk5IQRI0YgJiYG0dHRcHJyMlp/3rx5kMvlWLduHbZt2waJRIInnngCCQkJmDp1qlH8o48+imPHjiEhIQFffPEF1Go1hg4divfffx9Lly616fETkf1iko2IuiwnJycolUqTyyIjI1FeXo74+HiDZFdUVBTefPNNpKSkYMOGDWJ5SkoKamtrsWbNGoPtLF68GLt370ZiYiIKCgrEJ+by8vJQXFwMhUIBLy8vMX727NmIi4tDRkYGFi5ciIEDBwIw//oCERERUWeTlZWFrKwsi2JdXV2RmZnZrP2EhoYiNDTU4vhhw4Zh7969zdoXEXUNHJONiMgKq1atwqhRo5CWloaQkBDEx8cjJCQEaWlp8Pf3x/Llyw3iJ0+ejKioKBw6dAh+fn6Ii4vD/Pnz8dxzz6Fv377IyMgwiNe/vnDjxg34+flh2bJlWLZsGfz8/HDz5k38+c9/Njs9PBHRg9LS0iCRSCCRSHD06FGj5dXV1YiNjYWXlxekUim8vb2xcuVK1NbWmtyeTqdDRkYGfH194eTkBHd3d4SFhaGiosJsHVQqFYKCguDi4gJXV1dMnjwZhYWFNjtGIiIioo6CSTYiIivIZDKUlJRg+fLlOHv2LN555x2cO3cOK1asQGFhocnXEbZs2YLNmzcDADZv3ozc3FzMnDkT33zzDYYOHWoUP2/ePOTl5WH48OHYtm0bsrKy8MgjjyA/Px8vvPBCqx8jEXUO33//PZKSkgxebW9IPxteeno6hg8fjtdeew3Dhg3Dpk2b8NRTT+Hu3btG6yxZsgQxMTEQBAExMTEIDQ3F559/Dn9/f5PjVWZnZyM0NBRnz55FZGQkIiIicPr0aQQHB+Ozzz6z+TETERERtSe+LkpEZEJjrym4ubkhPT0d6enpFm3LwcEBMTExiImJsXj/1r6+QETUkFarRUREBEaPHg0fHx9kZ2cbxWzcuBEnT55EXFycwevvq1evRlpaGtLT0xEfHy+WFxUVQalUIjAw0OD197lz52L69OmIjo4Wx44EgFu3bmHZsmWQy+UoKysTX3+Pi4vD448/jqVLlyIkJIRP5xIREVGnwSfZiIiIiDqZ1NRUnD59Gh9//LHRzMYAIAgClEolnJ2dkZiYaLAsMTERzs7ORmNWbt26FUD9GJQNZ2SeNm0aJk2ahPz8fFy+fFks37t3L27fvo1ly5aJCTYAGDhwIKKjo3Hjxg3s37/fJsdLRERE1BEwyUZERETUiZSVlSE1NRVJSUl45JFHTMaUl5fj6tWrCAgIMHqdVCaTISAgABUVFaisrBTLi4uLxWUPCgkJAQCUlJQYxAOAQqGwKJ6IiIjI3vF1USIiIqJOQqPRYP78+Rg9ejRWrVplNk4/fpqPj4/J5T4+PlCpVCgvL4enpyfUajWuXbuGkSNHmnwyTr+dhuOyNbYPU/GmjkWj0Yifq6urAdS/CqvVas2up48BAKmD0GictZrar73QH0dnOR5bY/uYZ03bsP2IqCtiko2IiIiok3jjjTdQXl6O7777zmQyTK+qqgpA/RiTpri6uhrEWRvf1Dqm4h+0fv16rF271qg8Pz8fvXr1MrteQyljdBbFWSo3N9em22tvBQUF7V2FDo3tY54lbXPnzp02qAkRUcfCJBsRERFRJ3DkyBFs2rQJycnJGDlyZHtXp8Xi4+MRGxsrfq6uroanpycUCoWYpDNHq9WioKAAiccdoNFJbFan75NDbLat9qRvn+DgYDg6OrZ3dTocto951rSN/ulTIqKuxOokW3Z2Nr7++mt89913OHXqFO7du4dt27YhMjLSKDY5OdnkHUi9CxcuwNvb26hcpVJh3bp1KCsrg0QiwRNPPIGEhARMmTLF5HbOnz+PhIQEfPXVV1Cr1Rg6dCheeeUVvPLKK5BIbHdhRURERNQR3b9/HxEREXjsscewevXqJuP1T5eZe5JM/+NYH2dt/IPr9OvXr8n4B0mlUkilUqNyR0dHixMfGp0EmjrbXQt2toSLNW3ZFbF9zLOkbdh2RNQVWZ1kS0hIwKVLlyCXy+Hh4YFLly41uU5ERITJZFrv3r2NyrKzsxEeHg53d3cxcZeTk4Pg4GDs2bMHzz//vEH8mTNnMH78ePz666+YPXs2BgwYgC+++AKvvvoqzpw5g4yMDGsPkYiIiMiu1NbWiuObNZz5s6Enn3wSALB//35xQgRzY6I9OJ6aTCaDh4cHLly4gLq6OqNXUU2Nv+bj44Pjx4+jvLzcKMnW1JhwRERERPbI6iSbUqmEj48PvLy8sGHDBsTHxze5TmRkJCZNmtRk3K1bt7Bs2TLI5XKUlZWJ073HxcXh8ccfx9KlSxESEgIXFxdxnaVLl6Kqqgq5ubmYNm0agPqp5adOnYrMzEzMnTtXvKgkIiIi6oykUilefvllk8sOHTqE8vJyPPPMM3B3d4e3tzd8fHwwYMAAlJaWQq1WG8wwqlarUVpaikGDBsHT01MsDwoKwu7du1FaWorAwECDfahUKgAwKA8KCsKuXbuQn5+PcePGmYwPCgpq2YETERERdSAO1q4wdepUeHl5tUZdsHfvXty+fRvLli0TE2wAMHDgQERHR+PGjRvYv3+/WH7+/HkcOnQIkydPFhNsQP0d3JSUFADA1q1bW6WuRERERB2Fk5MTlEqlyb/x48cDqB/jTKlUYvTo0ZBIJIiKikJtba14zaSXkpKC2tpaLFq0yKB88eLFAIDExETcu3dPLM/Ly0NxcTEUCoXBNeLs2bPh5uaGjIwMXLlyRSy/cuUKMjMzIZfLMXPmTJu3BREREVF7aZOJDw4dOoRjx47BwcEBPj4+mDp1KpydnY3iiouLAQAKhcJoWUhICJKTk1FSUoL58+c3GT9hwgTIZDKUlJTY7kCIiIiIOolVq1bh4MGDSEtLw4kTJ+Dn54eysjLk5+fD398fy5cvN4ifPHkyoqKioFQq4efnhxkzZuDatWvIyclB3759jYbo6NOnDzIzMxEeHg4/Pz/MmTMHQP0wIDdv3kROTo7B2wlERERE9q5NkmxJSUkGn3v37o3NmzeLyTK9xsbn0Jc1HDuksfhu3bph0KBBOHPmDO7fv4/u3U0fqkajgUajET/rB+LVarXQarWNHpd+udRBaDTOWk3tlyynb0u2acfV0nPEc0tE1Dz6m5HJycnYt28fioqK4OHhgRUrViApKQlOTk5G62zZsgW+vr746KOPsHnzZjg7O2PmzJlITU3FkCFDjOLnzZsHuVyOdevWYdu2bQYTWk2dOrUtDpOIiIiozbRqkm3UqFH4+OOPMWnSJHh4eOD69ev429/+hjfeeAORkZHo3bs3nnnmGTFeP2OVqZmm9FO1N5zVqrF4/To6nQ41NTXo06ePyZj169ebnAE1Pz8fvXr1sug4U8boLIqzVG5urk23R0BBQUF7V4Ga0NxzdOfOHRvXhIioc8nKykJWVpbJZW5ubkhPT0d6erpF23JwcEBMTAxiYmIs3n9oaChCQ0MtjiciIiKyV62aZHtwnA1vb29ER0djxIgRCA4ORkJCgkGSrT3Ex8cjNjZW/FxdXQ1PT08oFAoxsWeOVqtFQUEBEo87QKOz3fTw3yeH2GxbXZ3+HAUHB3Ma8Q6qpedI//QpERERERERUXtqk9dFHzRlyhQMGTIEp06dQnV1tZjM0j+RVlVVZTTVu/6HdMOn1hrGm1JdXQ2JRNLoeB9SqRRSqdSo3NHR0eIf/BqdBJo62yXZmAyyPWvOJ7WP5p4jnlciIiIiIiLqCKyeXdRW5HI5AMNXvUyNu6Znavy1xuLr6upw4cIFDBo0yOx4bERERERERERERLbQLkk2tVqN06dPQyaTick2AAgKCgJQPx7ag1QqlUFMU/GHDx+GWq02iCciIiIiIiIiImoNrZZkq6mpwfnz543Kf/31VyxatAg1NTWYPXu2wVNms2fPhpubGzIyMnDlyhWx/MqVK8jMzIRcLjcY523YsGEIDAxEUVER8vLyxPJ79+4hMTERABAVFdUah0dERERERERERCSy+j1KpVKJw4cPAwBOnTollhUXFwMAJkyYgKioKNy8eRPDhw+Hv78/RowYgf79++Nf//oXvvzyS1y5cgW+vr54++23Dbbdp08fZGZmIjw8HH5+fpgzZw4AICcnBzdv3kROTo7R+Gp//vOfERAQgOeeew5z5syBh4cHvvjiC5w+fRrR0dEYP3681Y1CRERERERERERkDauTbIcPH8b27dsNykpLS1FaWip+joqKQt++ffHqq6/im2++QW5uLm7dugUnJyeMGDECMTExiI6OhpOTk9H2582bB7lcjnXr1mHbtm2QSCR44oknkJCQgKlTpxrFP/roozh27BgSEhLwxRdfQK1WY+jQoXj//fexdOlSaw+PiIiIiIiIiIjIalYn2bKyspCVldVknKurKzIzM5tTJ4SGhiI0NNTi+GHDhmHv3r3N2hcREREREREREVFLtdvsokRERERERERERJ0Fk2xEREREREREREQtxCQbERERERERERFRCzHJRkRERERERB3Gzz//jPfeew8KhQIPP/wwevTogf79+2PWrFk4duyYyXWqq6sRGxsLLy8vSKVSeHt7Y+XKlaitrTUZr9PpkJGRAV9fXzg5OcHd3R1hYWGoqKgwWy+VSoWgoCC4uLjA1dUVkydPRmFhoU2OmYg6BybZiIiIiIiIqMPIyMjAa6+9hoqKCigUCqxYsQITJkzAwYMHMX78eOTk5BjEq9VqBAUFIT09HcOHD8drr72GYcOGYdOmTXjqqadw9+5do30sWbIEMTExEAQBMTExCA0Nxeeffw5/f3+Ul5cbxWdnZyM0NBRnz55FZGQkIiIicPr0aQQHB+Ozzz5rtbYgIvti9eyiRERERERERK1l7NixKC4uRlBQkEH5119/jSlTpmDp0qV47rnnIJVKAQAbN27EyZMnERcXhw0bNojxq1evRlpaGtLT0xEfHy+WFxUVQalUIjAwEAUFBejRowcAYO7cuZg+fTqio6OhUqnE+Fu3bmHZsmWQy+UoKyvDwIEDAQBxcXF4/PHHsXTpUoSEhMDFxaXV2oSI7AOfZCMiIiIiIqIO4w9/+INRgg0AJk6ciMmTJ+PWrVs4deoUAEAQBCiVSjg7OyMxMdEgPjExEc7OzlAqlQblW7duBQCkpKSI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IiIiIiIiaiEm2YiIiIiIiIiIiFqISTYiIiIiIiIiIqIW6t7eFSAios7Ne/UXNt/mxQ0zbL5NIiIiIiKilmCSjaiFWiOBADCJQERERERERGRP+LooERERERERERFRCzHJRkRERERERERE1EJMshEREREREREREbUQk2xEREREREREREQtxCQbERERERERERFRCzHJRkRERERERERE1EJMshEREREREREREbUQk2xEREREREREREQt1L29K0BEREREZA+8V3/RKtu9uGFGq2yXiIiI2hafZCMiIiIiIiIiImohPslGRERERNSOWuMJOT4dR0SdCftJshdMshF1UPwfCREREREREZH9YJKNiIjsDsdFIiIiIiKijoZjshEREREREREREbVQp0myffvtt5g+fTp69+4NmUyGcePGYc+ePe1dLSKiZmGfRkSdBfszIupM2KcRUWM6xeuiRUVFCAkJQc+ePfHiiy/CxcUF+/btw5w5c1BZWYkVK1a0dxWJiCzGPo2IOgv2Z0TUmbBPI6Km2P2TbPfv38eiRYvg4OCAQ4cO4aOPPsI777yDf/7znxg6dCjWrFmDS5cutXc1iYgswj6NiDoL9mdE1JmwTyMiS9j9k2xfffUVfvrpJyxYsACjR48Wy93c3LBmzRpERkZi+/bteOONN9qvkkREFmKf1r44oQKR7bA/I6LOhH0aEVnC7pNsxcXFAACFQmG0LCQkBABQUlLSllUi6rCYQOj42KcRUWfB/qx9Nfb/fGk3ARvHAiOTVdDUSdqwVubxWoI6OvZpZCn+5ura7D7JVl5eDgDw8fExWta/f384OzuLMaZoNBpoNBrxc1VVFQDgl19+gVarbXTfWq0Wd+7cQXetA+p0HeMChQx11wm4c0fHc9TKfven5g/2KnUQkPC4DqNf/xyaB87RsfgpTa5fU1MDABAEodl16Ejaq09jf9a6WvIdMaWx701XYkkf0RHov183b96Eo6Njo7GdqU/jNVrH1RGvj27evNneVRBZ853tarpqfwa0rE9jf9Yxmbo+s8U1VmslWTpSP2lL9tLnWtqn2X2STd9Bubm5mVzu6uoqxpiyfv16rF271qh80KBBtqkgtbu57V0BapK5cyR/x/Jt1NTUmO0H7An7NLIU+zbr+gh70xn6NPZnHVtH60M68/e5q+sM/RnQsj6N/Zl96Wj9ox77yY6h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OwoMDNTWrVu1cOFCdevWzSqmU6dOevjhh/XJJ58oOzvbKedNTExUXFycjh07pt/97nd27XvlyhWNGTNG58+fV//+/bVr1y7LK2f1unTpoqysLK1du1aStHLlShUWFjql7gDaRmBgoBITE/Xuu+8qJydHkrR8+XK774da69Zbb9WyZcskSSdOnND+/fvb5Lz1JkyYIOnq02yGYdi1r7v6dgCAdyPJBo9wyy23aMKECTIMQxkZGU49dmRkpH75y19Kkn71q1+ptra2xfv+7ne/0zfffKPw8HD94Q9/UPv2jb9hnZ6errvvvlt1dXXKyspytNoAvEBVVZUlwf7cc8/pvvvuazLeZDJp3rx5Tjl3hw4dtGDBAklSTk6OLly40OJ9CwsLtX//fgUEBGjt2rUKCwtrNPaxxx7TY489JknKzMxscg44AJ4rIyNDw4cPlyRL39EWrp1H7fLly212Xulqv9ylSxft27dP69evb/F+7uzbAQDejSQbPMaCBQsUFBSkoqKiVs+d0ZjZs2fre9/7ng4cOKA1a9a0eL833nhD0tUn7aKiopqMNZlM+sUvfiFJ2r59u/7xj3+0vsIAvMKWLVt09uxZBQQEKC0trc3PP378ePXt21enT5/Wiy++2OL96vu2lJQU3Xzzzc3G1881+be//U1//vOfW1VXAO5X30/95S9/0bFjx9rknB999JGkqwMDrph3tymdO3e2DN7Onz9fNTU1LdrP3X07AMB7kWSDx4iJidFTTz0lSZo7d65Tjx0aGmoZYczKylJ1dXWz+5w9e1Z//etfJckyUW9zrh3pLC0tbUVNAXiT+lfDb7311iYnC3eVgIAAyytgeXl5LU7u19e7pX3bgAEDLE+70bcB3uvee++1vBa+e/dul52ntrZWJ0+etCxqJV0d8IyIiHDZORsza9Ysff/739dXX32llStXtmgfd/ftAADvRZINHuX5559XeHi4Pv74Y23atMmpx54+fbp69uyp48ePa8WKFc3GnzhxwvL/LR15jYqKstxAXrs/AN9U/znv1auX2+rwH//xHxo0aJAqKytbNCdQRUWFKioqJLW8bwsICLC0kb4N8F6dO3dWeHi4JOmbb75psH3y5MkymUyNfjW1gnrPnj0tce3bt9f3v/99TZkyRdHR0Xr99dctr1+2tY4dO1qm8cjOzlZVVVWz+3hC3w4A8E4k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ZMkopx8TAAAAQOvxJBsAAAAAAADgIJJsAAAAAAAAgINIsgEAAAAAAAAOIskGAAAAAAAAOIgkGwAAAAAAAOAgkmwAAAAAAACAg0iyAQAAAAAAAA4iyQYAAAAAAAA4iCQbAAAAAAAA4CCSbAAAAAAAAICDSLIBAAAAAAAADiLJBgAAAAAAADiIJBsAAAAAAADgIJJsAAAAAAAAgINIsgEAAAAAAAAOIskGAAAAAAAAOIgkGwDYIS4uTiaTyebXkCFDGsRXV1dr4cKFio+PV8eOHdW9e3dNmzZN//jHPxo9xx//+EcNHDhQISEh6tKli3784x+rrKzMha0CAAAAADiqvbsrAADeJiIiQk8//XSD8ri4OKvv6+rq9JOf/ERms1l33XWXHn74YZWXl6ugoEDbt2/Xnj17FBUVZbXPokWLNG/ePMXGxurnP/+5Lly4oPXr1+uee+7R9u3bNWjQIBe2DAAAAADQWiTZPFDc3PdcctwjS0a55LiAv+ncubOysrKajVuzZo3MZrPGjRunP/7xjzKZTJKk3//+95oxY4bmzZunV1991RJfXl6urKws3XTTTfr4448VEREhSXryySd11113aerUqfr8888VEMBDyAAAAADgafhLDQBcZOXKlZKkxYsXWxJskjR9+nT16tVLf/zjH/Xdd99ZyletWqUrV67oV7/6lSXBJkm33367xo0bpwMHDmjXrl1t1wAAAAAAQIuRZAMAO1VXV2v16tXKycnRihUr9NFHHzWIuXTpkj766CP16dNHsbGxVttMJpNGjBihqqoqffrpp5by4uJiSVJycnKD46WkpEiSSkpKnNgSAAAAAICz8LooANjp66+/1uTJk63KBgwYoDfffFO9e/eWJH311Veqq6tTfHy8zWPUl5eXl+vee++1/H9oaKi6devWZHxTqqurVV1dbfm+oqJCklRTU6OamppG96vf1lRMawW1M5x+TGcICjCs/uttWnOtXHmdPZW3tdlb6gkAAICG7E6yrVu3Th9++KH+/Oc/67PPPtPly5e1atUqTZo0yWZ8RUWFsrKytGnTJn399deKjo7Wo48+qszMTIWGhjaIr6ur08svv6zXXntNBw8eVGhoqIYPH65FixapV69eNs9hNpuVk5OjsrIymUwm3XnnnZo3b56GDRtmb/MAoEmTJ0/Wvffeq759+yo0NFRffvmlfvvb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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ - "hmeq_data.hist(figsize=(15, 15), layout=(4, 4));" + "hmeq_data.hist(figsize=(15,15), layout=(4, 4));" ] }, { @@ -331,26 +320,13 @@ }, "outputs": [], "source": [ - "predictor_columns = [\n", - " \"LOAN\",\n", - " \"MORTDUE\",\n", - " \"VALUE\",\n", - " \"YOJ\",\n", - " \"DEROG\",\n", - " \"DELINQ\",\n", - " \"CLAGE\",\n", - " \"NINQ\",\n", - " \"CLNO\",\n", - " \"DEBTINC\",\n", - "]\n", + "predictor_columns = [\"LOAN\", \"MORTDUE\", \"VALUE\", \"YOJ\", \"DEROG\", \"DELINQ\", \"CLAGE\", \"NINQ\", \"CLNO\", \"DEBTINC\"]\n", "\n", "target_column = \"BAD\"\n", "x = hmeq_data[predictor_columns]\n", "y = hmeq_data[target_column]\n", "\n", - "x_train, x_test, y_train, y_test = train_test_split(\n", - " x, y, test_size=0.3, random_state=42\n", - ")" + "x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=42)" ] }, { @@ -383,28 +359,13 @@ }, "outputs": [], "source": [ - "dtc = DecisionTreeClassifier(\n", - " max_depth=7, min_samples_split=2, min_samples_leaf=2, max_leaf_nodes=500\n", - ")\n", + "dtc = DecisionTreeClassifier(max_depth=7, min_samples_split=2, min_samples_leaf=2, max_leaf_nodes=500)\n", "dtc = dtc.fit(x_train, y_train)\n", "\n", - "rfc = RandomForestClassifier(\n", - " n_estimators=120,\n", - " max_depth=9,\n", - " max_leaf_nodes=850,\n", - " min_samples_split=5,\n", - " min_samples_leaf=4,\n", - ")\n", + "rfc = RandomForestClassifier(n_estimators=120, max_depth=9, max_leaf_nodes=850, min_samples_split=5, min_samples_leaf=4)\n", "rfc = rfc.fit(x_train, y_train)\n", "\n", - "gbc = GradientBoostingClassifier(\n", - " learning_rate=0.1,\n", - " n_estimators=600,\n", - " max_depth=4,\n", - " min_samples_leaf=1,\n", - " min_samples_split=2,\n", - " max_leaf_nodes=500,\n", - ")\n", + "gbc = GradientBoostingClassifier(learning_rate=0.1, n_estimators=600, max_depth=4, min_samples_leaf=1, min_samples_split=2, max_leaf_nodes=500)\n", "gbc = gbc.fit(x_train, y_train)" ] }, @@ -416,13 +377,11 @@ }, "outputs": [], "source": [ - "# Calculate the importance of a predictor\n", + "# Calculate the importance of a predictor \n", "def sort_feature_importance(model, data):\n", " features = {}\n", - " for importance, name in sorted(\n", - " zip(model.feature_importances_, data.columns), reverse=True\n", - " ):\n", - " features[name] = str(np.round(importance * 100, 2)) + \"%\"\n", + " for importance, name in sorted(zip(model.feature_importances_, data.columns), reverse=True):\n", + " features[name] = str(np.round(importance*100, 2)) + \"%\"\n", " return features" ] }, @@ -462,63 +421,63 @@ " \n", " \n", " DEBTINC\n", - " 58.35%\n", - " 34.74%\n", - " 39.53%\n", - " \n", - " \n", - " DELINQ\n", - " 18.57%\n", - " 15.89%\n", - " 12.29%\n", + " 36.16%\n", + " 26.14%\n", + " 51.18%\n", " \n", " \n", " CLAGE\n", - " 8.07%\n", - " 9.27%\n", - " 10.37%\n", + " 12.6%\n", + " 10.87%\n", + " 7.76%\n", " \n", " \n", - " DEROG\n", - " 4.86%\n", - " 9.38%\n", - " 6.32%\n", + " DELINQ\n", + " 12.18%\n", + " 9.82%\n", + " 14.68%\n", " \n", " \n", " VALUE\n", - " 3.07%\n", - " 5.51%\n", - " 7.33%\n", + " 7.16%\n", + " 9.42%\n", + " 4.77%\n", + " \n", + " \n", + " LOAN\n", + " 6.97%\n", + " 8.98%\n", + " 3.54%\n", " \n", " \n", " YOJ\n", - " 2.7%\n", - " 3.67%\n", - " 3.77%\n", + " 6.75%\n", + " 6.88%\n", + " 2.04%\n", " \n", " \n", " MORTDUE\n", - " 1.59%\n", - " 5.04%\n", - " 6.38%\n", + " 6.15%\n", + " 8.46%\n", + " 2.03%\n", " \n", " \n", - " NINQ\n", - " 1.41%\n", - " 3.92%\n", - " 2.78%\n", + " CLNO\n", + " 5.97%\n", + " 8.16%\n", + " 4.2%\n", " \n", " \n", - " CLNO\n", - " 1.2%\n", - " 5.77%\n", - " 5.85%\n", + " DEROG\n", + " 3.46%\n", + " 6.47%\n", + " 7.65%\n", " \n", " \n", - " LOAN\n", - " 0.17%\n", - " 6.79%\n", - " 5.37%\n", + " NINQ\n", + " 2.59%\n", + " 4.8%\n", + " 2.15%\n", " \n", " \n", "\n", @@ -526,16 +485,16 @@ ], "text/plain": [ " DecisionTree RandomForest GradientBoosting\n", - "DEBTINC 58.35% 34.74% 39.53%\n", - "DELINQ 18.57% 15.89% 12.29%\n", - "CLAGE 8.07% 9.27% 10.37%\n", - "DEROG 4.86% 9.38% 6.32%\n", - "VALUE 3.07% 5.51% 7.33%\n", - "YOJ 2.7% 3.67% 3.77%\n", - "MORTDUE 1.59% 5.04% 6.38%\n", - "NINQ 1.41% 3.92% 2.78%\n", - "CLNO 1.2% 5.77% 5.85%\n", - "LOAN 0.17% 6.79% 5.37%" + "DEBTINC 36.16% 26.14% 51.18%\n", + "CLAGE 12.6% 10.87% 7.76%\n", + "DELINQ 12.18% 9.82% 14.68%\n", + "VALUE 7.16% 9.42% 4.77%\n", + "LOAN 6.97% 8.98% 3.54%\n", + "YOJ 6.75% 6.88% 2.04%\n", + "MORTDUE 6.15% 8.46% 2.03%\n", + "CLNO 5.97% 8.16% 4.2%\n", + "DEROG 3.46% 6.47% 7.65%\n", + "NINQ 2.59% 4.8% 2.15%" ] }, "execution_count": 11, @@ -544,15 +503,9 @@ } ], "source": [ - "importances = pd.DataFrame.from_dict(\n", - " sort_feature_importance(dtc, x_train), orient=\"index\"\n", - ").rename(columns={0: \"DecisionTree\"})\n", - "importances[\"RandomForest\"] = pd.DataFrame.from_dict(\n", - " sort_feature_importance(rfc, x_train), orient=\"index\"\n", - ")\n", - "importances[\"GradientBoosting\"] = pd.DataFrame.from_dict(\n", - " sort_feature_importance(gbc, x_train), orient=\"index\"\n", - ")\n", + "importances = pd.DataFrame.from_dict(sort_feature_importance(dtc, x_train), orient=\"index\").rename(columns={0: \"DecisionTree\"})\n", + "importances[\"RandomForest\"] = pd.DataFrame.from_dict(sort_feature_importance(rfc, x_train), orient=\"index\")\n", + "importances[\"GradientBoosting\"] = pd.DataFrame.from_dict(sort_feature_importance(gbc, x_train), orient=\"index\")\n", "importances" ] }, @@ -567,18 +520,18 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[1428 13]\n", - " [ 279 68]]\n", + "[[1427 14]\n", + " [ 272 75]]\n", " precision recall f1-score support\n", "\n", " 0 0.84 0.99 0.91 1441\n", - " 1 0.84 0.20 0.32 347\n", + " 1 0.84 0.22 0.34 347\n", "\n", " accuracy 0.84 1788\n", - " macro avg 0.84 0.59 0.61 1788\n", - "weighted avg 0.84 0.84 0.79 1788\n", + " macro avg 0.84 0.60 0.63 1788\n", + "weighted avg 0.84 0.84 0.80 1788\n", "\n", - "Decision Tree Model Accuracy = 83.67%\n" + "Decision Tree Model Accuracy = 84.0%\n" ] } ], @@ -587,11 +540,7 @@ "y_dtc_proba = dtc.predict_proba(x_test)\n", "print(confusion_matrix(y_test, y_dtc_predict))\n", "print(classification_report(y_test, y_dtc_predict))\n", - "print(\n", - " \"Decision Tree Model Accuracy = \"\n", - " + str(np.round(dtc.score(x_test, y_test) * 100, 2))\n", - " + \"%\"\n", - ")" + "print(\"Decision Tree Model Accuracy = \" + str(np.round(dtc.score(x_test, y_test)*100,2)) + \"%\")" ] }, { @@ -606,17 +555,17 @@ "output_type": "stream", "text": [ "[[1440 1]\n", - " [ 254 93]]\n", + " [ 246 101]]\n", " precision recall f1-score support\n", "\n", " 0 0.85 1.00 0.92 1441\n", - " 1 0.99 0.27 0.42 347\n", + " 1 0.99 0.29 0.45 347\n", "\n", " accuracy 0.86 1788\n", - " macro avg 0.92 0.63 0.67 1788\n", - "weighted avg 0.88 0.86 0.82 1788\n", + " macro avg 0.92 0.65 0.69 1788\n", + "weighted avg 0.88 0.86 0.83 1788\n", "\n", - "Random Forest Model Accuracy = 85.74%\n" + "Random Forest Model Accuracy = 86.19%\n" ] } ], @@ -625,11 +574,7 @@ "y_rfc_proba = rfc.predict_proba(x_test)\n", "print(confusion_matrix(y_test, y_rfc_predict))\n", "print(classification_report(y_test, y_rfc_predict))\n", - "print(\n", - " \"Random Forest Model Accuracy = \"\n", - " + str(np.round(rfc.score(x_test, y_test) * 100, 2))\n", - " + \"%\"\n", - ")" + "print(\"Random Forest Model Accuracy = \" + str(np.round(rfc.score(x_test, y_test)*100,2)) + \"%\")" ] }, { @@ -661,11 +606,7 @@ "y_gbc_proba = gbc.predict_proba(x_test)\n", "print(confusion_matrix(y_test, y_gbc_predict))\n", "print(classification_report(y_test, y_gbc_predict))\n", - "print(\n", - " \"Gradient Boosting Model Accuracy = \"\n", - " + str(np.round(gbc.score(x_test, y_test) * 100, 2))\n", - " + \"%\"\n", - ")" + "print(\"Gradient Boosting Model Accuracy = \" + str(np.round(gbc.score(x_test, y_test)*100,2)) + \"%\")" ] }, { @@ -688,9 +629,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "Model DecisionTreeClassifier was successfully pickled and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\DecisionTreeClassifier\\DecisionTreeClassifier.pickle.\n", - "Model RandomForest was successfully pickled and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\RandomForest\\RandomForest.pickle.\n", - "Model GradientBoosting was successfully pickled and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\GradientBoosting\\GradientBoosting.pickle.\n" + "Model DecisionTreeClassifier was successfully pickled and saved to ~\\data\\hmeqModels\\DecisionTreeClassifier\\DecisionTreeClassifier.pickle.\n", + "Model RandomForest was successfully pickled and saved to ~\\data\\hmeqModels\\RandomForest\\RandomForest.pickle.\n", + "Model GradientBoosting was successfully pickled and saved to ~\\data\\hmeqModels\\GradientBoosting\\GradientBoosting.pickle.\n" ] } ], @@ -698,19 +639,19 @@ "# Model names within SAS Model Manager\n", "model_prefix = [\"DecisionTreeClassifier\", \"RandomForest\", \"GradientBoosting\"]\n", "# Directory location for the model files\n", - "zip_folder = [\n", - " Path.cwd() / \"data/hmeqModels/DecisionTreeClassifier/\",\n", - " Path.cwd() / \"data/hmeqModels/RandomForest/\",\n", - " Path.cwd() / \"data/hmeqModels/GradientBoosting\",\n", - "] # Changes required by user\n", + "zip_folder = [Path.cwd() / \"data/hmeqModels/DecisionTreeClassifier/\",\n", + " Path.cwd() / \"data/hmeqModels/RandomForest/\",\n", + " Path.cwd() / \"data/hmeqModels/GradientBoosting\"] # Changes required by user\n", "model = [dtc, rfc, gbc]\n", "# Output variables expected in SAS Model Manager. If a classification value is expected to be output, it should be the first metric.\n", "score_metrics = [\"EM_CLASSIFICATION\", \"EM_EVENTPROBABILITY\"]\n", "\n", "# Serialize the models to a pickle format\n", - "for mod, prefix, path in zip(model, model_prefix, zip_folder):\n", + "for (mod, prefix, path) in zip(model, model_prefix, zip_folder):\n", " pzmm.PickleModel.pickle_trained_model(\n", - " model_prefix=prefix, trained_model=mod, pickle_path=path\n", + " model_prefix=prefix,\n", + " trained_model=mod,\n", + " pickle_path=path\n", " )" ] }, @@ -725,53 +666,45 @@ "name": "stdout", "output_type": "stream", "text": [ - "inputVar.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\DecisionTreeClassifier\\inputVar.json\n", - "outputVar.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\DecisionTreeClassifier\\outputVar.json\n", - "ModelProperties.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\DecisionTreeClassifier\\ModelProperties.json\n", - "fileMetadata.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\DecisionTreeClassifier\\fileMetadata.json\n", - "inputVar.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\RandomForest\\inputVar.json\n", - "outputVar.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\RandomForest\\outputVar.json\n", - "ModelProperties.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\RandomForest\\ModelProperties.json\n", - "fileMetadata.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\RandomForest\\fileMetadata.json\n", - "inputVar.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\GradientBoosting\\inputVar.json\n", - "outputVar.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\GradientBoosting\\outputVar.json\n", - "ModelProperties.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\GradientBoosting\\ModelProperties.json\n", - "fileMetadata.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\GradientBoosting\\fileMetadata.json\n" + "inputVar.json was successfully written and saved to ~\\data\\hmeqModels\\DecisionTreeClassifier\\inputVar.json\n", + "outputVar.json was successfully written and saved to ~\\data\\hmeqModels\\DecisionTreeClassifier\\outputVar.json\n", + "ModelProperties.json was successfully written and saved to ~\\data\\hmeqModels\\DecisionTreeClassifier\\ModelProperties.json\n", + "fileMetadata.json was successfully written and saved to ~\\data\\hmeqModels\\DecisionTreeClassifier\\fileMetadata.json\n", + "inputVar.json was successfully written and saved to ~\\data\\hmeqModels\\RandomForest\\inputVar.json\n", + "outputVar.json was successfully written and saved to ~\\data\\hmeqModels\\RandomForest\\outputVar.json\n", + "ModelProperties.json was successfully written and saved to ~\\data\\hmeqModels\\RandomForest\\ModelProperties.json\n", + "fileMetadata.json was successfully written and saved to ~\\data\\hmeqModels\\RandomForest\\fileMetadata.json\n", + "inputVar.json was successfully written and saved to ~\\data\\hmeqModels\\GradientBoosting\\inputVar.json\n", + "outputVar.json was successfully written and saved to ~\\data\\hmeqModels\\GradientBoosting\\outputVar.json\n", + "ModelProperties.json was successfully written and saved to ~\\data\\hmeqModels\\GradientBoosting\\ModelProperties.json\n", + "fileMetadata.json was successfully written and saved to ~\\data\\hmeqModels\\GradientBoosting\\fileMetadata.json\n" ] } ], "source": [ - "def write_json_files(data, predict, target, path, prefix):\n", + "def write_json_files(data, predict, target, path, prefix): \n", " # Write input variable mapping to a json file\n", - " pzmm.JSONFiles.write_var_json(\n", - " input_data=data[predict], is_input=True, json_path=path\n", - " )\n", - "\n", + " pzmm.JSONFiles.write_var_json(input_data=data[predict], is_input=True, json_path=path)\n", + " \n", " # Set output variables and assign an event threshold, then write output variable mapping\n", - " output_var = pd.DataFrame(\n", - " columns=score_metrics, data=[[\"A\", 0.5]]\n", - " ) # data argument includes example expected types for outputs\n", + " output_var = pd.DataFrame(columns=score_metrics, data=[[\"A\", 0.5]]) # data argument includes example expected types for outputs\n", " pzmm.JSONFiles.write_var_json(output_var, is_input=False, json_path=path)\n", - "\n", + " \n", " # Write model properties to a json file\n", " pzmm.JSONFiles.write_model_properties_json(\n", - " model_name=prefix,\n", - " target_variable=target, # Target variable to make predictions about (BAD in this case)\n", - " target_values=[\n", - " \"1\",\n", - " \"0\",\n", - " ], # Possible values for the target variable (1 or 0 for binary classification of BAD)\n", - " json_path=path,\n", + " model_name=prefix, \n", + " target_variable=target, # Target variable to make predictions about (BAD in this case)\n", + " target_values=[\"1\", \"0\"], # Possible values for the target variable (1 or 0 for binary classification of BAD)\n", + " json_path=path, \n", " model_desc=f\"Description for the {prefix} model.\",\n", " model_algorithm=\"\",\n", " modeler=\"sasdemo\",\n", " )\n", - "\n", + " \n", " # Write model metadata to a json file so that SAS Model Manager can properly identify all model files\n", " pzmm.JSONFiles.write_file_metadata_json(model_prefix=prefix, json_path=path)\n", "\n", - "\n", - "for prefix, path in zip(model_prefix, zip_folder):\n", + "for (prefix, path) in zip(model_prefix, zip_folder):\n", " write_json_files(hmeq_data, predictor_columns, target_column, path, prefix)" ] }, @@ -784,7 +717,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": { "Collapsed": "false" }, @@ -793,696 +726,48 @@ "name": "stdout", "output_type": "stream", "text": [ - "Selected Rows from Table ROC\n", - "\n", - " _Column_ _Event_ _Cutoff_ _TP_ _FP_ _FN_ _TN_ _Sensitivity_ _Specificity_ _KS_ _KS2_ _FHALF_ _FPR_ _ACC_ _FDR_ _F1_ _C_ _GINI_ _GAMMA_ _TAU_ _MiscEvent_ _FNR_\n", - "0 actual 1 0.00 814.0 0.0 0.0 0.0 1.000000 NaN 1.0 NaN 1.000000 NaN 1.000000 0.0 1.000000 NaN NaN NaN NaN 0.000000 0.000000\n", - "1 actual 1 0.01 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "2 actual 1 0.02 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "3 actual 1 0.03 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "4 actual 1 0.04 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "5 actual 1 0.05 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "6 actual 1 0.06 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "7 actual 1 0.07 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "8 actual 1 0.08 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "9 actual 1 0.09 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "10 actual 1 0.10 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "11 actual 1 0.11 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "12 actual 1 0.12 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "13 actual 1 0.13 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "14 actual 1 0.14 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "15 actual 1 0.15 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "16 actual 1 0.16 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "17 actual 1 0.17 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "18 actual 1 0.18 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "19 actual 1 0.19 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "20 actual 1 0.20 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "21 actual 1 0.21 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "22 actual 1 0.22 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "23 actual 1 0.23 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "24 actual 1 0.24 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "25 actual 1 0.25 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "26 actual 1 0.26 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "27 actual 1 0.27 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "28 actual 1 0.28 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "29 actual 1 0.29 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "30 actual 1 0.30 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "31 actual 1 0.31 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "32 actual 1 0.32 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "33 actual 1 0.33 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "34 actual 1 0.34 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "35 actual 1 0.35 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "36 actual 1 0.36 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "37 actual 1 0.37 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "38 actual 1 0.38 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "39 actual 1 0.39 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "40 actual 1 0.40 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "41 actual 1 0.41 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "42 actual 1 0.42 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "43 actual 1 0.43 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "44 actual 1 0.44 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "45 actual 1 0.45 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "46 actual 1 0.46 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "47 actual 1 0.47 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "48 actual 1 0.48 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "49 actual 1 0.49 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "50 actual 1 0.50 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "51 actual 1 0.51 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "52 actual 1 0.52 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "53 actual 1 0.53 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "54 actual 1 0.54 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "55 actual 1 0.55 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "56 actual 1 0.56 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "57 actual 1 0.57 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "58 actual 1 0.58 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "59 actual 1 0.59 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "60 actual 1 0.60 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "61 actual 1 0.61 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "62 actual 1 0.62 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "63 actual 1 0.63 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "64 actual 1 0.64 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "65 actual 1 0.65 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "66 actual 1 0.66 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "67 actual 1 0.67 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "68 actual 1 0.68 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "69 actual 1 0.69 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "70 actual 1 0.70 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "71 actual 1 0.71 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "72 actual 1 0.72 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "73 actual 1 0.73 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "74 actual 1 0.74 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "75 actual 1 0.75 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "76 actual 1 0.76 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "77 actual 1 0.77 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "78 actual 1 0.78 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "79 actual 1 0.79 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "80 actual 1 0.80 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "81 actual 1 0.81 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "82 actual 1 0.82 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "83 actual 1 0.83 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "84 actual 1 0.84 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "85 actual 1 0.85 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "86 actual 1 0.86 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "87 actual 1 0.87 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "88 actual 1 0.88 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "89 actual 1 0.89 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "90 actual 1 0.90 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "91 actual 1 0.91 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "92 actual 1 0.92 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "93 actual 1 0.93 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "94 actual 1 0.94 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "95 actual 1 0.95 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "96 actual 1 0.96 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "97 actual 1 0.97 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "98 actual 1 0.98 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "99 actual 1 0.99 633.0 0.0 181.0 0.0 0.777641 NaN 0.0 NaN 0.945906 NaN 0.777641 0.0 0.874914 NaN NaN NaN NaN 0.222359 0.222359\n", - "Selected Rows from Table ROC\n", - "\n", - " _Column_ _Event_ _Cutoff_ _TP_ _FP_ _FN_ _TN_ _Sensitivity_ _Specificity_ _KS_ _KS2_ _FHALF_ _FPR_ _ACC_ _FDR_ _F1_ _C_ _GINI_ _GAMMA_ _TAU_ _MiscEvent_ _FNR_\n", - "0 actual 1 0.00 81.0 0.0 0.0 0.0 1.000000 NaN 1.0 NaN 1.000000 NaN 1.000000 0.0 1.000000 NaN NaN NaN NaN 0.000000 0.000000\n", - "1 actual 1 0.01 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "2 actual 1 0.02 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "3 actual 1 0.03 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "4 actual 1 0.04 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "5 actual 1 0.05 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "6 actual 1 0.06 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "7 actual 1 0.07 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "8 actual 1 0.08 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "9 actual 1 0.09 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "10 actual 1 0.10 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "11 actual 1 0.11 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "12 actual 1 0.12 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "13 actual 1 0.13 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "14 actual 1 0.14 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "15 actual 1 0.15 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "16 actual 1 0.16 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "17 actual 1 0.17 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "18 actual 1 0.18 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "19 actual 1 0.19 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "20 actual 1 0.20 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "21 actual 1 0.21 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "22 actual 1 0.22 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "23 actual 1 0.23 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "24 actual 1 0.24 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "25 actual 1 0.25 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "26 actual 1 0.26 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "27 actual 1 0.27 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "28 actual 1 0.28 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "29 actual 1 0.29 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "30 actual 1 0.30 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "31 actual 1 0.31 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "32 actual 1 0.32 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "33 actual 1 0.33 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "34 actual 1 0.34 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "35 actual 1 0.35 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "36 actual 1 0.36 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "37 actual 1 0.37 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "38 actual 1 0.38 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "39 actual 1 0.39 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "40 actual 1 0.40 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "41 actual 1 0.41 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "42 actual 1 0.42 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "43 actual 1 0.43 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "44 actual 1 0.44 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "45 actual 1 0.45 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "46 actual 1 0.46 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "47 actual 1 0.47 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "48 actual 1 0.48 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "49 actual 1 0.49 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "50 actual 1 0.50 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "51 actual 1 0.51 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "52 actual 1 0.52 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "53 actual 1 0.53 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "54 actual 1 0.54 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "55 actual 1 0.55 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "56 actual 1 0.56 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "57 actual 1 0.57 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "58 actual 1 0.58 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "59 actual 1 0.59 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "60 actual 1 0.60 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "61 actual 1 0.61 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "62 actual 1 0.62 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "63 actual 1 0.63 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "64 actual 1 0.64 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "65 actual 1 0.65 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "66 actual 1 0.66 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "67 actual 1 0.67 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "68 actual 1 0.68 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "69 actual 1 0.69 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "70 actual 1 0.70 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "71 actual 1 0.71 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "72 actual 1 0.72 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "73 actual 1 0.73 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "74 actual 1 0.74 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "75 actual 1 0.75 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "76 actual 1 0.76 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "77 actual 1 0.77 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "78 actual 1 0.78 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "79 actual 1 0.79 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "80 actual 1 0.80 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "81 actual 1 0.81 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "82 actual 1 0.82 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "83 actual 1 0.83 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "84 actual 1 0.84 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "85 actual 1 0.85 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "86 actual 1 0.86 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "87 actual 1 0.87 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "88 actual 1 0.88 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "89 actual 1 0.89 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "90 actual 1 0.90 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "91 actual 1 0.91 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "92 actual 1 0.92 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "93 actual 1 0.93 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "94 actual 1 0.94 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "95 actual 1 0.95 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "96 actual 1 0.96 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "97 actual 1 0.97 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "98 actual 1 0.98 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "99 actual 1 0.99 68.0 0.0 13.0 0.0 0.839506 NaN 0.0 NaN 0.963173 NaN 0.839506 0.0 0.912752 NaN NaN NaN NaN 0.160494 0.160494\n", - "dmcas_fitstat.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\DecisionTreeClassifier\\dmcas_fitstat.json\n", - "dmcas_roc.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\DecisionTreeClassifier\\dmcas_roc.json\n", - "dmcas_lift.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\DecisionTreeClassifier\\dmcas_lift.json\n", - "None\n", - "Selected Rows from Table ROC\n", - "\n", - " _Column_ _Event_ _Cutoff_ _TP_ _FP_ _FN_ _TN_ _Sensitivity_ _Specificity_ _KS_ _KS2_ _FHALF_ _FPR_ _ACC_ _FDR_ _F1_ _C_ _GINI_ _GAMMA_ _TAU_ _MiscEvent_ _FNR_\n", - "0 actual 1 0.00 587.0 0.0 0.0 0.0 1.000000 NaN 1.0 NaN 1.000000 NaN 1.000000 0.0 1.000000 NaN NaN NaN NaN 0.000000 0.000000\n", - "1 actual 1 0.01 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "2 actual 1 0.02 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "3 actual 1 0.03 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "4 actual 1 0.04 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "5 actual 1 0.05 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "6 actual 1 0.06 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "7 actual 1 0.07 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "8 actual 1 0.08 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "9 actual 1 0.09 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "10 actual 1 0.10 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "11 actual 1 0.11 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "12 actual 1 0.12 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "13 actual 1 0.13 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "14 actual 1 0.14 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "15 actual 1 0.15 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "16 actual 1 0.16 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "17 actual 1 0.17 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "18 actual 1 0.18 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "19 actual 1 0.19 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "20 actual 1 0.20 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "21 actual 1 0.21 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "22 actual 1 0.22 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "23 actual 1 0.23 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "24 actual 1 0.24 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "25 actual 1 0.25 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "26 actual 1 0.26 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "27 actual 1 0.27 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "28 actual 1 0.28 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "29 actual 1 0.29 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "30 actual 1 0.30 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "31 actual 1 0.31 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "32 actual 1 0.32 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "33 actual 1 0.33 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "34 actual 1 0.34 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "35 actual 1 0.35 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "36 actual 1 0.36 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "37 actual 1 0.37 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "38 actual 1 0.38 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "39 actual 1 0.39 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "40 actual 1 0.40 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "41 actual 1 0.41 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "42 actual 1 0.42 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "43 actual 1 0.43 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "44 actual 1 0.44 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "45 actual 1 0.45 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "46 actual 1 0.46 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "47 actual 1 0.47 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "48 actual 1 0.48 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "49 actual 1 0.49 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "50 actual 1 0.50 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "51 actual 1 0.51 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "52 actual 1 0.52 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "53 actual 1 0.53 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "54 actual 1 0.54 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "55 actual 1 0.55 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "56 actual 1 0.56 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "57 actual 1 0.57 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "58 actual 1 0.58 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "59 actual 1 0.59 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "60 actual 1 0.60 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "61 actual 1 0.61 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "62 actual 1 0.62 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "63 actual 1 0.63 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "64 actual 1 0.64 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "65 actual 1 0.65 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "66 actual 1 0.66 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "67 actual 1 0.67 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "68 actual 1 0.68 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "69 actual 1 0.69 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "70 actual 1 0.70 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "71 actual 1 0.71 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "72 actual 1 0.72 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "73 actual 1 0.73 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "74 actual 1 0.74 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "75 actual 1 0.75 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "76 actual 1 0.76 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "77 actual 1 0.77 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "78 actual 1 0.78 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "79 actual 1 0.79 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "80 actual 1 0.80 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "81 actual 1 0.81 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "82 actual 1 0.82 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "83 actual 1 0.83 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "84 actual 1 0.84 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "85 actual 1 0.85 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "86 actual 1 0.86 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "87 actual 1 0.87 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "88 actual 1 0.88 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "89 actual 1 0.89 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "90 actual 1 0.90 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "91 actual 1 0.91 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "92 actual 1 0.92 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "93 actual 1 0.93 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "94 actual 1 0.94 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "95 actual 1 0.95 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "96 actual 1 0.96 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "97 actual 1 0.97 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "98 actual 1 0.98 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "99 actual 1 0.99 550.0 0.0 37.0 0.0 0.936968 NaN 0.0 NaN 0.986724 NaN 0.936968 0.0 0.967458 NaN NaN NaN NaN 0.063032 0.063032\n", - "Selected Rows from Table ROC\n", - "\n", - " _Column_ _Event_ _Cutoff_ _TP_ _FP_ _FN_ _TN_ _Sensitivity_ _Specificity_ _KS_ _KS2_ _FHALF_ _FPR_ _ACC_ _FDR_ _F1_ _C_ _GINI_ _GAMMA_ _TAU_ _MiscEvent_ _FNR_\n", - "0 actual 1 0.00 94.0 0.0 0.0 0.0 1.000000 NaN 1.0 NaN 1.000000 NaN 1.000000 0.0 1.000000 NaN NaN NaN NaN 0.000000 0.000000\n", - "1 actual 1 0.01 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "2 actual 1 0.02 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "3 actual 1 0.03 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "4 actual 1 0.04 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "5 actual 1 0.05 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "6 actual 1 0.06 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "7 actual 1 0.07 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "8 actual 1 0.08 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "9 actual 1 0.09 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "10 actual 1 0.10 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "11 actual 1 0.11 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "12 actual 1 0.12 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "13 actual 1 0.13 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "14 actual 1 0.14 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "15 actual 1 0.15 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "16 actual 1 0.16 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "17 actual 1 0.17 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "18 actual 1 0.18 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "19 actual 1 0.19 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "20 actual 1 0.20 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "21 actual 1 0.21 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "22 actual 1 0.22 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "23 actual 1 0.23 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "24 actual 1 0.24 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "25 actual 1 0.25 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "26 actual 1 0.26 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "27 actual 1 0.27 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "28 actual 1 0.28 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "29 actual 1 0.29 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "30 actual 1 0.30 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "31 actual 1 0.31 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "32 actual 1 0.32 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "33 actual 1 0.33 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "34 actual 1 0.34 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "35 actual 1 0.35 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "36 actual 1 0.36 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "37 actual 1 0.37 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "38 actual 1 0.38 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "39 actual 1 0.39 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "40 actual 1 0.40 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "41 actual 1 0.41 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "42 actual 1 0.42 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "43 actual 1 0.43 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "44 actual 1 0.44 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "45 actual 1 0.45 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "46 actual 1 0.46 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "47 actual 1 0.47 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "48 actual 1 0.48 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "49 actual 1 0.49 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "50 actual 1 0.50 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "51 actual 1 0.51 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "52 actual 1 0.52 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "53 actual 1 0.53 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "54 actual 1 0.54 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "55 actual 1 0.55 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "56 actual 1 0.56 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "57 actual 1 0.57 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "58 actual 1 0.58 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "59 actual 1 0.59 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "60 actual 1 0.60 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "61 actual 1 0.61 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "62 actual 1 0.62 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "63 actual 1 0.63 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "64 actual 1 0.64 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "65 actual 1 0.65 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "66 actual 1 0.66 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "67 actual 1 0.67 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "68 actual 1 0.68 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "69 actual 1 0.69 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "70 actual 1 0.70 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "71 actual 1 0.71 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "72 actual 1 0.72 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "73 actual 1 0.73 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "74 actual 1 0.74 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "75 actual 1 0.75 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "76 actual 1 0.76 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "77 actual 1 0.77 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "78 actual 1 0.78 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "79 actual 1 0.79 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "80 actual 1 0.80 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "81 actual 1 0.81 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "82 actual 1 0.82 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "83 actual 1 0.83 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "84 actual 1 0.84 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "85 actual 1 0.85 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "86 actual 1 0.86 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "87 actual 1 0.87 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "88 actual 1 0.88 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "89 actual 1 0.89 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "90 actual 1 0.90 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "91 actual 1 0.91 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "92 actual 1 0.92 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "93 actual 1 0.93 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "94 actual 1 0.94 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "95 actual 1 0.95 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "96 actual 1 0.96 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "97 actual 1 0.97 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "98 actual 1 0.98 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "99 actual 1 0.99 93.0 0.0 1.0 0.0 0.989362 NaN 0.0 NaN 0.997854 NaN 0.989362 0.0 0.994652 NaN NaN NaN NaN 0.010638 0.010638\n", - "dmcas_fitstat.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\RandomForest\\dmcas_fitstat.json\n", - "dmcas_roc.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\RandomForest\\dmcas_roc.json\n", - "dmcas_lift.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\RandomForest\\dmcas_lift.json\n", - "None\n", - "Selected Rows from Table ROC\n", - "\n", - " _Column_ _Event_ _Cutoff_ _TP_ _FP_ _FN_ _TN_ _Sensitivity_ _Specificity_ _KS_ _KS2_ _FHALF_ _FPR_ _ACC_ _FDR_ _F1_ _C_ _GINI_ _GAMMA_ _TAU_ _MiscEvent_ _FNR_\n", - "0 actual 1 0.00 842.0 0.0 0.0 0.0 1.000000 NaN 1.0 NaN 1.000000 NaN 1.000000 0.0 1.000000 NaN NaN NaN NaN 0.000000 0.000000\n", - "1 actual 1 0.01 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "2 actual 1 0.02 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "3 actual 1 0.03 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "4 actual 1 0.04 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "5 actual 1 0.05 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "6 actual 1 0.06 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "7 actual 1 0.07 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "8 actual 1 0.08 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "9 actual 1 0.09 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "10 actual 1 0.10 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "11 actual 1 0.11 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "12 actual 1 0.12 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "13 actual 1 0.13 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "14 actual 1 0.14 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "15 actual 1 0.15 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "16 actual 1 0.16 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "17 actual 1 0.17 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "18 actual 1 0.18 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "19 actual 1 0.19 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "20 actual 1 0.20 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "21 actual 1 0.21 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "22 actual 1 0.22 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "23 actual 1 0.23 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "24 actual 1 0.24 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "25 actual 1 0.25 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "26 actual 1 0.26 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "27 actual 1 0.27 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "28 actual 1 0.28 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "29 actual 1 0.29 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "30 actual 1 0.30 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "31 actual 1 0.31 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "32 actual 1 0.32 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "33 actual 1 0.33 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "34 actual 1 0.34 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "35 actual 1 0.35 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "36 actual 1 0.36 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "37 actual 1 0.37 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "38 actual 1 0.38 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "39 actual 1 0.39 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "40 actual 1 0.40 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "41 actual 1 0.41 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "42 actual 1 0.42 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "43 actual 1 0.43 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "44 actual 1 0.44 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "45 actual 1 0.45 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "46 actual 1 0.46 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "47 actual 1 0.47 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "48 actual 1 0.48 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "49 actual 1 0.49 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "50 actual 1 0.50 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "51 actual 1 0.51 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "52 actual 1 0.52 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "53 actual 1 0.53 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "54 actual 1 0.54 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "55 actual 1 0.55 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "56 actual 1 0.56 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "57 actual 1 0.57 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "58 actual 1 0.58 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "59 actual 1 0.59 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "60 actual 1 0.60 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "61 actual 1 0.61 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "62 actual 1 0.62 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "63 actual 1 0.63 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "64 actual 1 0.64 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "65 actual 1 0.65 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "66 actual 1 0.66 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "67 actual 1 0.67 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "68 actual 1 0.68 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "69 actual 1 0.69 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "70 actual 1 0.70 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "71 actual 1 0.71 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "72 actual 1 0.72 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "73 actual 1 0.73 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "74 actual 1 0.74 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "75 actual 1 0.75 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "76 actual 1 0.76 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "77 actual 1 0.77 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "78 actual 1 0.78 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "79 actual 1 0.79 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "80 actual 1 0.80 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "81 actual 1 0.81 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "82 actual 1 0.82 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "83 actual 1 0.83 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "84 actual 1 0.84 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "85 actual 1 0.85 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "86 actual 1 0.86 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "87 actual 1 0.87 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "88 actual 1 0.88 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "89 actual 1 0.89 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "90 actual 1 0.90 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "91 actual 1 0.91 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "92 actual 1 0.92 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "93 actual 1 0.93 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "94 actual 1 0.94 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "95 actual 1 0.95 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "96 actual 1 0.96 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "97 actual 1 0.97 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "98 actual 1 0.98 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "99 actual 1 0.99 840.0 0.0 2.0 0.0 0.997625 NaN 0.0 NaN 0.999524 NaN 0.997625 0.0 0.998811 NaN NaN NaN NaN 0.002375 0.002375\n", - "Selected Rows from Table ROC\n", - "\n", - " _Column_ _Event_ _Cutoff_ _TP_ _FP_ _FN_ _TN_ _Sensitivity_ _Specificity_ _KS_ _KS2_ _FHALF_ _FPR_ _ACC_ _FDR_ _F1_ _C_ _GINI_ _GAMMA_ _TAU_ _MiscEvent_ _FNR_\n", - "0 actual 1 0.00 149.0 0.0 0.0 0.0 1.000000 NaN 1.0 NaN 1.000000 NaN 1.000000 0.0 1.000000 NaN NaN NaN NaN 0.000000 0.000000\n", - "1 actual 1 0.01 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "2 actual 1 0.02 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "3 actual 1 0.03 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "4 actual 1 0.04 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "5 actual 1 0.05 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "6 actual 1 0.06 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "7 actual 1 0.07 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "8 actual 1 0.08 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "9 actual 1 0.09 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "10 actual 1 0.10 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "11 actual 1 0.11 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "12 actual 1 0.12 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "13 actual 1 0.13 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "14 actual 1 0.14 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "15 actual 1 0.15 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "16 actual 1 0.16 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "17 actual 1 0.17 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "18 actual 1 0.18 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "19 actual 1 0.19 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "20 actual 1 0.20 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "21 actual 1 0.21 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "22 actual 1 0.22 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "23 actual 1 0.23 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "24 actual 1 0.24 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "25 actual 1 0.25 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "26 actual 1 0.26 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "27 actual 1 0.27 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "28 actual 1 0.28 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "29 actual 1 0.29 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "30 actual 1 0.30 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "31 actual 1 0.31 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "32 actual 1 0.32 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "33 actual 1 0.33 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "34 actual 1 0.34 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "35 actual 1 0.35 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "36 actual 1 0.36 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "37 actual 1 0.37 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "38 actual 1 0.38 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "39 actual 1 0.39 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "40 actual 1 0.40 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "41 actual 1 0.41 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "42 actual 1 0.42 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "43 actual 1 0.43 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "44 actual 1 0.44 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "45 actual 1 0.45 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "46 actual 1 0.46 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "47 actual 1 0.47 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "48 actual 1 0.48 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "49 actual 1 0.49 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "50 actual 1 0.50 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "51 actual 1 0.51 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "52 actual 1 0.52 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "53 actual 1 0.53 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "54 actual 1 0.54 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "55 actual 1 0.55 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "56 actual 1 0.56 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "57 actual 1 0.57 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "58 actual 1 0.58 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "59 actual 1 0.59 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "60 actual 1 0.60 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "61 actual 1 0.61 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "62 actual 1 0.62 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "63 actual 1 0.63 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "64 actual 1 0.64 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "65 actual 1 0.65 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "66 actual 1 0.66 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "67 actual 1 0.67 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "68 actual 1 0.68 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "69 actual 1 0.69 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "70 actual 1 0.70 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "71 actual 1 0.71 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "72 actual 1 0.72 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "73 actual 1 0.73 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "74 actual 1 0.74 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "75 actual 1 0.75 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "76 actual 1 0.76 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "77 actual 1 0.77 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "78 actual 1 0.78 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "79 actual 1 0.79 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "80 actual 1 0.80 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "81 actual 1 0.81 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "82 actual 1 0.82 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "83 actual 1 0.83 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "84 actual 1 0.84 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "85 actual 1 0.85 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "86 actual 1 0.86 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "87 actual 1 0.87 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "88 actual 1 0.88 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "89 actual 1 0.89 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "90 actual 1 0.90 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "91 actual 1 0.91 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "92 actual 1 0.92 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "93 actual 1 0.93 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "94 actual 1 0.94 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "95 actual 1 0.95 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "96 actual 1 0.96 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "97 actual 1 0.97 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "98 actual 1 0.98 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "99 actual 1 0.99 144.0 0.0 5.0 0.0 0.966443 NaN 0.0 NaN 0.993103 NaN 0.966443 0.0 0.982935 NaN NaN NaN NaN 0.033557 0.033557\n", - "dmcas_fitstat.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\GradientBoosting\\dmcas_fitstat.json\n", - "dmcas_roc.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\GradientBoosting\\dmcas_roc.json\n", - "dmcas_lift.json was successfully written and saved to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\GradientBoosting\\dmcas_lift.json\n", - "None\n" + "dmcas_fitstat.json was successfully written and saved to ~\\data\\hmeqModels\\DecisionTreeClassifier\\dmcas_fitstat.json\n", + "dmcas_roc.json was successfully written and saved to ~\\data\\hmeqModels\\DecisionTreeClassifier\\dmcas_roc.json\n", + "dmcas_lift.json was successfully written and saved to ~\\data\\hmeqModels\\DecisionTreeClassifier\\dmcas_lift.json\n", + "dmcas_fitstat.json was successfully written and saved to ~\\data\\hmeqModels\\RandomForest\\dmcas_fitstat.json\n", + "dmcas_roc.json was successfully written and saved to ~\\data\\hmeqModels\\RandomForest\\dmcas_roc.json\n", + "dmcas_lift.json was successfully written and saved to ~\\data\\hmeqModels\\RandomForest\\dmcas_lift.json\n", + "dmcas_fitstat.json was successfully written and saved to ~\\data\\hmeqModels\\GradientBoosting\\dmcas_fitstat.json\n", + "dmcas_roc.json was successfully written and saved to ~\\data\\hmeqModels\\GradientBoosting\\dmcas_roc.json\n", + "dmcas_lift.json was successfully written and saved to ~\\data\\hmeqModels\\GradientBoosting\\dmcas_lift.json\n" ] } ], "source": [ "import getpass\n", - "\n", - "\n", - "def write_model_stats(\n", - " x_train, y_train, test_predict, test_proba, y_test, model, path, prefix\n", - "):\n", + "def write_model_stats(x_train, y_train, test_predict, test_proba, y_test, model, path, prefix):\n", " # Calculate train predictions\n", " train_predict = model.predict(x_train)\n", " train_proba = model.predict_proba(x_train)\n", - "\n", + " \n", " # Assign data to lists of actual and predicted values\n", - " train_data = pd.concat(\n", - " [\n", - " y_train.reset_index(drop=True),\n", - " pd.Series(train_predict),\n", - " pd.Series(data=train_proba[:, 1]),\n", - " ],\n", - " axis=1,\n", - " )\n", - " test_data = pd.concat(\n", - " [\n", - " y_test.reset_index(drop=True),\n", - " pd.Series(test_predict),\n", - " pd.Series(data=test_proba[:, 1]),\n", - " ],\n", - " axis=1,\n", - " )\n", - "\n", + " train_data = pd.concat([y_train.reset_index(drop=True), pd.Series(train_predict), pd.Series(data=train_proba[:,1])], axis=1)\n", + " test_data = pd.concat([y_test.reset_index(drop=True), pd.Series(test_predict), pd.Series(data=test_proba[:,1])], axis=1)\n", + " \n", " # Calculate the model statistics, ROC chart, and Lift chart; then write to json files\n", " pzmm.JSONFiles.calculate_model_statistics(\n", " target_value=1,\n", - " train_data=train_data,\n", - " test_data=test_data,\n", - " json_path=path,\n", + " train_data=train_data, \n", + " test_data=test_data, \n", + " json_path=path\n", " )\n", "\n", - " full_training_data = pd.concat(\n", - " [y_train.reset_index(drop=True), x_train.reset_index(drop=True)], axis=1\n", - " )\n", - " \n", - " \n", - "\n", - "\n", + " full_training_data = pd.concat([y_train.reset_index(drop=True), x_train.reset_index(drop=True)], axis=1)\n", + " \n", "username = getpass.getpass()\n", "password = getpass.getpass()\n", - "host = \"demo.sas.com\" # Changes required by user\n", - "sess = Session(\n", - " host, username, password, protocol=\"http\"\n", - ") # For TLS-enabled servers, change protocol value to \"https\"\n", - "conn = sess.as_swat() # Connect to SWAT through the sasctl authenticated connection\n", + "host = \"demo.sas.com\" # Changes required by user\n", + "sess = Session(host, username, password, protocol=\"http\") # For TLS-enabled servers, change protocol value to \"https\"\n", + "conn = sess.as_swat() # Connect to SWAT through the sasctl authenticated connection\n", "\n", "test_predict = [y_dtc_predict, y_rfc_predict, y_gbc_predict]\n", "test_proba = [y_dtc_proba, y_rfc_proba, y_gbc_proba]\n", - "for mod, pred, proba, path, prefix in zip(\n", - " model, test_predict, test_proba, zip_folder, model_prefix\n", - "):\n", + "for (mod, pred, proba, path, prefix) in zip(model, test_predict, test_proba, zip_folder, model_prefix):\n", " write_model_stats(x_train, y_train, pred, proba, y_test, mod, path, prefix)" ] }, @@ -1497,74 +782,43 @@ "name": "stderr", "output_type": "stream", "text": [ - "c:\\Users\\sapotl\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\sasctl\\pzmm\\write_score_code.py:1501: UserWarning: Due to the ambiguity of the provided metrics and prediction return types, the score code assumes that a classification and the target event probability should be returned.\n", - " warn(\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model score code was written successfully to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\DecisionTreeClassifier\\score_DecisionTreeClassifier.py and uploaded to SAS Model Manager.\n", - "All model files were zipped to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\DecisionTreeClassifier.\n", - "Model was successfully imported into SAS Model Manager as DecisionTreeClassifier with the following UUID: bfc9dd0c-ca5e-49ce-bae0-e0eda9cfe61c.\n", - "Model score code was written successfully to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\RandomForest\\score_RandomForest.py and uploaded to SAS Model Manager.\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "c:\\Users\\sapotl\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\sasctl\\pzmm\\write_score_code.py:1501: UserWarning: Due to the ambiguity of the provided metrics and prediction return types, the score code assumes that a classification and the target event probability should be returned.\n", - " warn(\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "All model files were zipped to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\RandomForest.\n", - "Model was successfully imported into SAS Model Manager as RandomForest with the following UUID: 351f0465-813d-41d1-90e3-e0f8f49d9418.\n", - "Model score code was written successfully to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\GradientBoosting\\score_GradientBoosting.py and uploaded to SAS Model Manager.\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "c:\\Users\\sapotl\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\sasctl\\pzmm\\write_score_code.py:1501: UserWarning: Due to the ambiguity of the provided metrics and prediction return types, the score code assumes that a classification and the target event probability should be returned.\n", - " warn(\n" + "~\\sasctl\\pzmm\\write_score_code.py:1059: UserWarning: Due to the ambiguity of the provided metrics and prediction return types, the score code assumes that a classification and the target event probability should be returned.\n", + " warn(\n", + "~\\sasctl\\pzmm\\import_model.py:45: UserWarning: No project with the name or UUID HMEQModels was found.\n", + " warn(f\"No project with the name or UUID {project} was found.\")\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "All model files were zipped to c:\\Users\\sapotl\\OneDrive - SAS\\Desktop\\python-sasctl\\python-sasctl\\examples\\data\\hmeqModels\\GradientBoosting.\n", - "Model was successfully imported into SAS Model Manager as GradientBoosting with the following UUID: 4408283e-2c93-4ae8-8450-3b727aafc049.\n" + "Model score code was written successfully to ~\\data\\hmeqModels\\DecisionTreeClassifier\\score_DecisionTreeClassifier.py and uploaded to SAS Model Manager.\n", + "All model files were zipped to ~\\data\\hmeqModels\\DecisionTreeClassifier.\n", + "A new project named HMEQModels was created.\n", + "Model was successfully imported into SAS Model Manager as DecisionTreeClassifier with the following UUID: 82cf6fb7-c845-48ad-8f0c-9e572104335d.\n", + "Model score code was written successfully to ~\\data\\hmeqModels\\RandomForest\\score_RandomForest.py and uploaded to SAS Model Manager.\n", + "All model files were zipped to ~\\data\\hmeqModels\\RandomForest.\n", + "Model was successfully imported into SAS Model Manager as RandomForest with the following UUID: 44bfd538-8e02-4d04-99cd-fe1dacbabdfd.\n", + "Model score code was written successfully to ~\\data\\hmeqModels\\GradientBoosting\\score_GradientBoosting.py and uploaded to SAS Model Manager.\n", + "All model files were zipped to ~\\data\\hmeqModels\\GradientBoosting.\n", + "Model was successfully imported into SAS Model Manager as GradientBoosting with the following UUID: a248bde8-f767-4c05-8791-63700efd9288.\n" ] } ], "source": [ - "for prefix, path in zip(model_prefix, zip_folder):\n", + "for (prefix, path) in zip(model_prefix, zip_folder):\n", " pzmm.ImportModel.import_model(\n", - " model_files=path, # Where are the model files?\n", - " model_prefix=prefix, # What is the model name?\n", - " project=\"HMEQModels\", # What is the project name?\n", - " input_data=x, # What does example input data look like?\n", - " predict_method=[\n", - " dtc.predict_proba,\n", - " [int, int],\n", - " ], # What is the predict method and what does it return?\n", - " score_metrics=score_metrics, # What are the output variables?\n", - " overwrite_model=True, # Overwrite the model if it already exists?\n", - " target_values=[\n", - " \"0\",\n", - " \"1\",\n", - " ], # What are the expected values of the target variable?\n", - " target_index=1, # What is the index of the target value in target_values?\n", - " model_file_name=prefix + \".pickle\", # How was the model file serialized?\n", - " missing_values=True, # Does the data include missing values?\n", + " model_files=path, # Where are the model files?\n", + " model_prefix=prefix, # What is the model name?\n", + " project=\"HMEQModels\", # What is the project name?\n", + " input_data=x, # What does example input data look like?\n", + " predict_method=[dtc.predict_proba, [int, int]], # What is the predict method and what does it return?\n", + " score_metrics=score_metrics, # What are the output variables?\n", + " overwrite_model=True, # Overwrite the model if it already exists?\n", + " target_values=[\"0\", \"1\"], # What are the expected values of the target variable?\n", + " target_index=1, # What is the index of the target value in target_values?\n", + " model_file_name=prefix + \".pickle\", # How was the model file serialized?\n", + " missing_values=True # Does the data include missing values?\n", " )\n", " # Reinitialize the score_code variable when writing more than one model's score code\n", " pzmm.ScoreCode.score_code = \"\"" @@ -1587,7 +841,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.0" + "version": "3.9.18" }, "latex_envs": { "LaTeX_envs_menu_present": true, diff --git a/examples/pzmm_generate_complete_model_card.ipynb b/examples/pzmm_generate_complete_model_card.ipynb index 60bed6b1..3a68271b 100644 --- a/examples/pzmm_generate_complete_model_card.ipynb +++ b/examples/pzmm_generate_complete_model_card.ipynb @@ -84,7 +84,7 @@ } ], "source": [ - "adult = pd.read_csv(\"data/adult.csv\", sep=\",\")\n", + "adult = pd.read_csv(\"data/adult.csv\", sep= \",\")\n", "\n", "print(\"Shape of data:\", adult.shape)" ] @@ -299,7 +299,7 @@ } ], "source": [ - "adult.hist(figsize=(15, 15), layout=(4, 4));" + "adult.hist(figsize=(15,15), layout=(4, 4));" ] }, { @@ -458,12 +458,12 @@ ], "source": [ "print(\"Unique Values: \")\n", - "print(adult[adult.select_dtypes(include=[\"object\"]).columns].nunique())\n", + "print(adult[adult.select_dtypes(include=['object']).columns].nunique())\n", "print(\"--------------------------------\")\n", "print(\"Value Counts: \")\n", - "for i in adult.select_dtypes(include=[\"object\"]).columns:\n", - " print(adult[i].value_counts())\n", - " print(\"--------------------------------\")" + "for i in adult.select_dtypes(include=['object']).columns:\n", + " print(adult[i].value_counts())\n", + " print(\"--------------------------------\")" ] }, { @@ -481,17 +481,12 @@ "source": [ "df = adult.copy()\n", "df = df.dropna().reset_index()\n", - "cat_vals = df[\n", - " [\"WorkClass\", \"Education\", \"MartialStatus\", \"Relationship\", \"Race\", \"Sex\"]\n", - "]\n", - "df = pd.get_dummies(\n", - " df,\n", - " columns=[\"WorkClass\", \"Education\", \"MartialStatus\", \"Relationship\", \"Race\", \"Sex\"],\n", - ")\n", - "df.columns = df.columns.str.replace(\" \", \"\")\n", - "df.columns = df.columns.str.replace(\"-\", \"_\")\n", - "df = df.drop([\"Sex_Male\"], axis=1)\n", - "df = pd.concat([df, cat_vals], axis=1).drop(\"index\", axis=1)" + "cat_vals = df[[\"WorkClass\", \"Education\", \"MartialStatus\", \"Relationship\", \"Race\", \"Sex\"]]\n", + "df = pd.get_dummies(df, columns=[\"WorkClass\", \"Education\", \"MartialStatus\", \"Relationship\", \"Race\", \"Sex\"])\n", + "df.columns = df.columns.str.replace(' ', '')\n", + "df.columns = df.columns.str.replace('-', '_')\n", + "df = df.drop(['Sex_Male'], axis=1)\n", + "df = pd.concat([df, cat_vals], axis=1).drop('index', axis=1)\n" ] }, { @@ -540,34 +535,16 @@ } ], "source": [ - "df[\"Education_Some_HS\"] = (\n", - " df[\"Education_9th\"]\n", - " | df[\"Education_10th\"]\n", - " | df[\"Education_11th\"]\n", - " | df[\"Education_12th\"]\n", - ")\n", + "df[\"Education_Some_HS\"] = df[\"Education_9th\"] | df[\"Education_10th\"] | df[\"Education_11th\"] | df[\"Education_12th\"]\n", "df[\"Education_Assoc\"] = df[\"Education_Assoc_voc\"] | df[\"Education_Assoc_acdm\"]\n", - "df[\"Education_Adv_Degree\"] = (\n", - " df[\"Education_Masters\"] | df[\"Education_Prof_school\"] | df[\"Education_Doctorate\"]\n", - ")\n", - "df[\"Education_No_HS\"] = (\n", - " df[\"Education_Preschool\"]\n", - " | df[\"Education_1st_4th\"]\n", - " | df[\"Education_5th_6th\"]\n", - " | df[\"Education_7th_8th\"]\n", - ")\n", + "df[\"Education_Adv_Degree\"] = df[\"Education_Masters\"] | df[\"Education_Prof_school\"] | df[\"Education_Doctorate\"]\n", + "df[\"Education_No_HS\"] = df[\"Education_Preschool\"] | df[\"Education_1st_4th\"] | df[\"Education_5th_6th\"] | df[\"Education_7th_8th\"]\n", "\n", "df[\"WorkClass_Self\"] = df[\"WorkClass_Self_emp_inc\"] | df[\"WorkClass_Self_emp_not_inc\"]\n", - "df[\"WorkClass_Gov\"] = (\n", - " df[\"WorkClass_Federal_gov\"] | df[\"WorkClass_Local_gov\"] | df[\"WorkClass_State_gov\"]\n", - ")\n", - "df[\"WorkClass_Other\"] = df[\n", - " \"WorkClass_Without_pay\"\n", - "] # df[\"WorkClass_Never_worked\"] is fully dropped when all NA values removed\n", + "df[\"WorkClass_Gov\"] = df[\"WorkClass_Federal_gov\"] | df[\"WorkClass_Local_gov\"] | df[\"WorkClass_State_gov\"]\n", + "df[\"WorkClass_Other\"] = df[\"WorkClass_Without_pay\"] # df[\"WorkClass_Never_worked\"] is fully dropped when all NA values removed\n", "\n", - "df[\"MartialStatus_Other\"] = (\n", - " df[\"MartialStatus_Married_spouse_absent\"] | df[\"MartialStatus_Married_AF_spouse\"]\n", - ")\n", + "df[\"MartialStatus_Other\"] = df[\"MartialStatus_Married_spouse_absent\"] | df[\"MartialStatus_Married_AF_spouse\"]\n", "\n", "df.columns" ] @@ -646,62 +623,19 @@ "metadata": {}, "outputs": [], "source": [ - "original_columns = [\n", - " \"Age\",\n", - " \"WorkClass\",\n", - " \"Education\",\n", - " \"MartialStatus\",\n", - " \"Relationship\",\n", - " \"Race\",\n", - " \"Sex\",\n", - " \"HoursPerWeek\",\n", - " \"GE50K\",\n", - "]\n", + "original_columns = ['Age', 'WorkClass', 'Education', 'MartialStatus', \n", + " 'Relationship', 'Race', 'Sex', 'HoursPerWeek', 'GE50K']\n", "\n", - "original_inputs = [\n", - " \"Age\",\n", - " \"WorkClass\",\n", - " \"Education\",\n", - " \"MartialStatus\",\n", - " \"Relationship\",\n", - " \"Race\",\n", - " \"Sex\",\n", - " \"HoursPerWeek\",\n", - "]\n", + "original_inputs = ['Age', 'WorkClass', 'Education', 'MartialStatus', \n", + " 'Relationship', 'Race', 'Sex', 'HoursPerWeek']\n", "\n", - "predictor_columns = [\n", - " \"Age\",\n", - " \"HoursPerWeek\",\n", - " \"WorkClass_Private\",\n", - " \"WorkClass_Self\",\n", - " \"WorkClass_Gov\",\n", - " \"WorkClass_Other\",\n", - " \"Education_HS_grad\",\n", - " \"Education_Some_HS\",\n", - " \"Education_Assoc\",\n", - " \"Education_Some_college\",\n", - " \"Education_Bachelors\",\n", - " \"Education_Adv_Degree\",\n", - " \"Education_No_HS\",\n", - " \"MartialStatus_Married_civ_spouse\",\n", - " \"MartialStatus_Never_married\",\n", - " \"MartialStatus_Divorced\",\n", - " \"MartialStatus_Separated\",\n", - " \"MartialStatus_Widowed\",\n", - " \"MartialStatus_Other\",\n", - " \"Relationship_Husband\",\n", - " \"Relationship_Not_in_family\",\n", - " \"Relationship_Own_child\",\n", - " \"Relationship_Unmarried\",\n", - " \"Relationship_Wife\",\n", - " \"Relationship_Other_relative\",\n", - " \"Race_White\",\n", - " \"Race_Black\",\n", - " \"Race_Asian_Pac_Islander\",\n", - " \"Race_Amer_Indian_Eskimo\",\n", - " \"Race_Other\",\n", - " \"Sex_Female\",\n", - "]\n", + "predictor_columns = ['Age', 'HoursPerWeek', 'WorkClass_Private', 'WorkClass_Self', 'WorkClass_Gov', \n", + " 'WorkClass_Other', 'Education_HS_grad', 'Education_Some_HS', 'Education_Assoc', 'Education_Some_college',\n", + " 'Education_Bachelors', 'Education_Adv_Degree', 'Education_No_HS', 'MartialStatus_Married_civ_spouse',\n", + " 'MartialStatus_Never_married', 'MartialStatus_Divorced', 'MartialStatus_Separated', 'MartialStatus_Widowed',\n", + " 'MartialStatus_Other', 'Relationship_Husband', 'Relationship_Not_in_family', 'Relationship_Own_child', 'Relationship_Unmarried',\n", + " 'Relationship_Wife', 'Relationship_Other_relative', 'Race_White', 'Race_Black', 'Race_Asian_Pac_Islander',\n", + " 'Race_Amer_Indian_Eskimo', 'Race_Other', 'Sex_Female']\n", "\n", "target_column = \"GE50K\"\n", "\n", @@ -709,12 +643,8 @@ "\n", "y = df[target_column]\n", "\n", - "x_train_full, x_test_full, y_train, y_test = train_test_split(\n", - " x, y, test_size=0.2, random_state=42\n", - ")\n", - "x_train_full, x_val_full, y_train, y_val = train_test_split(\n", - " x_train_full, y_train, test_size=0.2, random_state=42\n", - ")\n", + "x_train_full, x_test_full, y_train, y_test = train_test_split(x, y, test_size=.2, random_state=42)\n", + "x_train_full, x_val_full, y_train, y_val = train_test_split(x_train_full, y_train, test_size=.2, random_state=42)\n", "\n", "x_train = x_train_full[predictor_columns]\n", "x_test = x_test_full[predictor_columns]\n", @@ -736,9 +666,7 @@ "metadata": {}, "outputs": [], "source": [ - "dtc = DecisionTreeClassifier(\n", - " max_depth=7, min_samples_split=2, min_samples_leaf=2, max_leaf_nodes=500\n", - ")\n", + "dtc = DecisionTreeClassifier(max_depth=7, min_samples_split=2, min_samples_leaf=2, max_leaf_nodes=500)\n", "dtc = dtc.fit(x_train, y_train)" ] }, @@ -766,20 +694,15 @@ } ], "source": [ - "y_axis = np.array([\"Training\", \"Testing\", \"Validation\"])\n", - "x_axis = np.array(\n", - " [\n", - " (dtc.score(x_train, y_train)),\n", - " (dtc.score(x_test, y_test)),\n", - " (dtc.score(x_val, y_val)),\n", - " ]\n", - ")\n", + "y_axis =np.array([\"Training\", \"Testing\", \"Validation\"])\n", + "x_axis = np.array([(dtc.score(x_train, y_train)), (dtc.score(x_test, y_test)), (dtc.score(x_val, y_val))])\n", "\n", "fig, ax = plt.subplots()\n", - "p = ax.bar(x=y_axis, height=x_axis)\n", - "ax.bar_label(p, label_type=\"center\")\n", - "ax.set_title(\"Decision Tree Accuarcy Across Each Set\")\n", - "plt.show()" + "p = ax.bar(x = y_axis, height = x_axis)\n", + "ax.bar_label(p, label_type='center')\n", + "ax.set_title('Decision Tree Accuarcy Across Each Set')\n", + "plt.show()\n", + "\n" ] }, { @@ -815,15 +738,15 @@ "outputs": [], "source": [ "# Step 1: Update variables below to fit your needs\n", - "output_directory = \"outputs\"\n", - "model_prefix = \"dtc\"\n", + "output_directory = 'outputs'\n", + "model_prefix = 'dtc'\n", "model_object = dtc\n", - "target = \"GE50K\"\n", + "target= \"GE50K\"\n", "algorithm = \"Decision Tree\"\n", "description = \"SKLearn Decision Tree Model\"\n", - "assess_bias_var = \"Sex\"\n", - "cat_columns = [\"WorkClass\", \"Education\", \"MartialStatus\", \"Relationship\", \"Race\", \"Sex\"]\n", - "interval_columns = [\"Age\", \"HoursPerWeek\"]\n", + "assess_bias_var = 'Sex'\n", + "cat_columns = ['WorkClass', 'Education', 'MartialStatus', 'Relationship', 'Race', 'Sex']\n", + "interval_columns = ['Age', 'HoursPerWeek']\n", "mm_project = \"Salary Classification\"" ] }, @@ -844,10 +767,8 @@ "username = input(\"Username: \")\n", "password = getpass.getpass(\"Password: \")\n", "host = input(\"Viya Environment URL: \")\n", - "sess = Session(\n", - " host, username, password, protocol=\"http\"\n", - ") # For TLS-enabled servers, change protocol value to \"https\"\n", - "conn = sess.as_swat() # Connect to SWAT through the sasctl authenticated connection" + "sess = Session(host, username, password, protocol=\"http\") # For TLS-enabled servers, change protocol value to \"https\"\n", + "conn = sess.as_swat() # Connect to SWAT through the sasctl authenticated connection\n" ] }, { @@ -863,42 +784,37 @@ "metadata": {}, "outputs": [], "source": [ - "# Step 3: Create folder for output files.\n", + "# Step 3: Create folder for output files. \n", "output_path = Path.cwd() / output_directory / model_prefix\n", "if not os.path.exists(output_path):\n", " os.makedirs(output_path)\n", "\n", "# Step 4: Pickle model\n", "pzmm.PickleModel.pickle_trained_model(\n", - " model_prefix=model_prefix, trained_model=model_object, pickle_path=output_path\n", - ")\n", + " model_prefix=model_prefix,\n", + " trained_model=model_object,\n", + " pickle_path=output_path)\n", "\n", "# Step 5: Write input variables file\n", - "pzmm.JSONFiles.write_var_json(\n", - " input_data=x[original_inputs], is_input=True, json_path=output_path\n", - ")\n", + "pzmm.JSONFiles.write_var_json(input_data=x[original_inputs], is_input=True, json_path=output_path)\n", "\n", "# Step 6: Write output variables file\n", - "output_var = pd.DataFrame(\n", - " columns=[\"EM_CLASSIFICATION\", \"EM_EVENTPROBABILITY\"], data=[[\"A\", 0.5]]\n", - ")\n", + "output_var = pd.DataFrame(columns=[\"EM_CLASSIFICATION\", \"EM_EVENTPROBABILITY\"], data=[[\"A\", 0.5]])\n", "pzmm.JSONFiles.write_var_json(output_var, is_input=False, json_path=output_path)\n", "\n", "# Step 7: Write model properties files\n", "pzmm.JSONFiles.write_model_properties_json(\n", - " model_name=model_prefix,\n", - " target_variable=target,\n", - " target_values=[\"1\", \"0\"],\n", - " json_path=output_path,\n", + " model_name=model_prefix, \n", + " target_variable=target, \n", + " target_values=[\"1\", \"0\"], \n", + " json_path=output_path, \n", " model_desc=description,\n", " model_algorithm=algorithm,\n", " modeler=username,\n", ")\n", "\n", "# Step 8: Write file metadata file\n", - "pzmm.JSONFiles.write_file_metadata_json(\n", - " model_prefix=model_prefix, json_path=output_path\n", - ")" + "pzmm.JSONFiles.write_file_metadata_json(model_prefix=model_prefix, json_path=output_path)\n" ] }, { @@ -914,45 +830,33 @@ "metadata": {}, "outputs": [], "source": [ - "# Step 9: Score training, testing, and validation data\n", - "t1 = \"P_\" + target + \"1\"\n", - "t0 = \"P_\" + target + \"0\"\n", - "ti = \"I_\" + target\n", - "\n", - "train_scored = pd.DataFrame(\n", - " {\n", - " t1: model_object.predict_proba(x_train)[:, 1],\n", - " t0: model_object.predict_proba(x_train)[:, 0],\n", - " ti: model_object.predict(x_train),\n", - " target: y_train,\n", - " assess_bias_var: x_train_full[assess_bias_var],\n", - " \"Split\": \"Train\",\n", - " }\n", - ")\n", - "\n", - "test_scored = pd.DataFrame(\n", - " {\n", - " t1: model_object.predict_proba(x_test)[:, 1],\n", - " t0: model_object.predict_proba(x_test)[:, 0],\n", - " ti: model_object.predict(x_test),\n", - " target: y_test,\n", - " assess_bias_var: x_test_full[assess_bias_var],\n", - " \"Split\": \"Testing\",\n", - " }\n", - ")\n", - "\n", - "val_scored = pd.DataFrame(\n", - " {\n", - " t1: model_object.predict_proba(x_val)[:, 1],\n", - " t0: model_object.predict_proba(x_val)[:, 0],\n", - " ti: model_object.predict(x_val),\n", - " target: y_val,\n", - " assess_bias_var: x_val_full[assess_bias_var],\n", - " \"Split\": \"Validation\",\n", - " }\n", - ")\n", - "\n", - "scored = pd.concat([train_scored, test_scored, val_scored])" + "# Step 9: Score training, testing, and validation data \n", + "t1 = 'P_' + target + '1'\n", + "t0 = 'P_' + target + '0'\n", + "ti = 'I_'+ target\n", + "\n", + "train_scored = pd.DataFrame({t1: model_object.predict_proba(x_train)[:,1], \n", + " t0: model_object.predict_proba(x_train)[:,0], \n", + " ti: model_object.predict(x_train), \n", + " target: y_train, \n", + " assess_bias_var: x_train_full[assess_bias_var], \n", + " 'Split': 'Train'})\n", + "\n", + "test_scored = pd.DataFrame({t1: model_object.predict_proba(x_test)[:,1], \n", + " t0: model_object.predict_proba(x_test)[:,0], \n", + " ti: model_object.predict(x_test),\n", + " target: y_test, \n", + " assess_bias_var: x_test_full[assess_bias_var], \n", + " 'Split': 'Testing'})\n", + "\n", + "val_scored = pd.DataFrame({t1: model_object.predict_proba(x_val)[:,1], \n", + " t0: model_object.predict_proba(x_val)[:,0], \n", + " ti: model_object.predict(x_val),\n", + " target: y_val, \n", + " assess_bias_var: x_val_full[assess_bias_var], \n", + " 'Split': 'Validation'})\n", + "\n", + "scored = pd.concat([train_scored, test_scored, val_scored])\n" ] }, { @@ -970,13 +874,12 @@ "source": [ "# Step 10: Write model statistics files\n", "pzmm.JSONFiles.calculate_model_statistics(\n", - " target_value=1,\n", - " prob_value=0.5,\n", - " train_data=train_scored[[target, ti, t1]],\n", - " test_data=test_scored[[target, ti, t1]],\n", - " validate_data=test_scored[[target, ti, t1]],\n", - " json_path=output_path,\n", - ")" + " target_value=1,\n", + " train_data=train_scored[[target, ti, t1]], \n", + " test_data=test_scored[[target, ti, t1]],\n", + " validate_data=test_scored[[target, ti, t1]],\n", + " json_path=output_path\n", + " )" ] }, { @@ -994,14 +897,14 @@ "source": [ "# Step 11: Assess Model Bias\n", "dfs = pzmm.JSONFiles.assess_model_bias(\n", - " score_table=test_scored,\n", - " actual_values=target,\n", - " sensitive_values=assess_bias_var,\n", - " prob_values=[t1, t0],\n", - " levels=[\"1\", \"0\"],\n", - " json_path=output_path,\n", - " return_dataframes=True,\n", - ")" + " score_table=test_scored,\n", + " actual_values=target, \n", + " sensitive_values=assess_bias_var, \n", + " prob_values=[t1, t0], \n", + " levels=['1', '0'], \n", + " json_path=output_path, \n", + " return_dataframes=True \n", + " )" ] }, { @@ -1708,37 +1611,30 @@ ], "source": [ "print(\"Group Metrics: \")\n", - "display(dfs[\"groupMetricsData\"])\n", + "display(dfs['groupMetricsData'])\n", "print(\"-------------------------------------------\")\n", "print(\"Max Differences: \")\n", - "display(dfs[\"maxDifferencesData\"])\n", + "display(dfs['maxDifferencesData'])\n", "print(\"-------------------------------------------\")\n", "print(\"Bias Metrics : \")\n", - "display(dfs[\"biasMetricsData\"])\n", + "display(dfs['biasMetricsData'])\n", "\n", "print(\"-------------------------------------------\")\n", - "y_axis = np.array([\"Male\", \"Female\"])\n", - "x_axis = np.array(\n", - " [(dfs[\"groupMetricsData\"][\"_acc_\"][0]), (dfs[\"groupMetricsData\"][\"_acc_\"][1])]\n", - ")\n", + "y_axis =np.array([\"Male\", \"Female\"])\n", + "x_axis = np.array([(dfs['groupMetricsData']['_acc_'][0]), (dfs['groupMetricsData']['_acc_'][1])])\n", "\n", "fig, ax = plt.subplots()\n", - "p = ax.bar(x=y_axis, height=x_axis)\n", - "ax.set_title(\"Model Accuracy\")\n", + "p = ax.bar(x = y_axis, height = x_axis)\n", + "ax.set_title('Model Accuracy')\n", "plt.show()\n", "\n", "print(\"-------------------------------------------\")\n", - "y_axis = np.array([\"Male\", \"Female\"])\n", - "x_axis = np.array(\n", - " [\n", - " (dfs[\"groupMetricsData\"][\"PREDICTED_EVENT\"][0]),\n", - " (dfs[\"groupMetricsData\"][\"PREDICTED_EVENT\"][1]),\n", - " ]\n", - ")\n", + "y_axis =np.array([\"Male\", \"Female\"])\n", + "x_axis = np.array([(dfs['groupMetricsData']['PREDICTED_EVENT'][0]), (dfs['groupMetricsData']['PREDICTED_EVENT'][1])])\n", "\n", "fig, ax = plt.subplots()\n", - "p = ax.bar(x=y_axis, height=x_axis)\n", - "ax.set_title(\"Predicted Probability for Salary > $50K\")\n", + "p = ax.bar(x = y_axis, height = x_axis)\n", + "ax.set_title('Predicted Probability for Salary > $50K')\n", "plt.show()" ] }, @@ -1755,21 +1651,19 @@ "metadata": {}, "outputs": [], "source": [ - "# Step 12: Generate Model Card Function\n", + "# Step 12: Generate Model Card Function \n", "train_predict = model_object.predict(x_train)\n", "\n", "pzmm.JSONFiles.generate_model_card(\n", - " model_prefix=model_prefix,\n", - " model_files=output_path,\n", - " algorithm=algorithm,\n", - " train_data=x_train_full[\n", - " original_columns\n", - " ], # changed to x_train_full with original variables (non-OHE'd)\n", - " train_predictions=train_scored[ti],\n", - " target_type=\"classification\",\n", + " model_prefix = model_prefix,\n", + " model_files = output_path,\n", + " algorithm = algorithm,\n", + " train_data = x_train_full[original_columns], # changed to x_train_full with original variables (non-OHE'd)\n", + " train_predictions = train_scored[ti],\n", + " target_type='classification',\n", " target_value=1,\n", - " class_vars=cat_columns,\n", - " interval_vars=interval_columns,\n", + " class_vars=cat_columns, \n", + " interval_vars=interval_columns\n", ")" ] }, @@ -1777,197 +1671,6 @@ "cell_type": "markdown", "metadata": {}, "source": [ -<<<<<<< Updated upstream:examples/pzmm_generate_complete_model_card.ipynb -======= - "I'm going to write the score code myself because I want to include all the data preprocessing we did earlier, but that is not a requirement. If you prefer that this score code be automatically written, I'll provide example code before the conclusion you can use instead. " - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "# Step 13: Write score code\n", - "sn = \"score_\" + model_prefix + \".py\"\n", - "sc = Path.cwd() / output_path / sn" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%%writefile $sc\n", - "\n", - "import math\n", - "import pickle\n", - "import pandas as pd\n", - "import numpy as np\n", - "from pathlib import Path\n", - "\n", - "import settings\n", - "\n", - "with open(Path(settings.pickle_path) / \"dtc.pickle\", \"rb\") as pickle_model:\n", - " model = pickle.load(pickle_model)\n", - "\n", - "def score(Age, WorkClass, Education, MartialStatus, Relationship, Race, Sex, HoursPerWeek): \n", - " \"Output: EM_EVENTPROBABILITY, EM_CLASSIFICATION\" \n", - "\n", - " # Check if pickle file is loaded, load if unavailable\n", - " try:\n", - " global model\n", - " except NameError:\n", - " with open(settings.pickle_path + 'dtc.pickle', 'rb') as _pFile:\n", - " model = pickle.load(_pFile)\n", - "\n", - " # Encode WorkClass\n", - " WorkClass_Private = 0\n", - " WorkClass_Self = 0\n", - " WorkClass_Gov = 0 \n", - " WorkClass_Other = 0\n", - " if \"Private\" in WorkClass: WorkClass_Private = 1\n", - " elif \"Self-emp-not-inc\" in WorkClass: WorkClass_Self = 1\n", - " elif \"Self-emp-inc\" in WorkClass: WorkClass_Self = 1\n", - " elif \"Local-gov\" in WorkClass: WorkClass_Gov = 1\n", - " elif \"State-gov\" in WorkClass: WorkClass_Gov = 1\n", - " elif \"Federal-gov\" in WorkClass: WorkClass_Gov = 1\n", - " else: WorkClass_Other = 1\n", - "\n", - "\n", - " # Encode Education\n", - " Education_HS_grad = 0\n", - " Education_Some_HS = 0\n", - " Education_Assoc = 0\n", - " Education_Some_college = 0\n", - " Education_Bachelors = 0\n", - " Education_Adv_Degree = 0\n", - " Education_No_HS = 0\n", - "\n", - " if \"HS-grad\" in Education: Education_HS_grad = 1\n", - " elif \"11th\" in Education: Education_Some_HS = 1\n", - " elif \"10th\" in Education: Education_Some_HS = 1\n", - " elif \"9th\" in Education: Education_Some_HS = 1\n", - " elif \"12th\" in Education: Education_Some_HS = 1\n", - " elif \"Assoc-voc\" in Education: Education_Assoc = 1\n", - " elif \"Assoc-acdm\" in Education: Education_Assoc = 1\n", - " elif \"Some-college\" in Education: Education_Some_college = 1\n", - " elif \"Bachelors\" in Education: Education_Bachelors = 1\n", - " elif \"Masters\" in Education: Education_Adv_Degree = 1\n", - " elif \"Prof-school\" in Education: Education_Adv_Degree = 1\n", - " elif \"Doctorate\" in Education: Education_Adv_Degree = 1\n", - " else:Education_No_HS = 1\n", - " \n", - " # Encode MaritalStatus\n", - " MartialStatus_Married_civ_spouse = 0\n", - " MartialStatus_Never_married = 0\n", - " MartialStatus_Divorced = 0\n", - " MartialStatus_Separated = 0 \n", - " MartialStatus_Widowed = 0 \n", - " MartialStatus_Other = 0\n", - " if \"Married-civ-spouse\" in MartialStatus: MartialStatus_Married_civ_spouse = 1\n", - " elif \"Never-married\" in MartialStatus: MartialStatus_Never_married = 1\n", - " elif \"Divorced\" in MartialStatus: MartialStatus_Divorced = 1\n", - " elif \"Separated\" in MartialStatus: MartialStatus_Separated = 1\n", - " elif \"Widowed\" in MartialStatus: MartialStatus_Widowed = 1\n", - " else: MartialStatus_Other = 1\n", - " \n", - " # Encode Relationship\n", - " Relationship_Husband = 0\n", - " Relationship_Not_in_family = 0\n", - " Relationship_Own_child= 0\n", - " Relationship_Unmarried = 0 \n", - " Relationship_Wife = 0\n", - " Relationship_Other_relative = 0\n", - " if \"Husband\" in Relationship: Relationship_Husband = 1\n", - " elif \"Not-in-family\" in Relationship: Relationship_Not_in_family = 1\n", - " elif \"Own-child\" in Relationship: Relationship_Own_child = 1\n", - " elif \"Unmarried\" in Relationship: Relationship_Unmarried = 1\n", - " elif \"Wife\" in Relationship: Relationship_Wife = 1\n", - " else: Relationship_Other_relative = 1\n", - "\n", - " # Encode Race\n", - " Race_White = 0\n", - " Race_Black = 0\n", - " Race_Asian_Pac_Islander = 0\n", - " Race_Amer_Indian_Eskimo = 0\n", - " Race_Other = 0\n", - " if \"White\" in Race: Race_White = 1\n", - " elif \"Black\" in Race: Race_Black = 1\n", - " elif \"Asian-Pac-Islander\" in Race: Race_Asian_Pac_Islander = 1\n", - " elif \"Amer-Indian-Eskimo\" in Race: Race_Amer_Indian_Eskimo = 1\n", - " else: Race_Other = 1\n", - "\n", - " # Encode Sex\n", - " Sex_Female = 0\n", - " if \"Female\" in Sex: Sex_Female = 1\n", - "\n", - " try: \n", - " input_array = pd.DataFrame([[Age, HoursPerWeek, WorkClass_Private, WorkClass_Self, WorkClass_Gov, WorkClass_Other, \n", - " Education_HS_grad, Education_Some_HS, Education_Assoc, Education_Some_college, \n", - " Education_Bachelors, Education_Adv_Degree, Education_No_HS, \n", - " MartialStatus_Married_civ_spouse, MartialStatus_Never_married, \n", - " MartialStatus_Divorced, MartialStatus_Separated, MartialStatus_Widowed, \n", - " MartialStatus_Other, Relationship_Husband, Relationship_Not_in_family, \n", - " Relationship_Own_child, Relationship_Unmarried, Relationship_Wife, \n", - " Relationship_Other_relative, Race_White, Race_Black, Race_Asian_Pac_Islander, \n", - " Race_Amer_Indian_Eskimo, Race_Other, Sex_Female]], \n", - " columns = ['Age', 'HoursPerWeek', 'WorkClass_Private', 'WorkClass_Self', 'WorkClass_Gov', 'WorkClass_Other', \n", - " 'Education_HS_grad', 'Education_Some_HS', 'Education_Assoc', 'Education_Some_college', \n", - " 'Education_Bachelors','Education_Adv_Degree', 'Education_No_HS', \n", - " 'MartialStatus_Married_civ_spouse', 'MartialStatus_Never_married', \n", - " 'MartialStatus_Divorced', 'MartialStatus_Separated', 'MartialStatus_Widowed', \n", - " 'MartialStatus_Other', 'Relationship_Husband', 'Relationship_Not_in_family', \n", - " 'Relationship_Own_child', 'Relationship_Unmarried', 'Relationship_Wife', \n", - " 'Relationship_Other_relative', 'Race_White', 'Race_Black', 'Race_Asian_Pac_Islander', \n", - " 'Race_Amer_Indian_Eskimo', 'Race_Other','Sex_Female'], \n", - " dtype = float)\n", - " except ValueError:\n", - " input_array = pd.DataFrame([[1.0, Age, HoursPerWeek, WorkClass_Private, WorkClass_Self, WorkClass_Gov, WorkClass_Other, \n", - " Education_HS_grad, Education_Some_HS, Education_Assoc, Education_Some_college, \n", - " Education_Bachelors, Education_Adv_Degree, Education_No_HS, \n", - " MartialStatus_Married_civ_spouse, MartialStatus_Never_married, \n", - " MartialStatus_Divorced, MartialStatus_Separated, MartialStatus_Widowed, \n", - " MartialStatus_Other, Relationship_Husband, Relationship_Not_in_family, \n", - " Relationship_Own_child, Relationship_Unmarried, Relationship_Wife, \n", - " Relationship_Other_relative, Race_White, Race_Black, Race_Asian_Pac_Islander, \n", - " Race_Amer_Indian_Eskimo, Race_Other, Sex_Female]], \n", - " columns = ['const', 'Age', 'HoursPerWeek', 'WorkClass_Private', 'WorkClass_Self', 'WorkClass_Gov', 'WorkClass_Other', \n", - " 'Education_HS_grad', 'Education_Some_HS', 'Education_Assoc', 'Education_Some_college', \n", - " 'Education_Bachelors', 'Education_Adv_Degree', 'Education_No_HS', \n", - " 'MartialStatus_Married_civ_spouse', 'MartialStatus_Never_married', \n", - " 'MartialStatus_Divorced', 'MartialStatus_Separated', 'MartialStatus_Widowed', \n", - " 'MartialStatus_Other', 'Relationship_Husband','Relationship_Not_in_family', \n", - " 'Relationship_Own_child', 'Relationship_Unmarried', 'Relationship_Wife', \n", - " 'Relationship_Other_relative', 'Race_White', 'Race_Black', 'Race_Asian_Pac_Islander', \n", - " 'Race_Amer_Indian_Eskimo', 'Race_Other','Sex_Female'], \n", - " dtype = float)\n", - "\n", - " prediction = model.predict_proba(input_array).tolist()\n", - "\n", - " # Check for numpy values and convert to a CAS readable representation\n", - " if isinstance(prediction, np.ndarray):\n", - " prediction = prediction.tolist()\n", - "\n", - " if input_array.shape[0] == 1:\n", - " if prediction[0][1] > 0.5:\n", - " EM_CLASSIFICATION = \"1\"\n", - " else:\n", - " EM_CLASSIFICATION = \"0\"\n", - " return EM_CLASSIFICATION, prediction[0][1]\n", - " else:\n", - " df = pd.DataFrame(prediction)\n", - " proba = df[1]\n", - " classifications = np.where(df[1] > 0.5, '1', '0')\n", - " return pd.DataFrame({'EM_CLASSIFICATION': classifications, 'EM_EVENTPROBABILITY': proba})" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ ->>>>>>> Stashed changes:examples/pzmm_generate_complete_mode_card.ipynb "To document the requirements for our score code, lets create a requirements file. Since scikit-learn is installed as scikit-learn but imported as sklearn, we're going to tweak the requirements file to make sure we are referencing scikit-learn correctly. " ] }, @@ -2016,15 +1719,12 @@ "requirements_json = pzmm.JSONFiles.create_requirements_json(output_path)\n", "\n", "import json\n", - "\n", "print(json.dumps(requirements_json, sort_keys=True, indent=4))\n", "\n", "for requirement in requirements_json:\n", - " if \"sklearn\" in requirement[\"step\"]:\n", - " requirement[\"command\"] = requirement[\"command\"].replace(\n", - " \"sklearn\", \"scikit-learn\"\n", - " )\n", - " requirement[\"step\"] = requirement[\"step\"].replace(\"sklearn\", \"scikit-learn\")\n", + " if 'sklearn' in requirement['step']:\n", + " requirement['command'] = requirement[\"command\"].replace('sklearn', 'scikit-learn')\n", + " requirement['step'] = requirement['step'].replace('sklearn', 'scikit-learn')\n", "\n", "print(json.dumps(requirements_json, sort_keys=True, indent=4))\n", "\n", @@ -2045,7 +1745,6 @@ "metadata": {}, "outputs": [], "source": [ -<<<<<<< Updated upstream:examples/pzmm_generate_complete_model_card.ipynb "# Step 14: Automatically generate score code and import model \n", "pzmm.ImportModel.import_model(\n", " model_files=output_path, # Where are the model files?\n", @@ -2063,65 +1762,6 @@ " preprocess_function=preprocess_function # What do we want to do to the data before we score it?\n", " )\n", " # Reinitialize the score_code variable when writing more than one model's score code\n", -======= - "# Step 15: Import model into SAS Model Manager\n", - "zipIOFile = pzmm.ZipModel.zip_files(\n", - " model_files=output_path, model_prefix=model_prefix, is_viya4=True\n", - ")\n", - "\n", - "mr.create_project(mm_project, \"Public\")\n", - "\n", - "mr.import_model_from_zip(model_prefix, mm_project, zipIOFile)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And now your model is available in SAS Model Manager where you can run the scoring test, update the model usage properties, add Key Performance Indicators (KPIs) thresholds, and run performance monitoring against the model. Managing the rest of the model lifecycle in SAS Model Manager will complete the rest of the model card.\n", - "\n", - "Instead of writing the score code manually and importing the model, you can run the following function to automatically generate the score code and import the model into SAS Model Manager in one step. Automatically generating the score code makes things easy, but manually writing allows greater customization and control. Only run the block below if you don't want to run steps 13 and 15. \n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Alternate to Step 13 and Step 15: Automatically generate score code and import model\n", - "pzmm.ImportModel.import_model(\n", - " model_files=output_path, # Where are the model files?\n", - " model_prefix=model_prefix, # What is the model name?\n", - " project=mm_project, # What is the project name?\n", - " input_data=x_train_full[\n", - " [\n", - " \"Age\",\n", - " \"WorkClass\",\n", - " \"Education\",\n", - " \"MartialStatus\",\n", - " \"Relationship\",\n", - " \"Race\",\n", - " \"Sex\",\n", - " \"HoursPerWeek\",\n", - " ]\n", - " ], # What does example input data look like?\n", - " predict_method=[\n", - " dtc.predict_proba,\n", - " [int, int],\n", - " ], # What is the predict method and what does it return?\n", - " score_metrics=[\n", - " \"EM_CLASSIFICATION\",\n", - " \"EM_EVENTPROBABILITY\",\n", - " ], # What are the output variables?\n", - " overwrite_model=True, # Overwrite the model if it already exists?\n", - " target_values=[\"0\", \"1\"], # What are the expected values of the target variable?\n", - " target_index=1, # What is the index of the target value in target_values?\n", - " model_file_name=model_prefix + \".pickle\", # How was the model file serialized?\n", - " missing_values=False, # Does the data include missing values?\n", - ")\n", - "# Reinitialize the score_code variable when writing more than one model's score code\n", ->>>>>>> Stashed changes:examples/pzmm_generate_complete_mode_card.ipynb "pzmm.ScoreCode.score_code = \"\"" ] }, @@ -2145,7 +1785,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": ".venv", "language": "python", "name": "python3" }, diff --git a/src/sasctl/pzmm/write_json_files.py b/src/sasctl/pzmm/write_json_files.py index a982dd06..1c0c560d 100644 --- a/src/sasctl/pzmm/write_json_files.py +++ b/src/sasctl/pzmm/write_json_files.py @@ -1281,21 +1281,20 @@ def calculate_model_statistics( data = cls.stat_dataset_to_dataframe(data, target_value, target_type) data["predict_proba2"] = 1 - data["predict_proba"] - out = conn.upload( + conn.upload( data, casout={"caslib": "Public", "name": "assess_dataset", "replace": True}, ) if target_type == "classification": - output = conn.percentile.assess( + conn.percentile.assess( table={"name": "assess_dataset", "caslib": "Public"}, - inputs="actual", - response="predict_proba", + inputs="predict_proba", + response="actual", event="1", pvar="predict_proba2", pevent="0", includeLift=True, - cutstep=0.2, fitStatOut={"name": "FitStat", "replace": True, "caslib": "Public"}, rocOut={"name": "ROC", "replace": True, "caslib": "Public"}, casout={"name": "Lift", "replace": True, "caslib": "Public"}, @@ -1303,8 +1302,8 @@ def calculate_model_statistics( else: conn.percentile.assess( table={"name": "assess_dataset", "caslib": "Public"}, - response="predict", - inputs="actual", + response="actual", + inputs="predict", fitStatOut={"caslib": "Public", "name": "FitStat", "replace": True}, casout={"caslib": "Public", "name": "Lift", "replace": True}, )