《机器学习算法的数学解析与Python实现》读书笔记

《机器学习算法的数学解析与Python实现》

书名:机器学习算法的数学解析与Python实现
作者:莫凡
出版社:机械工业出版社
出版时间:2020-01
ISBN:9787111642602

第1章首先介绍机器学习究竟是什么,特别是与“人工智能”“深度学习”这些经常在一起出现的术语究竟有什么关系,又有什么区别。本章也将对机器学习知识体系里的一些常用术语进行简要说明,如果读者此前并不了解机器学习,则可以通过本章了解相关背景知识。

第2章对当前机器学习算法常用的Python编程语言以及相关的Python库进行介绍,同时列举一些常用的功能。

第3章开始正式介绍机器学习算法,要介绍的第一款机器学习算法是线性回归,本章将对回归问题、线性模型和如何用线性模型解决回归问题,以及对机器学习解决问题的主要模式进行介绍。

从第4章开始,介绍当下机器学习应用最广的分类问题,第一款解决分类问题的算法是Logistic回归分类算法,即用线性模型结合Logistic函数解决分类问题。

第5章介绍KNN分类算法,这款算法不依赖太复杂的数学原理,因此一般被认为是最直观好懂的分类算法之一。

第6章介绍朴素贝叶斯分类算法,它基于贝叶斯公式设计,理论清晰、逻辑易懂,是一款典型的基于概率统计理论解决分类问题的机器学习算法。

第7章介绍决策树分类算法,这是一款很重要的算法,从思想到结构都对程序员非常友好,当前XGBoost等主流机器学习算法就是在决策树算法的基础上,结合集成学习方法设计而成的。

第8章介绍支持向量机分类算法,这是一款在学术界和工业界都有口皆碑的机器学习模型。在深度学习出现之前,支持向量机被视作最被看好的机器学习算法,能力强、理论美,也是本书中最为复杂的机器模型。

第9章介绍无监督学习的聚类问题,以及简单好懂的聚类算法——K-means聚类算法。

第10章介绍神经网络分类算法,当前大热的深度学习就是从神经网络算法这一支发展而来的,而且大量继承了神经网络的思想和结构,可以作为了解深度学习的预备。

第11章介绍集成学习方法,以及如何通过组合两个以上的机器学习模型来提升预测效果。

第1章 机器学习概述

人工智能、机器学习和深度学习三者是包含关系

机器学习知识的三个需求层次

  1. 设计需求层次
    • 思想原理
  2. 调用需求层次
    • 运行流程
  3. 数学需求层次
    • 数学解析

“训练模型”

“训练” == “拟合”

算法

  • 数据结构算法
  • 机器学习算法
      • 我猜是什么
      • 我猜中没有

“猜数字”游戏

裁判选定一个数字,接着参赛选手也报一个数字,裁判回答他猜大了或猜小了,不断重复这个过程,直到最后猜中。

猜数字 机器学习
参赛选手 算法模型
裁判回答 损失函数

拟合

  • 欠拟合
    • 准确性不够
  • 过拟合
    • 泛化性不好

机器学习的基本概念

术语

  • 模型
    模型(Model)是机器学习的核心概念。如果认为编程有两大组成部分,即算法和数据结构,那么机器学习的两大组成部分就是模型和数据集。如果之前没有接触过相关概念,想必你现在很希望直观地理解什么是模型,但对模型给出一个简洁又严谨的定义并不容易,你可以认为它是某种机器学习算法在设定参数后的产物,它的作用和编程时用到的函数一样,可以根据某些输入得到某些输出。既然叫机器学习算法,不妨将它想象成一台机器,其上有很多旋钮,这些旋钮就是参数。机器本身是有输入和输出功能的,根据不同的旋钮组合,同一种输入可以产生不同的输出,而机器学习的过程就是找到合适的那组旋钮组合,通过输入得到你所希望的输出。

  • 数据集
    如果说机器学习的“机器”指的是模型,那么数据集就可以说是驱动着这台机器去“学习”的“燃料”。有些文献将数据集又分为训练集和测试集,其实它们的内容和形式并无差异,只是用在不同的地方:在训练模型阶段使用,就叫作训练集;在测试模型阶段使用,就叫作测试集。

  • 数据
    我们刚才提到了数据集,数据集就是数据的集合。在机器学习中,我们称一条数据为一个样本(Sample),形式类似一维数组。样本通常包含多个特征(Feature),如果是用于分类问题的数据集,还会包含类别(Class Label)信息,如果是回归问题的数据集,则会包含一个连续型的数值。

  • 特征
    这个术语又容易让你产生误解了。我们一般把可以作为人或事物特点的征象、标志等称作特征,譬如这个人鼻子很大,这就是特征,但在机器学习中,特征是某个对象的几个记录维度。我们都填写过个人信息表,特征就是这张表里的空格,如名字、性别、出生日期、籍贯等,一份个人信息表格可以看成一个样本,名字、籍贯这些信息就称作特征。前面说数据形式类似一维数组,那么特征就是数组的值。

  • 向量
    向量为线性代数术语,机器学习模型算法的运算均基于线性代数法则,不妨认为向量就是该类算法所对应的“数据结构”。一条样本数据就是以一个向量的形式输入模型的。一条监督学习数据的向量形式如下:

    [特征X1值,特征X2值,…, Y1值]

  • 矩阵
    矩阵为线性代数术语,可以将矩阵看成由向量组成的数组,形式上也非常接近二维数组。前面所说的数据集,通常就是以矩阵的形式输入模型的,常见的矩阵形式如下:

    [[特征X1值,特征X2值,…, Y1值],
    '[特征X1值,特征X2值,…, Y2值],

    [特征X1值,特征X2值,…, Yn值]]

