机器学习笔记
本质
寻找或拟合一个函数f,给定输入x,能够输出理想的y
步骤
- 数据预处理与特征选择
剔除NULL值;提取数据的特征向量,具体的如年龄、性别等;有的则难以进行具体特征提取,如推荐中这种情况可通过LFM自动学习来获取特征 - 模型选取与建立
- 模型评估与调优
分类
监督学习:给定一定量的有标准输出值的数据集,通过训练后来预测输出
主要算法:线性回归、逻辑回归、决策树、朴素贝叶斯、K近邻、支持向量机、集成算法Adaboost等
- 回归问题:预测连续值输出(线性回归),模型输出为值
- 分类问题:预测离散值输出(逻辑回归),模型输出为概率
非监督学习:输入为一定量数据集,不确定输出后的具体类别
主要算法:聚类、降维、关联规则、PageRank等
- 聚类:对数据进行分类为唯一需求
- 密度估计算法:除了分类若还要估计数据与每个分组的相似程度,则选用密度估计算法
增强学习:通过奖励或惩罚来对输出结果进行反馈,训练其自行学习
batch learning、online learning
**batch learning:**批量学习,平时最常用的一种方法。每次训练都需要使用全量的样本,因而可能会面临数据量过大、模型更新慢的问题。批量梯度下降法(BGD)和随机梯度下降法(SGD)都属于batch learning或者offline learning的范畴
**online learning:**在线学习,强调的是学习是实时的,流式的,每次训练不用使用全部样本,而是以之前训练好的模型为基础,每来一个样本就更新一次模型,这种方法叫做OGD(online gradient descent)。这样做的目的是快速地进行模型的更新,提升模型时效性
**Active Learning:**主动学习,再训练过程中模型会自动提出一些难以判断的数据出来让专家帮助标注
参见https://blog.csdn.net/vividonly/article/details/51078186
损失函数、代价函数、目标函数
损失函数(Loss Function )是定义在单个样本上的,算的是一个样本的误差。
代价函数(Cost Function )(也叫做成本函数)是定义在整个训练集上的,是所有样本误差的平均,也就是损失函数的平均。
- 均方差代价函数:用在线性回归的回归问题上
- 交叉熵代价函数:用在logistic回归的分类问题上
目标函数(Object Function)定义为:最终需要优化的函数。等于经验风险+结构风险(也就是Cost Function + 正则化项)。
特征缩放
多数的分类器是利用两样本间的距离计算两样本的差异,若其中一个特征具有非常广的范围,那两样本间的差异就会被该特征左右,因此,所有的特征都该处理到同等范围,这样才能大略的使各特征依比例地影响数据。而且进行特征缩放后最优解的寻优过程明显会变得平缓,更容易正确的收敛到最优解

由左图可看出两个变量中theta2的数据范围明显大于theta1,所以theta2的变化会主导函数梯度的变化,导致theta2成为比较强的影响因素,而theta1的重要性得不到体现,而如右图归一化后两变量具有了同等的影响程度
特征缩放主要为以下四种方法:

在国内一般称第一钟为归一化,第二种为均值归一化,第三种为标准化
归一化将特征缩放在[0,1]之间,均值归一化缩放在[-1,1]之间(均值为0),标准化缩放后的数据为均值0标准差为1的正态分布(逻辑回归和SVM多用此方法)
在选择上可优先使用标准化,其与归一化的不同在于标准化对异常值(很大或很小的数)有着良好的去噪作用,而用归一化处理仅仅是对数据同等缩放,并不能改变异常值的相对大小,当对输出值的范围有要求时再使用归一化,以下公式为用归一化将数据缩放在[a,b]之间:
![]()
另外,在对数据进行处理时,首先应进行训练集和测试集的划分,然后再进行特征缩放,特别注意在进行测试集的特征缩放(以标准化为例)时,要使用训练集的均值和方差。
因为你的算法不应该知道关于任何测试集的信息,所以测试集的方差与均值都应该来自训练集的先验数据。当然,这也需要你的数据集划分足够合理,使你在训练集上训练出来的模型有足够的泛化能力(当然模型的设计更关键)
归一化与批归一化
归一化是对原始数据的处理,批归一化不仅仅对原始数据进行归一化,而且在每一层的输入都会做归一化
梯度下降法的学习率
设置合适的学习率可通过看不同学习率下的代价函数随迭代次数的变化曲线来判断,而且通过曲线还可以判断梯度下降函数是否已经收敛完成
当变化曲线不正常时可尝试较小的学习率
学习率较小:收敛慢 ; 学习率较大:代价函数可能不会每次迭代都下降,甚至最终都不收敛
可按以下顺序尝试:…,0.001,0.003,0.01,0.03,0.1,… ,找到最小值与最大值,然后在中间选取一个合适值
过拟合

