周志华西瓜书学习笔记(一)

周志华西瓜书笔记(一)

以下是西瓜书第1章和第2章的笔记。不过第1章和第2章大部分是一些术语和概念,有一些知识点没有看过后续内容会比较难理解,就暂时跳过。主要是:第1章:【1.4-归纳偏好】可以跳过;第2章:【2.3.3-ROC与AUC】及其以后的都可以跳过

第一章 绪论

机器学习的主要内容

​ 机器学习所研究的主要内容是关于在计算机上从数据中产生“模型”的算法,即“学习算法”(Learning algorithm)

基本术语

假定我们收集了一批关于西瓜的数据,如表

色泽根蒂敲声是否好瓜
青绿蜷缩浊响
乌黑稍蜷沉闷
浅白硬挺清脆

数据集:这些记录的集合成为数据集

示例:数据集中每条记录是关于一个事件或对象的描述,称为“示例”或“样本”

属性:反映事件或对象在某方面的表现或性质的事项,例如:“色泽”、“根蒂”等

属性值:顾名思义即属性上的取值,例如“青绿”、“蜷缩”等

特征空间:例如我们把“色泽”、“根蒂”、“敲声”作为三个坐标轴,就会形成一个用于描述西瓜的三维空间,每个西瓜都可在这个空间中找到自己的坐标位置,空间中的每个点就对应一个坐标向量,因此我们可以把一个实例称为一个“特征向量”(数据向量化是机器学习的重要步骤)

维数:样本空间D中包含了m个示例,每个示例中是d维的样本空间,d称为维数。

机器学习分类

根据训练数据是否拥有标记,学习任务主要分为两类:

  • 监督学习:样本有标记(如是否为好瓜)
    • 欲预测的是离散值,此类学习任务称为“分类”
    • 欲预测的是连续值,此类学习任务称为“回归”
  • 无监督学习:样本无标记
    • 聚类是无监督学习的典型代表

模型的泛化能力

泛化能力是指学得模型适用于新样本的能力,能够反映出样本空间特性的训练集越有可能经过学习得到具有强泛化能力的模型。一般而言,训练样本越多,我们得到的关于未知分布的信息就越多,这样就越有可能通过学习获得具有强泛化能力的模型。

归纳和演绎是科学推理的两大基本手段。前者从特殊到一般,从具体的事实归结出规律;后者则是一般到特殊,由基础原理推导出具体情况。“从样例中学习”的机器学习是一种归纳学习。

第二章 模型的评估与选择

经验误差与过拟合

错误率:分类错误的样本数占样本总数的比例

精度:1-错误率

例:

m个样本中,有a个样本分类错误
错误率E=a/m,
精度=1-a/m

误差:学习器的实际预测输出与样本的真实输出之间的差异

  • 学习器在训练集上的误差称为“训练误差”或“经验误差”
  • 学习器在新样本上的叫“泛化误差”

很多时候我们会努力训练得到经验误差很小、在训练集上表现很好吗,甚至对所有训练样本的正确的学习器,但这样的学习器可能在新样本中表现不好,这便是出现了“过拟合”。而与过拟合相对的,是“欠拟合”。书上的示意图能很好的解释两者的定义。
在这里插入图片描述
在这里插入图片描述

评估方法

通过对数据集D进行适当的处理,从中产生训练集S和测试集T,具体方法有以下几种:

  1. 留出法:直接将数据集D划分成两个互斥的集合S和T,在S上训练,在T上测试
  • 要注意的是,训练/测试集的划分尽可能保持数据分布的一致性,避免因划分过程引入额外的偏差。比如,在分类任务中,可以采用分层抽样的方法。另一个需要主要的问题是,单词使用留出法得到的估计结果往往不够可靠,一般要采用若干次随机划分,重复试验评估取平均值。

  • 缺点:若训练集包含绝大多数样本,则训练出的模型可能更接近于用D训练出来的模型,但由于T比较小,评估结果可能不够稳定准确;若令测试集多一些样本,则测试集S与D差别更大,被评估的模型与用D训练处的模型相比可能有较大差别,从而降低了评估结果的保真性。

  1. 交叉验证法:首先,将D划分成k个大小相似的互斥子集,注意要保证每个子集 $D_i $都尽可能保持数据分布的一致性,即从D中通过分层采样得到。其次,每次用k -1个子集的并集作为训练集,余下的那个作为测试集,从而进行k次训练,返回的结果取均值。

    为强调这一点,通常把交叉验证法成为“k折验证法”

    留一法:即令k=m,m为数据集D中的样本个数。即只留一条样本作为测试集。
    在这里插入图片描述

  2. 自助法 :留出法和交叉验证都保留了一部分样本用于测试,导致训练集实际上比 D 小,这会引入因训练样本规模不同而导致的估计偏差。自助法是一种解决方案。我们通过对有 m 个样本的 D 进行 m 次采样得到 D',用 D' 作为训练集,D\D' 作为测试集。显然,有些样本在 D' 中出现多次,有些一次也不出现。样本在 m 次采样中都不被采样到的概率为 ( 1 − 1 m ) m (1-\frac{1}{m})^m (1m1)m ,取极限得到其概率为 1 e = 0.368 \frac{1}{e}=0.368 e1=0.368,即 D 中约有1/3的样本未出现在 D' 中。依旧有数据总量1/3的数据,不曾出现在训练集中的样本用于测试,这样的测试结果成为“包外估计”。

    优点:在数据集较小、难以有效划分训练集和测试集时很有用;同时能够产生多个不同的训练集,对集成学习有帮助

    缺点:自助法产生的数据集改变了初始数据集的分布

    在样本数量足够时,多采用留出法和交叉验证法。