其实这个组织形式非常类似电子表格,不妨就以电子表格来对照理解。每一行就是一个样本,每一列就是一个特征维度,譬如某个数据集一共包括了7个样本,那就是有7行数据,每个样本又都有4个维度的特征,那就是每行数据有4列,用电子表格表示如图1-2所示,其中,A~D列为特征,E列为结果。

用电子表格来表示机器学习的数据集矩阵

常用函数

  • 假设函数(Hypothesis Function)

\[ H(x) \]

这里的 \(x\) 可以简单理解成矩阵形式的数据,我们把数据“喂”给假设函数,假设函数就会返回一个结果,而这个结果正是机器学习所得到的预测结果。

  • 损失函数(Loss Function)/ 目标函数

\[ L(x) \]

\(L\) 代表 Loss,这里的 \(x\) 是假设函数的预测结果。

函数返回值越大,表示结果偏差越大。

  • 成本函数(Cost Function)

\[ J(x) \]

这里的 \(x\) 也是假设函数的预测结果。

函数返回值越大,表示偏差越大。

差别 损失函数 成本函数
对象 单个样本 整个数据集
角度 微观 宏观

成本函数是由损失函数计算得到的。

\(J(x) = Sum(L(x))\)

或者

\(J(x) = Avg(L(x))\)

机器学习的基本模式

假设函数产生的偏差驱动着机器学习模型不断优化
  • 数据
  • 假设函数
  • 损失函数

优化方法

\[ min(L(x)) \]

\[ 新参数值 = 旧参数值 - 损失值 \]

牛顿法、拟牛顿法、共轭梯度法

梯度下降(Gradient Descent)法是机器学习中常用的一种优化方法

梯度下降(Gradient Descent)法是机器学习中常用的一种优化方法,梯度是微积分学的术语,某个函数在某点的梯度指向该函数取得最大值的方向,那么它的反方向自然就是取得最小值的方向。所以只要对损失函数采用梯度下降法,让假设函数朝着梯度的负方向更新权值,就能达到令损失值最小化的效果。

