🥵硬啃-Machine-Learning
代码
本篇所用到的代码在这: 👀Code-4-Machine-Learning
何为机器学习
随机取市场上一些芒果样本为训练数据,教给机器怎么判断好坏
输入为特征
: [颜色, 大小, 形状, 产地, 品牌]输出为品质
: [好, 坏]
训练模型时, 输入输出都告诉它, 让它自动学会建立 特征<->品质
之间的关系
下次买芒果时可以根据要购买芒果的特征,使用此模型预测芒果的品质
学习方式
区分有-无监督学习
三方面区别: [3], 也有混合形式的半监督学习
监督学习(supervised) | 无监督学习(self-supervised) | |
---|---|---|
训练数据 | ||
学习目标 | 映射关系 | x 的内在结构 |
适用场景 | 分割/检测/回归(标签连续)/分类(离散) | 聚类、特征学习或密度估计 |
强化学习-RL
Reinforcement Learning:
我们不清楚如何标记样本/无法说明什么样本数据特征是更好的,但是可以指明什么是好的终点
比如围棋,没啥可标记的数据, 也很难说明哪一步更好,只能指明
快点赢
为最终结果对不同决策结果进行赏罚,使结果趋近期望结果
数据预处理
均值移除
把一组数据的均值和标准差
由 x, y -> 0, 1
例如有一组数据 sample = [a,b,c]
范围缩放
对于 sample = [a,b,c] , min=a, max=c
兜底,让 min=0
缩放,把范围控制在 [0,1]
归一化
转化后的数据在 [0,1] , 反应某数据在当前行所占比重
例:对于 sample 某 row 中的值 a
二值化
设置阈值,大于阈值的设为 1,小于阈值的设为 0
没啥可说的…不举例了
OneHot-独热编码
独热编码是稀疏矩阵的一种应用 [8]
对于离散数据的分类任务, 我们常需要做
特征数字化
: [4]对于某一列数据中有 n 种类型, 就用 n 位编码表示,不同类型使用不同激活位,如下:
关于为什么这么做? 直接[0,0,0], [0,1,2] 这种表示不行吗?
上面 row1 和 row3 都是男, 问题在于我们无法单纯通过 1 和 3 这俩数字来判断他俩是否是同一类型的
对于编码后的,想找’男’这个类型,只需要查找第一位是’1’的数据
标签编码
可以理解为上面独热编码的子步骤,一言以蔽之:
[红,黄,蓝,黄] -> [1,2,3,2]
评估方法
平均绝对误差
均方误差
中位数绝对误差
R2 决定系数
基本问题
回归-分类问题
回归: 输出连续, 例如预测房价股价
分类: 输出离散, 例如产品质量好坏检测,手写体识别
聚类: 把输入数据相似度高的堆一起
例如把各种水果照片聚类出来,分出品种
对于购物网站, 可以根据用户对商品的喜好度, 搞出
推荐算法
降维问题
借个图 [6] >
回归问题
线性回归
对于输入的属性 ,输出 y 为:
其中 权重 w 与 b 是通过学习后模型确定的
学习: 寻找最小的损失函数 loss -> 最优线性模型
多项式回归
从几何角度理解就是把直线变成了曲线
Lasso-岭回归
Lasso 和 岭 这两种都是在线性回归基础上对损失函数正则化的回归算法, 降低了偏差大的样本权重, 防止过拟合
Lasso (Least absolute shrinkage and selection operator, 最小绝对值收敛和选择算法/套索算法), 使用 L1 正则
岭回归 (Ridge regression), 用 L2 正则
决策树-随机森林
decision tree, 决策树可用于 classification + regression; 学习决策树需要用到信息论知识 参考课程: [1]
简化概念
CART 决策树选择算法
随机森林
不同的特征选择方式产生不同的决策树,组在一起就是随机森林
分类
我们想对一组 iris 数据做花种分类
有 setosa,versicolor,virginica 三类
鉴于 2d 展示图易观察,我们只取前两列 (花萼长度,宽度) 作为输入,最后一列作为输出,训练模型
4.8,3.0,1.4,0.3,Iris-setosa
5.1,3.8,1.6,0.2,Iris-setosa
4.6,3.2,1.4,0.2,Iris-setosa
5.0,3.3,1.4,0.2,Iris-setosa
7.0,3.2,4.7,1.4,Iris-versicolor
6.4,3.2,4.5,1.5,Iris-versicolor
6.2,2.9,4.3,1.3,Iris-versicolor
5.1,2.5,3.0,1.1,Iris-versicolor
5.7,2.8,4.1,1.3,Iris-versicolor
5.8,2.7,5.1,1.9,Iris-virginica
7.1,3.0,5.9,2.1,Iris-virginica
6.3,2.9,5.6,1.8,Iris-virginica
6.5,3.0,5.8,2.2,Iris-virginica下图为训练数据(点) 和 测试数据(星) 的分布
模型的决策树如下 (颜色表示类别, 颜色深度表示确定程度)
下面来分析一下决策树如何分类的:
根节点选取了 105 个输入, 其中最多的是 virginica 37 个, class=virginica
暂且不看每个节点的熵 entropy 是怎么计算的,看一下比较:
决策树就是通过一层层的
条件 Y
(如 sepal lenth <= 5.45) 来减小熵,增大确定性来解决分类确定度问题最后的叶子节点的熵会趋近于 0 (非常确定) 和 1 (非常不确定) 的两点分布
信息增益
通过上面分类的例子可知,
gain(X,Y)
就是熵下降/确定度增加的关键回过头来,条件 Y (如 sepal lenth <= 5.45) 是怎么选取的?
遍历特征组和取值区间,找到 max( gain(X,Y) ),即为熵下降最多的条件;
(当然也需要考虑到类似贪心-DP 的区别, 全是贪心的话会让模型单一化, 所以很多时候需要
随机筛掉一部分条件
来使得条件较优
而不是最优
)
深度与过拟合
深度增加虽然能降低训练集错误率,但泛化能力会减弱->过拟合
随机森林
自动聚合-BootStrap
对训练数据集进行多次有放回的随机采样 (有的样本可能从未采样,有的可能采样多次) -> 随机森林 [DT1, DT2… DTn]
如何 roll 出来数据集中部分随机数据? (比如取 80%)
for i in dataset
if Math.random() < 0.8: random_set.append(i)
分类问题
从思想和实现角度看, 有下面很多种分类
- 线性模型 (Linear Models)
- 逻辑回归 (Logistic Regression)
- 朴素贝叶斯 (Naive Bayes)
- 决策树 (Decision Trees)
- 支持向量机 (Support Vector Machines)
- 随机梯度下降 (Stochastic Gradient Descent)
- 最近邻 (Nearest Neighbors)
- 高斯过程 (Gaussian Processes)
- 集成方法/投票分类器 (Ensemble methods / voting classifier)
- 多类别多输出 / 多类别多标签分类 (Multiclass and multioutput algorithms / multiclass and multilabel classification)
逻辑回归
虽然叫回归,但其实是二分类模型
,是在线性回归输出基础上使用 Sigmoid/逻辑函数,将线性回归输出 映射到
逻辑回归也是可以做多分类的, 原理就是多个二分类叠加起来
支持向量机-SVM
target
SVM 目标就是找到如下红色实线 (与线两边样本点距离最大的线)
两条虚线上的点叫做 support vector / 支持向量
, 通过支持向量构造出的分类器就是 支持向量机 SVM
线性可分-不可分
如上面的图示, 样本可被直线/超平面分开 (线性可分), 支持向量所在两虚线之间没有其他向量,即为 线性可分 SVM
如果两虚线间存在样本, 即为 线性 SVM
; 如果样本无法被直线/超平面分开 (线性不可分), 即为 非线性 SVM
对于线性不可分问题,可通过 核函数
进行特征变换来 升维
核函数
常用的有为 1 和 3, 多项式核函数用处较少
线性核函数 Linear
不做升维,直接找直线/超平面; 类似美国地图,分割直来直去的
多项式核函数 poly (Polynomial Kernel)
通过增加高次项升维, 此函数复杂度升的很快
径向基核函数-高斯核函数 rbf (Radial Basis Function Kernel)
相对于多项式核函数,大多数情况下参数更少性能更高; 直线分不了的无脑冲 rbf
朴素贝叶斯
Naive Bayes classification,理论基础是大学必修课-概率论知识
"朴素"指的是 A,B 为独立事件, 有贝叶斯公式:
先验概率
P(A) : 已知或可推断出事件 A 发生的概率后验概率
P(A|B) : 已知 B 发生条件下,A 发生的概率对于样本特征 得出每个特征的概率 , 判断所属分类 的概率:
特点
必要的前提条件是特征间互不相关 (相互独立), 很多情况下难以满足,无法对特征关联性强的样本进行分类
逻辑简单,性能起伏小且稳定,特征独立性越强分类效果越好
聚类问题-cluster
就像是人群根据 hobby 扎堆, 输入的数据根据某些特征的相似度分出多个"簇"
聚类问题属于无监督学习 (无需指明训练样本所属类别)
样本-相似度度量
对于两点
欧氏距离
无视路径阻碍的空间绝对 distance
曼哈顿距离
计量阻碍,可以理解为寻路问题,同一曼哈顿距离可有多种路径解法
余弦相似度
cosine similarity, 上为减函数, 在 [45°, 135°] 区间下降快
余弦相似度对向量敏感度: 方向 > 长度
以上对比
如下欧氏距离(绿色直线) 与哈曼顿距离(褐色折现) 与余弦相似度(红色向量) 对比
闵可夫斯基距离
改变 p 的值,可以转化为其他距离:
p=1 : 哈曼顿距离
p=2 : 欧氏距离
: 切比雪夫距离
交并比-IOU-杰卡德相似系数
Jaccard 相似系数/交并比可用于目标检测中 目标位置-预测位置
的相似度分析
上面假定的是 A,B 中样本权重相同, 实际聚类中需要考量样本的权重
相对熵
聚类算法划分
原型-K-Means
prototype-based clustering, 用原型表示聚类结构, 然后通过对原型的更新来完善聚类算法
常用
K-均值 / K-Means 算法
: 若干样本聚类为 k 个簇, k 为指定参数随机挑选 k 个样本, 计算其他所有样本与此 k 个样本的欧氏距离,离谁近就归为哪一簇
对每一个簇, 计算其中所有样本的均值中心, 并将这 k 个均值中心作为 1. 中的样本再次重复
直到均值中心不再变化/变化小于阈值
K-Means 对
距离很远的异常点
和初始样本点的选择
是敏感的遇到影响大的异常点时可以换为
K-中位数/ K-Mediods 算法
当初始样本点选择不当时,会使聚类结果不好,如下图
改良 -> K-Means++
初始样本点的选取: 要选择的样本点与已选择样本点距离越远越好
方案: 每选择样本点后计算
未选择样本
与已选择样本组
的距离, 使未选择样本下一次的选择概率与距离成正比数据分布对 K-Means 的影响:
数据分布不平衡几乎没影响
但是数据
几何畸变
对聚类影响很大; K-Means 对符合高斯/正态分布的样本 (大致是圈的样子) 的聚类效果最好, 对带状样本聚类效果差无论如何调参, K-Means 都不适用于如下情况:
Mini-Batch K-Means:
对所有样本求均值计算量还是蛮大的, Mini-Batch 思想大致是抽取一部分样本求均值来近似总均值
特点:
简单快速, 可解决大批量聚类,对于符合高斯分布的数据聚类效果较优
需要预先给出聚类簇数量 k; 对于异常点和初始样本选取敏感; 对非高斯分布样本聚类效果差
层次-AGNES
hierarchical clustering, 通过分层 -> 树形聚类结构 -> 聚类结果
可采用
自顶向下DIANA / 自底向上AGNES
的划分方式AGNES (AGglomerative NESting)最初将每个对象作为一个簇,然后这些簇一步步地合并。两个簇间的距离由这两个不同簇中距离最近的数据点对的相似度来确定;聚类的合并过程反复进行直到所有的对象最终满足簇数目。
DIANA (DIvisive ANAlysis)算法是上述过程的反过程,属于分裂的层次聚类,首先将所有的对象初始化到一个簇中,然后根据一些原则(比如最大的欧式距离),将该簇分类。直到到达用户指定的簇数目或者两个簇之间的距离超过了某个阈值。
常用
凝聚层次AGNES算法
.AGNES 簇间距离不同定义/合并策略
最小距离 prime
两个集合中最近的两个样本的距离
容易形成链状结构
最大距离 complete
两个集合中最远的两个样本的距离
若存在异常值则不稳定
平均距离 average
两个集合中样本间两两距离的平均值
方差 Ward
使得簇内距离平方和最小,簇间平方和最大
如下为以上四类对于含噪点样本的聚类效果,最小距离聚类效果最好
密度-DBSCAN
density-based clustering, 通过样本分布密度来考察样本间的可连接性, 逐步拓展连接成最终聚类结果
几种密度聚类实现算法:
噪声密度 DBSCAN 聚类算法
密度最大值聚类
AP (Affinity Propagation)
谱聚类
常用
噪声密度 / DBSCAN 算法
允许噪声的基于密度的空间聚类 DBSCAN (Density-Based Spatial Clustering of Applications with Noise)
只要样本点的密度大于某阈值,则将该样本添加到最近的簇中。这类算法能克服基于距离的算法只能发现
高斯分布/类圆形(凸)
的聚类缺点,可发现任意形状的聚类,且对噪声数据不敏感。但计算密度单元的计算复杂度大,需要建立空间索引来降低计算量使用方面, DBSCAN 不仅可以避免噪声影响,也可以专门找噪声/剔除噪声
概念
学名 概念 -邻域 样本点在 半径内的区域 核心对象 对于给定的阈值 m, 如果某样本点-邻域中其他样本点数量 n>=m,那么此样本点就是核心对象 直接密度可达 对于核心对象 q, p 在其圈内, 那么 p 从 q 出发是直接密度可达的 密度相连 一串密度可达对象的串联 簇 最大的密度相连对象集合 半径 与 阈值 m 的影响 (调参侠石锤)
模型-衡量指标
均一性-homogeneity
一个簇中只包含一个类别的样本
完整性-completeness
同类别样本被归类到相同簇中
V-measure
均一性与完整性的加权平均
ARI-AMI
轮廓系数-Silhouette
a: 当前样本与簇内样本距离均值
b: min(当前样本与其他簇样本距离均值)
降维问题
比如在 3 维空间 xyz 内有一条线段, 我们只想知道线段的 x 信息, 可以把线段映射到 x-axis 上 (损失 yz-axis 上的信息)
降维作用: 降低时间-空间复杂度,使数据易于分析展示 (维度越高的图人类越难理解) [2]
缺失值比率
Missing Value Ratio, 去掉缺失值大于某一阈值的特征列
低方差过滤
Low Variance Filter, 对于某些列, 所有值的方差很小/样本没啥区别, 可以不用其做特征
随机森林
Random Forest, 随机森林可以自动计算各个特征的重要性, 便于寻找最优+最小的特征子集
反向特征消除
Backward Feature Elimination, 用数据集中 n 个样本训练模型, 每次删除一个样本, 找出对模型影响最小的样本删除
前向特征选择
Forward Feature Selection,前向特征选择其实就是反向特征消除的相反过程,即找到能改善模型性能的最佳特征,而不是删除弱影响特征.它背后的思路如下所述:
- 选择一个特征,用每个特征训练模型 n 次,得到 n 个模型.
- 选择模型性能最佳的变量作为初始变量.
- 每次添加一个变量继续训练,重复上一过程,最后保留性能提升最大的变量.
- 一直添加,一直筛选,直到模型性能不再有明显提高.
因子分析
Factor Analysis, 因子分析是一种常见的统计方法,它能从多个变量中提取共性因子,并得到最优解.
在因子分析中,我们将变量按其相关性分组,即特定组内所有变量的相关性较高,组间变量的相关性较低.我们把每个组称为一个因子,它是多个变量的组合.和原始数据集的变量相比,这些因子在数量上更少,但携带的信息基本一致.
主成分分析-PCA
通过正交变换将原始的 n 维数据集变换到一个新的被称做主成分的数据集中,即从现有的大量变量中提取一组新的变量.下面是关于 PCA 的一些要点:
- 主成分是原始变量的线性组合.
- 第一个主成分具有最大的方差值.
- 第二主成分试图解释数据集中的剩余方差,并且与第一主成分不相关 (正交).
- 第三主成分试图解释前两个主成分等没有解释的方差.
映射不包含任何数据内部的分类信息, 因此一般 PCA 降维后数据表示更有效但或许分类更加困难
LDA
Linear Discriminant Analysis / Fisher Linear Discriminant 是一种有监督的 supervised 线性降维算法
LDA 充分利用数据的标签信息, 一般 LDA 降维后可以直接分类
假设原始数据集表示为 X,(m*n 矩阵,m 是维度,n 是 sample 的数量), 目标是找到映射向量 a, 使得 a‘X 后的数据点能够保持以下两种性质:
同类的数据点尽可能的接近 (within class)
不同类的数据点尽可能的分开 (between class)
局部线性嵌入-LLE
非线性降维, 可使数据降维后较好的保持 流形结构
,适用于 flow-learninh
拉普拉斯特征映射-LE
Laplacian-Eigenmaps, 也是一种常用的流形降维算法, 思想也近似 LLE
超参的学习-更新
损失函数-loss
loss function, 也叫代价函数 cost function
用于衡量样本给出的 真实值
与 模型输出的 预测值
y 之间的差异
损失函数将
寻找最优参数
问题转换为了寻找损失函数最小值
问题
均方差损失函数-MSE
mean squared error, 常用于回归问题, 对于真实值 和预测值 ,其均方差
均方差在几何意义上对应欧几里得距离 (欧氏距离)
基于 min(均方差 loss) 寻找最优模型的方法叫
最小二乘法
在线性回归中应用的解释为: 寻找一条距所有真实值样本点 几何距离之和 最小的直线
如何求 min(均方差 loss) ? -> 一种方法是求导,令导函数 = 0 求解
交叉熵损失函数
分类问题常用交叉熵作为损失函数
比如下图的二分类模型 [9]
例题
对于期末考试三种结果,假设 one-hot 标签编码:
优秀 [1,0,0]
合格 [0,1,0]
不合格 [0,0,1]假设优秀,合格,不合格概率分别为:
甲 [0.2,0.5,0.3]
乙 [0.2,0.2,0.6]实际二位都不合格
分别求交叉熵:
预测值越接近真实标签,损失函数越小
过-欠拟合及处理
一种是啥都没背过; 一种是背过了但只会死记硬背,不会其他的
可以用泛化误差来衡量拟合程度 [5]
- 处理
- 过拟合
- 训练数据++, 数据增广
- 早停
- 降维
- 正则化
- 集成学习方法
- 欠拟合
- 添加新特征
- 增加模型复杂度
- 减小正则化系数
早停
Early Stopping [7]
优化算法
梯度下降法
在使用最小二乘法计算 min(均方差 loss) 时,有可能会遇到逆矩阵不存在或者计算量巨大的情况
这时就可以用梯度下降法求 loss 极小值,进而找最小值
分类
- 批量梯度下降法 BGD
- 随机剃度下降法 SGD
- 小批量随机梯度下降法 MBSGD
步骤: 对于 梯度 和其对应的 loss
loss 是否足够小/迭代次数是否达到? -> 如果不够,就更新参数,继续迭代
梯度下降
循环 1.
例题
学习率
学习率退火
如果学习率不变,对于初期来说学习率偏低, 收敛慢 loss 下降慢
对于后期来说又偏大,导致难以收敛, loss 止步不降
正则化
保留所有特征 x,减少参数 w 大小 (给高次项或者所有项加上系数来压制)
实际操作就是在目标函数(如损失函数)后加上一个范数:
p = 0 时为
L0 范数
, 为非零元素个数, 很难优化求解p = 1 时为
L1 范数 (曼哈顿范数)
,所有系数绝对值之和, 用于特征选择p = 2 时为
L2 范数 (欧几里得范数)
,所有系数平方和的开方, 可以防止过拟合提升模型的泛化能力
权重初始化
就像是 KMeans 一样, 的初始化对训练的性能和结果也会有很大影响
一种方法是随机初始化
另一种就是参考已经训练好的优秀模型的调参
图像增广-DataAugmentation
- 防止过拟合
- 增强模型泛化能力
借物表
[2]: 12 种降维方法终极指南 (含 Python 代码)
[6]: https://scikit-learn.org/stable/tutorial/machine_learning_map/