目录
熵 (entropy)/信息熵(information entropy):信息的期望值
朴素贝叶斯(Naive Bayes Classifier,或 NBC)
Gradient boosting Decision Tree(GBDT) 梯度提升树
针对一些常见的机器学习算法,总结算法的思路、流程、应用和优缺点等。工业界常用算法:决策树、神经网络,因为速度快,SVM太慢。
线性回归
目的 | 线性拟合 |
原理 | 利用连续性变量来估计实际数值,描述自变量和因变量之间的线性关系 |
公式 | 一元线性回归f(xi)=wTxi+b,令f(xi)≈yi |
调参 | 一元线性回归(简单线性回归),多元线性回归(多变量线性回归) 学习策略:最小二乘参数估计 损失函数:平方损失(均方误差,欧氏距离) 学习算法:最小二乘线性代数解,梯度下降优化 优化:删除非常类似(相关)的变量,并尽可能移除数据中的噪声 |
优点 | 简单,运算速度快,可解释性强 |
缺点 | 复杂模型拟合度差 |
适用问题 | 回归(房价、股市预测) |
适用数据类型 | |
python实现 | from sklearn.linear_model import LinearRegression |
逻辑回归LR
目的 | 逻辑回归假设数据服从伯努利分布(抛硬币实验),通过极大化似然函数(损失函数)的方法,运用梯度下降(随机梯度下降,批梯度下降,小批量梯度下降)来求解参数,来达到将数据二分类的目的。 |
原理 | 根据现有数据对决策边界建立回归方程,然后将回归方程映射到分类函数上实现分类。 |
公式 | y = 1 / (1 + e^(-z)),z=wTx+b 特征条件下类别的条件概率分布,对数线性模型 |
调参 | 梯度下降法: 1、批梯度下降会获得全局最优解,缺点是在更新每个参数的时候需要遍历所有的数据,计算量会很大,并且会有很多的冗余计算,导致的结果是当数据量大的时候,每个参数的更新都会很慢。 2、随机梯度下降是以高方差频繁更新,优点是使得sgd会跳到新的和潜在更好的局部最优解,缺点是使得收敛到局部最优解的过程更加的复杂。 3、小批量梯度下降结合了sgd和batch gd的优点,每次更新的时候使用n个样本。减少了参数更新的次数,可以达到更加稳定收敛结果,一般在深度学习当中我们采用这种方法
梯度下降法优化(Adam,动量法等优化方法),上述梯度下降方法其实还有两个致命的问题: 1、第一个是如何对模型选择合适的学习率。自始至终保持同样的学习率其实不太合适。因为一开始参数刚刚开始学习的时候,此时的参数和最优解隔的比较远,需要保持一个较大的学习率尽快逼近最优解。但是学习到后面的时候,参数和最优解已经隔的比较近了,你还保持最初的学习率,容易越过最优点,在最优点附近来回振荡,通俗一点说,就很容易学过头了,跑偏了。 2、第二个是如何对参数选择合适的学习率。在实践中,对每个参数都保持的同样的学习率也是很不合理的。有些参数更新频繁,那么学习率可以适当小一点。有些参数更新缓慢,那么学习率就应该大一点。
学习策略:极大似然估计,正则化的极大似然估计 损失函数:逻辑斯蒂损失(交叉熵损失函数) 学习算法:改进的迭代尺度算法,梯度下降法(求解步骤如下:1-随机一组W.2-将W带入交叉熵损失函数,让得到的点沿着负梯度的方向移动. 3-循环第二步.);拟牛顿法 优化方法:对数据进行欠采样/重采样来让正负例保持一个差不多的平衡,或者使用树型算法来做分类 |
优点 | 1、形式简单,模型的可解释性非常好。从特征的权重可以看到不同的特征对最后结果的影响,某个特征的权重值比较高,那么这个特征最后对结果的影响会比较大。 2、模型效果不错。在工程上是可以接受的(作为baseline),如果特征工程做的好,效果不会太差,并且特征工程可以大家并行开发,大大加快开发的速度。 3、训练速度较快。分类的时候,计算量仅仅只和特征的数目相关。并且逻辑回归的分布式优化sgd发展比较成熟,训练的速度可以通过堆机器进一步提高,这样我们可以在短时间内迭代好几个版本的模型。 4、资源占用小,尤其是内存。因为只需要存储各个维度的特征值。 5、方便输出结果调整。逻辑回归可以很方便的得到最后的分类结果,因为输出的是每个样本的概率分数,我们可以很容易的对这些概率分数进行cutoff,也就是划分阈值(大于某个阈值的是一类,小于某个阈值的是一类)。 or 1、直接对分类可能性进行建模,无需事先假设数据分布,避免假设分布在不混却带来的问题; |
缺点 | 1、准确率并不是很高。因为形式非常的简单(非常类似线性模型),很难去拟合数据的真实分布。 2、很难处理数据不平衡的问题,对数据倾斜(不平衡)敏感。举个例子:如果我们对于一个正负样本非常不平衡的问题比如正负样本比 10000:1.我们把所有样本都预测为正也能使损失函数的值比较小。但是作为一个分类器,它对正负样本的区分能力不会很好。 3、处理非线性数据较麻烦。逻辑回归在不引入其他方法的情况下,只能处理线性可分的数据,或者进一步说,处理二分类的问题 。 4、逻辑回归本身无法筛选特征。有时候,我们会用gbdt来筛选特征,然后再上逻辑回归。 |
适用问题 | 多类分类(垃圾邮件分类,信用评估),二分类问题首选,线性分类器 |
适用数据类型 | |
python实现 | from sklearn.linear_model import LogisticRegression |
K-均值聚类
目的 | 将数据集划分成k个簇,并给出对应簇的中心点 |
原理 | 1、预先将数据分为K组,随机选取K个对象作为初始聚类中心 2、计算每个样本分别到K个中心的距离,将每个样本分配给距离它最近的聚类中心,形成K个簇 3、重新计算每个簇的中心点(质心,均值) 4、重复2-3步直到满足某个终止条件,如质心位置不再发生变化,误差平方和局部最小,达到设定的迭代次数,没有样本被重新分配给不同的聚类中心 |
公式 | 质心ui=Σx /|Cj|,Cj为簇,x为点位置 k值选择、距离度量 |
调参 | k值选择、多次测试 |
优点 | 容易实现,对于大数据集, K均值聚类算法相对是可伸缩和高效的, 它的计算复杂度是O(NKt)接近于线性, 其中N是数据对象的数目, K是聚类的簇数, t是迭代的轮数。 尽管算法经常以局部最优结束, 但一般情况下达到的局部最优已经可以满足聚类的需求 |
缺点 | 1、需要人工预先确定初始K值,且该值和真实的数据分布未必吻合。 2、K均值只能收敛到局部最优,效果受到初始值很大每次的结果不稳定。 3、易受到噪点的影响每次的结果不稳定。 4、样本点只能被划分到单一的类中。 5、无法很好地解决数据簇分布差别比较大的情况比如一类是另一类样本数量的100倍、 6、不太适用于离散分类 7、大规模数据集收敛较慢 |
适用问题 | 聚类 |
适用数据类型 | 数值型数据 |
一般过程:
(1)创建k个点作为起始质心(经常是随机选择)
(2)当任意一个点的簇分配结果发生改变时:
对数据集中的每个数据点
对每个质心
计算质心与数据点之间的距离
将数据点分配到距其最近的簇
对每一个簇,计算簇中所有点的均值并将均值作为质心
优化
(1) 数据归一化和离群点等预处理
(2) 合理选择K值
① 手肘法
尝试不同的K值, 并将不同K值所对应的损失函数画成折线, 横轴为K的取值, 纵轴为误差平方和所定义的损失函数。手肘法认
为拐点就是K的最佳值。手肘法是一个经验方法, 缺点就是不够自动化。
② Gap Statistic
Gap Statistic方法的优点是, 不再需要肉眼判断, 而只需要找到最大的Gap statistic所对应的K即可, 因此该方法也适用于批量化作业。在这里我们继续使用上面的损失函数, 当分为K簇时,对应的损失函数记为Dk。 Gap Statistic定义为,
其中E(logDk)是logDk的期望, 一般通过蒙特卡洛模拟产生。我们在样本所在的区域内按照均匀分布随机地产生和原始样本数一样多的随机样本, 并对这个随机样本做K均值, 得到一个Dk; 重复多次就可以计算出E(logDk)的近似值。
它可以视为随机样本的损失与实际样本的损失之差。
(3) 采用核函数
面对非凸的数据分布形状时,可能需要引入核函数来优化(核K均值算法,是核聚类方法的一种)
(4)K-means++算法
(5)ISODATA算法(迭代自组织数据分析法)
K近邻算法(KNN)
目的 | 计算新输入数据与样本点之间的距离,取前K个类别中占比最多的标签,实现分类 |
原理 | 利用训练数据对特征向量空间进行划分,并将划分结果作为最终算法模型。 1、准备数据,对数据进行预处理 |
公式 | K值选择,距离度量(欧氏距离、余弦相似度)、分类决策规则(如多数表决) |
调参 | k值过小,过拟合。K值过大,欠拟合。一般通过交叉验证法选择k值。 |
优点 | 1、易于理解,易于实现,无需估计参数,无需训练,没有显式训练过程 2、精度高、对异常值不敏感、无数据输入假定 |
缺点 | 1、当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。 3、计算复杂度高、空间复杂度高 |
适用问题 | 多类分类(主要);回归 |
适用数据类型 | 数值型和标称型(离散型) |
python实现 | 交叉验证 from sklearn.model_selection import validation_curve |
简单地说,k近邻算法采用测量不同特征值之间的距离方法进行分类。
存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。输人没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处。通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。
流程
算法运行一般流程如下:
(1)收集数据:可以使用任何方法。
(2)准备数据:距离计算所需要的数值,最好是结构化的数据格式。
(3)分析数据:可以使用任何方法。
(4)训练算法:此步驟不适用于k近邻算法。
(5)测试算法:计算错误率。
(6)使用算法:首先需要输入样本数据和结构化的输出结果,然后运行k-近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理。
对未知类别属性的数据集中的每个点依次执行以下操作:
(1)计算已知类别数据集中的点与当前点之间的距离;
(2)按照距离递增次序排序;
(3)选取与当前点距离最小的k个点;
(4)确定前k个点所在类别的出现频率;
(5)返回前k个点出现频率最高的类别作为当前点的预测分类。
支持向量机(Support Vector Machine,SVM)
目的 | 将实例表示为空间中的点,将使用一条直线/一个分离超平面分隔数据点,求解能够正确划分训练数据集并且几何间隔最大的分离超平面wx+b=0 |
原理 | 1、转化为最优化问题,求解点到分离超平面的距离和并使其最大max(2/||w||),转化为求最小公式min(||w||^2/2) 2、使用拉格朗日乘子法最优化问题转换为min max L(w,λ),不等式约束优化,通过引入松弛变量,转为等式约束优化,再通过引入拉格朗日乘子,转为无约束优化(拉格朗日函数对所有优化变量求偏导,并令值为0) 3、对偶问题转化,利用强对偶性转化为max minL(w,λ) 4、利用SMO算法求解最优解λ 5、求偏导时求得w以及支持向量的均值b 6、构造最大分离超平面wx+b=0,分类决策函数f(x)=sign(wx+b),sign(·)是阶跃函数,输入新样本点即可求得样本分类 7、以上是完全线性可分(硬间隔)求解过程,对于大部分线性可分问题需要增加软间隔,引入松弛变量ζ,优化目标变为min(||w||^2/2)+CΣζ,求解过程与上面类似 8、对于非线性可分问题(圆形分隔线),将二(低)维线性不可分样本映射到高维空间中,让样本点在高维空间线性可分,引入核函数,核函数的价值在于虽然将特征进行从低维到高维的转换,但事先在低维上进行计算,而将实质上的分类效果表现在了高维上,避免了直接在高维空间中的复杂计算,减少计算量,也减少了存储数据的内存使用量 |
调参 | 分类超平面,核技巧 学习策略:极小化正则化合页损失,软间隔最大化 损失函数:合页损失 学习算法:序列最小最优化算法(SMO) 优化方法:一般选择线性核函数,效果不好上高斯核函数,高斯核函数可以映射到无限维空间 |
优点 | 有严格的数学理论支持,可解释性强,不依靠统计方法,从而简化了通常的分类和回归问题; 能找出对任务至关重要的关键样本(即:支持向量); 采用核技巧之后,可以处理非线性分类/回归任务; 最终决策函数只由少数的支持向量所确定,计算的复杂性取决于支持向量的数目,而不是样本空间的维数,这在某种意义上避免了“维数灾难”。 |
缺点 | 训练时间长。当采用 SMO 算法时,由于每次都需要挑选一对参数,因此时间复杂度为O(N^2),其中 N 为训练样本的数量; 当采用核技巧时,如果需要存储核矩阵,则空间复杂度为O(N^2) ; 模型预测时,预测时间与支持向量的个数成正比。当支持向量的数量较大时,预测计算复杂度较高。 |
适用问题 | 二类分类,支持非线性可分样本分类问题,支持向量机目前只适合小批量样本的任务,无法适应百万甚至上亿样本的任务(样本数量较大,计算复杂度高,训练耗时长) |
适用数据类型 | |
python实现 |
决策树(Decision Tree)
决策树是一种基本的分类与回归方法,此处主要讨论分类的决策树。
目的 | 在分类问题中,表示基于特征对实例进行分类的过程,可以认为是if-then的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。 根据给定的训练数据集构建一个决策树模型,使它能够对实例进行正确的分类。 |
原理 | 一种树形结构,其中每个内部节点表示一个属性上的判断,每个分支代表一个判断结果的输出,最后每个叶节点代表一种分类结果。 决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得各个子数据集有一个最好的分类的过程。这一过程对应着对特征空间的划分,也对应着决策树的构建。 1) 开始:构建根节点,将所有训练数据都放在根节点,选择一个最优特征,按着这一特征将训练数据集分割成子集,使得各个子集有一个在当前条件下最好的分类。 2) 如果这些子集已经能够被基本正确分类,那么构建叶节点,并将这些子集分到所对应的叶节点去。 3)如果还有子集不能够被正确的分类,那么就对这些子集选择新的最优特征,继续对其进行分割,构建相应的节点,如果递归进行,直至所有训练数据子集被基本正确的分类,或者没有合适的特征为止。 4)每个子集都被分到叶节点上,即都有了明确的类,这样就生成了一颗决策树。
步骤:特征选择、决策树的生成、决策树的修剪 用决策树分类:从根节点开始,对实例的某一特征进行测试,根据测试结果将实例分配到其子节点,此时每个子节点对应着该特征的一个取值,如此递归的对实例进行测试并分配,直到到达叶节点,最后将实例分到叶节点的类中。
决策树学习的本质:从训练集中归纳出一组分类规则,或者说是由训练数据集估计条件概率模型。 决策树学习的损失函数:正则化的极大似然函数 决策树学习的测试:最小化损失函数 决策树学习的目标:在损失函数的意义下,选择最优决策树的问题。 决策树原理和问答猜测结果游戏相似,根据一系列数据,然后给出游戏的答案。 |
调参 | 学习算法:特征选择,决策树生成,决策树剪枝 学习策略:正则化的极大似然估计 损失函数:对数似然损失(损失函数最小化) |
优点 | 1、计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据 2、可读性高,分类速度快 |
缺点 | 可能会产生过度匹配(过拟合)问题(剪枝处理:预剪枝、后剪枝;模型融合:bagging-GBDT、boosting-RF) |
适用问题 | 多类分类(分类树,主要讨论),回归(回归树),监督学习 |
适用数据类型 | 离散值 连续值(如采用二分法对连续值处理) |
python实现 |
一般流程:
- 寻找划分数据集的最好特征(信息增益最大--ID3、增益率最大--启发式C4.5、基尼指数最小--CART),将无序的数据变得更加有序
- 划分数据集
- 创建分支节点
- 剪枝处理
(1)收集数据:可以使用任何方法。
(2)准备数据:树构造算法只适用于标称型数据,因此数值型数据必须离散化。
(3)分析数据:可以使用任何方法,构造树完成之后,我们应该检查图形是否符合预期。
(4)训练算法:构造树的数据结构。
(5)测试算法:使用经验树计算错误率。
(6)使用算法:此步骤可以适用于任何监督学习算法,而使用决策树可以更好地理解数据的内在含义。
划分数据集方法
熵 (entropy)/信息熵(information entropy):信息的期望值
信息增益(information gain)
增益率 (gain ratio)
增益率准则对可取值数目较少的属性有所偏好,因此 , C4.5算法并不是直接选择增益率最大的候选划分属性,而是使用了一个启发式[Quinlan , 1993]: 先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。
基尼指数(Gini index)
剪枝(pruning)处理
降低过拟合风险,减少了训练时间开销和测试时间开销。但有些分支的当前划分虽不能提升泛化性能、甚至可能导致泛化性能暂时下降,但在其基础上进行的后续划分却有可能导致性能显著提高;预剪枝基于"贪心"本质禁止这些分支展开,给预剪枝决策树带来了欠拟含的风险。
- 预剪枝:是指在决策树生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点
使用验证集对这个单结点决策树进行评估,精度是否提高,若没有提高则剪枝不做划分
- 后剪枝:则是先从训练集生成一棵完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点
后剪枝决策树通常比预剪枝决策树保留了更多的分支。一般情形下,后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树。但后剪枝过程是在生成完全决策树之后进行的,并且要自底向上地对树中的所有非叶结点进行逐一考察,因此其训练时间开销比未剪枝决策树和预剪枝决策树都要大得多。
评价泛化性能好坏的方法:划分训练集、验证集、测试集
- 留出法
- 交叉验证法
- 自助法(在数据集较小、难以有效划分训练/测试集时很有用)
- 调参
关联规则(Association Rules)
目的 | 反映一个事物与其他事物之间的相互依存性和关联性,是数据挖掘的一个重要技术,用于从大量数据中挖掘出有价值的数据项之间的相关关系。 是一种基于规则的机器学习方法,用于从数据集中寻找物品之间的隐含关系。 |
原理 | 语义明确、能描述数据分布所隐含的客观规律或领域概念,可写成”若…,则…“形式的逻辑规则,从训练数据中学习出一组能用于对未见示例进行判别的规则,同时设置默认规则(缺省规则)处理未覆盖样本 |
调参 | 当同一示例背叛别不同结果,产生冲突,解决方法为冲突消解策略,常用投票法、排序法、元规则法 Apriori算法 衡量方法:支持度、置信度 误区: 1、强规则,但各个商品的支持度相差太多,没有实际意义,设定阈值后能在一定程度上避免。 2、强规则,可能存在某种联系,也可能只是同时出现而已,结合业务,注意不过分解读。 |
优点 | 可解释性强,能使用户更直观对判别过程有所了解。数理逻辑具有极强的表达能力 |
缺点 | |
适用问题 | 可用来寻找购物篮数据之间的联系,方便进行交叉销售;可以进行文本挖掘;也可使用在其他领域比如生物信息学、医疗诊断、地球科学等,发现一些有趣的联系。 |
适用数据类型 | |
python实现 |
随机森林(random forest)
目的 | |
原理 | |
调参 | |
优点 | |
缺点 | |
适用问题 | |
适用数据类型 | |
python实现 |
原理
采用随机的方式生成一个森林,森林由很多决策树组成,个决策树之间没有相关联系,当一个样本输入随机森林时,每个决策树都对样本进行判断,随机森林的最终输出由每一棵决策树的结果共同决定。如果是分类树则通过投票产生最终分类,如果是回归树则取所有结果的平均值。
注意:两个随机采样和完全分裂,对bagging(投票法)做了小改动(属性不完全采样)
单棵决策树生成:
- 行采样:有放回的随机采样,输入训练样本M个,单棵决策树采样样本也为M个,避免过拟合(所以不用剪枝处理,主要通过控制 树的深度(max_depth),结点停止分裂的最小样本数(min_size)等参数)
- 列采样:输入训练样本特征数N个,单棵决策树特征随机选择n个(n<<N),一般推荐值或
- 完全分裂:采样后的数据使用完全分裂的方式建立出决策树(完全分裂指的是决策树每一次分裂扩展节点时,能分裂必须分裂,分裂依据可以是信息增益或者增益率),这样决策树的某一个叶子节点要么是无法继续分裂的,要么里面的所有样本的都是指向的同一个分类
优缺点
优点 | 简单、容易实现、计算开销小 在很多现实任务中展现出强大的性能,随机森林的训练效率常优于 Bagging 对于高维度特征,不用做特征选择(但选择特征子集后,再选择一个最优属性用于划分) 训练速度快,可用并行计算处理方式(树与树之间相互独立) |
缺点 | 随机森林已经被证明在某些噪音较大的分类或回归问题上会过拟 对于有不同取值的属性的数据,取值划分较多的属性会对随机森林产生更大的影响,所以随机森林在这种数据上产出的属性权值是不可信的 |
适用数据类型 | 数值型(回归树) 离散型(分类树) |
Gradient boosting Decision Tree(GBDT) 梯度提升树
目的 | |
原理 | |
调参 | |
优点 | |
缺点 | |
适用问题 | |
适用数据类型 | |
python实现 |
DBSCAN密度聚类
目的 | |
原理 | 选择未访问点, 1.将所有点标记为核心点、边界点或噪声点; 2.删除噪声点; 3.为距离在Eps之内的所有核心点之间赋予一条边; 4.每组连通的核心点形成一个簇; 5.将每个边界点指派到一个与之关联的核心点的簇中(哪一个核心点的半径范围之内)。 |
公式 | 1.ε邻域:对象O为中心,ε为半径的空间。 2.MinPts(邻域密度阈值):对象O的ε邻域内的对象数量。 3.核心对象:如果对象O的ε邻域至少包含MinPts个对象,则该对象是核心对象。 4.密度直达:如果对象p在核心对象O的.ε邻域内,则p是从O密度直达。 5.密度可达:对xi和xj,如果存在样本序列p1,p2,..,pn,其中p1=xi,pn=xj且pi+1由pi密度直达,则xj由xi密度可达。 6.密度相连:对xi和xj,若存在xk使得xi与xj均由xk密度可达,则称xi与xj密度相连。 |
调参 | |
优点 | 1. 与K-means方法相比,DBSCAN不需要事先知道要形成的簇类的数量。 2. 与K-means方法相比,DBSCAN可以发现任意形状的簇类。 3. 同时,DBSCAN能够识别出噪声点。 4.DBSCAN对于数据库中样本的顺序不敏感,即Pattern的输入顺序对结果的影响不大。但是,对于处于簇类之间边界样本,可能会根据哪个簇类优先被探测到而其归属有所摆动。 |
缺点 | 1. DBScan不能很好反映高维数据。 2. DBScan不能很好反映数据集变化的密度。 3.如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差。 DBSCAN对用户定义的参数很敏感,细微的不同都可能导致差别很大的结果,而参数的选择无规律可循,只能靠经验确定。 |
适用问题 | 密度聚类 |
适用数据类型 | |
python实现 |
朴素贝叶斯(Naive Bayes Classifier,或 NBC)
一般过程:
(1)收集数据:可以使用任何方法。
(2)准备数据:需要数值型或者布尔型数据。
(3)分析数据:有大量特征时,绘制特征作用不大,此时使用直方图效果更好。
(4)训练算法:计算不同的独立特征的条件概率。
(5)测试算法:计算错误率。
(6)使用算法:一个常见的朴素贝叶斯应用是文档分类。可以在任意的分类场景中使用朴素贝叶斯分类器,不一定非要是文本。
优缺点
优点 | 在数据较少的情况下仍然有效,可以处理多类别问题 |
缺点 | 对于输入数据的准备方式较为敏感 |
适用数据类型 | 标称型数据 |
PS
由统计学知,如果每个特征需要N个样本,那么对于10个特征将需要个样本,对于包含1000个特征的词汇表将需要个样本。可以看到,所需要的样本数会随着特征数目增大而迅速增长。如果特征之间相互独立,那么样本数就可以从减少到1000*N。所谓独立(independence )指的是统计意义上的独立,即一个特征或者单词出现的可能性与它和其他单词相邻没有关系。
异常检测(Anomaly Detection)
异常检测主要用于非监督学习问题。给定数据集,假使数据集正常时,测试新数据是否异常,即这个测试数据不属于该组数据的几率如何。因此构建模型需要能够根据测试数据的位置,计算是否异常的可能性p(x)。此为密度估计方法。
流程
通常,应用高斯分布(也叫正态分布)开发异常检测算法。
选择特征
异常检测假设特征符合高斯分布,如果数据的分布不是高斯分布,异常检测算法也能够工作,但是最好还是将数据转换成高斯分布,例如使用对数函数:,其中 c 为非负常数; 或者,c 为 0-1 之间的一个分数,等方法。 (注:在 python 中,通常用 np.log1p()函数, 就是,可以避免出现负数结果,反向函数就是 np.expm1())
误差分析
一个常见的问题是一些异常的数据可能也会有较高的 p(x) 值,因而被算法认为是正常的。这种情况下误差分析能够帮助我们,我们可以分析那些被算法错误预测为正常的数据,观察能否找出一些问题。我们可能能从问题中发现我们需要增加一些新的特征,增加这些新特征后获得的新算法能够帮助我们更好地进行异常检测。
构建
异常检测算法是一个非监督学习算法,意味着我们无法根据结果变量 ? 的值来告诉我们数据是否真的是异常的。我们需要另一种方法来帮助检验算法是否有效。当我们开发一个异常检测系统时,我们从带标记(异常或正常)的数据着手,我们从其中选择一部分正常数据用于构建训练集,然后用剩下的正常数据和异常数据混合的数据构成交叉检验集和测试集。
例如:我们有 10000 台正常引擎的数据,有 20 台异常引擎的数据。 我们这样分配数据:
- 6000 台正常引擎的数据作为训练集
- 2000 台正常引擎和 10 台异常引擎的数据作为交叉检验集
- 2000 台正常引擎和 10 台异常引擎的数据作为测试集
评价
1. 根据测试集数据,我们估计特征的平均值和方差并构建 ?(?) 函数
2. 对交叉检验集,我们尝试使用不同的 ? 值作为阀值,并预测数据是否异常,根据 F1 值或者查准率与查全率的比例来选择 ?
3. 选出 ? 后,针对测试集进行预测,计算异常检验系统的 F1 值,或者查准率与查全率之比。
应用
异常检测主要用来识别欺骗。例如在线采集而来的有关用户的数据,一个特征向量中可能会包含如:用户多久登录一次,访问过的页面,在论坛发布的帖子数量,甚至是打字速度等。尝试根据这些特征构建一个模型,可以用这个模型来识别那些不符合该模式的用户。
再一个例子是检测一个数据中心,特征可能包含:内存使用情况,被访问的磁盘数量,CPU 的负载,网络的通信量等。根据这些特征可以构建一个模型,用来判断某些计算机是不是有可能出错了。
飞机引擎生产线上的质量控制测试,预测新的引擎是否有某种异常或者是否需要进一步测试。
异常检测与监督学习的对比
异常检测 | 监督学习 |
---|---|
非常少量的正向类(异常数据 ? = 1), 大量的负向类(? = 0) | 同时有大量的正向类和负向类 |
许多不同种类的异常,非常难。根据非常少量的正向类数据来训练算法 | 有足够多的正向类实例,足够用于训练算法,未来遇到的正向类实例可能与训练集中的非常近似 |
未来遇到的异常可能与已掌握的异常、非常的不同 | |
例如: 欺诈行为检测 生产(例如飞机引擎)检测数据中心的计算机运行状况 | 例如:邮件过滤器 天气预报 肿瘤分类 |
优化
假使两个特征相关且值域范围比较宽,一般的高斯分布模型可能无法很好的识别异常数据。即一般的高斯分布模型会尝试同时抓住两个特征的偏差,创造的判定边界较大,比实际范围大不少,影响识别精度。故采用多元高斯分布模型优化:构建特征协方差矩阵。
原高斯分布模型 | 多元高斯分布模型 |
---|---|
不能捕捉特征之间的相关性 但可以通过将特征进行组合的方法来解决 | 自动捕捉特征之间的相关性 |
计算代价低,能适应大规模的特征 | 计算代价较高 训练集较小时也同样适用 |
必须要有 m > n ,不然的话协方差矩阵不可逆的,通常需要 ,另外特征冗余也会导致协方差矩阵不可逆 |
卷积神经网络(CNN)
目的 | TEXTCNN,设定窗口,然后对窗口内的若干词进行卷积操作,得到这个窗口内的词的嵌入表示 |
原理 | |
调参 | |
优点 | |
缺点 | |
适用问题 | |
适用数据类型 | |
python实现 |
循环神经网络(RNN)
分为LSTM与GRU,主要介绍LSTM。
目的 | 基于LSTM/GRU的,基于单向(从左向右)或者双向的RNN模型,对整个序列进行建模,得到每个词的语境下的嵌入表示 |
原理 | |
调参 | |
优点 | |
缺点 | |
适用问题 | |
适用数据类型 | |
python实现 |
注意力机制ATTENTION
目的 | |
原理 | |
调参 | |
优点 | |
缺点 | |
适用问题 | |
适用数据类型 | |
python实现 |
BERT
目的 | |
原理 | |
调参 | |
优点 | |
缺点 | |
适用问题 | |
适用数据类型 | |
python实现 |
ELMo
目的 | |
原理 | |
调参 | |
优点 | |
缺点 | |
适用问题 | |
适用数据类型 | |
python实现 |
GPT
目的 | |
原理 | |
调参 | |
优点 | |
缺点 | |
适用问题 | |
适用数据类型 | |
python实现 |
Transformer
目的 | |
原理 | |
调参 | |
优点 | |
缺点 | |
适用问题 | |
适用数据类型 | |
python实现 |