0、知识点
监督分为分类和回归
回归问题:预测明天多少度(输出是连续变量):线性回归,决策树,KNN,神经网络,boosting和bagging
分类问题:预测明天是晴天还是雨天(输出是离散变量):LR,svm,因子分解机,朴素贝叶斯,决策树,KNN,神经网络,boosting和bagging
无监督学习包括聚类(Kmeans,混合高斯,层次聚类),关联与推荐,PCA
泛化强:对未知数据集也能表现良好
s.t.=受约束=已知
如:
目标函数:min {x+2}
s.t. x={1,2,3}
其题意为,已知x的取值为1、2、3,求x+2的最小值。
二分类中的线性和非线性:
线性分类器就是用一个“超平面”将两个样本隔离开,如:
(1)二维平面上的两个样本用一条直线来进行分类;
(2)三维立体空间内的两个样本用一个平面来进行分类(如下图);
(3)N维空间内的两个样本用一个超平面来进行分类。
非线性分类器就是用一个“超曲面”或者多个超平(曲)面的组合将两组样本隔离开(不属于线性的分类器),如:
(1)二维平面上的两组样本用一条曲线或折线来进行分类;
(2)三维立体空间内的两组样本用一个曲面或者折面来进行分类;
(3)N维空间内的两组样本用一个超曲面来进行分类。
【线性回归】
在几何问题上,线性回归就是寻找一个超平面去拟合样本点(把样本点都放上去),当样本是二维时(x1,x2)就是找一条直线,定义损失函数为最小二乘估计的损失函数,W是待求参数:
当W为下图时,损失最小:
最小二乘法的损失函数最小化问题《=》噪声(预测值-真实值)服从高斯分布的极大似然估计
特点是:线性、全局性、数据未加工(未降维)
【线性分类】
【感知机】

【逻辑回归LR】
用于解决二分类问题,假定二分类标签为y = 0 or 1
判别模型的 P(y=1 | x ) = h(x) = sigmoid(wx) = sigmoid(w1x1+w2x2),即已知该样本的特征x1,x2,求该样本的标签y=1的概率值
等价于全连接神经网络+1个神经元的输出层,激活函数是sigmoid,损失函数是交叉熵
MLE来求W:
因此基于极大似然估计,定义交叉熵代价函数如下:
所以单个样本的损失= - log(预测该样本属于实际类别的概率),对于多分类交叉熵也是一样
其中sigmoid的导数:
导数的值域为(0,0.25)
代码:
定义目标函数:
为了使得目标函数最大,利用梯度上升算法,梯度更新符号由-变+:
def sigmoid(inX): #sigmoid函数 return 1.0/(1+exp(-inX)) def gradAscent(dataMat, classLabels): # 梯度上升更新参数 # dataMat:m*n大小,一行对应一个样本的特征 # classLabels:m*1,样本标签 m,n = shape(dataMatrix) alpha = 0.001 # 学习率 maxCycles = 500 #设置迭代的次数 weights = ones((n,1)) # 初始化权重参数 for k in range(maxCycles): # 迭代500次 h = sigmoid(dataMatrix*weights) # XW delta = dataMatrix.T* (classLabels - h) # 偏导 weights = weights + alpha * delta # 迭代更新权重 return weights
【线性判别分析】
用于二分类问题,找一个超平面,使得样本映上去后,类内间距小(类内方差小),类间大(类的均值之间相差大),即求J取最大时的w,找到超平面之后,就把点映射上去,设定一个阈值,判定它的类别
【高斯判别分析】
这是个二分类生成模型,假定样本的标签服从伯努利分布(一次实验,2个结果),但是参数fai未知,特征x | y=0 服从高斯分布1,x | y=1服从高斯分布2,参数μ,theta也未知(这些分布对所有样本都成立)
要算概率的时候就拿pdf来算
通过最大化概率积P(y1|x1)P(y2|x2)P(y3|x3)...P(yn|xn)求出参数,进而比较 P(y=i | 预测x)之间的大小
此处:根据贝叶斯公式,由于比较P(y|x)之间的大小和比较P(x|y)P(y)之间的大小关系等价,所以就是最大化
P(x1|y1)P(y1)*P(x2|y2)P(y2)*P(x3|y3)P(y3)*....*P(xn|yn)P(yn)
【朴素贝叶斯分析】
可以看做高斯判别分析的推广,只不过加了个朴素的假设,它是一个生成模型,可用于分类和回归模型
朴素的假设:特征之间的取值相互独立《=》P(x|y) = P(x1|y)*P(x2|y)*P(x3|y)*..P(xn|y),这只是为了好算
categorial distribution:一次实验有N个结果
伯努利分布:一次实验有2个结果
多项式分布:N个categorial distribution,即做N次实验,每次实验有N个结果
若特征是离散的,则假定特征服从categorial distribution,若特征是连续的,则假定服从高斯分布
对于标签的假定也是如此
SVM是一个面向数据的分类算法,一个判别模型,它的目标是为确定一个分类超平面,从而将不同的数据分隔开。距离超平面最近的这几个训练样本点被称为支持向量,目标是使得两个异类支持向量到超平面的距离之和为最大。数学上就是找个一个合适的 f(x) = sign ( wx+b ) 使得间隔最大化
svm分为hard-margin svm,soft-margin svm和kernel svm
hard-margin svm:当训练数据线性可分时,通过硬间隔最大化,学习一个线性的分类器
soft-margin svm:当训练数据近似线性可分时,通过软间隔最大化,也学习一个线性的分类器
kernel svm:当训练数据线性不可分时,通过使用核技巧及软间隔最大化学习分类器
hard-margin svm推导:
【补充】:上述对偶问题自然满足弱对偶性,即max min L <= min max L;凸优化+slater条件能推出强对偶关系,由于svm是二次规划问题,满足以上,所以强对偶成立=>2问题同解,而且强对偶关系<=>KKT条件
slater条件:(relintD是D内的非边界点,m是一个约束式子)
不使用SMO算法的话也可以使用KKT求出:
soft-margin svm:允许样本存在一些噪声,此时就要求样本点可以去分界面的反方向(即分类错误),这点体现在约束上,但是不能离分界面太远(错的离谱),这点体现在目标函数上,所以引入松弛变量 > 0,当所有
= 0,就回到了硬间隔了,优化问题为:
这里的C是错误程度,比如当C很大的时候,为了使目标函数最小化,我们只能让 接近于0,这样也就变成了“硬间隔”SVM,表示无法容忍噪音点(错误)存在。后面解法类似硬间隔。
kernel svm:使用了核技巧,核将低纬度非线性可分问题转换为高纬度线性可分问题,同时高纬度空间出现的内积可以通过引入正定核函数来简化运算
【补充】:
核函数和正定核函数的定义(下面的X是低纬度空间,R是一个高维度空间,fai都能把低纬度映射到高维度,核能把2个低纬度映射到高纬度):
希尔伯特空间的元素是函数:
核函数有:线性核函数(未做映射),多项式核函数,高斯核函数,通过核函数可以直接求出映射到高维空间后的内积,其中高斯核函数用的最多,不仅仅是因为需要调的参数比较少。
最重要的原因是:

【LR与SVM的比较】
第一,本质上是其loss function不同,逻辑回归方法基于概率理论,假设样本为1的概率可以用sigmoid函数来表示,然后通过极大似然估计的方法估计出参数的值,支持向量机基于几何间隔最大化原理,认为存在最大几何间隔的分类面为最优分类面
机器学习之深入理解SVM
http://blog.csdn.net/sinat_35512245/article/details/54984251
https://www.bilibili.com/video/BV1Hs411w7ci?p=3
实战:svm.ipynb
https://blog.csdn.net/weixin_38753213/article/details/110358948
2.请简要介绍下Tensorflow的计算图。
TensorFlow和Pytorch都需要通过编程构建一个计算图,然后将数据作为输入,通过这个计算图规定的计算操作进行计算,最后得到计算结果。计算图模型由节点(nodes)和线(edges)组成,节点表示操作符Operator,或者称之为算子,线表示计算间的依赖,实线表示有数据传递依赖,传递的数据即张量。计算图从本质上来说,是TensorFlow在内存中构建的程序逻辑图,计算图可以被分割成多个块,并且可以并行地运行在多个不同的cpu或gpu上,这被称为并行计算。因此,计算图可以支持大规模的神经网络,如下:
2、PCA
降维分为人工直接降维、线性降维(PCA、MDS)、非线性降维(ISOMAP、LLE)
思想:将一组线性相关的变量通过正交变换变换到一组线性无关的变量(主成分),即对原始特征空间的重构
可以通过2种方法求出主成分:最大投影方差/最小重构代价
最大投影方差:寻求主成分uk使得样本映射上去之后方差最大
最小重构代价:用主成分uk分别表示原来样本和降维后的样本,两样本之间的距离最小
求出主成分后发现方差矩阵S的特征向量就是主成分,想降到几维就取几个特征向量
还可以对HX(中心化后的数据矩阵)做奇异值分解,找到V,也能得到主成分
3.在k-means或kNN,我们是用欧氏距离来计算最近的邻居之间的距离。为什么不用曼哈顿距离?
k-means:属于无监督(标签)学习
kmeans是按照距离将样本点分为k类,k是事先定好的
kmeans流程:
1、选取K个点做为初始聚集的簇心,也可选择非样本点;
2、分别计算每个样本点到 K个簇心的距离,该点离哪个簇心近,它就归属到对应的簇,直到所有点都归属到簇,此时所有点被分为了 K个簇(类)。
3、重新计算每个簇的中心,作为新的簇心;
4、反复迭代 2 - 3 步骤,直到达到簇中心收敛。
k值的确定:采用先验知识或者使用轮廓系数(Silhouette Coefficient和Calinski-Harabasz score),它能衡量簇内的稠密程度和簇间的离散程度,值越大则聚类效果越好
Silhouette Coefficient:它计算每个样本点的轮廓系数均值作为最终轮廓系数,它的范围在【-1,1】,选择最终轮廓系数最大的 k 值就好,单个样本点的轮廓系数计算公式是:(b-a)/max(b,a),其中b是该样本点到其他簇心距离的平均,a是该样本到自己簇心的距离的平均
Calinski-Harabasz score:
详细:https://blog.csdn.net/weixin_39857513/article/details/109883946
实战:Kmeans.ipynb
https://blog.csdn.net/lynn_001/article/details/86679270
Knn:属于监督学习,看与未分类样本最近的K个已分类样本,取K个已分类样本中类别数最多的类别
详细:https://blog.csdn.net/acceptedday/article/details/99681262
曼哈顿距离(只能横着走,竖着走,不能斜着走,最后计算总距离):
欧氏距离:n维空间2点的直线距离
其中:
样本x:x1 x2 x3 x4 x5 ... xn
样本y:y1 y2 y3 y4 y5 ... yn
7、决策树
决策树是一种树形结构,常用的分支准则:信息增益、信息增益比、Gini系数。不同分支规则对应不同的树,如ID3,C4.5,CART决策树,其中cart既能回归又能分类
比如【ID3决策树】
计算每个属性的信息增益(标签离散+特征离散),最大的信息增益的属性作为划分属性,从而进行一次划分,然后对叶子节点继续划分
详细:https://blog.csdn.net/qq_41661809/article/details/90321622
8、cart 决策树
是二叉树,每个划分节点以是否进行划分,cart分类树:基于基尼系数划分;cart回归树:采用误差平方和度量
【cart 分类树】
步骤:
1️⃣计算所有特征的基尼系数,如果某个特征列的值都一致,则不用考虑它:
|D|=总样本数=8
特征只有2个取值的基尼系数是相等的,即Gini(D,工资=0)=Gini(D,工资=1)=工资为1的有3个 / 8 *(1- 这3个是“好的”概率的平方 - 这3个是“不好”概率的平方 ) + 工资不为1的有5个 / 8 * (1- 这5个是“好的”概率的平方 - 这5个是“不好”概率的平方 )
2️⃣选择基尼系数最小的特征作为划分节点(基尼系数越大,不确定性越大),然后划分所有样本D,划分为D0,D1:
对于D,选择最小的基尼系数0.3,工资和平台=0都行,此时选择工资=0(/工资=1 )作为划分依据,将D划分为D0,D1
3️⃣如果某个子集的样本标签一致,则不用划分它,只划分标签不一样的子集:
D1的标签一致,不用再划分,此时划分D0
4️⃣对于新的子集,继续计算基尼系数并进行划分,直到所有子集内的样本标签一致停止(假定停止条件是准确率100%),此时生成了决策树 :
D0此时前面的特征不在考虑,接下来计算D0中压力和平台=0、1、2的基尼系数
选最小的平台=0作为依据继续划分
5️⃣ 预测:输入要预测的样本,待预测样本落至某一叶子节点,则输出该叶子节点中所有样本所属类别最多的那一类(即叶子节点中的样本可能不是属于同一个类别,则多数为主)
【cart 回归树】
定义Cm为第m个叶子节点里面所有样本的标签值的平均,单个叶子的损失为它里面所有样本的标签与叶子c的差值平方和,整体损失函数为所有叶子的损失加起来
列举按照所有特征的所有的候选值进行划分后的结果,取最小的损失,比如针对第一个特征(若有特征列完全一样,不考虑该列),如年龄有10,14,17,取中间值作为候选阈值:12,16,每个阈值对应一棵小树,求每个小树的损失值,取最小损失的树作为第一次划分,此时样本被分为2类D1,D2,然后接下来分别对子集进行同样的划分操作,如对子树D1,先对身高特征选候选阈值,然后计算所有可能的树的损失,取最小的那个,其他子集操作相同....
预测时,预测样本落在哪个节点,就预测它的标签为节点的C值,假定有M个叶子,公式预测值 f(x) 为:
6、集成学习
集成算法:使用多个机器学习模型来构建
集成学习分为boosting和bagging
7、boosting
【adaboost】
用于解决二分类问题,标签为-1/1,假定 n 个弱分类器G,一般选用单层决策树,即当x<k,G(x) = 1,当x>=k,G(x) = -1,k是参数,需要训练学习
首先初始化每个数据的权重,1/N,然后训练第一个分类器G1(在候选阈值中找到使得它的分类错误率最低的K),计算误差e=分类错误的样本的权重之和,再算G1的权重α1,根据公式,误差率大的话该学习器的权重就小(重要性降低):
然后采用指数损失函数更新训练数据的权值,使得分类正确的样本降低它的权重,分类错误的样本提高它的权重,指数损失的公式:
在更新了的权重的数据集上,训练第二个分类器....,最后用G(x)做最终的分类器
上面算法的理论基础是前向分布算法+指数损失函数,前向分布算法的思想是先更新第一棵树的参数,再更新第二棵树,再第三棵树...,而不是采用传统梯度下降的思想,因为梯度下降是一次性更新所有树,参数太多了,计算量太大了。
项目:AdaBoost.ipynb
https://www.cnblogs.com/pinard/p/6136914.html
https://blog.csdn.net/cindy407/article/details/94867720
https://www.bilibili.com/video/BV1x44y1r7Zc?p=4&spm_id_from=pageDriver
【提升树】
分类器的权重都为1,预测值=所有分类器的输出相加=落入的每棵树的叶子值相加
二分类问题的提升树:算法流程和adaboost一样,只不过分类器的权重置为1了
回归问题的提升树:分类器是回归树,每个分类器的输出就是对残差的逼近,即用残差来训练每个分类器,残差是指前n-1个分类器的输出和与真实值的差,采用前向分布算法依次优化每个分类器,损失函数为平方误差损失
GBDT(二分类和回归的推广):此时的损失函数是一般意义上的,分类器是回归树,目标是新增一个决策树不会使得整体损失变大,即:
其中fm(x)=前m个分类器输出之和,通过一阶泰勒展开推导出用损失函数的负梯度去做拟合才能满足条件, 所以算法流程是:计算当前损失函数的负梯度,把样本代进去得到训练样本,训练样本的标签就是负梯度,用这些训练样本去拟合当前分类器,然后按照前向分布算法再训练下一个分类器,当损失函数用MES时,负梯度就是残差了,对于二分类问题,损失函数用交叉熵,分类器相加的结果再通过sigmoid函数作为预测值,由于为了使得负梯度能更好地拟合等价于使得整体损失函数更小,在用训练样本建立单棵回归树时没有采用它传统的MSE,而是用整体损失函数作为评估,在候选回归树中,选择使得整体最小的回归树,因此每个叶子节点的标签不再是平均值了,而是使用整体损失函数+泰勒二阶导数推出来的值,但是传统回归树的构造结构和采用整体损失函数进行树的构造结构一样,所以为了简化运算,先用mse来构造树,然后叶节点的标签用整体损失函数的推导结果:
项目:GBDT.ipynb
【xgboost】
xgboost针对传统GBDT算法做了很多细节改进,损失函数在平方误差的基础上还要加个正则项,其中正则项为:
其中T是叶子节点个数,wi是叶子节点的值,2个超参数
使用贪婪+增益来划分树:列出划分根节点的所有情况,计算每个增益(标签连续)=划分前损失-划分后损失,此处引入一阶+二阶泰勒展开方便计算,然后取最大的增益划分,即损失下降的最快,然后子节点同理,都是一个一个节点来处理的
不想考虑所有特征列了,速度太慢=》优化——列采样:1、按树随机:先随机选几个特征,然后树的划分就只看这几个特征了,其他特征抛弃,2、按层随机:每层的候选特征列是重新随机的,即每一层划分前,随机选择部分特征列,然后这一层就在部分特征列里面选择特征,下一层划分时,又重新地随机选择部分列....
不想考虑所有候选特征值了=》优化——加权分位法:定义每个样本点的权重为损失函数在该点的二阶导,搜索候选特征值,使得按该特征值划分子集之后,子集里面的样本权重加起来差不多,即不会头重脚轻
缺失值处理:将特征列x1为空的样本都收集起来作为集合D,分别计算一下把D放到每个叶子里面的增益,哪个增益大就放到哪个叶子
时间复杂度优化:牺牲空间,提前分别按照特征列将样本预排序并分块存入磁盘,如:
每个块不仅存储索引,还存有相对应的样本梯度信息以方便计算的时候直接提取,这样还能提高缓存利用率,新建一个线程专门用于存取块,而且对各个子树的划分进行并行处理
【LightGBM】
相对于xgboost, 具有训练速度快和内存占用率低的特点。XGBoost不足之处在于:xgboost在进行最优分裂点的选择上是先进行预排序,然后对所有特征的所有候选分裂点计算这些分裂点分裂后的目标函数增益,这个过程的空间复杂度和时间复杂度很大。LightGBM 从多个角度出发,对XGBoost算法进行优化:
(1)为了解决分裂点数量过多的问题,LightGBM采用直方图算法。
决策树的划分不再以样本点划分,而是以直方图为单位。直方图算法说白了就是对特征进行分桶,先把连续的浮点特征值离散化成k个整数,同时构造一个宽度为k的直方图, 并根据特征所在的bin对其进行梯度求和个个数统计,这样计算增益只用以bin里的梯度和为单位,计算增益的时间复杂度从不同特征值数量 降低到直方图箱数量
,所以速度提升会很明显。bins的数量是远小于样本不同取值的数量的,所以分桶之后要遍历的分裂点的个数为num-bins-1,2个bin中间的做候选,减少了计算量。
LightGBM另一个优化是Histogram(直方图)做差加速。一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到,在速度上可以提升一倍。在实际构建树的过程中,LightGBM还可以先计算直方图小的叶子节点,然后利用直方图做差来获得直方图大的叶子节点,这样就可以用非常微小的代价得到它兄弟叶子的直方图。直方图做差加速能让耗时降低到原先的
(2)为了解决样本数量过多的问题, Lightgbm采用单边梯度抽样算法。
GBDT中梯度小的训练样本可以说明数据已经被模型学习得很好了,直接想法就是丢掉这部分梯度小的数据。然而这样做会改变数据的分布,将会影响训练模型的精确度,为了避免此问题,提出了GOSS算法。GOSS算法的亮点在于:根据样本的权重信息对样本进行抽样,减少了大量梯度小的样本,但是还能不会过多的改变数据集的分布
GOSS在进行数据采样的时候只保留了梯度较大的数据,但为了避免丢弃梯度小的数据而带来样本分布的改变,在计算增益时为梯度小的样本引入一个常数进行平衡。
GOSS算法首先将要进行分裂的特征的所有取值按照绝对值大小降序排序,选取绝对值最大的 a% 个数据。然后在剩下的较小梯度数据中随机选择 b% 个数据。接着将这 b% 个数据乘以一个常数(1 − a) / b。这样算法不会过多改变原数据集的分布。最后使用这( a + b ) %个数据来计算信息增益。举例说明:
通过采样的方式,选出了两个梯度大的6号和7号,然后又从剩下的样本里面随机选了2个梯度小的4号和2号,如果直接把另外四个给删掉的话,这时候会改变数据的分布,但应该怎么做呢? 也就是乘以一个常数(1 − a) / b,如下图所示:
梯度小的样本乘上相应的权重之后,我们在基于采样样本的估计直方图中可以发现Ni的总个数依然是8个, 虽然6个梯度小的样本中去掉了4个,留下了两个。 但是这2个样本在梯度上和个数上都进行了3倍的放大,所以可以防止采样对原数数据分布造成太大的影响。
(3)为了解决特征数量过多的问题,Lightgbm采用互斥特征捆绑算法
高维度的数据往往是稀疏的,这种稀疏性启发我们设计一种无损的方法来减少特征的维度。通常被捆绑的特征都是互斥的(即特征不会同时为非零值,像one-hot),这样两个特征捆绑起来才不会丢失信息。如果两个特征并不是完全互斥(部分情况下两个特征都是非零值),可以用一个指标对特征不互斥程度进行衡量,称之为冲突比率,当这个值较小时,我们可以选择把不完全互斥的两个特征捆绑,而不影响最后的精度。EFB算法就是通过捆绑特征来降低特征的维度。EFB 算法利用特征和特征间的关系构造一个加权无向图,从而判定哪些特征应该绑在一起
(4)带深度限制的 Leaf-wise 算法:
与前面的按层生长的决策树生长策略不同,该算法每次从当前所有叶子中,找到分裂增益最大的一个叶子,然后分裂,如此循环,同时增加了一个最大深度的限制,在保证高效率的同时防止过拟合。在同等分裂次数的情况下,显然按叶子生长能够把损失函数降低更多。
(5)采用 many-vs-many 模式分裂节点:对于类别特征,传统的决策树在学习节点分裂时,是一种 one-vs-rest 模式,每次只能根据一个类别做分类,如下图。这种模式效率比较低,而且不利于决策树学习。LightGBM 对此进行了优化,采用 many-vs-many 模式分裂节点,如下图。
(6)多机并行优化:之前的并行方法主要有两种:1)特征并行(每个 worker 拥有全部样本的部分特征);2)数据并行(每个 worker 拥有一部分数据的全部特征)。他们都是针对寻找最优分裂点这个过程,进行并行计算,LightGBM 在数据并行的基础上进行了优化,提出选举并行,极大地降低通信耗时
详细:
https://blog.csdn.net/zhong_ddbb/article/details/106244036
https://zhuanlan.zhihu.com/p/366952043
8、
【bagging】
如随机森林
1、对于每棵树而言,随机且有放回地从训练集中的抽取样本作为该树的训练集,所以每棵树的训练集里面可能包含重复的训练样本。
2、将K个训练集抽取的样本分别给K个基(弱)分类器训练(并行),在训练每棵树时,如果存在M个特征,则在每个节点分裂的时候,从M中随机选择m个特征维度(m << M),使用这些m个特征维度中最佳特征来分割节点
3、
详细:https://www.bilibili.com/video/BV1x44y1r7Zc?p=3
10、处理样本(某个类别过多,某个类别几乎没有,如识别欺诈交易)的方法:
1️⃣扩充数据集:首先想到能否获得更多数据,尤其是小类(该类样本数据极少)的数据,更多的数据往往能得到更多的信息。
2️⃣对数据集进行重采样:对小类的数据样本进行过采样来增加小类的数据样本个数,如SMOTE算法是通过对少数样本进行插值来获取新样本的。比如对于每个少数类样本a,从 a最邻近的样本中选取 样本b,然后在对 ab 中随机选择一点作为新样本。对大类的数据样本进行欠采样来减少大类的数据样本个数,采样算法容易实现,效果也不错,但可能增大模型的偏差(Bias),因为放大或者缩小某些样本的影响相当于改变了原数据集的分布。对大样本的随机欠采样可以采用Easy Ensemble算法:
从大类样本中随机产生和小类样本一样的个数N_i,与小样本组合成2*N_i个样本输入1个基分类器(论文中采用的基分类器是adaboost)中训练
重复操作给第二个基分类器去训练....
最后结合所有基分类器进行决策。下图中Hi是第i个基分类器,总共有T个基分类器:
3️⃣人造数据:给样本的某个属性增加噪声,如图像的数据增强
4️⃣改变算法:使用代价函数时,可以 增加小类样本的权值,降低大类样本的权值(这种方法其实是产生了新的数据分布,即产生了新的数据集),从而使得分类器将重点集中在小类样本身上。
比如平衡交叉熵函数:
其中m为正样本个数,n为负样本个数,N为样本总数,m+n=N
focal loss
focal loss相比balanced cross entropy而言,二者都是试图解决样本不平衡带来的模型训练问题,后者从样本分布角度对损失函数添加权重因子,前者从样本分类难易程度出发,使分类不准确的样本权重在loss中增加了。
5️⃣问题转换:把它看做一分类(One Class Learning)或异常检测(Novelty Detection)问题。这类方法的重点不在于捕捉类间的差别,而是为其中一类进行建模,经典的工作包括one-shot Learning等
【one-shot Learning】
定义:某个类别下的样本只有1个或者很少的情况下,模型能够正确的预测分类
核心思想:比如在人脸识别的情境下,使用Siamese 神经网络,该网络能将图片映射成一个向量,然后通过计算相似度来定义损失函数Triplet Loss,该公式要计算同一类别下的两张图片的输出向量之间的差异以及不同类别下的2张图片...,通过采用梯度下降来更新参数以实现最小化损失函数,同一类别的图片之间差异会小,不同类别的图片之间差异会大,这样神经网络就能做识别了。真正在训练阶段,1个类别起码要有10个样本。
下图Triplet Loss中,s1是属于A类别图片1的输出向量,s2是属于A类别图片2的输出向量,s3是属于B类别图片3的输出向量,α是超参数:
loss推导:
6️⃣改变评价指标,如用混淆矩阵代替准确率
9、分类器模型评价指标
分类器评价指标主要有:
混淆矩阵
Accuracy
Precision
Recall
F1 score
ROC 曲线
AUC
PR 曲线
【混淆矩阵】
通过混淆矩阵可以观察到A类别中有多少被分到了B类别,这样可以有针对性的设计特征等,使得类别更有区分性,进而观察模型在各个类别上的表现;
对角线是预测对了的数目,其他地方预测错了,4个加起来是总样本数
真正(True Positive , TP):正样本中被模型预测为正,预测对了。
假正(False Positive , FP):负样本但被模型预测为正,预测错了。
假负(False Negative , FN):正样本但被模型预测为负,预测错了。
真负(True Negative , TN):负样本被模型预测为负,预测对了。
从中可以计算出:
【准确率(Accuracy)】
准确率是最常用的分类性能指标。适用场景:不同的分类是同等地位的,阈值给定
Accuracy = (TP+TN)/(TP+FN+FP+TN),即正确预测的正反例数 /总数
【精确率(Precision)】
适用于不同类别地位不同的场景,阈值给定
精确率是预测出是正的里面有多少真正是正的。可理解为查准率。关注误报的比例。100%表示,挑出来的全是对的,越高表示只有十足的把握才去报告。如嫌疑人定罪,嫌疑人是正样本,基于不错怪一个好人的原则,对于嫌疑人的定罪我们希望是非常准确的。即时有时候放过了一些罪犯(recall低),但也是值得的。强调识别的准确性
Precision = TP/(TP+FP),即正确预测的正例数 /预测正例总数
【召回率(Recall)】
适用于不同类别地位不同的场景,阈值给定
召回率表现出在实际正样本中,分类器能预测出多少。与真正率相等,可理解为查全率。关注漏检的概率。100%表示,一个也没漏,越高表示只要有可能发生,就预测为发生。对于地震的预测,地震做正样本,我们希望的是RECALL非常高,也就是说每次地震我们都希望预测出来。这个时候我们可以牺牲PRECISION。情愿发出1000次警报,把10次地震都预测正确了,也不要预测100次对了8次漏了两次。强调识别的覆盖面。
Recall = TP/(TP+FN),即正确预测的正例数 /实际正例总数
【F1 score】
适用于不同类别地位不同的场景,阈值给定
F1分数(F1-score)是分类问题的一个衡量指标。它是精确率和召回率的调和平均数,最大为1,最小为0。F1-score越大自然说明模型质量更高。F1的核心思想在于,在尽可能地提高精确度(Precision)和召回率(Recall)的同时,也希望两者之间的差异尽可能的小。
【ROC曲线与AUC值】
适用于比较模型性能,阈值未定
定义横坐标FPR:TP/(TP+FN),即被预测为正的正样本数 /正样本实际数。
纵坐标FPR:FP/(FP+TN),即被预测为正的负样本数 /负样本实际数。
一个混淆矩阵对应一个点,当改变模型对正负样本的判别阈值会产生多个混淆矩阵,图中为多个点,连起来形成ROC曲线,即模型的不同阈值对应roc上的不同点,左下阈值高,右上阈值低,最优的阈值离左上角最近。一条ROC曲线对应一个模型。如果ROC是光滑的,那么基本可以判断没有太大的overfitting
ROC曲线下的面积就是AUC值,AUC值越大模型越好,即曲线越靠近左上角模型越好
对于N分类,可以求出宏观AUC值:计算每个类别的AUC值,取平均
也可以求出微观AUC值:先转换成右下的表格(多分类转二分类),根据右下表格计算
AUC计算方式2:
理解为预测为正样本的概率大于预测为负样本的概率的概率:P(P正样本 > P负样本)
AUC计算方式3:
这次用排序算,下图M是正样本个数,分母是M*N
【pr曲线】
适用于比较模型性能,阈值未定
PR曲线中的P代表的是precision(精准率),R代表的是recall(召回率),其代表的是精准率与召回率的关系,一般情况下,将recall设置为横坐标,precision设置为纵坐标。
一个阈值对应PR曲线上的一个点。选取不同的阈值,就得到很多点,连起来就是PR曲线。
不同模型对应不同曲线
图片来源于周志华老师的<机器学习>一书.
当PR曲线越靠近右上方时,表明模型性能越好,与ROC曲线类似,在对不同模型进行比较时,若一个模型的PR曲线被另一个模型的PR曲线完全包住则说明后者的性能优于前者.如上图中橘色线代表的模型要优于蓝色线代表的模型,若模型的PR曲线发生了交叉,则无法直接判断哪个模型更好.在周志华老师的机器学习上中提到了可以用平衡点.它是查准率=查全率时的取值,如上图黑色线代表的模型的平衡点要大于橘色线模型代表的平衡点,表明前者优于后者
【均方误差(MSE)】
均方误差是指:观测值与真值偏差的平方和与观测次数的比值,MSE相当于模型中的损失函数,模型之间的对比也可以用它来比较。MSE可以评价模型的预测精度,MSE的值越小,说明预测模型对于目标的拟合程度越精确。
【均方根误差(RMSE)】
RMSE其实是MSE开根号,两者实质一样,但RMSE能更好的描述数据。因为RMSE跟数据是一个级别的,更容易感知数据。
【平均绝对误差(MAE)】
【平均绝对百分比误差(MAPE)】
与RMSE相比,更加鲁棒,因为MAPE对每个点的误差进行了归一化。但是当实际值为零时,MAPE会采用未定义的值,MAPE的值可能超过100%。MAPE将偏向于预测不足而不是过度预测的模型。
【拟合优度/R-Squared】
一般用在线性模型中,表示回归直线对观测值的拟合程度。R2 越接近于1,说明回归直线对观测值的拟合程度越好;相反,R2值越小,说明回归直线对观测值的拟合程度越差。受样本量影响,不同数据集的模型结果比较会有一定的误差,不断添加特征虽然能让模型的效果提升,而这种提升是虚假的。
【校正决定系数(Adjusted R-square)】
这是对R2的修正,能对添加的特征给出惩罚,也就是说随意添加一个特征不一定能让模型拟合度上升。其中,n为样本数量,p为特征数量。取值范围还是负无穷到1,大多是 0~1,且越大越好
10、标准方程法:要求损失函数最小的参数,让损失函数的偏导数=0来算参数
11、鲁棒性:较高精度和有效性,离群点和噪声对算法影响不大
8.overfitting过拟合怎么解决?
1️⃣、交叉验证
数据集一般划分为:训练集,验证集(选择超参数),测试集(最后的评估作用)。如果数据样本量小于一万条,我们就会采用交叉验证来训练优化选择模型。
交叉验证分为:
简单交叉验证。首先,我们测试集分为两部分(比如: 70%的训练集,30%的验证集),然后用训练集来训练模型,在验证集上验证模型及参数。接着,我们再把样本打乱,重新选择训练集和验证集,继续训练数据和检验模型。
K折交叉验证(S-Folder Cross Validation)。
将训练集划分为K份(折)(先划分为训练接和测试集,然后对测试集实施交叉验证),训练完后,先用第一折的验证集评估模型分数,再用第二折的验证集评估分数...,最后取平均分数为该模型的评估分数,为了能实现更好的随机性,第一折验证完后,所有数据可以重新打乱,再划分折,然后再次评估分数....最后取平均
2️⃣、用更多数据进行训练
用更多相关数据训练模型有助于更好地识别信号,避免将噪声作为信号。数据增强是增加训练数据的一种方式,可以通过翻转(flipping)、平移(translation)、旋转(rotation)、缩放(scaling)、更改亮度(changing brightness)等方法来实现。
3️⃣、移除特征
移除特征能够降低模型的复杂性,并且在一定程度上避免噪声,使模型更高效。为了降低复杂度,我们可以移除层或减少神经元数量,使网络变小。
4️⃣、早停
对模型进行迭代训练时,我们可以度量每次迭代的性能。当验证损失开始增加时,我们应该停止训练模型,这样就能阻止过拟合。
5️⃣、正则化
损失函数后面的额外项,常用的额外项一般有两种,称作L1正则化和L2正则化。 前面的系数是惩罚系数,越大则惩罚力度越强,泛化能力越强
对于线性回归模型,使用L1正则化的模型建叫做Lasso回归,使用L2正则化的模型叫做Ridge回归(岭回归)。
L1 惩罚的目的是优化权重绝对值的总和。它生成一个简单且可解释的模型,且对于异常值是鲁棒的。
为了使得最终的损失函数最小,L1的结果就是产生稀疏权值矩阵,这样很多特征xi前的权值就是0了,这些特征就不用考虑了,即可以用于特征选择,L1假设模型参数服从拉普拉斯分布
L2 惩罚权重值的平方和。该模型能够学习复杂的数据模式,但对于异常值不具备鲁棒性。结果是所有参数都较小,但是不具备稀疏性。贝叶斯角度理解,L2正则化其实是加入了数据的先验知识,认为权重参数服从高斯先验分布=正态分布,所以在损失函数中加入这样的先验知识,让模型表现更好。
在线性回归模型中,标准方程法求最小化损失函数时的参数W,加入正则项还能实现可逆:
详细:https://mp.weixin.qq.com/s/uB9TuYZ-OboDXPvGP02ISg
https://blog.csdn.net/m0_38045485/article/details/82147817?utm_source=blogxgwz6
6️⃣、Dropout
每次神经网络训练一次,就随机禁用部分神经网络单元。它可以在任何隐藏层或输入层上实现,但不能在输出层上实现。该方法可以免除对其他神经元的依赖,进而使网络学习独立的相关性。测试阶段就不杀死了,用原网络。
⑦、batch normalizatin
对于神经网络的每层,当前一层神经元输出值经过WX+B后,就进行标准化,随后再经过激活函数,后面层也是...
对于标准化,在训练阶段,使用batch自己的均值(比如第1个样本的第1个特征,加上第2个样本的第1个特征,……,再加上第 N 个样本的第1个特征,求平均值,得到特征1的均值)和标准差来归一化batch(对所有特征),以及scale和shift操作:
这两个参数是神经网络需要学习的量,同时对每个特征分别维护它的全局滑动均值和滑动方差:
moving_mean = moving_mean * momentum + mean(batch) * (1-momentum)
moving_var = moving_var * momentum + var(batch) * (1-momentum)
预测阶段,使用训练阶段的滑动均值和滑动方差来归一化batch的各个特征
图示:
作用:对于一个batch而言,不适用归一化之前,单个神经元在处理每个样本时,传过来的值比较发散,分布不同,经过激活函数映射后,如tanh,多数样本都被映射到了值域边界附近,不利于信息传播,容易发生梯度消失和爆炸,反之,使用了BN后,能够保证数据分布相同且集中,有利于数据传递(这种分布指的是各个样本在同一个特征内分布一致)。增加的scale和shift操作,这两个参数是通过训练学习到的,意思是通过scale和shift把这个值从标准正态分布左移或者右移一点并长胖一点或者变瘦一点,等价于非线性函数的值从正中心周围的线性区往非线性区动了动,训练他俩的目的是想找到一个线性和非线性的较好平衡点,既能享受非线性的较强表达能力的好处,又避免太靠非线性区两头使得网络收敛速度太慢。
详细:https://www.cnblogs.com/guoyaohua/p/8724433.html