调参与最终模型

对于模型中的参数,我们不可能尝试每一个实数,现实中的做法是,对每个参数选定一个变化范围和变化步长。

性能度量

性能度量就是衡量模型泛化能力的评价标准。性能度量要反映任务需求,使用不同的性能度量往往会导致不同的评判结果。

  • 在回归任务中,最常用的性能度量就是“均方误差”,即

    E ( f ; D ) = 1 m ∑ i = 1 m ( f ( x i ) − y i ) 2 E(f; D) = \frac{1}{m} \sum_{i=1}^m (f(\mathbf{x}_i)-y_i)^2 E(f;D)=m1i=1m(f(xi)yi)2

  • 一般的,对数据分布D和概率密度函数p(·),均方误差可以表示为
    在这里插入图片描述

错误率与精度:

错误率(Error Rate)定义为: E ( f ; D ) = 1 m ∑ i = 1 m I ( f ( x i ) ! = y i ) E(f; D) = \frac{1}{m} \sum_{i=1}^m \mathbf{I}(f(\mathbf{x}_i)!=y_i) E(f;D)=m1i=1mI(f(xi)!=yi)

I ( ∗ ) \mathbf{I}(*) I() 为指示函数,若 * 成立则为 1 否则为 0.

精度定义为: a c c ( f ; D ) = = 1 m ∑ i = 1 m I ( f ( x i ) = y i ) = 1 − E ( f ; D ) acc(f;D) = = \frac{1}{m} \sum_{i=1}^m \mathbf{I}(f(\mathbf{x}_i)=y_i) =1 - E(f;D) acc(f;D)==m1i=1mI(f(xi)=yi)=1E(f;D)

查准率、查全率与F1:
在这里插入图片描述

注:TP+FP+TN+FN=样例总数
在这里插入图片描述
​ 这个图说明的是查准率和查全率间的矛盾关系,提高查准率就要牺牲查全率。在进行取舍时,可以用到P-R图。曲线A完全包围了曲线C,说明A的性能一定比C好。可对于A和B发生交叉时,只能在具体的查准率和查全率中进行比较。还有一个合理的判断依据是曲线包围的面积大小,它在一定程度上也能说明学习器在查准率和查全率上取得“双高”的比例。但面积也不太好估算,所以人们提出“平衡点”即查准率=查全率的值,作为一种度量。

F1度量: $ F = \frac{2PR}{P + R} = \frac{2 TP}{样本总数+ TP - TN}$ 也就是说,F1度量是P和R的调和平均值

F β F_\beta Fβ度量:可以通过对 P 和 R 进行加权来调整 F1,得到一个加权 F β F_{\beta} Fβ

F β = 1 + β 2 P R ( β 2 P ) + R F_{\beta} = \frac{1 + \beta^2PR}{(\beta^2P) + R} Fβ=(β2P)+R1+β2PR

β > 1 \beta > 1 β>1 时,更看重查全率,如逃犯检索、; β < 1 \beta < 1 β<1,侧重查准率,如推荐系统。

进行多次训练/测试时,可以使用到宏查准率、宏查全率、宏F1;微查准率、微查全率、微F1

ROC and AUC:

很多学习器根据分类阈值来进行分类,例如,若预测值大于分类阈值则为正例,反之为反例。在不同的任务中,可以设置不同的阈值来调整结果以适应需求。我们可以根据学习器预测结果对样例排序,排序的质量好坏,体现了考虑学习器在不同任务下的“期望泛化性能“的好坏。ROC 即是从这个角度来度量学习器泛化性能的有力工具。

ROC图以“真正例率”为纵轴,以“假正例率”为横轴得到的曲线,