在线性回归中,若数据特征较多而数据量少那么可能导致过拟合
解决的方法:舍弃一些不必要的特征或对数据正则化
正则化
目的:防止过拟合
若用二次多项式可很好的拟合,而三次过拟合,若想用三次来拟合且不过拟合,那么就可以想到将多项式的三次项的参数尽量缩小,那么三次项的影响就会小很多
倘若参数很多的情况下,那么找出影响过拟合的项比较困难,不过我们可通过修改代价函数来实现 J = J + (1/2m)*λ∑θ^2(θ∈[1,n],对常数项系数一般不用正则化) ,作用为缩小每一个参数
对用了正则化的损失函数,求其θ参数的梯度下降函数或正规方程都需要做相应的改变
正规方程:

总结
线性回归、logistic回归、梯度下降法、正规方程、高级算法法(如scipy.optimize.minimize)、正则化
神经网络
构成:输入层、隐藏层、输出层 激活函数
第j层参数θ的维度为 [s(j+1),s(j)+1],s(j)为第j层的神经元数
误差反向传播算法
目的:计算代价函数对θ偏导数 为梯度下降法或其他高级算法做铺垫,从而计算出θ
每次迭代中的传播环节包含两步:
- (前向传播阶段)将训练输入送入网络以获得激励响应
- (反向传播阶段)将激励响应同训练输入对应的目标输出求差,从而获得隐层和输出层的响应误差
前向传播算法
目的:得到代价函数
代价函数:若用于1对多分类的话,需将各个类别的代价函数相加作为总的代价函数

反向传播算法
参数计算:反向传播算法,即将输出层的误差反向传播给前一层,类似地,前一层将误差反向传播给前前一层。原理如下:


由以上算出的误差δ便可以很方便的计算出代价函数对θ偏导数了

反向传播算法的具体实现:

在神经网络中实现反向传播算法的时候,为防止出现bug,通常要进行梯度检测

验证完成后,记得注释掉梯度检测代码
对神经网络参数θ的初始化值不能全部都为0,否则最终会导致某些参数相同,学习不彻底,故需要随机的初始值
θ = rand()2ε-ε,(rand生成[0,1]之间的数) 故参数θ初始值θ∈[-ε,+ε]
反向传播算法原理可参考https://www.cnblogs.com/charlotte77/p/5629865.html
一些小方法
如何评估模型的准确性
将数据集分为训练集和测试集两部分,可按照7:3的比例来划分
如何选择模型(比如线性回归中是选择1次方程还是2次或3次方程)
将数据集分为训练集、交叉验证集和测试集三部分,可按照6:2:2的比例来划分
先用训练集分别对不同的方程进行训练,再用交叉验证集来分别求出每个方程下的代价函数,选出最小的那个作为当前最好效果的方程,最后再用测试集来测试该方程
偏差和方差
偏差(bias) 描述的是预测值(估计值)的期望与真实值之间的差距。偏差越大,越偏离真实数据
方差(variance ) 描述的是预测值的变化范围,离散程度,也就是离其期望值的距离。方差越大,数据的分布越分散
可用于判断欠拟合还是过拟合

可看出当训练集误差小而测试集误差大的时候,为过拟合;当训练集和测试集误差都比较大的时候,为欠拟合
过拟合原因: 特征太多、模型过于复杂
正则化与欠、过拟合
当正则化参数λ过大时,对θ的惩罚过大,θ就趋于0,导致欠拟合 ;当正则化参数λ过小时,正则项对θ的约束过小,甚至导致正则项几乎不起作用,导致过拟合
当训练集误差和交叉验证集误差都比较大的时候,为过拟合,即λ较小;当训练集误差小而交叉验证集误差大的时候,为欠拟合,即λ较大
dropout
dropout可以防止过拟合
绘制学习曲线
训练集误差和交叉验证集误差随训练集大小的变化曲线
对于欠拟合,增加训练数据量起到的作用甚微;对于过拟合,增加训练数据量起到的作用比较大
支持向量机(SVM)
可有效解决分类和回归问题,适用于中小规模数据
SVM寻找决策边界不同于逻辑回归等算法通过最小化代价函数来寻找,而是在算法内部实现,使得决策边界距离样本尽可能的远
在使用SVM之前,应首相对数据进行标准化处理
专有名词:支持向量,超平面,硬间隔(针对线性可分数据集),软间隔(针对线性不可分数据集)
可通过升维使得原来线性不可分的数据变得线性可分,可通过高斯核函数实现


SVM为凸函数,具有全局最优
大间隔分类器


上图中的黑色线为支持向量机分类的结果,可看出它会把正负样本以最大间距分开,这个特性会得到更好的结果,故支持向量机又称为大间隔分类器

当C较大时,则会产生上图情况
核函数
标记和相似度函数


无监督学习
K-Means聚类算法

初始化聚类中心
从数据集中随机选取K个数据点作为聚类中心
聚类结果可能会达到局部最优,为避免这种情况,可初始化多次,分别计算最终的代价函数并从总选取最小的那一个(这种方法通常对K值较小(2-10)的情况起作用)
如何选取聚类数量K
根据目的来选择
降维
优点
- 减少冗余,降低内存消耗,加快学习算法训练
- 降维至2维,可用图形进行可视化,以便更好地理解数据之间的关系
主成分分析法(PCA)
- 数据预处理:均值归一化、特征规范化
- 对于n维降至m维,需要寻找n-m个向量,使得在n维的数据到n-m个向量构成的“面”的距离最短


