{ "cells": [ { "cell_type": "markdown", "id": "6659ed94", "metadata": {}, "source": [ "### Knn\n", "\n", "https://joserzapata.github.io/courses/python-ciencia-datos/ml/\n", "\n", "\n" ] }, { "cell_type": "markdown", "id": "591e115a", "metadata": {}, "source": [ "https://www.kaggle.com/code/jchen2186/machine-learning-with-iris-dataset/notebook" ] }, { "cell_type": "markdown", "id": "3c069ffa", "metadata": {}, "source": [ "https://scikit-learn.org/stable/auto_examples/datasets/plot_iris_dataset.html" ] }, { "cell_type": "code", "execution_count": 41, "id": "44212962", "metadata": {}, "outputs": [], "source": [ "## Importar Librerias\n", "from sklearn import neighbors, datasets, preprocessing\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.ensemble import RandomForestClassifier\n", "from sklearn.metrics import accuracy_score\n", "from sklearn.metrics import confusion_matrix\n", "from sklearn.metrics import classification_report\n", "from sklearn.preprocessing import label_binarize\n", "import matplotlib.pyplot as plt\n", "\n", "from sklearn.metrics import roc_curve, auc" ] }, { "cell_type": "code", "execution_count": 2, "id": "ed1899b9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "sklearn.utils.Bunch" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "## Cargar Dataset\n", "iris = datasets.load_iris()\n", "type(iris)" ] }, { "cell_type": "code", "execution_count": 24, "id": "b0117c16", "metadata": {}, "outputs": [], "source": [ "## Definir cual es la columna de salida\n", "## este dataset ya esta representado como numpy.array\n", "X, y = iris.data[:, :2], iris.target" ] }, { "cell_type": "code", "execution_count": 4, "id": "a64d793b", "metadata": {}, "outputs": [], "source": [ "## Division del dataset en datos de entrenamiento y de prueba\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)" ] }, { "cell_type": "code", "execution_count": 5, "id": "1de8beb8", "metadata": {}, "outputs": [], "source": [ "## Standarizacion de los valores\n", "scaler = preprocessing.StandardScaler().fit(X_train)\n", "\n", "X_train = scaler.transform(X_train)\n", "X_test = scaler.transform(X_test)" ] }, { "cell_type": "code", "execution_count": 25, "id": "253e5041", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "RandomForestClassifier(max_depth=2, random_state=0)" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "## Selección del algoritmo de machine learning.classifier = clf\n", "clf = RandomForestClassifier(max_depth=2,random_state=0)" ] }, { "cell_type": "code", "execution_count": 28, "id": "bb1b7b1d", "metadata": {}, "outputs": [], "source": [ "## Entrenamiento del Modelo\n", "clf = clf.fit(X_train, y_train)" ] }, { "cell_type": "code", "execution_count": 11, "id": "50ebcc40", "metadata": {}, "outputs": [], "source": [ "## Prediccion\n", "y_pred = clf.predict(X_test)" ] }, { "cell_type": "code", "execution_count": 12, "id": "e90ae134", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.8666666666666667" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "## Evaluacion\n", "accuracy_score(y_test, y_pred)" ] }, { "cell_type": "code", "execution_count": 23, "id": "7af15f23", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[10 0 0]\n", " [ 0 7 2]\n", " [ 0 2 9]]\n" ] } ], "source": [ "## Matriz de confusión \n", "print(confusion_matrix(y_test, y_pred))" ] }, { "cell_type": "code", "execution_count": 22, "id": "fdbe8da6", "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " 0 1.00 1.00 1.00 10\n", " 1 0.78 0.78 0.78 9\n", " 2 0.82 0.82 0.82 11\n", "\n", " accuracy 0.87 30\n", " macro avg 0.87 0.87 0.87 30\n", "weighted avg 0.87 0.87 0.87 30\n", "\n" ] } ], "source": [ "## Reporte de clasificación\n", "print(classification_report(y_test, y_pred))" ] }, { "cell_type": "markdown", "id": "93f09ac1", "metadata": {}, "source": [ "### Roc????" ] }, { "cell_type": "code", "execution_count": 72, "id": "7ed160f6", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Area under the ROC curve : 0.795491\n" ] }, { "data": { "image/png": "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oECB5Pc9evTQYcOGqarq8ePH9frrr9fZs2erquqxY8e0ZcuW+uGHH6qq6vr16/X666/XzZs3q6pqYmKifvTRR5kaW2Z8xzp27KgxMTF+XeeFGDFihN57772qqvrll19q586dz5tm9+7det111+nx48dVVbVTp0766aefJr//8ssvVVX13nvvTf4fHDt2TKtWrZrqOlM77oCVepHnXat6Av7++28efPBBpkyZQvXq1Rk0aBC5c+e2TvxMpnpx5kY2/XkkU5cZcW1hXmjrfS8AtWvXZt26dQBMnDiRunXr0rx5cwDy58/Phx9+SMOGDRkwYABvvPEGQ4YMoUKFCoBTMrn//vvPW2ZcXBwPPvggK1euRER44YUX6NChAwULFiQuLg6AqVOn8u233zJ+/Hh69uxJ3rx5WbNmDXXr1uWrr74iJiaGokWLAlC+fHkWL15MSEgI9913H7GxsQC899571K1b95x1Hz16lHXr1lGlShXAeXrkww8/THx8PPny5ePTTz/lpptuYvz48Xz11VfExcVx+vRpZs2axYMPPsiGDRtISEhg6NChtGvXjt9//53u3btz7NgxwPnVXqdOHa/3b2q++eYbhg4dCjgXwgwcOBBVPa8tITExkRMnThAWFsbx48e59tprUVXmzZvHxIkTAYiOjmbo0KHcf//95M+fn+uuu47ly5dTs2bNS4oxIzn6TKiq/Pe//+WRRx4hLi6O//znPwwePDhTrz82Jqs4ffo0P/74Y3I1zcaNG6lRo8Y505QrV464uDiOHDnChg0bvKpqevnllylSpAjr168H4ODBgxnOs3v3bpYsWUJoaCinT59m+vTp9OrVi2XLllGmTBmuuuoqunXrxqOPPsqtt95KbGwsLVq0YPPmzecsZ+XKlURGRiYPV6hQgUWLFpErVy7mzp3LM888w7Rp0wBYvXo169ato1ixYjzzzDM0btyYcePGcejQIWrWrEnTpk258sor+d///kfevHn57bff6Nq1KytXrjwv/nr16nH06NHzPn/rrbdo2rTpOZ/t2bOHUqVKAU4P0kWKFOHAgQNcfvnlydOUKFGCxx9/nNKlS5MvXz6aN29O8+bN2b9/P0WLFk3+0VqyZEn27NmTPF9UVBSLFi2yROFLsbGx9O3bl6ioKMaOHZv8y8kYX7iQX/6Z6cSJE1StWpU9e/YQHh5Os2bNMnX5c+fOZdKkScnDl112WYbzdOrUKbmrmy5duvDSSy/Rq1cvJk2aRJcuXZKXu2nTpuR5jhw5QlxcHAULFkz+7K+//uKKK65IHj58+DDR0dH89ttviAgJCQnJ45o1a0axYsUAmDNnDjNmzOCtt94CnMuYY2Njufbaaxk4cCAxMTGEhoaydevWVONftGhRhtt4IQ4ePMg333zDzp07KVq0KJ06deK///0vLVu2THe+K6+8kl9/9f19ZTmuMTspKYnvv/8ecDrx+/nnn1m4cKElCRO08uXLR0xMDH/88Qeqmnw/UEREBKtWrTpn2h07dlCwYEEKFy5MxYoVzxt/ITyrVlJe11+gQIHk97Vr12bbtm3s27ePr7/+mjvvvBNwvqtLly4lJiaGmJgY9uzZc06SOLNtnst+7rnnaNSoERs2bGDmzJnnjPNcp6oybdq05GXHxsYSHh7Ou+++y1VXXcXatWtZuXJlcsNxSvXq1aNq1arnvebOnXvetCVKlGDXrl2AU710+PBhihcvfs40c+fOpWzZslxxxRWEhYVx5513smTJEooXL86hQ4dITEwEnJJYiRIlztmv+fLlSzXGzJSjEsXWrVtp2LAhrVq1YsGCBYBTdLNO/ExOkD9/fj744APefvttEhMTufvuu1m8eHHyye3EiRM89NBDyU9kHDx4MK+88kryr+qkpCRGjhx53nKbNWuWnHzgbNXTVVddxebNm0lKSmL69OlpxiUi3HHHHTz22GOEh4cnn0SbN2/O8OHDk6eLiYk5b97w8HC2bduWPHz48OHkE+n48ePTXGeLFi0YPnx48hVea9asSZ7/mmuuISQkhM8//5zTp0+nOv+iRYuSk4znK2W1E8Dtt9/OhAkTAKetpnHjxue1T5QuXZqlS5dy/PhxVJUff/yR8PBwRIRGjRoxdepUACZMmEC7du2S59u6des5VW8+c7Gt4IF6XcxVTwkJCfraa69pnjx5tGjRovrpp59qUlLSBS/HmAuV1a56UlVt06aNfvbZZ6qqum7dOm3QoIHeeOONWq5cOR06dOg5342ZM2dq9erVtUKFChoeHq6DBw8+b/lHjx7VHj16aMWKFbVy5co6bdo0VVWdMmWKXn/99VqrVi0dMGCARkdHq6pqdHS0Tpky5ZxlrFixQgEdP3588mf79u3Tzp07a6VKlTQ8PDz5yqGUIiMj9ciRI6qqumTJEi1fvrxWrVpVhwwZomXKlFFV1U8//VQHDBiQPM/x48e1f//+GhkZqREREdq6dWtVVd26datWqlRJK1eurE888cR5++5inDhxQjt27KjlypXTm2++Wbdv366qqnv27NHbbrstebrnn39eb7rpJq1YsaLec889Gh8fr6qq27dv15tvvlnLlSunHTt2TP5cVbVatWq6f//+89aZ2Vc95Yi+nlq0aMGcOXO48847GTFiBFdffbWPojPmXJs3byY8PDzQYQS1d999l0KFCtG3b99Ah+JXa9as4Z133uHzzz8/b1xqx5319ZSK+Pj45GJj//79mTp1KtOmTbMkYUyQuf/++8mTJ0+gw/C7/fv38/LLL/tlXUGZKH7++WeqVq2aXG/aoUMHOnToEOCojDG+kDdvXrp37x7oMPyuWbNmXHfddX5ZV1Aliri4OB566CHq1atHfHy8FflNlpDdqndN9uaL4y1oEsWCBQuIjIzkww8/ZODAgWzYsCHTrxc35kLlzZuXAwcOWLIwfqHqPI8ib968mbrcoLrhLn/+/CxatOi82/yNCZSSJUuye/du9u3bF+hQTA5x5gl3mSlbX/X01Vdf8euvv/LMM88AThcFdk+EMcacL8te9SQiLUVki4hsE5GnUhmfR0T+zx2/TES8apnZu3cvHTt2pEOHDkyfPj357klLEsYYk/l8lihEJBQYAdwGRABdRSQixWR9gIOqegPwLvB6Rss9deww4eHhfPvtt7z66qssWbKE3LlzZ3b4xhhjXL4sUdQEtqnqDlU9BUwC2qWYph0wwX0/FWgiGTzHL/7g30RGRrJ27Vqeeuop6+nVGGN8zJeN2SWAXR7Du4FaaU2jqokichgoDuz3nEhE+gP93cGTixcv3mCd+AFwOSn2VQ5m++Is2xdn2b4466aLnTFbXPWkqqOB0QAisvJiG2SCje2Ls2xfnGX74izbF2eJyPkP1vCSL6ue9gClPIZLup+lOo2I5AKKAAd8GJMxxpgL5MtEsQIoLyJlRSQ3cBcwI8U0M4Bo931HYJ5mt+t1jTEmyPms6sltcxgIzAZCgXGqulFEXsLp7nYGMBb4XES2Af/iJJOMjPZVzNmQ7YuzbF+cZfviLNsXZ130vsh2N9wZY4zxr6Dp68kYY4xvWKIwxhiTriybKHzV/Ud25MW+eExENonIOhH5UUTKBCJOf8hoX3hM10FEVESC9tJIb/aFiHR2j42NIjLR3zH6ixffkdIi8pOIrHG/J60CEaevicg4EflHRDakMV5E5AN3P60TkepeLfhin6HqyxdO4/d24HogN7AWiEgxzQPASPf9XcD/BTruAO6LRkB+9/39OXlfuNMVAhYCS4GoQMcdwOOiPLAGuMwdvjLQcQdwX4wG7nffRwC/BzpuH+2L+kB1YEMa41sB3wMC3AIs82a5WbVE4ZPuP7KpDPeFqv6kqsfdwaU496wEI2+OC4CXcfoNi/dncH7mzb7oB4xQ1YMAqvqPn2P0F2/2hQKF3fdFgD/9GJ/fqOpCnCtI09IO+EwdS4GiInJNRsvNqokite4/SqQ1jaomAme6/wg23uwLT31wfjEEowz3hVuULqWq3/kzsADw5ri4EbhRRH4WkaUi0tJv0fmXN/tiKHCPiOwGZgEP+im2rOZCzydANunCw3hHRO4BooAGgY4lEEQkBHgH6BnoWLKIXDjVTw1xSpkLRaSSqh4KbFgB0RUYr6pvi0htnPu3IlU1KdCBZQdZtURh3X+c5c2+QESaAkOA21X1pJ9i87eM9kUhIBKYLyK/49TBzgjSBm1vjovdwAxVTVDVncBWnMQRbLzZF32AyQCq+guQF6fDwJzGq/NJSlk1UVj3H2dluC9EpBowCidJBGs9NGSwL1T1sKperqrXqep1OO01t6vqRXeGloV58x35Gqc0gYhcjlMVtcOvUfqHN/siFmgCICLhOIkiJz6fdgbQw7366RbgsKr+ldFMWbLqSX3X/Ue24+W+eBMoCExx2/NjVfX2gAXtI17uixzBy30xG2guIpuA08BgVQ26UreX+2IQMEZEHsVp2O4ZjD8sReRLnB8Hl7vtMS8AYQCqOhKnfaYVsA04DvTyarlBuK+MMcZkoqxa9WSMMSaLsERhjDEmXZYojDHGpMsShTHGmHRZojDGGJMuSxQmSxKR0yIS4/FKs3dgEYnLhPWNF5Gd7rpWu3fvXugyPhGRCPf9MynGLbnUGN3lnNkvG0RkpogUzWD6qsHaU6rxH7s81mRJIhKnqgUze9p0ljEe+FZVp4pIc+AtVa18Ccu75JgyWq6ITAC2qup/0pm+J04PugMzOxaTc1iJwmQLIlLQfdbGahFZLyLn9RorIteIyEKPX9z13M+bi8gv7rxTRCSjE/hC4AZ33sfcZW0QkUfczwqIyHcistb9vIv7+XwRiRKR14B8bhxfuOPi3L+TRKS1R8zjRaSjiISKyJsissJ9TsC9XuyWX3A7dBORmu42rhGRJSJyk3uX8ktAFzeWLm7s40RkuTttar3vGnOuQPefbi97pfbCuZM4xn1Nx+lFoLA77nKcO0vPlIjj3L+DgCHu+1Ccvp8uxznxF3A/fxJ4PpX1jQc6uu87AcuAGsB6oADOne8bgWpAB2CMx7xF3L/zcZ9/cSYmj2nOxHgHMMF9nxunJ898QH/gWffzPMBKoGwqccZ5bN8UoKU7XBjI5b5vCkxz3/cEPvSY/xXgHvd9UZz+nwoE+v9tr6z9ypJdeBgDnFDVqmcGRCQMeEVE6gNJOL+krwL2esyzAhjnTvu1qsaISAOcB9X87HZvkhvnl3hq3hSRZ3H6AOqD0zfQdFU95sbwFVAP+AF4W0Rex6muWnQB2/U98L6I5AFaAgtV9YRb3VVZRDq60xXB6cBvZ4r584lIjLv9m4H/eUw/QUTK43RREZbG+psDt4vI4+5wXqC0uyxjUmWJwmQXdwNXADVUNUGc3mHzek6gqgvdRNIaGC8i7wAHgf+palcv1jFYVaeeGRCRJqlNpKpbxXnuRStgmIj8qKovebMRqhovIvOBFkAXnIfsgPPEsQdVdXYGizihqlVFJD9O30YDgA9wHtb0k6re4Tb8z09jfgE6qOoWb+I1BqyNwmQfRYB/3CTRCDjvueDiPCv8b1UdA3yC80jIpUBdETnT5lBARG70cp2LgPYikl9ECuBUGy0SkWuB46r6X5wOGVN77nCCW7JJzf/hdMZ2pnQCzkn//jPziMiN7jpTpc4TDR8CBsnZbvbPdBft+TyOozhVcGfMBh4Ut3glTs/DxqTLEoXJLr4AokRkPdAD+DWVaRoCa0VkDc6v9fdVdR/OifNLEVmHU+1UwZsVqupqnLaL5ThtFp+o6hqgErDcrQJ6ARiWyuyjgXVnGrNTmIPzcKm56jy6E5zEtglYLSIbcLqNT7fE78ayDuehPG8Ar7rb7jnfT0DEmcZsnJJHmBvbRnfYmHTZ5bHGGGPSZSUKY4wx6bJEYYwxJl2WKIwxxqTLEoUxxph0WaIwxhiTLksUxhhj0mWJwhhjTLr+Hx/yQZt9fyJjAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "\n", "import numpy as np\n", "import pylab as pl\n", "from sklearn import svm, datasets\n", "from sklearn.utils import shuffle\n", "from sklearn.metrics import roc_curve, auc\n", "\n", "random_state = np.random.RandomState(0)\n", "\n", "# Import some data to play with\n", "iris = datasets.load_iris()\n", "X = iris.data\n", "y = iris.target\n", "\n", "# Make it a binary classification problem by removing the third class\n", "X, y = X[y != 2], y[y != 2]\n", "n_samples, n_features = X.shape\n", "\n", "# Add noisy features to make the problem harder\n", "X = np.c_[X, random_state.randn(n_samples, 200 * n_features)]\n", "\n", "# shuffle and split training and test sets\n", "X, y = shuffle(X, y, random_state=random_state)\n", "half = int(n_samples / 2)\n", "X_train, X_test = X[:half], X[half:]\n", "y_train, y_test = y[:half], y[half:]\n", "\n", "# Run classifier\n", "classifier = svm.SVC(kernel='linear', probability=True)\n", "probas_ = classifier.fit(X_train, y_train).predict_proba(X_test)\n", "\n", "# Compute ROC curve and area the curve\n", "fpr, tpr, thresholds = roc_curve(y_test, probas_[:, 1])\n", "roc_auc = auc(fpr, tpr)\n", "print (\"Area under the ROC curve : %f\" % roc_auc)\n", "\n", "# Plot ROC curve\n", "pl.clf()\n", "pl.plot(fpr, tpr, label='ROC curve (area = %0.2f)' % roc_auc)\n", "pl.plot([0, 1], [0, 1], 'k--')\n", "pl.xlim([0.0, 1.0])\n", "pl.ylim([0.0, 1.0])\n", "pl.xlabel('False Positive Rate')\n", "pl.ylabel('True Positive Rate')\n", "pl.title('Receiver operating characteristic example')\n", "pl.legend(loc=\"lower right\")\n", "pl.show()" ] }, { "cell_type": "code", "execution_count": 45, "id": "50d3c321", "metadata": {}, "outputs": [ { "data": { "image/png": "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Dh0iLCyMV155hd69e1OwYMFgh2eMScVXorBbXU1ADB8+nOefd2pDtm7dmvfff5+qVasGOSpjTHp83XDXKtuiMPnKQw89xNVXX82HH37I3LlzLUkYk8OlmyhU9VB2BmLyrk2bNvHEE0+QlOQ8GPHqq69m8+bNdOnSxWo0GZML+FPCw5hMSUhI4D//+Q9RUVG89dZbjB071tOvUKFCQYzMGHMxLrp6rDH+WLlyJTExMfz222+Ac7qpY8eOQY7KGJMZdkRhstTZs2d57rnnaNy4Mb/99htXX3013377LRMnTqRMmTLBDs8YkwmWKEyWmjRpEsOHDychIYE+ffqwZs0a2rRpE+ywjDGXwE49mUumqp6L0g8//DA//vgjvXr14oYbbghyZMaYrGBHFOaSzJ8/n0aNGrFnj/Msq5CQEKZOnWpJwpg8xBKFyZTDhw8TExPDbbfdxu+//84bb7wR7JCMMQFip57MRZs5cya9evVi3759FClShBdeeIEnn7RnWxmTV1miMH7bv38/jz32GJ999hkA119/PePGjaN27dpBjswYE0iWKIzftm/fzueff06xYsUYMWIEvXr1okCBrD97ef78eXbt2sWZM2eyfNrG5HWhoaFUqlQpS29qtURhfIqPj6ds2bIANGnShA8++IBWrVpRuXLlgM1z165dFC9enCpVqliJD2MugqoSHx/Prl27srSGml3MNmlKSkpi9OjRVKlShTlz5njef/jhhwOaJADOnDlD2bJlLUkYc5FEhLJly2b50bgliksVHQ0iF//KwTZs2MDNN99Mnz59OHHiBN9++222x2BJwpjMCcR3xxLFpfL6tX3R7rgj6+LIAufPn2fEiBHUq1ePRYsWUaFCBT7//HNGjRoV7NCMMUFkiSKrqF786+uvgx21x5YtW2jatCmDBw/m7NmzdO3alfXr19OhQ4dghxYUBQsWpH79+kRERPD3v/+dI0eOePqtXbuWli1bcs0111CzZk1efPFFVP96OvA333xD48aNCQ8Pp0GDBgwYMCAYi5ApnTp1IioqijfffNOv4S+77LKAxKGq9O3blxo1ahAVFcWKFSvSHO706dPcfPPNJCYmBiSOSxUfH88tt9zCZZddRp8+fdId7tChQ7Ru3ZqaNWvSunVrDh8+DKS/HuLi4mjbtm22LANYojCucuXKERcXR5UqVZg3bx4TJkyg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27SICHfffTf9+/enTp06nl+9t912G2+//bZnuNjY2AvGvfHGG5kyZQoAGzduZMeOHVxzzTU+10OrVq149913AUhMTOTo0aMp+h89epTy5ctTqFAhfvjhB7Zv3w44215YWBgPPPAAAwcOZMWKFZw4cYKjR49yxx138Oabb7Jy5coL5te+fXsmT56MqvLLL79QsmRJrrjiihTDlC5dmsTERM/OPL0YUmvTpg0TJkzgxIkTAOzevZsDBw5w9OhRSpcuTVhYGH/88Qe//PJLmuO/+eabniTj/Xr66ad9rkNf2rdvz6RJkwDn4V933nlnhuth48aNREREZHqeFyWz56wyegH3AuO8uh8E3kln2AdwjiiKZDTdoFyjyIXXIbwlJSXpXXfdpTfddJNu2LAh2OFkKK3zq9nN+1qBqmq7du108uTJqqq6atUqvfnmm7VWrVpavXp1HTJkiOd8u6rql19+qQ0bNtTatWtrnTp1dODAgRdM//jx49q5c2etW7euRkVF6eeff66qznWJatWqadOmTbV3794prlF89tlnKaaxbNkyBXTixIme9+Li4rRjx44aGRmpderU0UceeeSCead3MdvXNYp9+/Zp+/btNSIiQuvVq6dLlixJsZ7i4uK0WbNmGhERoV26dNHatWvr1q1b9dtvv9XIyEitV6+eNm7cWJctW6Z79uzRa6+9ViMjIzUiIiJF/MmSkpK0V69eWq1aNY2IiLjg+kSyhx9+WOfPn+8zhrSW66233tKIiAiNiIjQZs2a6ebNm/XMmTPatm1brV27tt55551688036w8//JDmfC9G5cqVtXTp0lqsWDGtWLGirl27VlVVY2JiPMt18OBBbdmypdaoUUNbtWrluVbiaz2MHDlSR40aleY8c83FbKA5MNerezAwOI3hbgXWA+X9ma4liowlJSXphAkTdNWqVZ73jh07pomJiUGMyn85IVGY3OG3337TBx54INhhBMWNN97oaQSRWlYnikCeeloG1BSRqiJSGPgnMNt7ABFpALwPtFfVAwGMJd/Ytm0bbdq04eGHH+bhhx/23IhUvHjxgFR6NSaYGjZsyC233JJjb7gLlLi4OPr3759t9zoFbM+hqglAH2AuzhHDp6q6VkSGiUh7d7CRwGXAZyISKyKz05mcyUBiYiKjRo0iIiKC+fPnU6ZMGR5//HFLDibPe/jhh/2+4S6vuPzyy7nrrruybX4BLTOuqnOAOanee97r/1sDOf/8Yv369XTr1o0lS5YA0LFjR95++21PywljjLkU9jyKXO7UqVPceOONxMfHc8UVVzBmzJhs/aVhjMn7LFHkcmFhYQwdOpTY2FhGjhyZ4gYkY4zJCpYocpnTp08zdOhQqlatyiOPPAJA7969gxyVMSYvsyuduchPP/1EvXr1ePXVVxk0aBDHjh0Ldkh5lpUZD26Z8T/++IPmzZtTpEgRn5VXVZWWLVvm6O/CpEmTqFmzJjVr1vTcVJfafffd57nDu0qVKp6bYefPn0+jRo2IjIykUaNGfP/9955xbr31Vs+NmgGX2Xa1wXrlx/sojh49qr169VJAAQ0PD/cUOMuLcsJ9FN433HXu3FmHDx+uqk6xuGrVquncuXNVVfXkyZPatm1bfeedd1RVdfXq1VqtWjVdv369qjoF9MaMGZOlsZ0/fz5Lp5ds7969Wr169YsaJ/WNiVll//79unTpUn3mmWd05MiR6Q731Vdfab9+/S5q2smFFbNDfHy8Vq1aVePj4/XQoUNatWrVdO99SNa/f38dOnSoqqquWLFCd+/erarOtnXllVd6hps4caJnu0wt19xwF6hXfksUX3/9tV511VUKaEhIiD7//PN65syZoMSSXVJs5EEqH2tlxoNbZjzZCy+84DNRdOrUKcXd0+mVCS9WrJj2799fo6Ki9Oeff9aPPvpIr732Wq1Xr5726NHDkzweffRRbdSokYaHh6coP55ZU6dO1R49eni6U5cNTy0pKUkrVaqkGzduTLNf6dKlPd//Q4cOpXsnfa6pHmsuXVJSEs899xw7d+6kcePGjB8/nqioqGCHla8kJiby3XffERMTAzinnRo1apRimOrVq3PixAmOHTvGmjVr/DrV9OKLL1KyZElWr14N4NcphF27drFkyRIKFixIYmIiM2fOpGvXrvz6669UrlyZChUqcP/99/PEE09www03sGPHDtq0acP69etTTGf06NGICKtXr+aPP/7gtttuY+PGjcyePZt27dqlWR+qb9++3HzzzcycOZPExERPnaRkoaGhzJw5kxIlSnDw4EGaNWtG+/bt+fbbb7nyyiv52n2a49GjR4mPj2fmzJn88ccfiEiK03oXa/Hixbz//vue7gkTJlCmTBlOnz7Ntddeyz333EPZsmU5efIkTZs2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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "from sklearn import svm, datasets\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.preprocessing import label_binarize\n", "from sklearn.metrics import roc_curve, auc\n", "from sklearn.multiclass import OneVsRestClassifier\n", "from itertools import cycle\n", "\n", "iris = datasets.load_iris()\n", "X = iris.data\n", "y = iris.target\n", "\n", "# Binarize the output\n", "y = label_binarize(y, classes=[0, 1, 2])\n", "n_classes = y.shape[1]\n", "\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.5, random_state=0)\n", "\n", "classifier = OneVsRestClassifier(svm.SVC(kernel='linear', probability=True,\n", " random_state=0))\n", "y_score = classifier.fit(X_train, y_train).decision_function(X_test)\n", "\n", "fpr = dict()\n", "tpr = dict()\n", "roc_auc = dict()\n", "lw=2\n", "for i in range(n_classes):\n", " fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i])\n", " roc_auc[i] = auc(fpr[i], tpr[i])\n", "colors = cycle(['blue', 'red', 'green'])\n", "for i, color in zip(range(n_classes), colors):\n", " plt.plot(fpr[i], tpr[i], color=color, lw=2,\n", " label='ROC curve of class {0} (area = {1:0.2f})'\n", " ''.format(i, roc_auc[i]))\n", "plt.plot([0, 1], [0, 1], 'k--', lw=lw)\n", "plt.xlim([-0.05, 1.0])\n", "plt.ylim([0.0, 1.05])\n", "plt.xlabel('False Positive Rate')\n", "plt.ylabel('True Positive Rate')\n", "plt.title('Receiver operating characteristic for multi-class data')\n", "plt.legend(loc=\"lower right\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "id": "4f6ae3a0", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "57515bf4", "metadata": {}, "outputs": [], "source": [] } ], "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.9.7" } }, "nbformat": 4, "nbformat_minor": 5 }