机器学习技术栈 ——《跟着迪哥学Python数据分析与机器学习实战》(2)

接上文《机器学习技术栈 ——《跟着迪哥学Python数据分析与机器学习实战》(1)》

七、贝叶斯算法

关于贝叶斯算法,有太多文章讲的比我好,我不赘述,此处只放上我的一个总结,方便我之后索引记忆:《机器学习技术栈—— 概率学基础》,欲了解更多贝叶斯算法内容,请移步他处。

7.1 新闻分类任务实战

朴素贝叶斯(Native Bayes):假设变量之间是独立的。Naive Bayes classifier - wiki

用朴素贝叶斯方法,分辨垃圾邮件,但我发现下载下来的代码文件并没有包含数据集,所以我只看代码运行结果,没有去实际跑一遍。

7.1.1 结巴分词

pip install jieba

用以下代码可以做到分词

content_S = []
for line in content:
    current_segment = jieba.lcut(line) #对每一篇文章进行分词, lcut = letter cut
    if len(current_segment) > 1 and current_segment != '\r\n': #换行符
        content_S.append(current_segment) #保存分词的结果

7.1.2 词云表示工具包wordcloud

word cloud offical website

7.1.3 TF-IDF特征

经过清洗之后,剩下的都是稍微有价值的词,但是这些词的重要程度不一定相同,可以这样定义重要程度

(1)如果一个词在整个语料库中(可以当作是在所有文章中)出现的次数都很高(这篇文章有它,另一篇还有这个词),那么这个词的重要程度就不高,因为它更像一个通用词
(2)如果另一个词在整体的语料库中的词频很低,但是在这一篇文章中却大量出现,就有理由认为它在这篇文章中很重要

T F − I D F = 词频 ( T F ) ∗ 逆文档频率 ( I D F ) TF-IDF = 词频(TF)*逆文档频率(IDF) TFIDF=词频(TF)逆文档频率(IDF)
词频 ( T F ) = 某个词在文章中出现的次数 文章的总词数 词频(TF) = \frac{某个词在文章中出现的次数}{文章的总词数} 词频(TF)=文章的总词数某个词在文章中出现的次数
逆文档频率 ( I D F ) = l o g ( 语料库的文档总数 包含该词的文档数 + 1 ) 逆文档频率(IDF) = log(\frac{语料库的文档总数}{包含该词的文档数+1}) 逆文档频率(IDF)=log(包含该词的文档数+1语料库的文档总数)
I D F IDF IDF,包含该词的文档数越少,就会导致分母减小,从而导致 I D F IDF IDF增大,说明出现了该词的文档非常重要,加1是为了防止分母为0。

八、聚类算法

聚类算法是一种典型的无监督学习算法,但要说这是完全的无监督,似乎也不成立,因为还得首先知道“人以类聚,物以群分”的朴素道理,不知道这个道理,也无法推导出聚类算法。

人类的无师自通式的无监督,是先从劳动中总结归纳出文字符号系统,即,从最原始的物与物的相互作用,A作用于B,归纳出“名词-动词-名词”体系,然后再有各种副词,形容词去丰富这个体系,一个语言系统中,最原始的部分应该就是简单句,比如说“我爱你”,就符合“名词-动词-名词”体系,然后有了这套文字符号系统后,再表达出早已观察到的“人以类聚,物以群分”。

但是计算机的无监督,是先有了“人以类聚,物以群分”这套算法,然后再进行聚类分析,要学会如何学习,涉及到的领域是元学习(Meta Learning),这张图表示的很清楚
meta learning

Meta learning参考文章
Meta-learning - wiki
《Meta Learning 简介》- 知乎

8.1 K-means K-均值聚类算法

评估指标

轮廓系数(Silhouette Coefficient)是聚类效果好坏的一种评价方式,也是最常用的评估方法。

Silhouette Coefficient参考文章
《聚类效果评估指标总结》
Silhouette - wiki

优缺点

优点缺点
1.快速、简单,概括来说就是很通用的算法。1.在K-means算法中,K是事先给定的,这个K值是非常难以估计的。很多时候,事先并不知道给定的数据集应该分成多少个类别才合适。《kmeans算法的k值选择》
2.聚类效果通常还是不错的,可以自己指定划分的类别数。2.初始质心点的选择有待改进,可能会出现不同的结果。
3.可解释性较强,每一步做了什么都在掌控之中。3.在球形簇上表现效果非常好,但是其他类型簇中效果一般。

8.2 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)基于密度的聚类算法

