目录
熵 (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个类别中占比最多的标签,实现分类 |