{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "d50d28a6-e6ae-4966-89db-68de923947a3",
   "metadata": {},
   "source": "# 🍿 CleanLab之二"
  },
  {
   "cell_type": "markdown",
   "id": "b1eba1738a0aa510",
   "metadata": {},
   "source": [
    "Datalab通过利用任何已经训练过的 ML 模型或其学习到的数据表示的（概率）预测来执行这些检查。[^1]\n",
    "\n",
    "* 增量问题搜索\n",
    "\n",
    "* 指定非默认参数来发出检查\n",
    "\n",
    "* 保存并加载 Datalab 对象\n",
    "\n",
    "* 添加自定义 IssueManager\n",
    "\n",
    "[^1]: [Datalab: Advanced workflows to audit your data](https://docs.cleanlab.ai/stable/tutorials/datalab/datalab_advanced.html)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4b19eac92bfd2c4f",
   "metadata": {},
   "source": [
    "## 壹丨导入依赖"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "b7f73518d2d7b2d8",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-31T16:37:29.510095Z",
     "start_time": "2024-07-31T16:37:28.008965Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.model_selection import cross_val_predict\n",
    "\n",
    "from cleanlab import Datalab"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "991a56f9-1dfb-4e09-85a0-509885d97d10",
   "metadata": {},
   "source": [
    "## 贰丨创建并加载数据"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "63e58706-0fdc-4713-ae87-0e53d92ebaaa",
   "metadata": {},
   "source": [
    "### 1. 创建数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "8275f61af09728c5",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Note: This pulldown content is for docs.cleanlab.ai, if running on local Jupyter or Colab, please ignore it.\n",
    "\n",
    "from sklearn.model_selection import train_test_split\n",
    "from cleanlab.benchmarking.noise_generation import (\n",
    "    generate_noise_matrix_from_trace,\n",
    "    generate_noisy_labels,\n",
    ")\n",
    "\n",
    "SEED = 123\n",
    "np.random.seed(SEED)\n",
    "\n",
    "BINS = {\n",
    "    \"low\": [-np.inf, 3.3],\n",
    "    \"mid\": [3.3, 6.6],\n",
    "    \"high\": [6.6, +np.inf],\n",
    "}\n",
    "\n",
    "BINS_MAP = {\n",
    "    \"low\": 0,\n",
    "    \"mid\": 1,\n",
    "    \"high\": 2,\n",
    "}\n",
    "\n",
    "\n",
    "def create_data():\n",
    "\n",
    "    X = np.random.rand(250, 2) * 5\n",
    "    y = np.sum(X, axis=1)\n",
    "    # Map y to bins based on the BINS dict\n",
    "    y_bin = np.array([k for y_i in y for k, v in BINS.items() if v[0] <= y_i < v[1]])\n",
    "    y_bin_idx = np.array([BINS_MAP[k] for k in y_bin])\n",
    "\n",
    "    # Split into train and test\n",
    "    X_train, X_test, y_train, y_test, y_train_idx, y_test_idx = train_test_split(\n",
    "        X, y_bin, y_bin_idx, test_size=0.5, random_state=SEED\n",
    "    )\n",
    "\n",
    "    # Add several (5) out-of-distribution points. Sliding them along the decision boundaries\n",
    "    # to make them look like they are out-of-frame\n",
    "    X_out = np.array(\n",
    "        [\n",
    "            [-1.5, 3.0],\n",
    "            [-1.75, 6.5],\n",
    "            [1.5, 7.2],\n",
    "            [2.5, -2.0],\n",
    "            [5.5, 7.0],\n",
    "        ]\n",
    "    )\n",
    "    # Add a near duplicate point to the last outlier, with some tiny noise added\n",
    "    near_duplicate = X_out[-1:] + np.random.rand(1, 2) * 1e-6\n",
    "    X_out = np.concatenate([X_out, near_duplicate])\n",
    "\n",
    "    y_out = np.sum(X_out, axis=1)\n",
    "    y_out_bin = np.array([k for y_i in y_out for k, v in BINS.items() if v[0] <= y_i < v[1]])\n",
    "    y_out_bin_idx = np.array([BINS_MAP[k] for k in y_out_bin])\n",
    "\n",
    "    # Add to train\n",
    "    X_train = np.concatenate([X_train, X_out])\n",
    "    y_train = np.concatenate([y_train, y_out])\n",
    "    y_train_idx = np.concatenate([y_train_idx, y_out_bin_idx])\n",
    "\n",
    "    # Add an exact duplicate example to the training set\n",
    "    exact_duplicate_idx = np.random.randint(0, len(X_train))\n",
    "    X_duplicate = X_train[exact_duplicate_idx, None]\n",
    "    y_duplicate = y_train[exact_duplicate_idx, None]\n",
    "    y_duplicate_idx = y_train_idx[exact_duplicate_idx, None]\n",
    "\n",
    "    # Add to train\n",
    "    X_train = np.concatenate([X_train, X_duplicate])\n",
    "    y_train = np.concatenate([y_train, y_duplicate])\n",
    "    y_train_idx = np.concatenate([y_train_idx, y_duplicate_idx])\n",
    "\n",
    "    py = np.bincount(y_train_idx) / float(len(y_train_idx))\n",
    "    m = len(BINS)\n",
    "\n",
    "    noise_matrix = generate_noise_matrix_from_trace(\n",
    "        m,\n",
    "        trace=0.9 * m,\n",
    "        py=py,\n",
    "        valid_noise_matrix=True,\n",
    "        seed=SEED,\n",
    "    )\n",
    "\n",
    "    noisy_labels_idx = generate_noisy_labels(y_train_idx, noise_matrix)\n",
    "    noisy_labels = np.array([list(BINS_MAP.keys())[i] for i in noisy_labels_idx])\n",
    "\n",
    "    return X_train, y_train_idx, noisy_labels, noisy_labels_idx, X_out, X_duplicate"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "25df8562d59320eb",
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train, y_train_idx, noisy_labels, noisy_labels_idx, X_out, X_duplicate = create_data()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "abd27bdc-41f9-48e4-9f0a-019e310363dc",
   "metadata": {},
   "source": [
    "### 2. 可视化数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "16dc02f77a9f4b9b",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Note: This pulldown content is for docs.cleanlab.ai, if running on local Jupyter or Colab, please ignore it.\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "def plot_data(X_train, y_train_idx, noisy_labels_idx, X_out, X_duplicate):\n",
    "    # Plot data with clean labels and noisy labels, use BINS_MAP for the legend\n",
    "    fig, ax = plt.subplots(figsize=(8, 6.5))\n",
    "\n",
    "    low = ax.scatter(X_train[noisy_labels_idx == 0, 0], X_train[noisy_labels_idx == 0, 1], label=\"low\")\n",
    "    mid = ax.scatter(X_train[noisy_labels_idx == 1, 0], X_train[noisy_labels_idx == 1, 1], label=\"mid\")\n",
    "    high = ax.scatter(X_train[noisy_labels_idx == 2, 0], X_train[noisy_labels_idx == 2, 1], label=\"high\")\n",
    "\n",
    "    ax.set_title(\"Noisy labels\")\n",
    "    ax.set_xlabel(r\"$x_1$\", fontsize=16)\n",
    "    ax.set_ylabel(r\"$x_2$\", fontsize=16)\n",
    "\n",
    "    # Plot true boundaries (x+y=3.3, x+y=6.6)\n",
    "    ax.set_xlim(-3.5, 9.0)\n",
    "    ax.set_ylim(-3.5, 9.0)\n",
    "    ax.plot([-0.7, 4.0], [4.0, -0.7], color=\"k\", linestyle=\"--\", alpha=0.5)\n",
    "    ax.plot([-0.7, 7.3], [7.3, -0.7], color=\"k\", linestyle=\"--\", alpha=0.5)\n",
    "\n",
    "    # Draw red circles around the points that are misclassified (i.e. the points that are in the wrong bin)\n",
    "    for i, (X, y) in enumerate(zip([X_train, X_train], [y_train_idx, noisy_labels_idx])):\n",
    "        for j, (k, v) in enumerate(BINS_MAP.items()):\n",
    "            label_err = ax.scatter(\n",
    "                X[(y == v) & (y != y_train_idx), 0],\n",
    "                X[(y == v) & (y != y_train_idx), 1],\n",
    "                s=180,\n",
    "                marker=\"o\",\n",
    "                facecolor=\"none\",\n",
    "                edgecolors=\"red\",\n",
    "                linewidths=2.5,\n",
    "                alpha=0.5,\n",
    "                label=\"Label error\",\n",
    "            )\n",
    "\n",
    "\n",
    "    outlier = ax.scatter(X_out[:, 0], X_out[:, 1], color=\"k\", marker=\"x\", s=100, linewidth=2, label=\"Outlier\")\n",
    "\n",
    "    # Plot the exact duplicate\n",
    "    dups = ax.scatter(\n",
    "        X_duplicate[:, 0],\n",
    "        X_duplicate[:, 1],\n",
    "        color=\"c\",\n",
    "        marker=\"x\",\n",
    "        s=100,\n",
    "        linewidth=2,\n",
    "        label=\"Duplicates\",\n",
    "    )\n",
    "\n",
    "    first_legend = ax.legend(handles=[low, mid, high], loc=[0.75, 0.7], title=\"Given Class Label\", alignment=\"left\", title_fontproperties={\"weight\":\"semibold\"})\n",
    "    second_legend = ax.legend(handles=[label_err, outlier, dups], loc=[0.75, 0.45], title=\"Type of Issue\", alignment=\"left\", title_fontproperties={\"weight\":\"semibold\"})\n",
    "\n",
    "    ax = plt.gca().add_artist(first_legend)\n",
    "    ax = plt.gca().add_artist(second_legend)\n",
    "    plt.tight_layout()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "afca6d145dd0613d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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caFFixbs37/f1mEJIczk4eHB2LFjGTNmDMHBwcbtOp3OhlEJIUQ5odNC/A6IW65+12lL9em6d+/Oq6++yuuvv061atXw9fVl3rx53L17l2effRYPDw8aNGjA+vXrgfynQn3//ffUqVMHV1dXBg8eLFNdq4gKn1jcvHmTzp074+DgwPr16zl69CgzZ86kWrVqtg5NCGEBjUZj0pU7OTmZL7/8krNnz9ouKCGEsLWjq+Hz5rDgcVjxnPr98+bq9lK0YMECatasyb59+3j11Vd58cUXGT58OJ06dSImJobevXszevRo0tLS8jx27969PPfcc7zyyiscOnSIHj168M9//rNU4xXlg6Kv4HUep0yZwp9//smOHTuKfQxLWpULIcrGihUriIuLQ1EUunfvTteuXWWYXQhRYWRkZBAfH0+9evWKP8Xz6GpYOgbIfap2/7MwYiGEDihJmPnq3r07Wq3WeG6l1Wrx8vJiyJAhLFy4EIArV67g7+/P7t27ycjIoEePHty8eRNvb29GjhxJSkoKv/32m/GYTz75JFFRUYUu8BaFs8rvVDFYcp5c4UcsVq9eTbt27Rg+fDg+Pj60bt2aefPm2TosIUQJDRgwgDZt2qDX69m6dSuLFy/O98qYEEJUSjotRE0mb1LBg21RU0ptWlTLli2N/7azs6NGjRq0aNHCuM3X1xeApKSkPI89duwYDz30kMm2jh07lkqconyp8InF2bNnmT17Ng0bNmTDhg28+OKLvPbaayxYsKDAx2RmZpKammryJYQoXxwcHBgwYACDBg3C3t6e06dPM2fOHC5dumTr0IQQovSd3wWplwvZQQ+pl9T9SoGDg4PJbUVRTLYZRpBlLZzIqcInFjqdjjZt2vDpp5/SunVrJkyYwPjx4/n6668LfExkZCReXl7Gr6CgoDKMWAhhiVatWjF+/HiqV69OSkoK3377LRcuXLB1WEIIUbruXLXufmWoadOm7N2712Tbnj17bBSNKEsVPrHw9/cnNDTUZFvTpk0LPfGYOnUqKSkpxq+EhITSDlMIUQK+vr5MmDCBpk2bUrt2bWrXrm3rkIQQonS5+1p3vzL02muvERUVxWeffcapU6f46quviIqKsnVYogxU+MSic+fOeRpqnTx50qRkZW5OTk54enqafAkhyjdnZ2ciIiIYOXIkGo360aXVaqWEoRCicgruBJ4B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RERERLIxsSAiIiIiItmYWBARERERkWxMLIiIiIiISDYmFkREREREJBsTCyIiIiIiko2JBRERERERycbEgoiIiIiIZGNiQUREREREsjGxICIiIiIi2ZhYEBERERGRbEwsiIiIiIhINiYWREQk29mzZ216PBEROT4mFkREJMuaNWsQGxuL5cuXm3T88uXLERsbizVr1tg4MiIisicmFkREZLGzZ89iwYIFAIClS5c2mVwsX74cS5cuBQAsWLCAKxdERC7EqROLW7duYd68eYiKioK3tzc6deqE9957D5WVlUqHRkTULMTExGDZsmU1t3XJhUYr4ljGfew4k4VjGfeh0YoGSQUALFu2DDExMUqETURENuCmdABypKenQ6vVIjExEU899RQuXLiA+fPno7S0FB999JHS4RERNQsJCQkAUJM0LF26FP88cB2q2Ck1x2jPbEfm3rU1t5ctW1bzPCIicg2CKIqi0kFY04cffoiVK1fixo0bJj+npKQEAQEBKC4uhr+/vw2jIyJyXXVXJFoOm42AAdNRfHwLHhxcX3M/kwoiIudhznmyU69YNKS4uBitW7dWOgwiombn939Ygn8euF6zMvHg4HqUHN8KbUVpzTERY+fh939YolSIRERkQ05dY1HX9evX8cknn2DhwoWNHldRUYGSkhKDLyIikiflZiFUsVPQctjsmvv0k4qWw2ZDFTsFKTcLlQiPiIhszCETi4SEBAiC0OhXenq6wXOysrIwbtw4TJ8+HfPnz2/09ZctW4aAgICar4iICFv+OUREzUL+w3IAQMCA6VB5+ho8pvL0RcCA6QbHERGRa3HIGouCggLcv3+/0WM6duwIDw8PAEB2djaGDx+OAQMG4IsvvoBK1Xi+VFFRgYqKiprbJSUliIiIYI0FEZEMxzLuY+aa4/VqKnR0NRdfzR+AgZ3aKBAhERGZy+lrLAIDAxEYGGjSsVlZWRgxYgT69OmDdevWNZlUAICnpyc8PT3lhklERHr6RbWG9sx2g6RC5elbsx3qwcH18PNyQ7+oF5QKkYiIbMght0KZKisrC8OHD0dkZCQ++ugjFBQUIDc3F7m5uUqHRkTU7Hz4Px8YtJRtOWw2It7+2qDmInPvWnz4Px8oER4REdmYQ65YmOqnn37C9evXcf36dbRr187gMQfc4UVE5LLqtpqNGDuvZo5FwIDp8PNyq0k6dMex5SwRkWtxyBoLe+McCyIiyzU0Ufv3f1iClJuFyH9YjiA/L/SLao0P/+eDescxuSAicmzmnCczsQATCyIiS509exaxsbE1t5tKFuomIWfOnEFMTIwtQyQiIhnMOU926hoLIiJSVkxMDFavXg3AtBWIhIQELFu2DACwevVqJhVERC6EKxbgigURkVxnz541K0kw93giIlIGVyyIiMiuzE0SmFQQEbkeJhZERERERCQbEwsiIiIiIpKNiQUREREREcnGxIKIiIiIiGRjYkFERERERLIxsSAiIiIiItmYWBARERERkWxMLIiIiIiISDYmFkREREREJBsTCyIiIiIiko2JBRERERERycbEgoiIiIiIZGNiQUREREREsjGxICIiIiIi2ZhYEBERERGRbEwsiIiIiIhINiYWREREREQkGxMLIiIiIiKSjYkFERERERHJxsSCiIiIiIhkY2JBRERERESyMbEgIiIiIiLZmFgQEREREZFsTCyIiIiIiEg2JhZERERERCQbEwsiIiIiIpKNiQUREREREcnGxIKIiIiIiGRjYkFERERERLIxsSAiIiIiItmYWBARERERkWxMLIiIiIiISDYmFkREREREJBsTCyIiIiIiko2JBRERERERycbEgoiIiIiIZGNiQUREREREsjGxICIiIiIi2ZhYEBERERGRbEwsiIiIiIhINiYWREREREQkGxMLIiIiIiKSjYkFERERERHJxsSCiIiIiIhkY2JBRERERESyMbEgIiIiIiLZmFgQEREREZFsTCyIiIiIiEg2JhZERERERCQbEwsiIiIiIpKNiQUREREREcnGxIKIiIiIiGRjYkFERERERLIxsSAiIiIiItmYWBARERERkWxuSgfgCERRBACUlJQoHAkRERERkePQnR/rzpcbw8QCwMOHDwEAERERCkdCREREROR4Hj58iICAgEaPEURT0g8Xp9VqkZ2dDT8/PwiCoHQ4LqGkpAQRERHIzMyEv7+/0uGQDHwvXQPfR9fA99F18L10Dc3hfRRFEQ8fPkRYWBhUqsarKLhiAUClUqFdu3ZKh+GS/P39XfZftOaG76Vr4PvoGvg+ug6+l67B1d/HplYqdFi8TUREREREsjGxICIiIiIi2ZhYkE14enrivffeg6enp9KhkEx8L10D30fXwPfRdfC9dA18Hw2xeJuIiIiIiGTjigUR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WoR+/frh5s2bKCoqYmJBROSAmFgQEZFiBg8ejKNHj8LPzw+HDh1CbGxsvWO0Wi1UKmnn7uuvv449e/YwsSAickCssSAiIkWsW7cOx44dAwBUVFTA39+/weN0SQURETk2/teaiIjsbsuWLZg/fz5at26NGTNmoLKyEkuWLFE6LCIikoGJBRER2dX333+Pl19+Gb6+vti7dy9WrVqF1q1bY+vWrTh69KjS4RERkYWYWBARkd0cPHgQ06ZNg5ubG3bt2oU+ffqgZcuWePfddwEAixcvVjhCIiKyFBMLIiKyi5SUFEycOBEajQbffPMNhg4dWvPYm2++ifbt2+PEiRPYvHmzglESEZGlmFgQEZHNnT9/Hs8//zzKysqwceNGjBs3zuBxT09P/PnPfwYALF26FBUVFUqESUREMrDdLBEROQ22myUiclxuSgdARETUmLKyMnz//fcAgBs3bqCsrAxbt24FAMTFxaF9+/ZKhkdERE9wxYKIiBzarVu3EBUV1eBj69atw5w5c+wbEBERNYiJBRERERERycbibSIiIiIiko2JBRERERERycbEgoiIiIiIZGNiQUREREREsjGxICIiIiIi2ZhYEBERERGRbEwsiIiIiIhINiYWREREREQkGxMLIiIiIiKSjYkFERERERHJxsSCiIiIiIhkY2JBRERERESy/X8LcrUA6DvykQAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 800x650 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_data(X_train, y_train_idx, noisy_labels_idx, X_out, X_duplicate)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cbff00c2-6216-421c-8105-2ea7e14b66b9",
   "metadata": {},
   "source": [
    "## 贰丨从分类器获取样本外的预测概率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "7e5d77a84aba9bcb",
   "metadata": {},
   "outputs": [],
   "source": [
    "model = LogisticRegression()\n",
    "pred_probs = cross_val_predict(\n",
    "    estimator=model, X=X_train, y=noisy_labels, cv=5, method=\"predict_proba\"\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a5409098-0acf-493c-a5b9-d7d66af5c069",
   "metadata": {},
   "source": [
    "## 叁丨实例化Datalab"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "f5ecc99461469c97",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 支持的数据类型包括：HuggingFace数据集、DataFrame\n",
    "data = {\"X\": X_train, \"y\": noisy_labels}\n",
    "\n",
    "lab = Datalab(data, label_name=\"y\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "47c1e602-1584-4d6e-a189-875a3b2bbcf0",
   "metadata": {},
   "source": [
    "### 功能1：增量问题搜索\n",
    "\n",
    "可以使用`find_issues`多次调用一个`Datalab`对象来检测一种类型的问题"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "8e32140c2cc9cf00",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Finding label issues ...\n",
      "\n",
      "Audit complete. 11 issues found in the dataset.\n",
      "Dataset Information: num_examples: 132, num_classes: 3\n",
      "\n",
      "Here is a summary of various issues found in your data:\n",
      "\n",
      "issue_type  num_issues\n",
      "     label          11\n",
      "\n",
      "Learn about each issue: https://docs.cleanlab.ai/stable/cleanlab/datalab/guide/issue_type_description.html\n",
      "See which examples in your dataset exhibit each issue via: `datalab.get_issues(<ISSUE_NAME>)`\n",
      "\n",
      "Data indices corresponding to top examples of each issue are shown below.\n",
      "\n",
      "\n",
      "----------------------- label issues -----------------------\n",
      "\n",
      "About this issue:\n",
      "\tExamples whose given label is estimated to be potentially incorrect\n",
      "    (e.g. due to annotation error) are flagged as having label issues.\n",
      "    \n",
      "\n",
      "Number of examples with this issue: 11\n",
      "Overall dataset quality in terms of this issue: 0.9318\n",
      "\n",
      "Examples representing most severe instances of this issue:\n",
      "     is_label_issue  label_score given_label predicted_label\n",
      "77             True     0.006940        high             mid\n",
      "7              True     0.007830         low             mid\n",
      "40             True     0.014828         mid             low\n",
      "107            True     0.021241        high             mid\n",
      "120            True     0.026407        high             mid\n"
     ]
    }
   ],
   "source": [
    "lab.find_issues(pred_probs=pred_probs, issue_types={\"label\": {}})\n",
    "lab.report()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f1362de0-f27d-49f1-8173-720129d7a709",
   "metadata": {},
   "source": [
    "可以继续监测异常值和近似重复值，都利用了数据的特征\n",
    "\n",
    "第二次调用会更新输出`report()`，可以看到与新问题一起监测到的现有标签问题"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "fb21c81224f80fe4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Finding outlier issues ...\n",
      "Finding near_duplicate issues ...\n",
      "\n",
      "Audit complete. 21 issues found in the dataset.\n",
      "Dataset Information: num_examples: 132, num_classes: 3\n",
      "\n",
      "Here is a summary of various issues found in your data:\n",
      "\n",
      "    issue_type  num_issues\n",
      "         label          11\n",
      "       outlier           6\n",
      "near_duplicate           4\n",
      "\n",
      "Learn about each issue: https://docs.cleanlab.ai/stable/cleanlab/datalab/guide/issue_type_description.html\n",
      "See which examples in your dataset exhibit each issue via: `datalab.get_issues(<ISSUE_NAME>)`\n",
      "\n",
      "Data indices corresponding to top examples of each issue are shown below.\n",
      "\n",
      "\n",
      "----------------------- label issues -----------------------\n",
      "\n",
      "About this issue:\n",
      "\tExamples whose given label is estimated to be potentially incorrect\n",
      "    (e.g. due to annotation error) are flagged as having label issues.\n",
      "    \n",
      "\n",
      "Number of examples with this issue: 11\n",
      "Overall dataset quality in terms of this issue: 0.9318\n",
      "\n",
      "Examples representing most severe instances of this issue:\n",
      "     is_label_issue  label_score given_label predicted_label\n",
      "77             True     0.006940        high             mid\n",
      "7              True     0.007830         low             mid\n",
      "40             True     0.014828         mid             low\n",
      "107            True     0.021241        high             mid\n",
      "120            True     0.026407        high             mid\n",
      "\n",
      "\n",
      "---------------------- outlier issues ----------------------\n",
      "\n",
      "About this issue:\n",
      "\tExamples that are very different from the rest of the dataset \n",
      "    (i.e. potentially out-of-distribution or rare/anomalous instances).\n",
      "    \n",
      "\n",
      "Number of examples with this issue: 6\n",
      "Overall dataset quality in terms of this issue: 0.3558\n",
      "\n",
      "Examples representing most severe instances of this issue:\n",
      "     is_outlier_issue  outlier_score\n",
      "126              True       0.006636\n",
      "130              True       0.012571\n",
      "129              True       0.012571\n",
      "127              True       0.014909\n",
      "128              True       0.017443\n",
      "\n",
      "\n",
      "------------------ near_duplicate issues -------------------\n",
      "\n",
      "About this issue:\n",
      "\tA (near) duplicate issue refers to two or more examples in\n",
      "    a dataset that are extremely similar to each other, relative\n",
      "    to the rest of the dataset.  The examples flagged with this issue\n",
      "    may be exactly duplicated, or lie atypically close together when\n",
      "    represented as vectors (i.e. feature embeddings).\n",
      "    \n",
      "\n",
      "Number of examples with this issue: 4\n",
      "Overall dataset quality in terms of this issue: 0.6160\n",
      "\n",
      "Examples representing most severe instances of this issue:\n",
      "     is_near_duplicate_issue  near_duplicate_score near_duplicate_sets  distance_to_nearest_neighbor\n",
      "131                     True              0.000000               [123]                  0.000000e+00\n",
      "123                     True              0.000000               [131]                  0.000000e+00\n",
      "129                     True              0.000002               [130]                  4.463180e-07\n",
      "130                     True              0.000002               [129]                  4.463180e-07\n",
      "51                     False              0.161148                  []                  3.859087e-02\n"
     ]
    }
   ],
   "source": [
    "lab.find_issues(features=data[\"X\"], issue_types={\"outlier\": {}, \"near_duplicate\": {}})\n",
    "lab.report()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "deec68cd-6a4d-403d-a746-1a4b842eaa8c",
   "metadata": {},
   "source": [
    "### 功能2：指定非默认参数\n",
    "\n",
    "下面以检查异常值为例，说明如何使用不同的设置重新运行检查，并覆盖原有结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "69d57c606952e525",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Finding outlier issues ...\n",
      "\n",
      "Audit complete. 22 issues found in the dataset.\n",
      "Dataset Information: num_examples: 132, num_classes: 3\n",
      "\n",
      "Here is a summary of various issues found in your data:\n",
      "\n",
      "    issue_type  num_issues\n",
      "         label          11\n",
      "       outlier           7\n",
      "near_duplicate           4\n",
      "\n",
      "Learn about each issue: https://docs.cleanlab.ai/stable/cleanlab/datalab/guide/issue_type_description.html\n",
      "See which examples in your dataset exhibit each issue via: `datalab.get_issues(<ISSUE_NAME>)`\n",
      "\n",
      "Data indices corresponding to top examples of each issue are shown below.\n",
      "\n",
      "\n",
      "----------------------- label issues -----------------------\n",
      "\n",
      "About this issue:\n",
      "\tExamples whose given label is estimated to be potentially incorrect\n",
      "    (e.g. due to annotation error) are flagged as having label issues.\n",
      "    \n",
      "\n",
      "Number of examples with this issue: 11\n",
      "Overall dataset quality in terms of this issue: 0.9318\n",
      "\n",
      "Examples representing most severe instances of this issue:\n",
      "     is_label_issue  label_score given_label predicted_label\n",
      "77             True     0.006940        high             mid\n",
      "7              True     0.007830         low             mid\n",
      "40             True     0.014828         mid             low\n",
      "107            True     0.021241        high             mid\n",
      "120            True     0.026407        high             mid\n",
      "\n",
      "\n",
      "---------------------- outlier issues ----------------------\n",
      "\n",
      "About this issue:\n",
      "\tExamples that are very different from the rest of the dataset \n",
      "    (i.e. potentially out-of-distribution or rare/anomalous instances).\n",
      "    \n",
      "\n",
      "Number of examples with this issue: 7\n",
      "Overall dataset quality in terms of this issue: 0.3453\n",
      "\n",
      "Examples representing most severe instances of this issue:\n",
      "     is_outlier_issue  outlier_score\n",
      "126              True       0.029542\n",
      "130              True       0.031182\n",
      "129              True       0.031182\n",
      "128              True       0.057961\n",
      "127              True       0.058244\n",
      "\n",
      "\n",
      "------------------ near_duplicate issues -------------------\n",
      "\n",
      "About this issue:\n",
      "\tA (near) duplicate issue refers to two or more examples in\n",
      "    a dataset that are extremely similar to each other, relative\n",
      "    to the rest of the dataset.  The examples flagged with this issue\n",
      "    may be exactly duplicated, or lie atypically close together when\n",
      "    represented as vectors (i.e. feature embeddings).\n",
      "    \n",
      "\n",
      "Number of examples with this issue: 4\n",
      "Overall dataset quality in terms of this issue: 0.6160\n",
      "\n",
      "Examples representing most severe instances of this issue:\n",
      "     is_near_duplicate_issue  near_duplicate_score near_duplicate_sets  distance_to_nearest_neighbor\n",
      "131                     True              0.000000               [123]                  0.000000e+00\n",
      "123                     True              0.000000               [131]                  0.000000e+00\n",
      "129                     True              0.000002               [130]                  4.463180e-07\n",
      "130                     True              0.000002               [129]                  4.463180e-07\n",
      "51                     False              0.161148                  []                  3.859087e-02\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Artmallo\\PycharmProjects\\MyNote\\.venv\\Lib\\site-packages\\cleanlab\\datalab\\internal\\data_issues.py:348: UserWarning: Overwriting columns ['outlier_score', 'is_outlier_issue'] in self.issues with columns from issue manager OutlierIssueManager.\n",
      "  warnings.warn(\n",
      "C:\\Users\\Artmallo\\PycharmProjects\\MyNote\\.venv\\Lib\\site-packages\\cleanlab\\datalab\\internal\\data_issues.py:378: UserWarning: Overwriting row in self.issue_summary with row from issue manager OutlierIssueManager.\n",
      "  warnings.warn(\n",
      "C:\\Users\\Artmallo\\PycharmProjects\\MyNote\\.venv\\Lib\\site-packages\\cleanlab\\datalab\\internal\\data_issues.py:357: UserWarning: Overwriting key outlier in self.info\n",
      "  warnings.warn(f\"Overwriting key {issue_name} in self.info\")\n"
     ]
    }
   ],
   "source": [
    "lab.find_issues(features=data[\"X\"], issue_types={\"outlier\": {\"k\": 30}})\n",
    "lab.report()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7b018fbc-9812-42ca-9cde-4d98857102bc",
   "metadata": {},
   "source": [
    "还可以增加`report`详细程度以查看有关数据问题的其他信息，并控制每个问题显示多少个排名靠前的示例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "2a93a736c27d11b1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Dataset Information: num_examples: 132, num_classes: 3\n",
      "\n",
      "Here is a summary of various issues found in your data:\n",
      "\n",
      "    issue_type  num_issues\n",
      "         label          11\n",
      "       outlier           7\n",
      "near_duplicate           4\n",
      "\n",
      "Learn about each issue: https://docs.cleanlab.ai/stable/cleanlab/datalab/guide/issue_type_description.html\n",
      "See which examples in your dataset exhibit each issue via: `datalab.get_issues(<ISSUE_NAME>)`\n",
      "\n",
      "Data indices corresponding to top examples of each issue are shown below.\n",
      "\n",
      "\n",
      "----------------------- label issues -----------------------\n",
      "\n",
      "About this issue:\n",
      "\tExamples whose given label is estimated to be potentially incorrect\n",
      "    (e.g. due to annotation error) are flagged as having label issues.\n",
      "    \n",
      "\n",
      "Number of examples with this issue: 11\n",
      "Overall dataset quality in terms of this issue: 0.9318\n",
      "\n",
      "Examples representing most severe instances of this issue:\n",
      "     is_label_issue  label_score given_label predicted_label\n",
      "77             True     0.006940        high             mid\n",
      "7              True     0.007830         low             mid\n",
      "40             True     0.014828         mid             low\n",
      "107            True     0.021241        high             mid\n",
      "120            True     0.026407        high             mid\n",
      "54             True     0.039122         mid             low\n",
      "53             True     0.044598        high             mid\n",
      "105            True     0.105196         mid            high\n",
      "4              True     0.133654        high             mid\n",
      "43             True     0.168033        high             mid\n",
      "\n",
      "\n",
      "---------------------- outlier issues ----------------------\n",
      "\n",
      "About this issue:\n",
      "\tExamples that are very different from the rest of the dataset \n",
      "    (i.e. potentially out-of-distribution or rare/anomalous instances).\n",
      "    \n",
      "\n",
      "Number of examples with this issue: 7\n",
      "Overall dataset quality in terms of this issue: 0.3453\n",
      "\n",
      "Examples representing most severe instances of this issue:\n",
      "     is_outlier_issue  outlier_score\n",
      "126              True       0.029542\n",
      "130              True       0.031182\n",
      "129              True       0.031182\n",
      "128              True       0.057961\n",
      "127              True       0.058244\n",
      "125              True       0.101107\n",
      "37               True       0.183382\n",
      "109             False       0.209259\n",
      "35              False       0.211042\n",
      "5               False       0.221316\n",
      "\n",
      "Additional Information: \n",
      "average_ood_score: 0.34530442089193386\n",
      "\n",
      "\n",
      "------------------ near_duplicate issues -------------------\n",
      "\n",
      "About this issue:\n",
      "\tA (near) duplicate issue refers to two or more examples in\n",
      "    a dataset that are extremely similar to each other, relative\n",
      "    to the rest of the dataset.  The examples flagged with this issue\n",
      "    may be exactly duplicated, or lie atypically close together when\n",
      "    represented as vectors (i.e. feature embeddings).\n",
      "    \n",
      "\n",
      "Number of examples with this issue: 4\n",
      "Overall dataset quality in terms of this issue: 0.6160\n",
      "\n",
      "Examples representing most severe instances of this issue:\n",
      "     is_near_duplicate_issue  near_duplicate_score near_duplicate_sets  distance_to_nearest_neighbor\n",
      "131                     True              0.000000               [123]                  0.000000e+00\n",
      "123                     True              0.000000               [131]                  0.000000e+00\n",
      "129                     True              0.000002               [130]                  4.463180e-07\n",
      "130                     True              0.000002               [129]                  4.463180e-07\n",
      "51                     False              0.161148                  []                  3.859087e-02\n",
      "52                     False              0.161148                  []                  3.859087e-02\n",
      "5                      False              0.169820                  []                  4.087324e-02\n",
      "89                     False              0.169820                  []                  4.087324e-02\n",
      "92                     False              0.259024                  []                  6.583757e-02\n",
      "91                     False              0.346458                  []                  9.341292e-02\n",
      "\n",
      "Additional Information: \n",
      "threshold: 0.13\n"
     ]
    }
   ],
   "source": [
    "lab.report(num_examples=10, verbosity=2)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dac087e4-a869-432a-958a-0facc71c8359",
   "metadata": {},
   "source": [
    "### 功能3：保存和加载Datalab对象"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "243a57dc-3ab6-480b-a718-d4a7d5cacc0f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "0a2d27e9203f46ff90fe66a000840061",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Saving the dataset (0/1 shards):   0%|          | 0/132 [00:00<?, ? examples/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saved Datalab to folder: datalab-files\n"
     ]
    }
   ],
   "source": [
    "path = \"datalab-files\"\n",
    "lab.save(path, force=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1b98bcbf-fd31-4626-9bbf-6cf4a8bde7dc",
   "metadata": {},
   "source": [
    "加载Datalab文件中的对象并查看先前的检测结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "ddc9bbf0-d31b-4216-815e-d9ef7657f2d5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Datalab loaded from folder: datalab-files\n",
      "Dataset Information: num_examples: 132, num_classes: 3\n",
      "\n",
      "Here is a summary of various issues found in your data:\n",
      "\n",
      "    issue_type  num_issues\n",
      "         label          11\n",
      "       outlier           7\n",
      "near_duplicate           4\n",
      "\n",
      "Learn about each issue: https://docs.cleanlab.ai/stable/cleanlab/datalab/guide/issue_type_description.html\n",
      "See which examples in your dataset exhibit each issue via: `datalab.get_issues(<ISSUE_NAME>)`\n",
      "\n",
      "Data indices corresponding to top examples of each issue are shown below.\n",
      "\n",
      "\n",
      "----------------------- label issues -----------------------\n",
      "\n",
      "About this issue:\n",
      "\tExamples whose given label is estimated to be potentially incorrect\n",
      "    (e.g. due to annotation error) are flagged as having label issues.\n",
      "    \n",
      "\n",
      "Number of examples with this issue: 11\n",
      "Overall dataset quality in terms of this issue: 0.9318\n",
      "\n",
      "Examples representing most severe instances of this issue:\n",
      "     is_label_issue  label_score given_label predicted_label\n",
      "77             True     0.006940        high             mid\n",
      "7              True     0.007830         low             mid\n",
      "40             True     0.014828         mid             low\n",
      "107            True     0.021241        high             mid\n",
      "120            True     0.026407        high             mid\n",
      "\n",
      "\n",
      "---------------------- outlier issues ----------------------\n",
      "\n",
      "About this issue:\n",
      "\tExamples that are very different from the rest of the dataset \n",
      "    (i.e. potentially out-of-distribution or rare/anomalous instances).\n",
      "    \n",
      "\n",
      "Number of examples with this issue: 7\n",
      "Overall dataset quality in terms of this issue: 0.3453\n",
      "\n",
      "Examples representing most severe instances of this issue:\n",
      "     is_outlier_issue  outlier_score\n",
      "126              True       0.029542\n",
      "130              True       0.031182\n",
      "129              True       0.031182\n",
      "128              True       0.057961\n",
      "127              True       0.058244\n",
      "\n",
      "\n",
      "------------------ near_duplicate issues -------------------\n",
      "\n",
      "About this issue:\n",
      "\tA (near) duplicate issue refers to two or more examples in\n",
      "    a dataset that are extremely similar to each other, relative\n",
      "    to the rest of the dataset.  The examples flagged with this issue\n",
      "    may be exactly duplicated, or lie atypically close together when\n",
      "    represented as vectors (i.e. feature embeddings).\n",
      "    \n",
      "\n",
      "Number of examples with this issue: 4\n",
      "Overall dataset quality in terms of this issue: 0.6160\n",
      "\n",
      "Examples representing most severe instances of this issue:\n",
      "     is_near_duplicate_issue  near_duplicate_score near_duplicate_sets  distance_to_nearest_neighbor\n",
      "131                     True              0.000000               [123]                  0.000000e+00\n",
      "123                     True              0.000000               [131]                  0.000000e+00\n",
      "129                     True              0.000002               [130]                  4.463180e-07\n",
      "130                     True              0.000002               [129]                  4.463180e-07\n",
      "51                     False              0.161148                  []                  3.859087e-02\n"
     ]
    }
   ],
   "source": [
    "new_lab = Datalab.load(path)\n",
    "new_lab.report()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5d0bdd4e-0306-439f-b8ea-566591c9759a",
   "metadata": {},
   "source": [
    "### 功能4：添加自定义IssueManager"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "84e89b36-036c-4eaa-90f9-ff3e389d07e8",
   "metadata": {},
   "source": [
    "Datalab中所有问题类型都是继承`IssueManager`，只需要注册为其子类即可自定义问题类型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "17eaca2d-7c8b-49c6-a687-a90de8289bf5",
   "metadata": {},
   "outputs": [],
   "source": [
    "from cleanlab.datalab.internal.issue_manager import IssueManager\n",
    "from cleanlab.datalab.internal.issue_manager_factory import register\n",
    "\n",
    "\n",
    "def scoring_function(idx: int, div: int = 13) -> float:\n",
    "    if idx == 0:\n",
    "        # Zero excluded from the divisibility check, gets the highest score\n",
    "        return 1\n",
    "    rem = idx % div\n",
    "    inv_scale = idx // div\n",
    "    if rem == 0:\n",
    "        return 0.5 * (1 - np.exp(-0.1*(inv_scale-1)))\n",
    "    else:\n",
    "        return 1 - 0.49 * (1 - np.exp(-inv_scale**0.5))*rem/div\n",
    "\n",
    "\n",
    "@register  # register this issue type for use with Datalab\n",
    "class SuperstitionIssueManager(IssueManager):\n",
    "    \"\"\"A custom issue manager that keeps track of issue indices that\n",
    "    are divisible by 13.\n",
    "    \"\"\"\n",
    "    description: str = \"Examples with indices that are divisible by 13 may be unlucky.\"  # Optional\n",
    "    issue_name: str = \"superstition\"\n",
    "\n",
    "    def find_issues(self, div=13, **_) -> None:\n",
    "        ids = self.datalab.issues.index.to_series()\n",
    "        issues_mask = ids.apply(lambda idx: idx % div == 0 and idx != 0)\n",
    "        scores = ids.apply(lambda idx: scoring_function(idx, div))\n",
    "        self.issues = pd.DataFrame(\n",
    "            {\n",
    "                f\"is_{self.issue_name}_issue\": issues_mask,\n",
    "                self.issue_score_key: scores,\n",
    "            },\n",
    "        )\n",
    "        summary_score = 1 - sum(issues_mask) / len(issues_mask)\n",
    "        self.summary = self.make_summary(score = summary_score)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "55af3383-1d0c-4c19-ad17-3a735f5fced7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Finding superstition issues ...\n",
      "\n",
      "Audit complete. 32 issues found in the dataset.\n",
      "Dataset Information: num_examples: 132, num_classes: 3\n",
      "\n",
      "Here is a summary of various issues found in your data:\n",
      "\n",
      "    issue_type  num_issues\n",
      "         label          11\n",
      "  superstition          10\n",
      "       outlier           7\n",
      "near_duplicate           4\n",
      "\n",
      "Learn about each issue: https://docs.cleanlab.ai/stable/cleanlab/datalab/guide/issue_type_description.html\n",
      "See which examples in your dataset exhibit each issue via: `datalab.get_issues(<ISSUE_NAME>)`\n",
      "\n",
      "Data indices corresponding to top examples of each issue are shown below.\n",
      "\n",
      "\n",
      "----------------------- label issues -----------------------\n",
      "\n",
      "About this issue:\n",
      "\tExamples whose given label is estimated to be potentially incorrect\n",
      "    (e.g. due to annotation error) are flagged as having label issues.\n",
      "    \n",
      "\n",
      "Number of examples with this issue: 11\n",
      "Overall dataset quality in terms of this issue: 0.9318\n",
      "\n",
      "Examples representing most severe instances of this issue:\n",
      "     is_label_issue  label_score given_label predicted_label\n",
      "77             True     0.006940        high             mid\n",
      "7              True     0.007830         low             mid\n",
      "40             True     0.014828         mid             low\n",
      "107            True     0.021241        high             mid\n",
      "120            True     0.026407        high             mid\n",
      "\n",
      "\n",
      "------------------- superstition issues --------------------\n",
      "\n",
      "About this issue:\n",
      "\tExamples with indices that are divisible by 13 may be unlucky.\n",
      "\n",
      "Number of examples with this issue: 10\n",
      "Overall dataset quality in terms of this issue: 0.9242\n",
      "\n",
      "Examples representing most severe instances of this issue:\n",
      "    is_superstition_issue  superstition_score\n",
      "13                   True            0.000000\n",
      "26                   True            0.047581\n",
      "39                   True            0.090635\n",
      "52                   True            0.129591\n",
      "65                   True            0.164840\n",
      "\n",
      "\n",
      "---------------------- outlier issues ----------------------\n",
      "\n",
      "About this issue:\n",
      "\tExamples that are very different from the rest of the dataset \n",
      "    (i.e. potentially out-of-distribution or rare/anomalous instances).\n",
      "    \n",
      "\n",
      "Number of examples with this issue: 7\n",
      "Overall dataset quality in terms of this issue: 0.3453\n",
      "\n",
      "Examples representing most severe instances of this issue:\n",
      "     is_outlier_issue  outlier_score\n",
      "126              True       0.029542\n",
      "130              True       0.031182\n",
      "129              True       0.031182\n",
      "128              True       0.057961\n",
      "127              True       0.058244\n",
      "\n",
      "\n",
      "------------------ near_duplicate issues -------------------\n",
      "\n",
      "About this issue:\n",
      "\tA (near) duplicate issue refers to two or more examples in\n",
      "    a dataset that are extremely similar to each other, relative\n",
      "    to the rest of the dataset.  The examples flagged with this issue\n",
      "    may be exactly duplicated, or lie atypically close together when\n",
      "    represented as vectors (i.e. feature embeddings).\n",
      "    \n",
      "\n",
      "Number of examples with this issue: 4\n",
      "Overall dataset quality in terms of this issue: 0.6160\n",
      "\n",
      "Examples representing most severe instances of this issue:\n",
      "     is_near_duplicate_issue  near_duplicate_score near_duplicate_sets  distance_to_nearest_neighbor\n",
      "131                     True              0.000000               [123]                  0.000000e+00\n",
      "123                     True              0.000000               [131]                  0.000000e+00\n",
      "129                     True              0.000002               [130]                  4.463180e-07\n",
      "130                     True              0.000002               [129]                  4.463180e-07\n",
      "51                     False              0.161148                  []                  3.859087e-02\n"
     ]
    }
   ],
   "source": [
    "lab.find_issues(issue_types={\"superstition\": {}})\n",
    "lab.report()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