DBSCAN算法流程
总结:规定好发展的范围 ε \varepsilon ε与规模 M i n P t s MinPts MinPts,各自发展下线,没有符合的目标就停止。遇到无监督问题时,记得这个算法。

优缺点

优点缺点
1.可以对任意形状的稠密数据集进行聚类,而K-means之类的聚类算法一般只适用于球状数据集1.如果样本集的密度不均匀、聚类间距差相差很大时,聚类效果较差
2.非常适合检测任务,寻找离群点2.半径的选择比较难,不同半径的结果差异非常大
3.不需要手动指定聚类的堆数,实际中也很难知道大致的堆数

九、神经网络基础

机器学习与深度学习最大的区别在于,是否需要特征工程。
在这里插入图片描述

书曰:“能用逻辑回归解决的问题根本没有必要拿到神经网络中”,这是因为神经网络的过拟合问题较为严重,训练时间也较长,事情总是能简单就别复杂,不存在例外,如果有例外,那就是描述事物的基本原理还没摸透,基本原理错了,再怎么演变也是错的。

9.1 计算机眼中的图像

图像在计算机中是以矩阵形式存储的,以RGB图像为例,是以300×100×3的形式存储在计算机中,即 L e n g t h ∗ W i d t h ∗ C o l o r s Length*Width*Colors LengthWidthColors,图像识别中常见的问题之一遮蔽现象,比如戴口罩
书曰:“一个特定类别对应一组权重参数,十分类对应十组权重参数,最终结果由 w w w来控制,偏置参数 b b b只是进行微调,如果是十分类任务,各自类别都需要进行微调,也就是需要10个偏置参数。”

损失函数

L i = ∑ j ≠ y i m a x ( 0 , s j − s y i + Δ ) L_{i} = \sum_{j \neq y_i}{max(0, s_j - s_{y_i} + \Delta)} Li=j=yimax(0,sjsyi+Δ)
其中 L i L_i Li为:当前输入数据属于正确类别的得分值(即 s y j s_{y_j} syj)与其他所有错误类别得分值(即 s j s_j sj)的差异总和,当 s j − s y i + Δ < 0 s_j - s{y_i} + \Delta < 0 sjsyi+Δ<0时,表示没有损失,当 s j − s y i + Δ > 0 s_j - s{y_i} + \Delta > 0 sjsyi+Δ>0时,表示开始计算损失, Δ \Delta Δ代表容忍度。

模型最终的损失值,是有大量测试图像结果的平均值决定的
L i = 1 N ∑ i = 1 N ∑ j ≠ y i m a x ( 0 , s j − s y i + Δ ) L_{i} = \frac{1}{N} \sum_{i=1}^{N}{ \sum_{j \neq y_i}{max(0, s_j - s_{y_i} + \Delta ) }} Li=N1i=1Nj=yimax(0,sjsyi+Δ)

9.2 dropout

为了降低过拟合风险,在每一次训练迭代过程中随机杀死一部分神经元,每次迭代都进行随机选择,测试阶段依旧可以使用完整的神经网络架构,

十、Tensorflow

书曰:“Tensorflow就是 张量(Tensor)以在计算图(Graph)上流动(Flow)的方式的实现和执行机器学习算法 的框架,它是一个基于数据流图的科学计算库,而非仅仅是机器学习库”。

10.1 Tensorflow基本用法

参考文章与链接总结
api docs —— Tensorflow
《Cause: No module named ‘tensorflow_core.estimator‘(解决方法)》
《AttributeError: module ‘tensorflow’ has no attribute ‘global_variables_initializer’》
《RuntimeError: The Session graph is empty. Add operations to the graph before calling run().解决方法》
《tf.add不同形状矩阵的加法操作》如果维度不相等的时候,必须有一个对应的维度为1

Tensorflow操作流程总结
(1) 创建变量
(2) 创建操作
(3) 全局变量初始化
(4) 创建Session(),最后sess.run(),只有完成这一步,才能真正得到最终结果。

a = 3
# (1)创建变量
w = tf.Variable([[0.5,1.0]]) # row vector 1*2
x = tf.Variable([[2.0],[1.0]]) # col vector 2*1
# (2)创建操作
y = tf.matmul(w, x)  

# (3)全局变量初始化
init_op = tf.compat.v1.global_variables_initializer()
with tf.compat.v1.Session() as sess:
    tf.compat.v1.disable_eager_execution() # Added by lyp at 2023-11-25
    # (4)sess.run()
    sess.run(init_op)
    print (y.eval())

10.2 用Keras搭建神经网络

