{
"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",
" | 预测=A | 预测=B | 预测=C | \n",
"
\n",
" \n",
" \n",
" \n",
" 实际=A | \n",
" 100 | \n",
" 6 | \n",
" 11 | \n",
"
\n",
" \n",
" 实际=B | \n",
" 1 | \n",
" 110 | \n",
" 12 | \n",
"
\n",
" \n",
" 实际=C | \n",
" 2 | \n",
" 7 | \n",
" 120 | \n",
"
\n",
" \n",
"
\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",
" | 预测=A | 预测=B | 预测=C | \n",
"
\n",
" \n",
" \n",
" \n",
" 实际=A | \n",
" 100 | \n",
" 6 | \n",
" 11 | \n",
"
\n",
" \n",
" 实际=B | \n",
" 1 | \n",
" 110 | \n",
" 12 | \n",
"
\n",
" \n",
" 实际=C | \n",
" 2 | \n",
" 7 | \n",
" 120 | \n",
"
\n",
" \n",
"
\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",
" | 预测=A | 预测=B | 预测=C | \n",
"
\n",
" \n",
" \n",
" \n",
" 实际=A | \n",
" 100 | \n",
" 6 | \n",
" 11 | \n",
"
\n",
" \n",
" 实际=B | \n",
" 1 | \n",
" 110 | \n",
" 12 | \n",
"
\n",
" \n",
" 实际=C | \n",
" 2 | \n",
" 7 | \n",
" 120 | \n",
"
\n",
" \n",
"
\n",
"\n",
"\n",
"$$\n",
"Precision=\\frac{120}{11+12+120}\n",
"$$\n",
"\n",
"----\n",
"\n",
"## Specificity\n",
"\n",
"* 特异性, 真阴性率\n",
"* 测出没病, 还说对了的概率\n",
"\n",
"\n",
" \n",
" \n",
" | 预测=A | 预测=B | 预测=C | \n",
"
\n",
" \n",
" \n",
" \n",
" 实际=A | \n",
" 100 | \n",
" 6 | \n",
" 11 | \n",
"
\n",
" \n",
" 实际=B | \n",
" 1 | \n",
" 110 | \n",
" 12 | \n",
"
\n",
" \n",
" 实际=C | \n",
" 2 | \n",
" 7 | \n",
" 120 | \n",
"
\n",
" \n",
"
\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",
" | 预测=A | 预测=B | 预测=C | \n",
"
\n",
" \n",
" \n",
" \n",
" 实际=A | \n",
" 100 | \n",
" 6 | \n",
" 11 | \n",
"
\n",
" \n",
" 实际=B | \n",
" 1 | \n",
" 110 | \n",
" 12 | \n",
"
\n",
" \n",
" 实际=C | \n",
" 2 | \n",
" 7 | \n",
" 120 | \n",
"
\n",
" \n",
"
\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",
"\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",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* ROC曲线越往左上, 越好. \n",
"* 曲线下面积(AUC), 越大越好\n",
"* 45度线是随机瞎猜线\n",
"\n",
"\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
}