机器学习:从数据中获得决策(预测)函数,使得机器能从大量历史数据中学习规律从而对新的样本做决策。
监督学习与非监督学习:简单来说,监督学习可以分出训练集和测试集数据,训练集有因变量y,用训练集拟合模型后,再去预测测试集的y来评估模型效果,最后才投入使用预测新的数据;而非监督学习没有因变量y,也就不存在训练集,直接用。
模型分类(根据目的划分):
分类——指的是预测的y是离散的,比如二分类、多分类;
回归——指的是预测的y是连续的,比如线性回归预测房价;
聚类——指的是将数据集划分成几类数据,类内数据相近(距离近),类与类之间数据差异较大(距离远);
关联分析——指的是在一堆事务(一个事务由多个元素项组成,比如一台电脑搜索过的关键词)中发现x—>y(意思是,x和y都是元素项,x和y出现次数足够多,x出现时y也出现的比例足够大)的模式;
频繁项发掘(只是关联分析的前一部分)——指的是在一堆事务中发现某些元素一起出现次数足够多,称为频繁的元素项的集合;
降维——指的是在维度特别多时可能需要将一些不重要的维度去掉或融合成一个新的维度,比如某两个维度存在共线性问题(即变化完全相同,没必要都留下)。
“原理概述”栏目:
在学习机器学习的过程中发现,最难的就是理解算法原理。毕竟某些算法涉及的公式、概念是需要数学基础的。但在应用中又没必要知道那么多,知道那么多结果发现根本应用不了场景才是最可怜的(显然,基础算法本来就不能直接应用场景,需要根据业务进行改动或创造)。而sklearn里又包含了足够丰富的算法,所以有时候没太大必要重复造轮子,避免在最初因为造轮子湮灭了学习机器学习的兴趣。
而这个栏目,我会尽量尝试用不同角度、不同程度、不同完整度、不同叙述方法去阐述算法原理,所以里面会有很多种版本,其中最简单的阐述就是“一句话概述”。如果你能看懂其中某一种,那么就可以直接去用代码了。
“代码API”栏目:
这部分会尽量以API的概念提供直接可用的代码。代码可以有不同的设计方案,所以这里也会有不同版本,可以互相参考和理解。
其他栏目:
比如优缺点、应用范围等等,我不会写官方的那些内容。我只用简单的语言写我能理解、认可以及认为有意义的部分。
术语部分:
机器学习top10算法:
C4.5,k-Means,SVM,Apriori,EM,PageRank,AdaBoost,kNN,NaiveBayes,andCART,十大算法都有汇总到,第一个和最后一个是决策树模型的两种算法,基础都是ID3。
优点:简单好理解;
缺点:计算量大,预测慢。
标称型
(数值型数据需要先人为划分为几类成为标称型数据,比如数值型的年龄,需要先划分为类似“青年、中年、老年”这样)
1.这里涉及到信息混乱度,用一个称为“熵”的度量计算。
2.划分前与划分后混乱度的差越大,说明划分后的数据越不混乱,即达到想要的目的,称为“信息增益”。
3.如果特征值都用完了某块数据还不是同一类,可以将类别占比较多的作为该块的类别(即少数服从多少)。
4.特征太多,数据太乱,构建出来的决策树这颗数可能过于“枝繁叶茂”,就存在过拟合问题,泛化能力较差(说人话就是,由于某些少量样本导致了不必要的分支,使得进来的新数据容易被错分,这模型也就不够普适了——所谓的模型越简单越好泛化)。这就需要一个形象地称为“剪枝”的过程,有“先剪枝”和“后剪枝”两种。“先剪枝”就是设定一个阈值,在给树不断加枝干时判断是否小于阈值,小于阈值就不要继续直接按少数服从多少给这一块盖戳结束;“后剪枝”就是决策树构建好之后,再剪掉小于阈值的枝干。
度量:信息增益,目标函数:max(信息增益)
1.朴素贝叶斯,“贝叶斯”我们知道是算法里应用的是贝叶斯定理,“朴素”的由来是指假设每个词条(词汇)的出现互相独立,显然某些词条还是有关联的,但朴素贝叶斯在某些领域(例如垃圾邮件过滤)效果也不错。
2.根据贝叶斯定理,要计算给定Document属于某个Category,只需要算出P(Document|Category),P(Category),P(Document)即可;
3.在计算中,由于每个词条都是特征变量,计算量大,所以是采用向量化计算的,具体过程大致是:
a.将训练文档集按词条去重得到词条集合的列表(也称“词条字典”);
b.计算每个类别的概率P(Category1)=文档为1类别数/总文档数;
c.计算每个类别中各个词条的概率向量P(word1,word2,word3,...|Category),向量的每个元素是每个词条在该类别文档中出现的次数(一个文档出现多次算1次)/该类别文档总词条数。
d.那么,计算某个给定文档属于某个类别的条件概率,首先将该文档向量化Vectorized_Samples_list(既改成同字典长度的向量,在该文档出现的词条对应索引的值为1,其他为0),则P(Category_1|Document)=sum(Vectorized_Samples_list*P(word1,word2,word3,...|Category1))*P(Category1)。
4.上述由于小数乘以小数会导致数值太小python直接返回0(即"下溢出”问题),所以可以改成取对数,即P(Category_1|Document)=sum(Vectorized_Samples_list*log(P(word1,word2,word3,...|Category1)))+log(P(Category1))。
5.上面每个词条出现就记为1,不出现记为0的简单模式称为“词集模式”,但更好的可能还需要剔除重要性低没有意义的高频词和停用词(例如“I”,“am”这种),且同一个词条出现的频次也可能需要叠加,这样的模式称为“词袋模式”。
度量:条件概率
1.SVM是个二分类问题,要解决多分类问题,是需要建立多个SVM分类器,比如五个分类的,先建立第1分类还是第2至5分类这样二分类的SVM,再叠加是第2分类还是第3至5分类这样二分类的SVM,以此类推。
2.在1个特征(1维)的问题里,超平面是一个点;在2个特征(2维)的问题里,超平面是一条线;在3个特征(3维)的问题里,超平面是一个面。超平面并不是指一个平面,只是一个代称,在n维问题里,超平面通常是n-1维的。
3.建立的两个平行于超平面穿过量类别离超平面最近的边界点的平面,称为“支持向量”,这些边界点称为“支持向量点”。
4.整个模型只受到“支持向量点”影响,其他点去掉与否都不影响。
5.这个算法的主要难点是如何“找到使得两支持矢量距离最远的超平面”,这里涉及到拉格朗日等概念。
6.如果无法用一个超平面来区分为两类,称为“线性不可分”问题,就涉及到要将“线性不可分”转为“线性可分”问题。通常是通过升维来进行,比如一个二维的非线性问题,可能通过映射到3维从而变得线性可分。
度量:两支持向量的最小距离,目标函数:min(两支持向量的距离)
1.Sigmoid函数是一个x值域是(-∞,+∞),y值域是(0,1)的单调递增函数;
2.预测y值>0.5为1类,<0.5为0类,y值也可以解释为为1和0类的概率;
3.同样使用“最小二乘”概念,求得最佳方程,得到目标函数;
4.要使得目标函数达到最小,需要采用一种称为“梯度下降”的算法,其过程大致为:在一个类似山脉的超平面上,从任一点出发,计算偏导数,沿着偏导数为负的方向前进一定距离(称为“学习速率”),直到初始点与移动后的点差值变化很小(称为“收敛”)为止。
度量:最小二乘,目标函数:最小二乘,目标函数解法:梯度下降
1.分类器集成方法是叠加多个同类或不同类的弱分类器(错误率较高),以达到降低错误率的目的。目前有两种方法,一种是bagging方法(代表是随机森林),另一种是boosting方法(代表是AdaBoost)。其区别在于,bagging方法每个弱分类器是并行,权重是一样的;而boosting方法每个弱分类器的串行的,权重不一样,其权重取决于其训练分类时的成功度。
2.本算法的两个难点在于,在迭代过程中如何调整下一次迭代的各样本的权重,以及如何计算每个分类器的权重。
3.注意AdaBoost算法要求分类标签是-1和1,不是0和1,多分类问题也还是需要处理为多个二分类问题。
4.第一次迭代每个样本的权重是一样的,第二次迭代根据第一次迭代预测分类结果是否正确重新调整权重,正确调整为下面左边的权重,错误调整为下面右边的权重(其中D是上一次迭代每个样本权重的向量,α是上一次迭代分类器的权重)。
5.每个分类器的权重为
其中ε是该分类器的错误率=未正确分类的样本数/总样本数。
6.每个分类器的权重*分类结果(-1或1)之和大于0,预测结果为1;小于0,预测结果为-1.
1.简单线性回归模型:y=β0+β1x+ε,β0称为截距,β1称为斜率,ε称为偏差。
2.该算法的难点在于找到一条最佳的直线,什么时候最佳呢?有一种称为“最小二乘法”的概念表示每个点到这条直线的距离平方和最小就是最佳;
3.根据“最小二乘法”,求得
4.1中的方程式是真实y值和真实x值,ε是表达在预测值上加的一些偏差,实际求得的y是期望值。
度量:最小二乘
1.多元回归模型:y=β0+β1x1+β2x2+...+βpxp+ε.
2.同样根据“最小二乘法”算得b0、b1、b2...,其中涉及到代数、矩阵运算。
1.需要给定划分为几个分类,有一个统计量SSE可以辅助测算划为分几类比较合理。
2.初始点的选择会影响结果。
度量:点与点的距离
(类似购买商品清单的数据)
1.关联规则有两部分,一是频繁项集挖掘,二是关联规则生成。
2.频繁项集挖掘的是通过计算项集的支持度(项集出现次数/事务次数)是否大于给定的最小支持度实现的;
那么该算法的难点就转化为如何快速判断所有项集的支持度是否大于最小支持度和所有规则的置信度是否大于最小置信度的问题。
3.Apriori的一个重要原理是,如果某个项集是频繁的,那么它的所有子集也是频繁的。这个观点直观上没什么用,但反过来就有用了,也就是如果一个项集是非频繁集,那么它的所有超集也是非频繁的。
所以在判断所有项集的支持度是否大于最小支持度时,可以从单个项集开始,如果单个项集支持度小于最小支持度,那么就不用判断叠加其他元素的项集了,依此类推完成判断完所有项集。
4.同理,如果某条规则不满足最小可信度要求,那么该规则的所有子集也就不满足最小可信度要求。
所以在判断所有规则的置信度是否大于最小置信度时,可以先1个频繁项集开始,先生成右侧包含1个元素的规则列表判断置信度,置信度小于最小置信度的节点下面几层右侧包含多个元素的置信度也很低,依此类推。(事实上这个过程我不太熟,后面再说)
度量:支持度,置信度
1.一个事务是类似一次购买商品清单的数据,所有事务样本就是一堆类似购买清单的数据。
2.元素项指的是每个商品,元素项集指的是元素项的组合(例如:多个商品,包括1个)。
3.支持度就是出现次数/总事务数,支持度指的是元素项集的支持度。
4.最小支持度是需要人为给定的,小于这个阈值的将去除。
5.频繁项集是事务中大于最小支持度的所有元素项集。
6.FP-tree是一个存储事务的存储结构,方便遍历,相比Apriori算法的多次遍历,FP-growth只需要遍历两次原始数据。
度量:支持度
2.理解上,比如二维数据散点图,第一个坐标轴就是覆盖数据的最长那条线A,第二个坐标轴是正交(垂直)于它的方差最大的那条线B,此时B的影响不是很大可以去掉,即转化成一维数据,更方便分类了。
2.计算过程涉及到协方差,大致过程:
3.其他降维技术还有因子分析、独立成分分析,PCA是应用范围最为广泛的。
优点:降低数据复杂性,保留最重要的几个特征。
缺点;不一定需要,可能损失有用信息。
1.理解上,例如用户是否看过图书的100w*1w大小的矩阵数据(行向量是用户,列向量是图书),事实上可以分解成三个小矩阵乘积的形式来近似。
其中,Σ只有对角元素,其余为0,对象元素是从大到小排列,这些对角元素称为奇异值。
2.仅需保留90%能量信息(用平方和度量)或上万维度时保留前两三千的奇异值即可近似于原始矩阵。
1.在EM算法目的的理解上,例如应用在高斯混合模型中:
假如从学校中分别抽取男100人,女100人,假设这两类人群分别都是服从高斯分布(正态分布,一般都符合正态分布)的,可以算出两类人群的均值和方差,这两样本均值就是对校园的两类人群总体的似然估计。
那么,假如我们不知道分男女,只是抽取了100人,那此时直接算均值和方差就不具有代表性了,因为其中有一个隐变量——性别,这实际是两个高斯分布混合在一起,那么EM算法就可以更好地进行参数估计。
2.EM算法分两步,第一步是期望步骤(E-step)——对极大似然取对数,第二步是最大化步骤(M-step)——对每个样例的每个可能类别z求联合分布概率和。
1.核心思想:
如果一个网页被很多其他网页链接到的话说明这个网页比较重要,也就是PageRank值会相对较高;如果一个PageRank值很高的网页链接到一个其他的网页,那么被链接到的网页的PageRank值会相应地因此而提高。