机器学习系统设计(Building Machine Learning Systems with Python)- Willi Richert Luis Pedro Coelho

机器学习系统设计(Building Machine Learning Systems with Python)- Willi Richert Luis Pedro Coelho

总述

本书是 2014 的,看完以后才发现有第二版的更新,2016。建议阅读最新版,有能力的建议阅读英文版,中文翻译有些地方比较别扭(但英文版的书确实是有些贵)。

我读书的目的:泛读主要是想窥视他人思考的方式。

作者写书的目标:面向初学者,但有时间看看也不错。作者说“我希望它能激发你的好奇心,并足以让你保持渴望,不断探索这个有趣的领域”。在我看来本书已达到这一目的,相对于理论性强的书籍,这样的书更能让人容易坚持去阅读,没有那么晦涩难懂。

正面感受:

  1. 侧重于机器学习系统的工程实践,没有晦涩难懂的理论,但内容也足够将建模和解题过程介绍清楚。有时间的读者可以 step by step 的尝试。本人没有实践,因为平时实验室的任务比较忙,不过其中的一些思想是可以借鉴到工作中的。(看书其实很多时候是想知道同一个问题别人是怎么做的,同时也发散思路)。
  2. 可以感受到作者在向我们传授如何学习的方式。与很多直接给出最优解的书不同,本书总是先从最基础的 baseline 入手,然后逐步发现问题并调优,这个过程与工程实践很 match。一口吃不下一个胖子,如何将问题分解,慢慢优化是关键。比如(1)在最开始时,作者指出“遇到困难的时候怎么办,分享了学习的方法:鼓励你构建自己的机器学习相关博客的列表,并定期阅读。kaggle 很重要!!”---传达他对问题的一个态度,我们必须要学会自我积累与成长。(2)第 2 章:从简单分类器升级到更复杂的分类器:模型结构(阈值划分特征)、搜索过程(尽可能多的尝试所有特征组合和阈值组合)、损失函数(确定哪些可能性不会太差),反复尝试。(3)第 5 章检测劣质答案,通过 偏差-方差(bias-variance)分析发现可优化的点,对模型调优。(4)第 6 章情感分析,通过特征分析和特征工程,不断发现有价值的特征以调优模型。(5)第 9 章音乐体裁分类,音频特征提取从傅立叶变换(FFT)到梅尔倒频谱系数(MFCC),这是作者通过音乐信息检索相关领域的 paper 获取到的信息。可见得调优过程需要对领域进行了解,需要广泛的调研,并且具备信息的甄别能力。(6)最后,分享了一些作者认为好的学习资源。

补充:

本书的初衷意味着它在系统性、理论性上的欠缺。因此希望在 ML 领域深耕,还是需要将其中涉及的理论和概念进行深挖,比如作者在最后提及的书籍是不错的选择。对于工具,我认为只是解决问题的手段,计算机出身对工具的运用应该有一套自己快速上手的方法。虽然由于时间原因很难将每本书都动手实践一遍,比如亚马逊云,如果有时间最好可以尝试,但如果时间有限可以大概了解有这样的工具可以解决这样的问题即可。

另外值得强调的是,信息时代更新换代很快,很多书本上的东西,尤其是工具也是与时俱进的。因此在真正应用时还是应该再做充分的调研,了解最新的进展。

机器学习系统的主要路线:问题抽象,数据采集,数据探索,数据清洗,特征提取,模型选择与调优。注意利用有效的评估手段对结果进行评估,对领域进行充分的调研,这样才能更好的发现问题并对模型进行调优。最值得一提的还是特征工程,特征的设计往往更像是一门艺术。总的来说还是要多积累,多发散思维,动手去做,反思总结,循序渐进。

各章节的 review

1.Python 机器学习入门:

介绍了本书的定位,一些学习心得。简单介绍了需要的 python库:NumPy、SciPy、Matplotlib 等。演示了一个小应用,回归问题。机器学习的工程实践:收集数据,读取和清洗数据,探索和理解数据,特征工程,选择正确的模型和算法,正确的评估。每一个步骤都很关键,在工程实践中数据处理(清洗、探索、理解、特征工程),尤其是特征工程又扮演着非常重要的角色。实际上我们有大部分时间将花费在模型之前。overfitting 的概念,train set 和 validation set 的概念。

