周志华《机器学习》笔记(第1-2章)

第一章 绪论

几个概念

  1. 机器学习:在计算机上从数据中产生“模型”的算法,即“学习算法”。
  2. 模型:泛指从数据中学得的结果。模式:指局部性结果。
  3. 属性:反映事件或对象在某方面的表现或性质的事项,每个属性对应的值称为属性值。比如说描述一个西瓜的属性(色泽=青绿,根蒂=蜷缩,敲声=浊响),由属性张成的空间叫做属性空间/样本空间/输入空间。
  4. 聚类:将训练集中的西瓜分成若干组,每组称为一个“簇”。每个簇的西瓜之间具有相似性。
  5. 监督学习:有标签的学习。无监督学习:没标签的学习。
  6. 泛化能力:使学得的模型能很好地适用于“新样本”,而不是仅仅在训练样本上工作的很好。具有强泛化能力的模型能很好地适用于整个样本空间。 即给定一些新的样本,所学得的模型能够作出准确的判断。
  7. 归纳(induction):从特殊到一般的“泛化”过程,即从具体的事实归结出一般性规律。演绎:从一般到特殊的“特化”过程,即从基础原理推演出具体状况。(例:从公理推演出新的定理。)
  8. 归纳学习:广义,从样例中学习,狭义,从训练数据中学得概念。
  9. 假设:可以理解为一个映射,将输入X(样本属性)–> Label(标签)的函数。由所有假设构成的空间叫假设空间,机器学习就是在假设空间中搜索与训练集匹配的假设。
    因为所给定的样本都是有限的,而假设空间一般都很大,所以针对一个训练集,可能存在多个假设都与训练集一致,这些假设构成的空间称为“版本空间”。
  10. 归案偏好:机器学习算法在学习的过程中对某种类型的假设的偏好。也可以看成学习算法自身在一个可能很庞大的假设空间中对假设进行选择的启发式或“价值观”。
  11. “奥卡姆剃刀(Occam’s razor)原则”,一种用来选择最终假设的价值观。
    内容: “若有多个假设与观察一致,则选最简单的那个。”
    意义:算法的归纳偏好是否与问题本身相配,大多情况下直接决定了算法能否取得好的性能。

没有免费的午餐定理(No Free Lunch Theorem)

定理内容:无论学习算法A多聪明,学习算法B多笨拙,它们的期望性能是相同的,证明过程如下:
假设样本空间 X \mathcal{X} X和假设空间 H \mathcal{H} H都是离散的, L a \mathfrak{L}_a La代表搜索算法, P ( h ∣ X , L a ) P\left(h \mid X, \mathfrak{L}_{a}\right) P(hX,La)代表算法 L a \mathfrak{L}_a La基于训练数据X产生假设h的概率,f代表真实目标函数,则 L a \mathfrak{L}_a La在训练集之外的所有样本的误差为:
(考虑二分类问题,且真实目标函数可以为函数空间内的任何函数,对所有可能的f按照均匀分布对误差求和)
∑ f E ote  ( L a ∣ X , f ) = ∑ f ∑ h ∑ x ∈ X − X P ( x ) I ( h ( x ) ≠ f ( x ) ) P ( h ∣ X , L a ) = ∑ x ∈ X − X P ( x ) ∑ h P ( h ∣ X , L a ) ∑ f I ( h ( x ) ≠ f ( x ) ) = ∑ x ∈ X − X P ( x ) ∑ h P ( h ∣ X , L a ) 1 2 ∣ X ∣ = 1 2 2 ∣ X ∣ ∑ x ∈ X − X P ( x ) ∑ h P ( h ∣ X , L a ) = 2 ∣ X ∣ − 1 ∑ x ∈ X − X P ( x ) ⋅ 1 \begin{aligned} \sum_{f} E_{\text {ote }}\left(\mathfrak{L}_{a} \mid X, f\right) &=\sum_{f} \sum_{h} \sum_{\boldsymbol{x} \in \mathcal{X}-X} P(\boldsymbol{x}) \mathbb{I}(h(\boldsymbol{x}) \neq f(\boldsymbol{x})) P\left(h \mid X, \mathfrak{L}_{a}\right) \\ &=\sum_{\boldsymbol{x} \in \mathcal{X}-X} P(\boldsymbol{x}) \sum_{h} P\left(h \mid X, \mathfrak{L}_{a}\right) \sum_{f} \mathbb{I}(h(\boldsymbol{x}) \neq f(\boldsymbol{x})) \\ &=\sum_{\boldsymbol{x} \in \mathcal{X}-X} P(\boldsymbol{x}) \sum_{h} P\left(h \mid X, \mathfrak{L}_{a}\right) \frac{1}{2^{|\mathcal{X}|}} \\ &=\frac{1}{2} 2^{|\mathcal{X}|} \sum_{\boldsymbol{x} \in \mathcal{X}-X} P(\boldsymbol{x}) \sum_{h} P\left(h \mid X, \mathfrak{L}_{a}\right) \\ &=2^{|\mathcal{X}|-1} \sum_{\boldsymbol{x} \in \mathcal{X}-X} P(\boldsymbol{x}) \cdot 1 \end{aligned} fEote (LaX,f)=fhxXXP(x)I(h(x)=f(x))P(hX,La)=xXXP(x)hP(hX,La)fI(h(x)=f(x))=xXXP(x)hP(hX,La)2X1=212XxXXP(x)hP(hX,La)=2X1xXXP(x)1