关于如何用Tensorflow搭建神经网络,我之前在微信公众号中写过一篇文章,使用的是Keras,而Keras已经被吸收成为Tensorflow的一部分了,所以用Keras搭建神经网络是必须要掌握的

参考文章
《用Keras搭建神经网络》—— 微信公众号

10.3 Tensorflow经典实战项目

//@TODO,网上都说初学者无脑入手pytorch,这方面的实战项目后期有需要再补充。

十一、CNN卷积神经网络

书曰:“神经网络的本质是对数据特征进行提取,卷积神经网络也是神经网络的一种,只不过在图像数据中效果更好”。

11.1 CNN原理与术语

MLP是一种全连接神经网络,CNN也是一种全连接神经网络。并且,MLP的矩阵计算方式所需参数过于庞大,一方面使得迭代速度很慢,另一方面过拟合问题比较严重,而CNN便可以更好地处理这个问题。

术语定义解释
卷积核Kernel (image processing) - wiki
《【低层视觉】低层视觉中常见的卷积核汇总》- 知乎
卷积是寻找特征
池化层池化是压缩数据
激活层激活是加强特征
参数共享对所有区域使用相同的卷积核计算特征

看到Wiki百科中,关于卷积核运算的操作,其实是有点奇怪的,它并非平常想象的矩阵元素一一对应相乘,而有一种元素下标相加回归到矩阵中心位置的特点,即旋转了180°后再一一对应相乘,单纯从计算机角度出发,你找不到任何解释的意义,反正都是矩阵元素相乘,所以只是数学上的定义是如此,实际的深度学习中没必要翻转,所以不同的书本在这里有不同的定义,有些书本不提翻转也是对的。

参考视频或链接
【图解,卷积神经网络(CNN可视化)】- bilibili
Convolutional neural network - wiki
《深度学习笔记(一):卷积神经网络CNN》
《在定义卷积时为什么要对其中一个函数进行翻转?》- 知乎
《卷积神经网络图像处理卷积时,为啥要旋转180°?》

11.2 CNN的原始论文、改进与扩展

论文.pdf相关代码实现
CNN原始论文:Gradient-based learning applied to document recognition.pdf
FastCNN
RCNN原始论文:Rich feature hierarchies for accurate object detection and semantic segmentation.pdf
FasterRCNN

对CNN的改进的讨论见://@TODO文章撰写中

11.3 CNN实战项目

项目链接
《深度学习实战项目 - 验证码识别》—— starryrbs
《深度学习-PyTorch框架》—— 唐宇迪

十二、RNN递归神经网络

RNN适合用来处理不定长的序列化数据,但在处理序列较长的数据时,性能会降低,因为距离过于遥远的信息会有损失,因此有LSTM(long short-term memory)长短期记忆模型。

12.1 RNN原理与术语

RNN的结构为:
RNN-structure
计算公式为:
h t = f 1 ( U X t + V h t − 1 + b ) L t = f 2 ( W h t ) h_t = f_1(UX_t + Vh_{t-1} + b) \\ L_t = f_2(Wh_t) ht=f1(UXt+Vht1+b)Lt=f2(Wht)
f i ( ⋅ ) f_i(·) fi()是激活函数,通常为 t a n h tanh tanh b b b是偏置项

术语定义解释
多对一任务输入是一个向量序列,输出是一个向量常应用在情感分析上
一对多任务输入是一个向量,输出是一个向量序列如图像描述(image captioning)任务,输入是一幅图片,输出是一段话
多对多任务输入是一个向量序列,输出是一个向量序列,因此也称为序列到序列(sequence to sequence,seq2seq)问题常用在语音识别与机器翻译中
参考视频或链接
【循环神经网络】5分钟搞懂RNN,3D动画深入浅出 - bilibili
55 循环神经网络 RNN 的实现【动手学深度学习v2】 - bilibili
Recurrent Neural Networks cheatsheet - Standford CS 230

12.2 RNN的原始论文、改进与扩展

论文.pdf相关代码
RNN原始论文:Finding Structure in Time

12.3 RNN实战项目

12.4 LSTM网络

LSTM是RNN的一个改进,基本构造与RNN一致。

LSTM

