replace classes with class string instead of index

This commit is contained in:
alu committed 2025-06-11 04:41:32 +00:00
1 parent fadeab8a99
commit c73de36c70
2 files changed
+33 -48

No files matched your search

+29 -9
View File
@@ -2,7 +2,7 @@
"cells": [
{
"cell_type": "code",
"execution_count": 6,
"execution_count": 1,
"id": "d5618056",
"metadata": {},
"outputs": [],
@@ -22,7 +22,7 @@
},
{
"cell_type": "code",
"execution_count": 7,
"execution_count": 2,
"id": "b96f3403",
"metadata": {},
"outputs": [
@@ -72,20 +72,22 @@
},
{
"cell_type": "code",
"execution_count": 8,
"execution_count": 3,
"id": "d336971a",
"metadata": {},
"outputs": [],
"source": [
"# output the tree\n",
"def get_lineage(tree, feature_names):\n",
" data = {\"features\": {}, \"paths\": []}\n",
" data = {\"features\": {}, \"paths\": [], \"classes\": set()}\n",
"\n",
" thresholds = tree.tree_.threshold\n",
" features = [feature_names[i] for i in tree.tree_.feature]\n",
" left = tree.tree_.children_left\n",
" right = tree.tree_.children_right\n",
" value = tree.tree_.value\n",
"\n",
" data[\"classes\"] = list(tree.classes_)\n",
" \n",
" # get ids of child nodes\n",
" idx = np.argwhere(left == -1)[:, 0]\n",
@@ -137,7 +139,7 @@
},
{
"cell_type": "code",
"execution_count": 9,
"execution_count": 4,
"id": "7f36344d",
"metadata": {},
"outputs": [],
@@ -146,18 +148,36 @@
"feature_names = Set1.columns\n",
"file = open(outputfile, \"w+\")\n",
"lineage = get_lineage(dt, feature_names)\n",
"file.write(json.dumps(lineage, indent = 4))\n",
"\n",
"class SetEncoder(json.JSONEncoder):\n",
" def default(self, obj):\n",
" if isinstance(obj, set):\n",
" return list(obj)\n",
" return json.JSONEncoder.default(self, obj)\n",
"\n",
"file.write(json.dumps(lineage, indent = 4, cls=SetEncoder))\n",
"file.close()"
]
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 5,
"id": "cf8832b9",
"metadata": {},
"outputs": [],
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAHlkAAB4nCAYAAACvQuxAAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzs3UEBACAQgDC1f+ezhTzcEtCAPTOzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHjt1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8CeTZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGGyDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJEyWAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAhMkyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQMFkGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASJssAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDCZBkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEiYLAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmTZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGGyDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJEyWAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAhMkyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQMFkGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASJssAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDCZBkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEiYLAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmTZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGGyDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJEyWAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAhMkyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQMFkGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASJssAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDCZBkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEiYLAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmTZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGGyDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJEyWAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAhMkyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQMFkGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASJssAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDCZBkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEiYLAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmTZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGGyDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJEyWAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAhMkyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQMFkGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASJssAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDCZBkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEiYLAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmTZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGGyDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJEyWAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAhMkyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQMFkGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASJssAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDCZBkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEiYLAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmTZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGGyDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJEyWAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAhMkyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQMFkGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASJssAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDCZBkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEiYLAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmTZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGGyDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJEyWAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAhMkyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQMFkGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASJssAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDCZBkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEiYLAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmTZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGGyDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJEyWAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAhMkyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQMFkGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASJssAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDCZBkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEiYLAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmTZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGGyDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJEyWAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAhMkyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQMFkGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASJssAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDCZBkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEiYLAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmTZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGGyDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJEyWAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAhMkyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQMFkGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASJssAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDCZBkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEiYLAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmTZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGGyDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJEyWAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAhMkyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQMFkGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASJssAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDCZBkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEiYLAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmTZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGGyDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJEyWAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAhMkyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQMFkGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASJssAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDCZBkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEiYLAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmTZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGGyDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJEyWAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAhMkyAAAAAAAAAAAAAAAAAAAAAAAAAAALine truncated
"text/plain": [
"<Figure size 10000x10000 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure(figsize=(25,20))\n",
"fig = plt.figure(figsize=(100,100))\n",
"_ = plot_tree(dt, filled=True)"
]
}
+4 -39
View File
@@ -38,14 +38,14 @@
"i = 0\n",
"\n",
"path_ids = set()\n",
"path_classes = set()\n",
"path_classes = tree[\"classes\"]\n",
"\n",
"# for each path in the tree\n",
"for path in paths:\n",
"\t# assign a path id \n",
"\tpath[\"id\"] = i\n",
"\tpath_ids.add(i)\n",
"\tpath_classes.add(path[\"classification\"])\n",
"\t#path_classes.add(path[\"classification\"])\n",
"\ti += 1\t\n",
"\t# for each condition\n",
"\tconditions = path[\"conditions\"]\n",
@@ -86,41 +86,7 @@
"execution_count": 5,
"id": "98cde024",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'dst': {'min': None, 'max': 578}, 'src': {'min': None, 'max': 60}, 'protocl': {'min': None, 'max': 0}}\n",
"{'dst': {'min': None, 'max': 3031}, 'src': {'min': None, 'max': 60}, 'protocl': {'min': None, 'max': 0}}\n",
"{'dst': {'min': None, 'max': 3031}, 'src': {'min': None, 'max': 60}, 'protocl': {'min': 0, 'max': None}}\n",
"{'dst': {'min': None, 'max': 3031}, 'src': {'min': None, 'max': 60}, 'protocl': {'min': 1, 'max': None}}\n",
"{'dst': {'min': None, 'max': 3031}, 'src': {'min': None, 'max': 67}, 'protocl': {'min': None, 'max': None}}\n",
"{'dst': {'min': None, 'max': 101}, 'src': {'min': 67, 'max': None}, 'protocl': {'min': None, 'max': None}}\n",
"{'dst': {'min': None, 'max': 101}, 'src': {'min': 54978, 'max': None}, 'protocl': {'min': None, 'max': None}}\n",
"{'dst': {'min': None, 'max': 101}, 'src': {'min': 59817, 'max': None}, 'protocl': {'min': None, 'max': None}}\n",
"{'dst': {'min': None, 'max': 101}, 'src': {'min': 60043, 'max': None}, 'protocl': {'min': None, 'max': None}}\n",
"{'dst': {'min': None, 'max': 3031}, 'src': {'min': 67, 'max': None}, 'protocl': {'min': None, 'max': None}}\n",
"{'dst': {'min': None, 'max': 3031}, 'src': {'min': 130, 'max': None}, 'protocl': {'min': None, 'max': None}}\n",
"{'dst': {'min': None, 'max': 3031}, 'src': {'min': 1223, 'max': None}, 'protocl': {'min': None, 'max': None}}\n",
"{'dst': {'min': 3031, 'max': None}, 'src': {'min': None, 'max': None}, 'protocl': {'min': None, 'max': None}}\n",
"{'dst': {'min': 3067, 'max': None}, 'src': {'min': None, 'max': None}, 'protocl': {'min': None, 'max': None}}\n",
"{'dst': {'min': 5110, 'max': None}, 'src': {'min': None, 'max': None}, 'protocl': {'min': None, 'max': None}}\n",
"{'dst': {'min': 33925, 'max': None}, 'src': {'min': None, 'max': None}, 'protocl': {'min': None, 'max': None}}\n",
"{'dst': {'min': 46329, 'max': None}, 'src': {'min': None, 'max': None}, 'protocl': {'min': None, 'max': None}}\n",
"{'dst': {'min': 46331, 'max': None}, 'src': {'min': None, 'max': None}, 'protocl': {'min': None, 'max': None}}\n",
"{'dst': {'min': 49152, 'max': None}, 'src': {'min': None, 'max': None}, 'protocl': {'min': None, 'max': None}}\n",
"{'dst': {'min': 49157, 'max': None}, 'src': {'min': None, 'max': 283}, 'protocl': {'min': None, 'max': 11}}\n",
"{'dst': {'min': 49157, 'max': None}, 'src': {'min': None, 'max': 283}, 'protocl': {'min': 11, 'max': None}}\n",
"{'dst': {'min': 49157, 'max': None}, 'src': {'min': None, 'max': 4566}, 'protocl': {'min': None, 'max': None}}\n",
"{'dst': {'min': 56320, 'max': None}, 'src': {'min': None, 'max': 4566}, 'protocl': {'min': None, 'max': None}}\n",
"{'dst': {'min': 49157, 'max': None}, 'src': {'min': 4566, 'max': None}, 'protocl': {'min': None, 'max': None}}\n",
"{'dst': {'min': 51848, 'max': None}, 'src': {'min': 4566, 'max': None}, 'protocl': {'min': None, 'max': None}}\n",
"{'dst': {'min': 49157, 'max': None}, 'src': {'min': 5225, 'max': None}, 'protocl': {'min': None, 'max': None}}\n",
"{'dst': {'min': 53283, 'max': None}, 'src': {'min': 5225, 'max': None}, 'protocl': {'min': None, 'max': None}}\n"
]
}
],
"outputs": [],
"source": [
"# collapse all paths to ranges for each feature\n",
"# because of how decision trees work, all conditions on a path must be true to reach the leaf node\n",
@@ -152,8 +118,7 @@
"\t\telif operation == \">\" and value > compressed[feature][\"max\"]:\n",
"\t\t\tcompressed[feature][\"min\"] = value\n",
"\n",
"\tpath[\"compressed\"] = compressed\n",
"\tprint(compressed)"
"\tpath[\"compressed\"] = compressed"
]
},
{