{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# 使用pandas读取数据\n", "import pandas as pd\n", "\n", "\n", "# 关闭不必要的warning\n", "pd.options.mode.chained_assignment = None\n", "data_path = \"./data/adult.data\"\n", "raw_data = pd.read_csv(data_path)\n", "## 选取需要使用的列\n", "cols = [\"age\", \"education_num\", \"capital_gain\", \"capital_loss\", \"hours_per_week\", \"label\"]\n", "data = raw_data[cols]" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ageeducation_numcapital_gaincapital_losshours_per_weeklabellabel_code
039132174040<=50K0
150130013<=50K0
23890040<=50K0
35370040<=50K0
428130040<=50K0
\n", "
" ], "text/plain": [ " age education_num capital_gain capital_loss hours_per_week label \\\n", "0 39 13 2174 0 40 <=50K \n", "1 50 13 0 0 13 <=50K \n", "2 38 9 0 0 40 <=50K \n", "3 53 7 0 0 40 <=50K \n", "4 28 13 0 0 40 <=50K \n", "\n", " label_code \n", "0 0 \n", "1 0 \n", "2 0 \n", "3 0 \n", "4 0 " ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 将label转换为可以运算的变量\n", "data.loc[:, \"label_code\"] = pd.Categorical(data.label).codes\n", "data.head()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# 将数据分为训练集和测试集\n", "from sklearn.model_selection import train_test_split\n", "\n", "\n", "train_set, test_set = train_test_split(data, test_size=0.2, random_state=2310)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/anaconda3/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n", " FutureWarning)\n" ] }, { "data": { "text/plain": [ "LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n", " intercept_scaling=1, max_iter=100, multi_class='warn',\n", " n_jobs=None, penalty='l2', random_state=None, solver='warn',\n", " tol=0.0001, verbose=0, warm_start=False)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 训练模型\n", "from sklearn.linear_model import LogisticRegression\n", "\n", "\n", "features = [\"age\", \"education_num\", \"capital_gain\", \"capital_loss\", \"hours_per_week\"]\n", "label = \"label_code\"\n", "model = LogisticRegression()\n", "model.fit(train_set[features], train_set[label])" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# 得到预测结果\n", "test_set.loc[:, \"prob\"] = model.predict_proba(test_set[features])[:, 1]\n", "alpha = 0.5\n", "test_set.loc[:, \"pred\"] = test_set.apply(lambda x: 1 if x[\"prob\"] > alpha else 0, axis=1)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "查准率: 0.728, 查全率: 0.333, f1: 0.457\n" ] } ], "source": [ "# 计算查准查全率以及f1\n", "import numpy as np\n", "\n", "\n", "bins = np.array([0, 0.5, 1])\n", "tn, fp, fn, tp = np.histogram2d(test_set[label], test_set[\"pred\"], bins=bins)[0].flatten()\n", "precision = tp / (tp + fp) # 0.728\n", "recall = tp / (tp + fn) # 0.333\n", "f1 = 2 * precision * recall / (precision + recall) # 0.457\n", "print(\"查准率: %.3f, 查全率: %.3f, f1: %.3f\" % (precision, recall, f1))" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(array([0.81854282, 0.72815534]), array([0.96029978, 0.33312183]), array([0.88377295, 0.45711798]), array([4937, 1576]))\n" ] } ], "source": [ "from sklearn.metrics import precision_recall_fscore_support\n", "\n", "\n", "print(precision_recall_fscore_support(test_set[label], test_set[\"pred\"]))" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.8301193386929114\n" ] } ], "source": [ "# 计算AUC\n", "from sklearn import metrics\n", "\n", "\n", "fpr, tpr, _ = metrics.roc_curve(test_set[label], test_set[\"prob\"])\n", "# 得到AUC\n", "auc = metrics.auc(fpr, tpr)\n", "print(auc)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaQAAAGNCAYAAABe7wXLAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAMTQAADE0B0s6tTgAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvqOYd8AAAIABJREFUeJzs3Xd0VVXi9vHvyU0jvZGEJPQWCFIDJHSGLiAWLGOhqFhGByuDQIAgAVHHhqg4Vhh1HB3bT8c2OooIoUmRIhB6J7T0fu95/wDy6kgJkOTc8nzWYq3cm5Obh3af7HP22dswTRMRERGreVkdQEREBFRIIiLiJFRIIiLiFFRIIiLiFFRIIiLiFFRIIiLiFFRIIiLiFFRIIiLiFKpcSIZh+BiG8blhGH3Oc9wswzBWnzq27iUnFBERj1ClQjIMwxf4FGhwnuOGAN2AZOCvwKxLDSgiIp7B+wKOvR3IOM8xg4C3TdN0GIbxHfDcmQ4yDONB4MHTj202W3xsbOwFRBERcR0VFRVc6DJtpmlSXl4OgN1uJz8/H5vNdkk57Hb7RX2dYRhnfN5ms2EYBnUcDgLtdk74+FBSXl5hmqbPxXyfKhWSaZplwL6zhfqVYGDPqa8xDcMIPMvrPQ08ffpxQkKCuW/fvioFFhGpbna7/YLerA8ePMjOnTt/89yePXvYsWMHixYtwt/fH4fDwddff13tORs2bHhJrxEZGUnXrl0rHzscDuLj4wkPDz/j8eHh4QQEBJzxczabjYZffUW7F1+kKDqaryZO5PpHHsm72GwXMkKqijzg1yUUUs2vLyJy0TZt2sTGjRsrH2/YsIG///3vvyuX6uDr64u3tzd2u534+HhatWpFUFDQBb1GREQEUVFRAMTHx1OvXj18fX0vOVsVBhdV0uizz7jsb3+jMDaWzFmzKPC5qIFRpeoupKVAP+AjwzBaAkeq+fVFRH6jpKSErVu3/uaUWEVFBYsXL+bNN99k3759BAae/Dl5z549Z32dpKQkQkKq9jO0aZo4HA4SExN/97kWLVoQExNTOeKw2WyXfKrNGTX56COS3niDgvh4MjMyKImMhJycS3rNiy4kwzAeAdaapvnlr57+FJhoGMY8oCfwzCWlExGPYrfbKS0t5fjx42RnZ5OTk1NZNKZpkpOTw5EjRzh+/Dj79u1j06ZNrF27lry8c58lMgyD4OBgGjVqREBAAH369Kn8XEBAAB06dCAoKKjaRg5uz+Eg4pdfyK9fn8yMDErPcrrvQhnVvR+SYRj+wBBgv2maK6ryNbqGJOKZHA4H6enpfPTRR5SXl7Nly5YLfo24uDiSk5Px+Z/TRaWlpTRu3JgGDRrQtGnT34xSVDwX6XRfGAZe5eXYiosp/9WoMicnh9tuu+14WVlZ5MW8fHWfssM0zRLgo+p+XRFxH4WFhSxcuJBnnnmGrKysyufDw8Px9fWlffv2BAcHExgY+Jvy8Pf3JzQ0lJCQEGw2GwEBAdSrVw8/Pz8rfhuexTRJ/PvfwTTZPGoUDh8fHJd4zeh/VXshiYicyerVq5kxYwYbNmxgx44dAAQFBTF06FC6dOlCYmIivr6+eHl5aQTjbEyT1q+/TtNPPuFEixZ4lZXhqIEfAlRIIlLjPvzwQ26++WZKS0vx9/fHx8eHq6++msGDBxMREaECcmYOB21eeYXG//43x1q3ZsW0aTVSRqBCEpFq9uWXX/Lhhx9y+PBh/Pz8+Oabbzhx4gRhYWHce++9dOnSBS8vL7y9vVVEzs7hoO2LL9Lw6685etllrEhLw16nTo19OxWSiFywiooKsrKy2L17N6ZpUlhYyIYNG/jiiy9YseLMc5kmTZpEYmKiSsiFBB04QPyiRRxp356VU6Zgr+FrdSokEamSsrIyJkyYwD/+8Q9yc3MpKyv73TF+fn50796dtm3b0rRpU+Lj4ytnt/n5+amMXExBQgJLH3uM/AYNcFTDDbnno0ISkUqmabJ+/XqKi4uBkzeSfvjhhyxevJj9+/dXHhcTE0NycjLR0dF4eZ1cozkgIICOHTsSHh5e+Zy4HqOigqRXX2XnFVdQGBdHbrNmtfa9VUgiwo4dO3jsscd49dVXz/j5Bg0a0KJFC4qKirjiiivo16/f7+77EdfnVV5OpyeeIHb5ckwvLzbecUetfn8VkoiHWL9+PU8//TTLly//zTI7BQUF/PrG9MDAQIYNG3ZyFec6dWjfvj3169fH21tvF+7Mq6yM5DlziFm1in29e7PptttqPYP+hYm4icLCQn7++WeWL1/Oa6+9xqFDhyo/Z5omx44dA06ebvt1udhsNvr27UtSUhLt2rUjKirKLddek7OzlZbSedYs6q5dy55+/Vh3771gwb8BFZKICysvL+fll19mz549vPfee+zevRuA4OBg4uLifnNsy5YtGTBgAJdddtnvRjuGYWjCgQdr8skn1F27lt2DBvHz3XeDRdcAVUgiLmr//v1cf/31LFmyBDg5i2348OEkJCSQkpJCWFiYSkaqZNvVV1MaFsaeAQPAwn8zKiQRF+JwOHj99dd56qmn2LlzJ6WlpQwaNIiBAwcSFhZGZGSkZrhJlXgXFJDw/ffsGjoU09ubPQMHWh1JhSTi7MrKyli5ciVz5szhs88+A06uAde8eXP69u1Lnz59NONNLohPXh4p06cTtn07hfHxHOnQwepIgApJxKkdOHCA+Pj4yscBAQFER0fzyCOPUK9ePZ2Skwvmm5NDyrRphO7axeYbb+RI+/ZWR6qkQhJxMrt372bUqFGsW7eO3NzcyudnzZpFy5Yt8fHxURHJRfE7cYLUtDSC9+7ll1Gj2DZypNWRfkOFJOIETNNk586dvPnmm8ydO5fc3FwSExOpX78+7dq1Y+jQoQQFBVkdU1yZadJl5kyC9+5l4223sWPECKsT/Y4KScRiP/zwA7179/7Nc3/+85/p27evbkaV6mMYbLztNoJ372b35ZdbneaM9K9dxELffvst/fv3r3w8atQomjZtStu2bXVzqlSLgEOH8KqooCAhgeNJSRxPSrI60lmpkERq2e7du/n66695+OGHycvLw9fXl4EDB3LTTTcREBCg60NSbQIPHCA1LQ2A7156qca3j7hUKiSRWpSTk0Pjxo1/s5bcrFmzaN68ue4fkmoVtHcvqVOn4puTw9oHHnD6MgIVkkitOXjwICNGjMA0TcLCwpg6dSqxsbEEBQVpVCTVKnj3blLT0vApKGD1hAkc7N7d6khVokISqWH79+/nnnvu4dtvv6WgoIC+ffty5513EhAQYHU0cUMBBw/SbfJkvIuLWTVxIodTUqyOVGUqJJEasnnzZt5//33S09NxOBwA3HffffTs2RPfWth9UzxTcXQ0h5OTOdCzJ9nJyVbHuSAqJJFqZpomCxYsYOzYscDJZX5Ob2oXFRWl03NSIwIOHqQoNhbTZmPtAw9YHeeiqJBEqolpmnzxxRe89NJLfPbZZ4SEhNC6dWtGjRpFfHy8ikhqTMSGDXSdOZOdw4ax+ZZbrI5z0VRIItVg0aJFvPnmm7z55psApKSkMHbsWOrVq2dtMHF7kevW0SUjA9PLi8OdOlkd55KokEQuQkVFBT/88ANffPEFGzdu5IsvvgDA29ub6667jquvvlrXiaTG1V29ms6zZ+Pw8WFZejo5LVtaHemSqJBELoBpmrz88svMmTOncndWgGbNmtGnTx+6d+9ORESETs9JjYteuZLkxx7DXqcOy2bMILdZM6sjXTIVkkgVbdiwgT//+c98//33APTp04cmTZrQunVrGjdurD2JpFaVBQdTEhXFqkmTyGvc2Oo41UKFJHIWS5cu5dixY2RlZTFt2jQKCwsB6NChAzfddBNNmjTR4qdS62wlJdj9/clJTOS7F1/EdKN/g+7zOxGpJhUVFcybN48H/mfqbFJSEtdeey1t27ZVEYklEr77jsQFC1iWkUFBQoJblRGokEQqLV68mBkzZrB161b27t2Lr68vV1xxBREREcTFxdGuXTutwC2Wqf+f/9Bu3jxKIiNxuOm6hyok8Xjr1q1j48aN3HTTTZXPXXXVVQwaNEjbhItTaPjFF7R96SUKY2LIzMigOCbG6kg1QoUkHstutzNmzBjeeustAGw2G0OGDOGKK64gJiZGRSROofGnn9LmlVcoqFePzIwMSurWtTpSjVEhice68847eeuttwgLC+O6666jQYMGJCUl6bScOA/TJGzrVvITEsicOZPSyEirE9UoFZJ4lEOHDpGZmckXX3zB66+/DsBf/vIX2rRpY3Eykf9hmmAYrL3/frwLCykPCbE6UY1TIYnbW7lyJfPnz+fEiRP8+9//pqysrPJzjz32GK1bt7Ywncj/ME1avvMOPgUFbLjjDkybzSPKCFRI4uZKS0sZNmwY2dnZADRv3pwePXrg5+dHfHw8rVq10rUicR6mSeLChTT/4ANymjU7ec9RnTpWp6o1KiRxSx988AHz58/nm2++AU7Omrv66qsJCAjQigrinEyTpNdeo8n//R/HW7ZkeXq6R5URqJDEjezdu5ebbrqJ3bt3s2fPHgAiT10EvuKKKwgNDbUynsjZORy0+dvfaPz55xxr3Zrl06Zh98AdhVVI4hbWrl1Lhw4dAIiJiaFLly4MGTKEdu3a4eXlhZeb3kgo7iEgO5uE77/nSNu2rExLw+7vb3UkS6iQxKWVl5cze/Zs0tPTAahfvz7PPPMMPj4+ujYkLqMoNpYlc+ZQWK8eDj8/q+NYRoUkLmvPnj00bNgQODkqGjFiBAMGDNA+ROISDLudpFdeYfeQIeQ3bEh+o0ZWR7KczmOIS/rggw8qyyguLo4nnniCYcOG4efBP12K6zDKy+n45JM0/vxzGn/6qdVxnIZGSOKS5syZg5eXFyNGjKBfv36Eh4dbHUmkSrzKy+n0+OPErljB/p49WX/XXVZHchoqJHE5W7duZdWqVfTo0YPRo0drwoK4DK/SUpLnzCHmp5/Y27cv68aPx9RSVZVUSOJSTpw4Qd++fQFITU1VGYlLafTll8T89BN7+vdn3T33gMroN1RI4jJKS0vp3LkzBw4cAE6uuiDiSnYMG0ZZUBD7+vYF/TD1O/oTEZeQm5vLDTfcwPbt2/Hz8+PJJ58kOjra6lgi5+VdVESTjz46uViqzca+fv1URmehEZI4PdM0mTRpEh9//DEATz75JI00RVZcgE9BAV3T0wnfupXCevU4nJJidSSnpkISp1ZRUVG59pxhGKSnp9OgQQOLU4mcn09eHqnTphG6Ywdbr7uOw127Wh3J6amQxKl99dVXlR/PnTuXBg0aaAUGcXq+OTmkTp1KyO7dbL7xRrJuuMHqSC5BhSROaeHChSxbtoyXXnoJgKeffrryRlgRp2aaJM+ZQ8ju3WwaPZrt11xjdSKXoUISp7Fv3z6GDh3KgQMHOHr0aOXziYmJNG7c2MJkIhfAMNh4++2Eb97MrmHDrE7jUlRI4hQOHTpE/fr1Kx83bNiQXr16MWjQIAIDA7Hpfg1xcnWys/EpLCSvcWNymzUjt1kzqyO5HBWSWOrzzz/nwQcfZMuWLQB4e3szf/58oqKidNOruIyAQ4dInTIFW1kZ/50/n4rAQKsjuST9jxfLpKWlMXTo0Moyuvzyy3n99deJjo5WGYnLCNy/n26TJlHn2DE2jRmjMroEGiGJJbKzs3nmmWcAuPHGGxkwYAARERGaQScuJWjvXlLT0vDNzWX1Aw9woHdvqyO5NP0YKrXq+++/Z/jw4cTExFBUVMTtt9/O9ddfT2RkpMpIXEqdI0foNnkyvnl5rP7LX1RG1UAjJKk1O3fupH///tjtdoKCgigvL6dTp04qInFJxZGRHExNJbtTJ930Wk1USFJr5syZg91uZ8SIEdx00034+PjoWpG4nIADByiKjQUvL9b/6U9Wx3ErejeQGme327nhhhv429/+RmhoKH/84x/x9/fHZrNpdCQuJfyXX+j1wAMkvfaa1VHckkZIUuPee+89/vnPfwLQuXNn6tSpY3EikQsXuWEDXR59FIBDqakWp3FPVSokwzBmAUOAQ8Bo0zSPnOEYb+B1oDEQBIw3TXNxNWYVF1JYWMiSJUt49913eeONN/D392fKlCkkJSVpVCQuJ2rdOrrMnInDZmP59OmcaN3a6khu6byFZBjGEKAbkAz0AWYBd5zh0MFAhWmaPQ3DSAQWALrS50FKSkr49NNPeemll/juu+9+87lx48bRtm1blZG4nLpr1tB51izsPj4snzGDnBYtrI7ktqoyQhoEvG2apsMwjO+A585y3GGgsWEYIZwsok1ne0HDMB4EHjz9ODQ0tOqJxWmNGjWK999/H4CmTZvSoUMH2rRpQ2RkJPHx8SojcUmloaEUR0WxesIEcps2tTqOW6tKIQUDewBM0zQNwzjbbcibgGzgXqAd8NLZXtA0zaeBp08/TkhIMKsaWJxLYWEhN9xwAytWrCA7OxuAiRMn0qVLl8p9jERcka2oCHtAAHlNmvD9Cy9gaj3FGleVQsoDfl1CIWc5biLwjmmanxgnfxTeZBhGG9M07ZcaUpzX8OHDK0/PderUiREjRtC+fXuLU4lcmrgffqDNK6+wbMYM8po0URnVkqoU0lKgH/CRYRgtgd9NaDglEOgIfAJcBkQBGvm4sbfffruyjF599VXq1q2r03Li8hL++1/az51LSXg4dj8/q+N4lKoU0qfARMMw5gE9gWcMwxgDYJrmm7867jlgoWEY+UAOcJ9pmo7qjSvO4Oeff6Z3797k5OTg5+dHenq6ykjcQv2vv6bdCy9QHBVFZkYGRfXqWR3Jo5y3kEzTLDEMowcnp30vNE1zxVmO28PJWXjixkpLSxkwYAA5OTk0adKEoUOH0rp1a5WRuLyGn39O2/nzKYyNJTMjg+LoaKsjeZwq3YdkmmYJ8FENZxEntmvXLm6++WaWLFkCQEpKCg899BB+OqUhbiJk1y4K4uPJnDmTkqgoq+N4JK3UIFUyevToyjJq2bIlf/rTn1RG4h5MEwyD9XfdhU9hIeXBwVYn8lgqJDkv0zTZtWsXUVFRzJ07l8DAQJ2iE7fQ/N13CTh8mHV//jN4eamMLKbFVeWccnJyiIqKYs+ePVx22WUqI3EPpknLt94i8Z13CN2xA+/iYqsTCSokOYcVK1bQpUsXjh8/DsCVV16pMhLXZ5q0WrCAFu+9x4nmzcmcNUvbjjsJFZKc0cSJE+natStZWVkkJCTw9ttv07hxY6tjiVwa0yTp1Vdp9uGHHE9MZNmjj1IeFGR1KjlF15Dkdw4fPswTTzxBWFgY48ePp2XLlgTr3Lq4Af/jx4lftIhjSUksnzoVe0CA1ZHkV1RI8hvPP/88Dz/8MAB9+vQhOTnZ4kQi1ackMpKlc+ZQHBWF3d/f6jjyP3TKTipt376d8ePHU1ZWxhVXXMG1115rdSSRS2e302b+fEKzsgAoSEhQGTkpFZIAkJ+fT79+/QC48cYbGTt2rE7TicszKiro+PTTNP78cxp/9pnVceQ8VEjC66+/TkhICLt37yY0NJRrrrkGm1Y3FhdnlJfT6ckniV+8mIOpqay7916rI8l56BqSh9u1axd33303AMOGDaN///7ax0hcnld5OZ0ef5zYFSvY37Mnax54ANNbb3fOTiMkD+VwOJg3bx49evSgrKyM0aNHc/vtt9OkSROro4lcsvrffkvsihXs7duX1Q8+qDJyEfpb8lDff/89f/7znwEYMWIEQ4cOxctLP5+Ie9g9aBAV/v7s79kTdPrZZegdyEONHDkSgDvvvJPRo0fjr1lH4uJsRUU0e/99sNvBMNjfp4/KyMVohOSB9u/fz4kTJwgODmbgwIF463SGuDjvwkK6zphBxObNFEVHc6B3b6sjyUXQO5GHcTgctGvXDjg5iUETGMTV+eTnkzJ9OmHbtrHt6qs50KuX1ZHkIqmQPMz//d//cezYMRo1asTVV19tdRyRS+Kbl0fK1KmE7tzJ1uuvZ8uNN4IWAHZZKiQPYpomEydOBOC2227TBnvi8jo++SShO3ey+aabyLr+eqvjyCVSIXmQl156ia1bt5KYmEirVq2sjiNyyTaMG0fUzz+za9gwq6NINVAheYiff/6Ze+65B4BRo0bh6+trcSKRi+N/9Cj+x4+T06IFBQ0aUNCggdWRpJqokDzEW2+9BUDbtm1JTEy0OI3Ixalz+DCpaWn4FBTw35dfpjwkxOpIUo10H5KbM02TSZMm8eSTTwJwzz33aJq3uKSAgwfpNnkyAdnZbLr1VpWRG9I7kxv76aefuPzyy8nOziYsLIyrrrqKmJgYq2OJXLDAfftITUvDPyeHNfffz/6+fa2OJDVAheSmPvnkE6688srKx1OmTKFly5YWJhK5OH7Hj9Nt8mR88/JY/dBDHOjZ0+pIUkNUSG5o7ty53HfffZWPX331VerWrWthIpGLVxoezv7evTneqhWHunWzOo7UIBWSm3n//fcry2jMmDEMGzZMM+rEJQUeOEBRTAymzcam226zOo7UAk1qcCPPPvss1113HQB33303V155pcpIXFLY1q30eOgh2r7wgtVRpBZphOQmFi5cyAMPPACcHBkNHjwYQ0uoiAsK37SJrjNmYDgc7NMiqR5FheQGDh06xOjRo4GTN72OGDFCZSQuKXL9errMnAmGwfL0dI4nJVkdSWqRCskNtGjRAoCIiAiGDRuGTXvAiAuKXLeOrjNn4vD2Znl6Oid0A7fHUSG5uEWLFpGfn09QUBDz5s3TgqniskoiIymKiWHN/feT27y51XHEAiokF1ZSUkKfPn0AGD9+PEFBQdYGErkI3oWFVAQGUpiQwPdz52qXVw+mWXYuym630717dwCioqLo3LmzxYlELly9JUvoN24cYZs3n3xCZeTRNEJyUR988AGrV6+ma9eu3H333bpuJC4nftEi2j/zDGVhYVRodC+okFxWWloaAKmpqURERFicRuTCJHz7Le3nzqUkMpLMjAwK4+KsjiROQIXkgjZv3kxWVhY+Pj506dLF6jgiF6TBV1/R9sUXKa5bl6UZGRTHxlodSZyECsnF7N27t3K31549e2oig7ic00sCZWZkUBwdbXUccSIqJBdSUlLCNddcA0CHDh0YM2aMtYFELoTDAV5e/DJmDNtGjqQ8ONjqROJkVEguYt++fdSvXx84eQPsI488Qp06dSxOJVI1zf71L0K3bWP1hAmYNpvKSM5I075dRM9f7QFz33334e/vb2EakSoyTZq/+y6tFi4kaP9+vIuKrE4kTkwjJBewceNGdu3aBcCbb76pWXXiGkyTxLfeovn775PTtCnLZszQyEjOSYXk5MrKyip3fh0/fjzh4eEWJxKpAtOk9Rtv0PTjjznRogXL0tN1r5GclwrJyXXv3p1t27YRGBhIz549tYq3uATf3FzifviB461asXz6dCoCAqyOJC5AheTEnnjiCVatWgXA/fffr832xGWUhYWx9LHHKA0Lw67JN1JFmtTgpN58800mTpwIwOjRo+natatGR+Lc7HbazJ9PxMaNABTVq6cykguiEZITMk2TOXPmAHDPPffwhz/8weJEIudm2O20f/ZZEhYtwjcv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kZGRBAYGUq9ePZ577jl69eqFYRgsWbKEcePG4e198q2npKSE7OxsGjRoUPlaFRUVzJw5k2uvvZbVq1dXPr9s2TJefPFFFi5c+Lvvb7fbGTx4MMePH8fhcDBlyhTef/99JkyYUPna69ev55dffiEuLu6cv9+HH36YNm3aEBYWdoF/Umc3fPhwbrzxRkJDQ+nSpUu1vW5NWrVqFfn5+XTv3r3WrtO69gjJNGnxzju0fOcd4NT9RiojsVB6ejpNmzalV69edOjQgQ8++AA4OWLo1q0b3bp145577sF+arLN888/T7du3UhNTeXLL78E4JVXXqFbt27079+fdevWcfPNN3P55Zdz+PBh+vfvT69evXjkkUcA+Prrr4mPj8fPz49u3bpRUFDAoUOH+PHHH/nnP//J559/zty5cy/497FmzRo6d+5M//79WbhwIU8++ST9+/fnl19+4bgmmG8AABF/SURBVOabb6Zfv370798fgIMHD/Lpp58ybtw4kpOTycrKYu/evezZs4ennnqKQ4cOMXr0aAB69uzJ5s2b2bBhAxs2bODdd9+lV69elY83bNjA5s2bufbaa3+XKTMzkz59+pwxr81m4z//+Q9vv/027dq1Y+TIkYSEhHDrrbfy448/8uOPP9KhQ4fzvrH++OOPmKbJrbfe+pvn33rrLS677LLKx+np6fz1r3+tfBwUFARAbm4u1113Hb169WL48OEcO3YMODkbdMGCBaSlpV30yK2qSkpKGDp0KN27d+fOO+885+nTffv2MWDAAFJTU+nTpw+HDx/m/7V371FVlXkDx78PChoQlIiDd8xYoWv0VRECohVGauRtTd41kGwyHPDV7MKUiCzGe+qYWl4ixUtKBiGoeCUxLS+NSuV4eeVVGB08qYGCgICH5/3j4HlBbvs4cDjq81nrrAVnP2x++7f22b+zn/3sZwPMmjWLZcuWkZqayksvvdToMd/z8J4hSYn7hg24JSZy89lnuTBiBOUtWjR1VEoTGzp0aI1dSg2ha9eupKSk1Ntu8uTJvP/++1y+fBlPT0+GDx9OcHAwcXFxeHp6MmzYMBITE3nuuedYv349R44cIT8/nz59+pCVlUVeXh4DBgwgOjoaf39/4uLicHFxwd3dnf3795OQkMD27dsBCA0NpXXr1iQlJbF27Vr69euHs7Mztra2vPfee3Tu3Jni4mKT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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# ROC曲线\n", "import matplotlib.pyplot as plt\n", "\n", "\n", "plt.rcParams[\"font.sans-serif\"] = [\"SimHei\"]\n", "fig = plt.figure(figsize=(6, 6), dpi=80)\n", "# 在图形框里只画一幅图\n", "ax = fig.add_subplot(1, 1, 1)\n", "ax.plot(fpr, tpr, \"k\",\n", " label=\"%s; %s = %0.2f\" % (\"ROC曲线\", \"曲线下面积(AUC)\", auc))\n", "ax.fill_between(fpr, tpr, color=\"grey\", alpha=0.6)\n", "ax.plot([0, 1], [0, 1], \"r--\")\n", "ax.set_xlim([0, 1])\n", "ax.set_ylim([0, 1])\n", "legend = plt.legend(shadow=True)\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.6.6" } }, "nbformat": 4, "nbformat_minor": 2 }