2.如何对真实样本分类:

  • Iris 数据集,这是很经典的数据集,scikit-learn tutorial 中常用的基础示例数据集。着重介绍了 cross-validation (周华志-机器学习,中的模型评估有很好的总结)。误差:训练误差、测试误差、泛化误差。我们终极目标是:降低泛化误差。更复杂的分类器:模型结构(阈值划分特征)、搜索过程(尽可能多的尝试所有特征组合和阈值组合)、损失函数(确定哪些可能性不会太差),反复尝试。
  • Seeds 数据集,介绍更复杂的数据和更复杂的分类器。着重介绍特征和特征工程,需要借助背景知识通过直觉来判断哪些是好的特征。幸运的是很多领域,已经有很多文献介绍可能用到的特征和特征类型。(这说明了知识面和广泛的调研时有必要的)。特征工程通常是一个能够获得最大正确率提升的地方,这是因为更好的特征数据往往可以击败漂亮的方法(CNN 核心就在于 feature extraction)。有很多方案可以混合搭配。二分类 vs 多分类。

3.聚类:寻找相关的帖子

  • 简单介绍了文本处理的背景。terminology:bag-of-word,相似性计算(Cosine, Pearson, Jaccard),频次向量归一化,删除不重要的词语——停用词,词干处理,词频-反转文档频率(TF-IDF)。
  • tool:NLTK
  • 步骤:(1)提取每个帖子的特征并向量化,将一个帖子映射到一个向量上;(2)在这些向量上进行聚类;(3)确定每个待聚类帖子所在的簇;(4)对每个簇,获取几个与待聚类帖子不同的帖子,提升多样性。
  • 目标:切分文本;扔掉出现过于频繁,而又对检测没有帮助的词语(停用词);扔掉出现频率低,只有很小可能出现在未来帖子中的词语;统计剩余的词语;考虑整个语料集合,从词频统计中计算 TF-IDF(现在大多使用深度学习进行representation learning,递归神经网络在文本中取得了很好的效果,TF 的 tutorial 不错:https://www.tensorflow.org/tutorials/recurrent)。
  • 聚类:k 均值。噪声处理。参数调整。

4.主题模型

  • 前一小节的扩展,更高级的文本分组方式。任务:拿到一个文本集合并对它做反向工程,从中发现都有哪些主题,以及每个文档属于哪些主题。这些主题是什么呢?从技术上讲,它们是词语上的多项式概率分布。
  • LDA 对整个维基百科建模。平均下来每个文档只涉及 6.5 个主题,其中 93% 的文档涉及的主题数小于等于 10。
  • 选择主题的个数。去除停用词。
  • tool:gensim

5.!!分类:检测劣质答案

  • 没有完美的答案。调优路线:knn-> logist regression --> 在部分数据上表现不错的模型。
  • 两个问题:
    • 如何表示数据样本:如何提取特征;
    • 应该采用什么模型或结构:逻辑回归、决策树、SVM和朴素贝叶斯。本结:knn vs. logistics regression
  • 预处理:获取数据 --> 削减到可处理的程度 --> 理解各个属性的作用并进行选择(业务背景)--> 定义什么是优质答案:if score > 0 then 是正例,if score <=0 then 是负例
  • 分类器调优:knn + 超链接的数量,accuracy 49% --> 更多的特征:加入代码行数, accuracy 0.583 --> 继续加特征:AvgSentLen, AvgWordLen, NumAllCaps, NumExclams,加了 4 个特征反而更差,accuracy 0.5765 --> 如何提升效果(4 个方向):增加更多的数据、考虑模型复杂度、修改特征空间、改变模型。
  • 无序的选不是好办法,偏差-方差(bias-variance)折中法进行分析,underfitting vs. overfitting 的平衡。我们希望 low bias 同时 low variance。但实际中我们必须在两者中平衡,因为一个的减小很可能导致另一个增大。(Andrew 的课程 和 周华志的机器学习 都有总结)
    • 针对 high-bias 的策略:增加更多特征,让模型复杂,或尝试别的模型。
    • 针对 high-variance 的策略:更多数据、降低模型的复杂度,删减一些特征。
  • 实践:作图 Train/Test Error vs Data set size。(图有一些错误,train error 和 test error 的图示反了)。不同的 k 对应的 train / test error 作图,k增大效果更好一些,即降低复杂度有一些正面的影响。
  • knn 的缺点:需要存储所有的训练数据空间开销大,预测时耗时。
  • baseline knn,k=90,accuracy 0.628 --> 逻辑回归,选择参数 C=0.1,accuracy 0.631,--> bias-variance 分析,观察:high bias --- test/train error 误差很接近,结论:数据过于嘈杂、对于区分不同类别来说特征集合还不合适。---> 观察正确率的背后:precision and recall,pr-curve,auc,分类针对劣质答案(A) vs 分类针对优质答案(B)。A 的 precision 和 recall 都很低,不需要考虑。B 的效果不错,进一步调整阈值,可以得到 80% precision,recall 37%,是否能容忍低的召回?---> 分类器瘦身:通过逻辑回归的系数判断特征的重要性,删除不重要的特征。

6.分类 II: 情感分析

  • 背景:对于公司来说,紧密监控公众对重要事件(例如产品发布或者新闻发布)的态度十分重要。Twitter 可以对推文的情感进行分类。有时也叫观点挖掘(opinion mining)
  • 目标:(1)介绍分类算法:朴素贝叶斯;(2)阐释词性(Part Of Speech, POS);(3)展示 Scikit-learn 工具箱中一些偶尔出现的小技巧
  • 获取 Twitter 数据(文本 + 标签(正面、负面、中性)),
  • naive Bayes:
    • 对无关特征的处理十分彪悍;
    • naive 的来源:特征相互独立条件假设。后验概率 = prior * likelihood / evidence
    • 未出现词(未出现特征):拉普拉斯平滑(Laplace smoothing),加1平滑(additive smoothing)。
  • 考虑算数下溢:很小的值连乘(太小!!!),log(x*y) = log(x) + log(y)
  • 分类器:GaussianNB, MultinomialNB, BernoulliNB
  • 简单问题:只处理正负两个类别,P/R AUC 0.88
  • 使用所有分类:正面、负面、中性,P/R AUC: sent(pos or neg) vs. rest:0.68;pos vs.rest: 0.31, neg vs. rest: 0.51
  • 对分类器进行调优:TfidfVectorizer, MultinomialNB,使用 GridSearchCV 对组合参数进行选择。评估:f1-score。pos vs. rest: 0.52, neg vs. rest: 0.64
  • 清洗推文:sent vs. rest: 70.7 (有提升,TfidfVectorizer 中的 preprocessor)
  • 将词语类型考虑进去:语言信息:名词、动词、形容词。确定词语的类型是词性标注(Part of Speech tagging, POS 标注)。tool:NLTK,SentiWordNet 赋予大部分英文单词一个正向分值和一个负向分值。词义消歧(word sense disambiguation)。
  • 把所有东西融合在一起:FeatureUnion: TfidVectorizer + 词类型 + naive bayes。pos vs. neg: 0.808, Pos vs. neg: 0.794, pos vs. restL: 0.886, Neg vs. rest: 0.881

7.回归:推荐

  • 回归预测房价:普通最小二乘法(Ordinary Least Squares, OLS)-- 考虑很多特征时不可用。
  • 更好的方法:lasso(l1 regularization),ridge(l2 regularization),elastic net(lasso + ridge)。
  • 多维回归。惩罚式回归,L1 VS L2。Netflix Challenge。
  • P 大于 N 问题:特征个数 P, 样本个数 N,即 P 大于 N 问题。OLS 不再适用。
  • 巧妙的设置 hyperparameter:评估泛化能力需要两层交叉验证,for example 10-fold,1 作为 test set,9 train set --- train set and validation set。最后投入使用时再用完所有的train 样例训练一遍。
  • 好算法是一件好事情,但你一定要亲自调优你的方法,使之适应数据的特性
  • 建模:分类 vs 预测(1~5分评分粗糙,中间值是有意义的比如 1.5),两个选择:movie-spercific, user-specific。(协同过滤,user-movies 矩阵)

8.回归:改进的推荐(推荐书籍:推荐系统实践--项亮)

  • 购物篮分析(basket analysis)
  • 改进的推荐:
    • 数据:0/1 矩阵,没评价/评价。
    • 步骤:(1)计算 user 间的相似性,对其他用户排序。(2)当我们需要一个用户-电影数据对估算评分时,我们顺序查找用户的近邻。当发现第一个对该电影的评分时,将它输出。
  • movie-based similarity,按照相似电影的得分来进行估计。
  • 组合多种方法:集成学习(ensemble learning)/ 栈式学习
  • 购物篮分析:Apriori 关联规则挖掘。tool: pymining

9.分类 III:音乐体裁分类

  • 到目前为止,我们均假定任何训练样本都很容易用特征向量来描述。这样的表示很“奢侈”。
  • 如何表达 3 分钟长度的歌曲?
  • 目标:在舒适区之外构建优秀的分类器,必须用基于声音的特征。多分类问题:Jazz, Classical, Country, Pop, Rock, Metal。
  • 获取音乐数据 ---> 观察音乐:Matplotlib 的 specgram() 画音乐的声谱;傅立叶变换(Fast Fourier Transform, FFT),将音乐分解成正弦波成分; ---> 用 FFT 构建一个分类器:混淆矩阵(图可以清洗的告诉我们应该专注于哪里的优化),ROC(Receiver Operator Characteristic)---> 用梅尔倒频谱系数(MFCC)提升分类效果。
    读者浏览了一些 AMGC(音乐信息检索的一个子领域) 的论文之后,发现有很多自动体裁分类方面的工作。(我们需要主动的去收集更多的信息)

10.计算机视觉:模式识别

  • tool:mahotas 计算机视觉包的传统图像处理函数:数据预处理、噪声消除、图像清理、对比度拉伸等。
  • 图像处理简介:尺度不变特征变换(Scale-Invariant Feature Transform,SIFT)
  • 读取和显示图像:图像里减去像素均值通常是很有用处的操作,有助于不同光照下对图像进行归一化,标准的 mean
  • 图像处理基础:
    • 阈值:卡阈值时一种非常简单的操作,if x > threshold then 1, if x < threshold then 0。rgb2gray。
    • 高斯模糊:经常用于降噪,可以将总体布局无关的细节去掉
    • 不同效果的滤波:
  • 加入椒盐噪声:模拟扫描噪点;聚焦中心。
  • 模式识别:由于历史原因,图像分类又叫做模式识别
  • 计算图像特征:Haralick 纹理特征,计算特征不仅仅是为了分类还可以降维
  • 设计你自己的特征:机器学习的一个优点就是,我们只需要写出一些想法,然后就可以让系统找出哪些是好的,哪些不太好。
  • 这个例子体现了一个原则:好算法只是比较容易的那个部分。你总可以找到一个前沿的分类方法来实现。但真正的秘密和附加值通常是在特征设计和特征工程里面。这就是数据本身知识的价值所在。
  • 在更难的数据集上分类
  • 局部特征表示(local feature):
    • 随机计算、在一个格子里计算、检测图像中的兴趣区域(关键点检测、即 keypoint detection)
    • bag-of-word 模型,视觉词:把图像中看起来相似的区域聚成一组,把它们叫做视觉词语。
    • 每一个图像可以用一列数目相同的特征来表示。
  • (目前对图像处理效果最好的是 CNN)

11.降维

  • 降维的必要性:
    • 多余的特征回影响或误导分类器
    • 更多特征意味着更多参数的调整,过拟合的风险更大
    • 用于解决实际问题的维度可能是虚高
    • 维度越少意味着训练越快,可以尝试更多东西
    • 可视化
  • 降维方法:特征选择方法、特征抽取方法。生成、分析、然后扔掉一些特征。
  • 主成分分析(Principal Component Analysis, PCA)、线性判别式分析(Linear Discriminant Analysis, LDA)和多维标度法(MultiDimensional Scaling, MDS)。
  • 两种通用的做法:
    • 筛选器(filter):
      • 相关性(线性和非线性)、互信息(依赖的不是数据序列而是数据的分布)
      • 缺点:扔掉在独立使用时没有用处的特征。但实际情况往往是,一些特征看起来跟目标变量完全独立,但当它们组合在一起时就有效了。
    • 封装器(wrapper)
      • 特征递归消除(recursive feature elimination)
      • 缺点:要设置保留的特征个数,不过可以尝试
    • 其他特征选择方法:
      • 嵌入式学习:比如决策树,L1
  • 特征抽取:
    • 线性:PCA:
      • 核心:保留方差最大的;最终的重构误差最小。
      • 局限性:(1)对非线性数据的处理存在局限性,有扩展,比如 KernelPCA 解决非线性问题。(2)无监督--> 考虑 LDA,让不同类别样本之间的距离最大。
      • 为什么优先考虑 PCA 而不是 LDA : 随着类别数量的增加,每个类别的样例数就会稀少,LDA 的效果也不再那么好;同时,对于不同训练集,PCA 并不像 LDA 那样敏感。(看情况!!)
    • 非线性:多标度法
      • 降低维度的同时尽可能保留样本的相对距离----当有一个高维数据集,并希望获得一个视觉印象的时候,这是非常有用的。
      • MDS 对数据点本身并不关心,相反,它对数据点间的不相似性却很感兴趣
      • 要使用 MDS,需要理解每一个特;或许我们所使用的距离并不能用欧式距离进行比较
      • MDS 是一个揭示数据相似性的有用工具,这在原始特征空间中很难看到
      • MDS 不是一个算法,而是一类算法
  • 特征选择和抽取更像是一门艺术。

12.大数据

  • “大数据”并不是指具体的数据量,既不是样本的个数,也不是数据所占用的 G 字节、T 字节 或 P 字节的数量。它的意思是:
    • 数据规模比处理它的能力增长更快
    • 过去一些效果不错的方法和技术需要重做,因为它们的扩展能力不行
    • 你的算法不能假设所有数据都能载入内存
    • 管理数据本身变成了一项主要任务
    • 使用计算机集群或者多核处理器是必需品,并不是奢侈品
  • tool:
    • python jug,一个小型 python 框架,管理哪些利用了多核或主机的计算。
    • 云服务平台,亚马逊 web 服务平台, AWS。

13.更多机器学习知识:

posted @ 2018-01-14 15:41  .....?  阅读(1824)  评论(1编辑  收藏  举报