{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "[Applied Machine Learning in Python](https://www.coursera.org/learn/python-machine-learning)\n", "\n", "这门课实在是太差了. 严重差评: \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\"所谓私人恩怨,跟政治就是一回事。所以,如果有哪个白痴政客或者哪个大人物想要推行一项法令或政策,伤害到你或者你亲人朋友的利益,那就是私人恩怨。点燃你的怒火吧。\" ----奎尔 \n", "\n", "作为报复, 我决定把第三周的ppt给丫翻译了!\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 决策函数(decision_function)\n", "* 分类器对每个测试点都给出一个分数, 这个分数表示分类器预测的可信度. \n", "* 选择一个固定的决策阈值就给出了一个分类规则. (大于阈值的就是正分类, 小于阈值的就是负分类)\n", "* 通过改变决策阈值, 在所有可能的分数范围内扫描, 我们就可以给出给出一个曲线" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 预测属于某个分类的概率(predict_proba)\n", "\n", "典型的规则: 选择最可能的分类\n", "例如: 如果数值>0.5, 属于分类1\n", "\n", "* 通过改变阈值可以调节分类器的预测. \n", "* 更高的阈值导致更为保守的分类器\n", " * 例如只有数值>0.7才归入分类1\n", " * 高阈值增加了precision. 比之前低阈值时更少把样本归入分类1, 但是如果归入到样本1, 那么把握更大. \n", " \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "还是举个我更熟悉的例子吧, 比如仅仅用眼压作为青光眼的诊断标准, \n", "* 21mmHg就是一个阈值, \n", "* 大于21mmHg的就归入青光眼分类, 小于等于21mmHg的就归入正常眼的分类. 但显然这样会把一部分高眼压症的人算作是青光眼. \n", "* 如果把阈值提高到比如30mmHg, 那么筛出来的病人, 真正就是青光眼的可能性就要高很多. 就是Precision更高. \n", "* 如果把阈值降低到比如15mmHg, 那么就有更少的病人漏网, 也就是Recall更高\n", "* 后面会讲半天ROC曲线, 就是看阈值变化时, Precision和Recall的变化. \n", "\n", "但是! 在此处吐槽一下. 这样的分类方法明显是错的啊, 本来根本不是用一个值来简单区分的事情, 为什么要强行这么做? 要诊断青光眼还要看视盘, 看盘沿, 看视野, 看动态变化, 本来就不是一个一维的事情, 不管其他, 去找一个参数的分界线是不对的啊. \n", "\n", "_贱人就是矫情_\n", "\n", "(4月4日更正), 此处的吐槽是不对的, 很抱歉. decision_function可以用到不同的分类器上, 是把多维的数据最终映射到一维上, 再拿到一维上来分类, 所以即使是深度学习, 如果是二分类问题, 仍然是最后由一个神经元输出[0, 1]之间的值, 并根据这个值来区分, 比如用sigmoid做激活函数, 那么分界阈值就是0.5, 但实际上可以设定不同. 所以仍然可以得出一个ROC曲线. \n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 复习一下各种率" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Accuracy\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", "
预测=A预测=B预测=C
实际=A100611
实际=B111012
实际=C27120
\n", "\n", "\n", "$$\n", "Accuracy=\\frac{100+110+120}{100+6+11+1+110+12+2+7+120}\n", "$$\n", "\n", "----\n", "\n", "## Recall\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", "
预测=A预测=B预测=C
实际=A100611
实际=B111012
实际=C27120
\n", "\n", "\n", "$$\n", "Recall=\\frac{120}{2+7+120}\n", "$$\n", "\n", "----\n", "\n", "## Precision\n", "\n", "* 精确度, 阳性预测率, PPV\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", "
预测=A预测=B预测=C
实际=A100611
实际=B111012
实际=C27120
\n", "\n", "\n", "$$\n", "Precision=\\frac{120}{11+12+120}\n", "$$\n", "\n", "----\n", "\n", "## Specificity\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", "
预测=A预测=B预测=C
实际=A100611
实际=B111012
实际=C27120
\n", "\n", "\n", "$$\n", "Specificity=\\frac{100+6+1+110}{100+6+1+110+2+7}\n", "$$\n", "\n", "----\n", "\n", "## False Positive Rate\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", "
预测=A预测=B预测=C
实际=A100611
实际=B111012
实际=C27120
\n", "\n", "\n", "$$\n", "False Positive Rate=\\frac{11+12}{100+6+11+1+110+12}\n", "$$\n", "\n", "----" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "比如现在只用眼压区分青光眼, 补充一点背景知识: 已知95%的人群眼压是是10-21mmHg, 眼压最低也只能到房水的流出通道, 也就是静脉里面, 最低最低8mmHg, 眼压到30mmHg摸起来已经接近脑门的硬度了, 到40mmHg已经要疼得撞墙了. \n", "\n", "* 那么, 如果以10mmHg作为分界, 认为大于10mmHg的都是青光眼, 那么几乎所有的人类都是青光眼, 于是没有任何一个青光眼病人会被漏掉. \n", "* 如果以40mmHg作为分界, 认为大于40mmHg的才是青光眼, 那么只有急性发作的病人才会被当作是青光眼, 这时候每筛出一个病人, 肯定就是青光眼, 不会筛出来的不是, 但会漏掉很多病人. \n", "\n", "\n", "\n", "# Precision-Recall曲线\n", "\n", "* X轴: Precision\n", "* Y轴: Recall\n", "\n", "右上顶端: \n", "* 理想点\n", "* Precision=1.0\n", "* Recall=1.0\n", "\n", "P-R曲线的陡峭程度很重要. 在最大Precision时, 能够达到多大的Recall. \n", "![P-R_curve.png](https://i.loli.net/2018/04/01/5ac0be6b687da.png)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# ROC曲线\n", "\n", "* X轴: False Positive Rate 假阳性率\n", "* Y轴: True Positive Rate 真阳性率\n", "\n", "\n", "左上顶点:\n", "* 理想点\n", "* False positive rate 假阳性率=0 \n", "* True positive rate 真阳性率=1\n", "\n", "![ROC.png](https://i.loli.net/2018/04/01/5ac0c250b9182.png)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* ROC曲线越往左上, 越好. \n", "* 曲线下面积(AUC), 越大越好\n", "* 45度线是随机瞎猜线\n", "\n", "![ROC-2.png](https://i.loli.net/2018/04/01/5ac0c511e280e.png)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 未完待续" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.10" }, "nikola": { "category": "", "date": "2018-04-1 19:30 UTC+08:00", "description": "", "link": "", "slug": "scikit-learn-note-4", "tags": "现代眼科医生知识扩展包, python", "title": "Scikit-learn笔记4(ROC曲线)", "type": "text" }, "toc": { "colors": { "hover_highlight": "#DAA520", "navigate_num": "#000000", "navigate_text": "#333333", "running_highlight": "#FF0000", "selected_highlight": "#FFD700", "sidebar_border": "#EEEEEE", "wrapper_background": "#FFFFFF" }, "moveMenuLeft": true, "nav_menu": { "height": "58px", "width": "254px" }, "navigate_menu": true, "number_sections": true, "sideBar": true, "threshold": 4, "toc_cell": false, "toc_section_display": "block", "toc_window_display": false, "widenNotebook": false } }, "nbformat": 4, "nbformat_minor": 4 }