主成分分析与线性回归的区别:

PCA时为了将特征相似的成分消除,因为相似的数据不能体现对数据的区分度,尤其是当各个数据的某些特征都相同时可看作是没有一点贡献,故去除也对后续操作无影响,那么如何判断数据相似呢,可用方差来计算,方差小那么数据就相似,所以我们要留下方差大的数据,即选择方差大的方向;但如果单纯地选择方差大地方向,那么之后地K-1个方向必定与第一个相似,即线性相关,不能比较好地体现数据,所以接下来考虑协方差,当协方差为0时,那么数据之间就不相关,每个数据就能更好地表述自己;之后则可通过协方差矩阵求出特征值即特征向量,选取前K个最大特征值对应地特征向量作为维度变换地坐标映射,之后再与源数据X相乘即可得到维度变换后地数据
主要计算协方差矩阵,之后再进行SVD奇异值分解求出特征向量即可
主成分数量K的选择
K即最后降低到的维度


PCA可将高维降至低维,那么低维的数据可表示高维的信息,那么也就有方法使得压缩后低维数据变为原来的高维:

可看出重构至高维只能近似
应用PCA加速学习算法的一些建议:
- 仅仅对训练集运用PCA
- PCA虽然能降低数据的维度,但不建议作为解决过拟化的方式,解决过拟化用正则化
- 推荐先在原始数据上进行学习算法,当速度过慢,内存消耗大时,再考虑应用PCA
异常检测
通常用于无监督学习,在此用于监督学习
给出一定地数据集,通过异常检测算法可检测出异常地数据
假定数据服从高斯分布

数据集划分比例举例

ε的选取:在预测值的最大与最小值之间进行等间隔选取ε,可通过对每个ε计算F1-Score(F1-Score, recall, precision)来估计
数据集的预处理:对每个特征x分析(可画图)是否符合高斯分布,若不符合可对其取对数(log(x+c))或开方(x^a,a<1)来使其满足高斯分布
多元高斯分布:

如何选择用原始高斯模型还是多元高斯模型:
一般用原始高斯模型,不过可能需要自己手动创造几个特征(例如Xn+1 = Xn/X2)

异常检测与监督学习(线性回归、逻辑回归)各自的使用场景
对于训练样本集,若有大量的负样本(y=0),而正样本(y=1)的数量较少(0-50),则考虑异常检测
若训练集中正样本和负样本的数量都很大,则适合监督学习
推荐系统
基于内容的推荐算法
基于电影的内容来推荐,即事先知道各个电影的类型,即每部电影都具有一组向量来描述其类别(或称作内容)
即用电影变量x来预测用户偏好θ
以电影推荐为例:

协同过滤算法(低秩矩阵分解算法)
协同过滤算法具有特征学习的特性
与基于内容的推荐算法不同的是,其可通过用户的数据来预测电影的特征,即用用户偏好θ来预测电影类型x

通过以上两种思想,我们可想象出把两种思想结合起来可能会更好,即循环地用x来预测θ,再用θ来预测x
协同过滤算法即时这种思想,不过它并不需要循环计算x和θ,可将其一块计算出来
协同过滤算法不需要偏置参数X0=1与θ0=1

寻找相似电影

大规模机器学习(处理大数据集的算法)
随机梯度下降
对于一般的梯度下降法来说,当数据量比较大时,梯度计算通常比较耗时,所以提出了随机梯度下降算法

相对于批量梯度下降算法,它不是将全部m个数据计算完再做一次梯度下降,而是对每一个数据都进行一次梯度下降
但这个下降具有随机性,每一次不一定朝着梯度最小的方向进行,但总体趋势还是朝着最优方向进行
随机梯度下降需要的迭代次数与数据集有关,一般在1-10倍的数据集
Mini-Batch 梯度下降
不像批量梯度下降一次计算m个样本,也不像随机梯度下降一次计算1个样本,而是一次计算b(一般在2-100之间)个样本,是一种介于两者之间的算法
若数据集大小为1000,一次计算b=10个样本,则只需要100次即可计算完成

系统设计与pipeline
假设一一个文字识别OCR系统可分为文字检测、字符分割和文字识别三个模块,则将其顺序放入pipeline中依次执行
如果最终的效果为72%,那如何找出是哪一部分出了问题呢,接下来主要提升哪一部分的的准确度呢?
可从开始到最后依次将每一部分的准确度人为设为100%,在进行总体测试
比如将第一部分准确度调至为100%,而最终结果为89%;在这基础上再将第二部分调至为100%,最终结果为90%;再将第三部分调至100%,最终结果为100%
则可以看出第一部分和第三部分对结果的影响较大,则下一步着重优化相关部分即可