解释:
I ( h ( x ) ≠ f ( x ) \mathbb{I}(h(\boldsymbol{x}) \neq f(\boldsymbol{x}) I(h(x)=f(x)是指示函数,里面的内容为真则取值1,否则取值0.
∑ f I ( h ( x ) ≠ f ( x ) ) = 2 ∣ X ∣ \sum_{f} \mathbb{I}(h(\boldsymbol{x}) \neq f(\boldsymbol{x})) = 2^{|\mathcal{X}|} fI(h(x)=f(x))=2X
f代表我们希望学习的真实目标函数,假如说样本空间 x \mathcal{x} x包含两个样本 { x 1 , x 2 } \{x_1,x_2\} {x1,x2},每个样本的取值为0或者1,那么f的个数就为 2 2 = 4 2^2 = 4 22=4个。那么假设 h ( x 1 ) h(x_1) h(x1)的标签为0,那么总有一半的 f f f是正确的。

结论:
∑ f E o t e ( L a ∣ X , f ) = ∑ f E o t e ( L b ∣ X , f ) \sum_f E_{ote}(\mathfrak{L}_a \mid X, f) = \sum_f E_{ ote}(\mathfrak{L}_b \mid X,f) fEote(LaX,f)=fEote(LbX,f)
即总误差和学习算法无关。

问题:
那么既然选择什么算法最终的期望性能都一样,那么机器学习到底学什么呢?
答:1.该定理有一个重要前提,f是均匀分布的。但是现实生活中,针对具体的问题,真实的目标函数是有偏好的。比如说,蜷缩、浊响的西瓜常常是好瓜。
2.该定理的意义,是让我们明确,机器学习必须针对具体的数据集来说话,这个学习算法在问题A上有很好的效果,但是在问题B上可能效果非常差。我们的目标是使自身的归纳偏好和问题相配。

第二章 模型评估与选择

几个概念

  1. 过拟合

在训练集上表现的很好,在测试集上表现的不好(学习能力过强)。欠拟合就是在训练集上表现的不好(学习能力不足)。
过拟合不可避免:我们要解决的问题通常都是NP问题,若不存在过拟合,则该问题可转化为P问题, N P ≠ P NP\neq P NP=P(至少现在还无法证明)

  1. 训练集的划分方法

1).留出法
将数据集D按比例划分为互斥的两个子集S和T,最好按照原样本中的类别比例。这种一般要采用若干次随机划分、重复进行实验评估后取平均值作为实验结果。常见的划分比例是:4:1或者2:1

2).交叉验证法
a. 首先将数据D划分为k个大小相似的互斥子集,即 D 1 ∪ D 2 ∪ . . . ∪ D k , D i ∩ D j = ∅ D_1\cup D_2 \cup ...\cup D_k,D_i \cap D_j = \emptyset D1D2...DkDiDj=,其中每个子集都尽量保持与原数据分布的一致性。
b.每次用k-1个子集的并集作为训练集,余下的子集作测试集,这样可以获得k组训练/测试集,最终返回这k组结果的均值。
c.常用的k值包括5,10,20等。
问题:将数据集划分为k个子集的时候也有多种划分方法,k折交叉验证通常要随机选用不同的划分重复p次,最终的结果是这p次k折的结果。常见的有“10次10折交叉验证” 相当于 100个划分。
特殊:每个子集包含1个样本,只有一种划分方式,就是留一法。(如果数据量大,那么计算开销非常大。评估结果也未必永远准确)

3).自助法
对数据集进行m次有放回采样得到D‘(训练集),共m个样本。
那么一个样本没有被采样过的概率为:
lim ⁡ m → ∞ ( 1 − 1 m ) m = 1 e ≈ 0.368 \lim\limits_{m \to \infty} (1-\frac{1}{m})^m = \frac{1}{e} \approx0.368 mlim(1m1)m=e10.368
所以D\D’用作测试集,D‘作为训练集,测试集的比例约为0.368
针对情况:数据集较小、难以有效划分训练/测试集时比较有用。缺点:改变了初始数据集的样本分布,在数据量足够时,留出法和交叉验证法更常用。

  1. 调参