真正例率:$ TPR = \frac{TP}{TP + FN}$

假正例率:$ FRP = \frac{FP}{TN + FP} $

AUC即ROC曲线下的面积,(Area Under ROC Curve)
在这里插入图片描述
在实际例子中,只有有限个测试集时,ROC绘图方法如下:
在这里插入图片描述

虽然看着比较绕,但仔细阅读不难理解。

E ( f ; D ) = 1 m ∑ i = 1 m I ( f ( x i ) ! = y i ) E(f; D) = \frac{1}{m} \sum_{i=1}^m \mathbf{I}(f(\mathbf{x}_i)!=y_i) E(f;D)=m1i=1mI(f(xi)!=yi)

还可以得到AUC的估算为: A U C = 1 2 ∑ i = 1 m − 1 ( x i + 1 − x i ) ⋅ ( y i + y i + 1 ) AUC=\frac{1}{2}\sum_{i=1}^{m-1}(x_{i+_1}-x_i)·(y_i+y_{i+1}) AUC=21i=1m1(xi+1xi)(yi+yi+1)

个人理解:

可能存在一个疑惑是为什么不直接用切割法,求和各个矩形的面积。但研究完绘图方法会发现,每两个相邻的点必有x或y之一相同,如果用矩形求矩形面积,即横轴相减乘纵轴相减,大部分点得到的结果都为0.

再进行一个排序损失定义:在这里插入图片描述

个人理解:

之所以是损失,是因为根据之前说的排序规则,正例的预测值一定会比反例的预测值大,不可能出现小于和等于的情况。若出现,就需要记为罚分。

总集合上考虑,正例预测值和反例预测值只有三种关系(大于、等于、小于),ROC曲线包含的是大于的情况,那么曲线之上就表示等于和小于两种情况。

附南瓜书对该式的解释:
在这里插入图片描述
在这里插入图片描述

代价敏感错误率与代价曲线

因为不同的预测错误代价会不同,比如把健康者检测为患者,把患者检测为健康者,代价是完全不一样的。所有可以用代价矩阵纳入考量范围。

代价曲线画法:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,我可以帮你输出一篇Selenium学习笔记。以下是一份简单的学习笔记供参考: Selenium学习笔记 Selenium是一款用于自动化Web应用程序测试的强大工具。它提供了一组丰富的API,可以与各种编程语言(如Python、Java、C#等)结合使用,以实现Web应用程序的自动化测试。 1. 安装和配置 首先,你需要安装Selenium库。如果你使用Python,可以使用以下命令安装: ``` pip install selenium ``` 安装完成后,你还需要下载并配置相应的浏览器驱动程序。Selenium支持各种浏览器,如Chrome、Firefox、Safari等。你可以在Selenium官方网站上找到相应的驱动程序下载链接。 2. 基本操作 Selenium提供了一系列方法来模拟用户在浏览器中的操作,如打开URL、点击元素、输入文本等。以下是一些常用的基本操作示例: - 打开浏览器并访问URL: ```python from selenium import webdriver driver = webdriver.Chrome() # 使用Chrome浏览器驱动 driver.get("https://www.example.com") # 打开指定URL ``` - 查找元素并操作: ```python element = driver.find_element_by_id("element_id") # 根据元素ID查找 element.click() # 点击元素 input_element = driver.find_element_by_name("input_name") # 根据元素名称查找 input_element.send_keys("Hello, World!") # 输入文本 ``` - 执行JavaScript代码: ```python driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 滚动到页面底部 ``` 3. 高级操作 Selenium还提供了一些高级操作,如处理弹窗、切换窗口、等待元素加载等。以下是一些常用的高级操作示例: - 处理弹窗: ```python alert = driver.switch_to.alert # 切换到弹窗 alert.accept() # 接受弹窗 confirm = driver.switch_to.alert # 切换到确认框 confirm.dismiss() # 取消确认框 ``` - 切换窗口: ```python window_handles = driver.window_handles # 获取所有窗口句柄 driver.switch_to.window(window_handles[-1]) # 切换到最后一个窗口 ``` - 等待元素加载: ```python from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "element_id")) ) ``` 4. 测试框架 Selenium还可以与测试框架(如Pytest、JUnit等)结合使用,以便更好地组织和管理测试用例。你可以使用测试框架提供的断言方法来验证测试结果。 ```python import pytest def test_example(): driver = webdriver.Chrome() driver.get("https://www.example.com") assert "Example Domain" in driver.title # 断言页面标题包含指定文本 driver.quit() ``` 以上是一份简单的Selenium学习笔记,希望对你有所帮助。当然,Selenium还有很多其他功能和用法,你可以进一步深入学习和探索。祝你学习愉快!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值