倒车:
1. 方向
1. 大小

  • 批量梯度下降(Batch Gradient Descent
    • 每次迭代都使用全部样本
  • 随机梯度下降(Stochastic Gradient Descent
    • 每次迭代只使用一个样本

因为需要计算的样本小,随机梯度下降的迭代速度更快,但更容易陷入局部最优,而不能达到全局最优点。

机器学习问题分类

机器学习问题具体类别的判断方法图

无监督学习(Unsupervised Learning)
有监督学习(Supervised Learning)

常用的机器学习算法

  1. 线性回归算法
    • 这是最基本的机器学习算法,但麻雀虽小,五脏俱全,该算法称得上是机器学习算法界的“Hello World”程序,是用线性方法解决回归问题。
  2. Logistic回归分类算法
    • 这可谓是线性回归算法的“孪生兄弟”,其核心思想仍然是线性方法,但套了一件名为Logistic函数的“马甲”,使得其具有解决分类问题的能力。
  3. KNN分类算法
    • 该算法是本书介绍的分类算法中唯一一个不依赖数学或统计模型,纯粹依靠“生活经验”的算法,它通过“找最近邻”的思想解决分类问题,其核心思想和区块链技术中的共识机制有着深远的关系。
  4. 朴素贝叶斯分类算法
    • 这是一套能够刷新你世界观的算法,它认为结果不是确定性的而是概率性的,你眼前所见的不过是概率最大的结果罢了。当然,算法是用来解决问题的,朴素贝叶斯分类算法解决的是分类问题。
  5. 决策树分类算法
    • 如果程序员的思维逻辑能够用if-else来概括的话,决策树分类算法应该就是最接近程序员逻辑的机器学习算法。
  6. 支持向量机分类算法
    • 如果说Logistic回归分类算法是最基本的线性分类算法,那么支持向量机则是线性分类算法的最高形式,同时也是最“数学”的一种机器学习算法。该算法使用一系列令人拍案叫绝的数学技巧,将线性不可分的数据点映射成线性可分,再用最简单的线性方法来解决问题。
  7. K-means聚类算法
    • 有监督学习是当前机器学习的一种主流方式,但样本标记需要耗费大量人工成本,容易出现样本累积规模庞大,但标记不足的问题。无监督学习则是一种无须依赖标记样本的机器学习算法,聚类算法就是其中具有代表性的一种,而K-means是聚类算法中的典型代表。
  8. 神经网络分类算法
    • 神经网络就是由许多神经元连接所构成的网络,很多人认为该算法是一种仿生算法,模仿的对象正是我们的大脑。神经网络分类算法也是当下热门的深度学习算法的起点。

机器学习算法的性能衡量指标

NFL定律(No Free Lunch Theorem,中文一般翻译为“没有免费午餐定律”)。

  • TP:True Positive,预测结果为正类,且与事实相符,即事实为正类。
  • TN:True Negative,预测结果为负类,且与事实相符,即事实为负类。
  • FP:False Positive,预测结果为正类,但与事实不符,即事实为负类。
  • FN:False Negative,预测结果为负类,但与事实不符,即事实为正类。

常用的指标

  • 准确率(Accuracy)
准确率
  • 精确率(Precision),又叫查准率
查准率
  • 召回率(Recall),又叫查全率
查全率

数据对算法结果的影响

数据决定了算法的能力上限

数据决定了模型能够达到的上限,而算法只是逼近这个上限。

特征工程

机器学习模型正是从这些特征中进行学习,特征有多少价值,机器才能学多少价值。

第2章 机器学习所需的环境

Python 简介

Python官网首页
Python下载页面

安装

1
2
3
4
# pip
pip install library
# conda
conda install library

使用

1
2
3
4
5
6
# library.a_class
import library
# lib.a_class
import libray as lib
# a_class
from library import a_class

Numpy 简介

Numpy是Python语言的科学计算支持库,提供了线性代数、傅里叶变换等非常有用的数学工具。Numpy是Python圈子里非常知名的基础库,即使你并不直接进行科学计算,但如图像处理等相关功能库,其底层实现仍需要数学工具进行支持,则需要首先安装Numpy库。

Numpy官网首页

安装

1
pip install -U numpy

使用

1
import numpy as np
Numpy常用函数功能表

Scikit-Learn 简介

正如机器学习中推荐使用Python语言,用Python语言使用机器学习算法时,推荐使用Scikit-Learn工具,或者应该反过来,现在机器学习推荐使用Python,正是因为Python拥有Scikit-Learn这样功能强大的支持包,它已经把底层的脏活、累活都默默完成了,让使用者能够将宝贵的注意力和精力集中在解决问题上,极大地提高了产出效率。

Scikit-Learn官网首页

安装

1
2
3
4
# pip
pip install -U scikit-learn
# conda
conda install scikit-learn

使用

1
import sklearn

调用机器学习算法也非常简单,Scikit-Learn库已经将算法按模型分类,查找起来非常方便。如线性回归算法可以从线性模型中找到,用法如下:

1
2
from sklearn import linear_model
model = linear_model.LinearRegression()

Logistic回归算法也是依据线性模型

1
2
from sklearn.linear_model import LogisticRegression
model =linear_model.LogisticRegression()

类似的还有基于近邻模型的KNN算法

1
2
from sklearn.neighbors import NearestNeighbors
model =NearestNeighbors()

生成模型后,一般使用fit方法给模型“喂”数据及进行训练。完成训练的模型可以使用predict方法进行预测。
Scikit-Learn库对机器学习算法进行了高度封装,使用过程非常简单,只要根据格式填入数据即可,不涉及额外的数学运算操作,甚至可以说只要知道机器学习算法的名字和优劣,就能直接使用,非常便利。

Pandas简介

Pandas是Python语言中知名的数据处理库。数据是模型算法的燃料,也决定了算法能够达到的上限。一般在学习中接触的数据都十分规整,可以直接供模型使用。但实际上,从生产环境中采集得到的“野生”数据则需要首先进行数据清洗工作,最常见的如填充丢失字段值。数据清洗工作一般使用Pandas来完成,前文所提到的特征工程也可通过Pandas完成。

Pandas官网首页

安装

1
2
3
4
# pip
pip install -U pandas
# conda
conda install pandas

Pandas的基本用法

Pandas针对数据处理的常用功能而设计,具有从不同格式的文件中读写数据的功能,使用Pandas进行一些统计操作特别便利。与Numpy类似,Pandas也有两个核心的数据类型,即Series和DataFrame。

  • Series:一维数据,可以认为是一个统计功能增强版的List类型。
  • DataFrame:多维数据,由多个Series组成,不妨认为是电子表格里的Sheet。使用Pandas包很简单,只要import导入即可。业界习惯在导入时使用“pd”作为它的别名:
1
import pandas as pd
Pandas常用函数功能表

第3章 线性回归算法

机器学习涉及的知识面很广,但总的来说有两条主线,

  • 问题
  • 模型

16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177