超参数:你自己设置的参数,比如学习率、迭代轮数等。
模型参数:模型反向梯度下降得到的参数。
调参:调的是超参数。
一般是用验证集来测试和调参。

  1. 性能度量(评价一个模型泛化能力的指标)

不同的任务侧重于不同的指标。
给定样例集D={(x1,y1),(x2,y2),…(xm,ym)},其中yi是真实标签,则评估学习器的性能。
均方误差:
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(x_i) - y_i)^2 E(F;D)=m1i=1m(f(xi)yi)2


1.错误率:分类错误的样本数占样本总数的比例。
2.精度:分类正确的样本数占样本总数的比例。

预测结果
真实情况正(T)负(N)
正(T)TPFN
负(N) FP TN

查准率(precision): P = T P T P + F P P = \frac{TP}{TP+FP} P=TP+FPTP,预测为正样本中有多少是真的正样本。


查全率(recall): R = T P T P + F N R = \frac{TP}{TP+FN} R=TP+FNTP,正样本中又多少被正确预测了。


查准率和查全率通常是相互矛盾的,如果把所有瓜都选上,查准率低,如果只想挑好瓜,必然漏了一部分好瓜,查全率就低了。

P-R曲线:

根据学习器的预测结果对样例进行排序,排在前面的是学习器认为“最可能”是正例的样本,按此顺序逐个把样本作为正例进行预测,则每次可以计算当前的查全率、查准率。以查准率为纵轴、查全率为横轴作图。
如果一个学习器的P-R曲线被另一个学习器的P-R曲线包住,可断言后者的性能优于前者。
请添加图片描述
a.平衡点(Break-Even Point,BEP)
是当查准率=查全率时的取值。可以作为评价哪个学习器更好的指标,如图,A > B(平衡点更大) > C(全包)
————————————————————————————————————————————
b.F1度量:基于查准率与查全率的调和平均定义的: 1 F 1 = 1 2 × ( 1 P + 1 R ) \frac{1}{F_1} = \frac{1}{2} \times(\frac{1}{P}+\frac{1}{R}) F11=21×(P1+R1)
.
F 1 = 2 × P × R P + R = 2 × T P 样 例 总 数 + T P − T N F_1 = \frac{2 \times P \times R}{P + R} = \frac{2 \times TP}{样例总数 + TP - TN} F1=P+R2×P×R=+TPTN2×TP


F β F_\beta Fβ则是加权调和平均,它表示了对查准率和查全率的不同偏好。其中 β > 0 \beta>0 β>0度量了查全率对查准率的相对重要性, β = 1 \beta=1 β=1退化为标准的F1, β \beta β > 1时查全率有更大的影响, β \beta β < 1时,查准率有更大的影响。


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