计算公式为
F t = σ ( X t W x f + H t − 1 W h f + b f ) I t = σ ( X t W x i + H t − 1 W h i + b i ) O t = σ ( X t W x o + H t − 1 W h o + b o ) C t ~ = t a n h ( X t W x c + H t − 1 W h c + b c ) C t = F t ⊙ C t − 1 + I t ⊙ C t ~ H t = O t ⊙ t a n h ( C t ) F_t =\sigma(X_tW_{xf} + H_{t-1}W_{hf} + b_f) \\ I_t = \sigma(X_tW_{xi} + H_{t-1}W_{hi} + b_i) \\ O_t =\sigma(X_tW_{xo} + H_{t-1}W_{ho} + b_o) \\ \tilde{C_t} = tanh(X_tW_{xc} + H_{t-1}W_{hc} + b_c) \\ C_t = F_t \odot C_{t-1} + I_t \odot \tilde{C_t} \\ H_t = O_t \odot tanh(C_{t} ) Ft=σ(XtWxf+Ht1Whf+bf)It=σ(XtWxi+Ht1Whi+bi)Ot=σ(XtWxo+Ht1Who+bo)Ct~=tanh(XtWxc+Ht1Whc+bc)Ct=FtCt1+ItCt~Ht=Ottanh(Ct)
其中
X t ∈ R n × d X_t \in \mathbb{R}^{n \times d} XtRn×d
H t − 1 ∈ R n × h H_{t-1} \in \mathbb{R}^{n \times h} Ht1Rn×h
F t − 1 , I t − 1 , O t − 1 , C t ~ ∈ R n × h F_{t-1}, I_{t-1}, O_{t-1},\tilde {C_{t}} \in \mathbb{R}^{n \times h} Ft1,It1,Ot1,Ct~Rn×h
W x f , W x i , W x o , W x c ∈ R d × h W_{xf},W_{xi},W_{xo},W_{xc} \in \mathbb{R}^{d \times h} Wxf,Wxi,Wxo,WxcRd×h
W h f , W h i , W h o , W h c ∈ R h × h W_{hf},W_{hi},W_{ho},W_{hc} \in \mathbb{R}^{h \times h} Whf,Whi,Who,WhcRh×h
b f , b i , b o , b c ∈ R 1 × h b_f,b_i,b_o,b_c \in \mathbb{R}^{1 \times h} bf,bi,bo,bcR1×h
σ ( ⋅ ) \sigma(\cdot) σ()是激活函数
n n n是样本的batch size
d d d是样本输入的维度
h h h是隐藏层的节点数

参考视频或链接
10.1. Long Short-Term Memory (LSTM) - d2l
《超简单理解LSTM和GRU模型,深度学习入门》- bilibili

12.4.1 LSTM的原始论文、改进与扩展

论文.pdf相关代码

十三、影评情感分析

13.1 word2vec模型

书曰:“如果用词袋模型和TF-IDF方法计算整个文本向量,比较难得到好的效果,若文章比较长的话,另外RNN本身的输入要求,需要将句子分解成一个个的词语,每个词语是一个输入,因此,每一个词都需要转换成相应的特征向量,而且维度必须一致,这里的向量不能是简单的词频统计,而是需要有实际的含义。如果基于统计的方法来制作向量,love和adore是两个完全不同的向量,因为统计的方法很难考虑词语本身以及上下文的含义,如果用词向量模型(word2vec)来制作,结果就大不相同。相似的词语在向量空间上也会非常类似,这才是希望得到的结果” 。
那如何得到这样的向量?
书曰:“根据上下文预测某一个中间词,或根据中间词预测上下文,如果预测的结果是比较接近的,那么这两个词的向量就应该是比较接近的,最终通过神经网络不断迭代,以训练出每一个词向量结果”。

这个训练过程,用到了两个模型:CBoW(Continuous bag-of-words,根据上下文预测目标词)与 Skip-Gram(Continuous skip-gram,根据目标词预测上下文),请看下面的参考视频或文章链接。

参考视频或文章链接
【清华NLP】刘知远团队大模型公开课全网首发|带你从入门到实战 - 2-5词向量:Word2vec

十四、三巨头的由来

深度学习三巨头分别是:“Geoffrey Hinton、Yann Lecun、Yoshua Bengio”,他们共同获得了2018年的Turing Award(图灵奖),我想这是对三巨头提法的一种认可,甚至我们可以追溯三巨头提法的来源,是不是2018年ACM授奖以后才正式有三巨头的提法,2018年以前有没有这种提法?

人物ACM委员会认为的主要贡献头像
Geoffrey HintonBP反向传播算法
玻尔兹曼机
对卷积神经网络的修正
Hinton
Yann LecunCNN神经网络
改进反向传播算法
拓宽神经网络的视角
Lecun
Yoshua Bengio序列的概率建模
高维词嵌入与注意力机制
生成对抗网络(GAN)
Bengio

上表总结自文章:《2018图灵奖:深度学习三巨头Hinton、Bengio、LeCun,30年坚持有回报》

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值