F β = ( 1 + β 2 ) × P × R ( β 2 × P ) + R F_\beta=\frac{(1+\beta^2)\times P\times R}{(\beta^2 \times P)+R} Fβ=(β2×P)+R(1+β2)×P×R
——————————————————————————————————————————————
c.宏查准率/宏查全率/宏F1
累加的形式
 macro-  P = 1 n ∑ i = 1 n P i  macro-  R = 1 n ∑ i = 1 n R i ,  macro-  F 1 = 2 ×  macro-  P ×  macro-  R  macro-  P +  macro-  R . \begin{array}{c} \text { macro- } P=\frac{1}{n} \sum_{i=1}^{n} P_{i} \\ \\ \text { macro- } R=\frac{1}{n} \sum_{i=1}^{n} R_{i}, \\ \\ \text { macro- } F 1=\frac{2 \times \text { macro- } P \times \text { macro- } R}{\text { macro- } P+\text { macro- } R} . \end{array}  macro- P=n1i=1nPi macro- R=n1i=1nRi, macro- F1= macro- P+ macro- R2× macro- P× macro- R.
先把各项平均再计算,叫微查准率/微查全率/微F1:
 micro-  P = T P ‾ T P ‾ + F P ‾ ,  micro-  R = T P ‾ T P ‾ + F N ‾ ,  micro-  F 1 = 2 ×  micro-  P ×  micro-  R  micro-  P +  micro-  R \begin{array}{c} \text { micro- } P=\frac{\overline{T P}}{\overline{T P}+\overline{F P}}, \\ \\ \text { micro- } R=\frac{\overline{T P}}{\overline{T P}+\overline{F N}}, \\ \\ \text { micro- } F 1=\frac{2 \times \text { micro- } P \times \text { micro- } R}{\text { micro- } P+\text { micro- } R} \end{array}  micro- P=TP+FPTP, micro- R=TP+FNTP, micro- F1= micro- P+ micro- R2× micro- P× micro- R

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很高兴听到你正在学习机器学习》这本经典的教材,下面我为你提供第十四概率图模型的Python实现学习笔记。 ## 1. 朴素贝叶斯分类器 ### 1.1 数据准备 在本中,我们将使用著名的鸢尾花数据集进行分类。首先,我们可以从sklearn库中导入该数据集。 ```python from sklearn.datasets import load_iris iris = load_iris() X = iris.data y = iris.target ``` ### 1.2 朴素贝叶斯分类器实现 接下来,我们可以使用sklearn库中的朴素贝叶斯分类器进行分类,具体实现如下: ```python from sklearn.naive_bayes import GaussianNB from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) gnb = GaussianNB() gnb.fit(X_train, y_train) y_pred = gnb.predict(X_test) accuracy = accuracy_score(y_test, y_pred) print('Accuracy:', accuracy) ``` ### 1.3 结果分析 运行上述代码后,我们可以得到该模型在测试集上的准确率,结果如下所示: ``` Accuracy: 1.0 ``` 可以看出,该模型在鸢尾花数据集上表现出色,准确率达到了100%。 ## 2. 隐马尔可夫模型 ### 2.1 数据准备 在本节中,我们将使用一个简单的例子来介绍隐马尔可夫模型的实现。假设我们有一个长度为100的序列,每个位置上的值都是0或1,其中0和1出现的概率分别为0.6和0.4。我们可以使用numpy库生成这个序列。 ```python import numpy as np np.random.seed(42) sequence = np.random.choice([0, 1], size=100, p=[0.6, 0.4]) ``` ### 2.2 隐马尔可夫模型实现 接下来,我们可以使用hmmlearn库中的隐马尔可夫模型进行序列建模,具体实现如下: ```python from hmmlearn import hmm model = hmm.MultinomialHMM(n_components=2) model.fit(sequence.reshape(-1, 1)) logprob, states = model.decode(sequence.reshape(-1, 1)) print('Sequence:', sequence) print('States:', states) ``` ### 2.3 结果分析 运行上述代码后,我们可以得到该模型对序列的建模结果,结果如下所示: ``` Sequence: [0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] States: [1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1] ``` 可以看出,模型对序列进行了建模,并输出了每个位置上的状态,其中0表示“假”,1表示“真”。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值