zoukankan      html  css  js  c++  java
  • 【机器学习算法应用和学习_1_基础篇】1.1 机器学习框架

    系列说明


    【机器学习算法应用和学习】是以学习应用机器学习为目标的系列文章,该系列主要包括以下几个板块:

    1.基础篇——主要介绍机器学习框架、基础库(包括padas/numpy/matplotlib/sklearn/scipy几个库),每个部分是一篇文章;

    2.理论篇——介绍机器学习的主要模型,会用不同版本的阐述去解释模型,便于不同程度的学习者理解,其他还包括模型主要流行的算法、模型特点、模型主要节点阐述等,每个算法是一篇文章;

    3.代码API篇——提供机器学习主要模型直接可用的代码API,会提供不同版本的API,最简单的API一般是sklearn的方法调用,每个算法是一篇文章;

    4.应用篇——主要结合实际例子去组织整个应用模型的案例,涉及到数据加载-预处理-模型选择和使用-模型评估-模型保存整个应用全过程,每个 案例-模型 是一篇文章。

    基础概念


    机器学习:从数据中获得决策(预测)函数,使得机器能从大量历史数据中学习规律从而对新的样本做决策。

    监督学习与非监督学习:简单来说,监督学习可以分出训练集和测试集数据,训练集有因变量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, Naive Bayes, and CART,十大算法都有汇总到,第一个和最后一个是决策树模型的两种算法,基础都是ID3。

    机器学习基础算法汇总 
    一级分类 二级分类 模型 难度 一句话概述 输入 输出 原理概述 模型特点/节点思考 优缺点 应用范围 代码API 相关文章
    监督学习 分类 KNN(K近邻)  计算所有样本与给定实例的距离,将距离最小的20个样本的所属类别中最多的作为给定实例的类别。  一般为数值型  所给定实例的类别    1.没有模型训练过程,每次预测给定实例的类别时,都需要计算所有样本与它的距离。

    优点:简单好理解;

    缺点:计算量大,预测慢。 

         
    监督学习 分类 决策树(这里讲ID3) ☆☆  将测试集挨个按特征的特征值划分,计算划分前与划分后的混乱度之差,将差最大的特征作为第一层节点,得到被该特征的特征值划分出来几块数据。再将这几块数据分别按上面的步骤重复进行(递归过程),直到该块都是同一类或特征值用完为止。

     标称型

    (数值型数据需要先人为划分为几类成为标称型数据,比如数值型的年龄,需要先划分为类似“青年、中年、老年”这样)

    所 给定实例的类别  

    1.这里涉及到信息混乱度,用一个称为的度量计算。

    2.划分前与划分后混乱度的差越大,说明划分后的数据越不混乱,即达到想要的目的,称为信息增益

    3.如果特征值都用完了某块数据还不是同一类,可以将类别占比较多的作为该块的类别(即少数服从多少)。

    4.特征太多,数据太乱,构建出来的决策树这颗数可能过于“枝繁叶茂”,就存在过拟合问题,泛化能力较差(说人话就是,由于某些少量样本导致了不必要的分支,使得进来的新数据容易被错分,这模型也就不够普适了——所谓的模型越简单越好泛化)。这就需要一个形象地称为“剪枝”的过程,有“先剪枝”和“后剪枝”两种。“先剪枝”就是设定一个阈值,在给树不断加枝干时判断是否小于阈值,小于阈值就不要继续直接按少数服从多少给这一块盖戳结束;“后剪枝”就是决策树构建好之后,再剪掉小于阈值的枝干。

    度量:信息增益,目标函数:max(信息增益)

           
    监督学习 分类 朴素贝叶斯 ☆☆ 目的是判断给定某个文档属于某类别的条件概率,根据贝叶斯定理,P( Category | Document) = P ( Document | Category ) * P( Category) / P(Document),这样计算出给定文档属于每一类的条件概率后,其中概率最大的类即为所属类别。

    标称型

    (一个样本可以是一封邮件、一条评论,其中每个单词会被拆成一个特征变量)

    所给定实例的类别  

     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”这种),且同一个词条出现的频次也可能需要叠加,这样的模式称为“词袋模式”。

    度量:条件概率

      用于文本分类,例如垃圾邮件过滤,识别侮辱性评论等    
    监督学习 分类 SVM ☆☆☆☆  将两个类别的数据以一个超平面划分(这样的超平面有很多),并调整截距参数建立两个平行的穿过两类别离超平面最近的边界点的平面,目的就是寻找使得两平面距离最远的超平面。  数值型 所 给定实例的类别  

     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(两支持向量的距离)

           
    监督学习 分类 逻辑回归 ☆☆☆  实际y值是0和1的二分类,用回归解法解决二分类问题,通过引入一个Sigmoid函数将中间y值映射到实际二分类y值上。  数值型(标称型需要独热编码  所 给定实例的类别  

     1.Sigmoid函数是一个x值域是(-∞,+∞),y值域是(0,1)的单调递增函数;

    2.预测y值>0.5为1类,<0.5为0类,y值也可以解释为为1和0类的概率;

    3.同样使用“最小二乘”概念,求得最佳方程,得到目标函数

    4.要使得目标函数达到最小,需要采用一种称为“梯度下降”的算法,其过程大致为:在一个类似山脉的超平面上,从任一点出发,计算偏导数,沿着偏导数为负的方向前进一定距离(称为“学习速率”),直到初始点与移动后的点差值变化很小(称为“收敛”)为止。

    度量:最小二乘,目标函数:最小二乘,目标函数解法:梯度下降

           
      分类器集成方法(提高分类性能) 随机森林(bagging的一种流行方法)  ☆☆☆  集成多个弱分类器,每个分类器权重一样,取多数预测结果作为分类结果。  数值型(标称型需要独热编码   所 给定实例的类别    略        
      分类器集成方法(提高分类性能) AdaBoost(boosting的一种流行方法)  ☆☆☆☆  给训练集每个样本相等的权重,用弱分类器训练取得训练结果标签向量,如果样本被错分权重调高,再用新的或同样的弱分类器训练,以此类推,直到错误率为0或达到设定的迭代次数。在预测时,将会按每个弱分类器的权重乘以分类结果(分类标签只能是-1和1,不是0和1)得到最终分类。  数值型(标称型需要独热编码  所 给定实例的类别  

     1.分类器集成方法是叠加多个同类或不同类的弱分类器(错误率较高),以达到降低错误率的目的。目前有两种方法,一种是bagging方法(代表是随机森林),另一种是boosting方法(代表是AdaBoost)。其区别在于,bagging方法每个弱分类器是并行,权重是一样的;而boosting方法每个弱分类器的串行的,权重不一样,其权重取决于其训练分类时的成功度。

    2.本算法的两个难点在于,在迭代过程中如何调整下一次迭代的各样本的权重,以及如何计算每个分类器的权重。

    3.注意AdaBoost算法要求分类标签是-1和1,不是0和1,多分类问题也还是需要处理为多个二分类问题。

    4.第一次迭代每个样本的权重是一样的,第二次迭代根据第一次迭代预测分类结果是否正确重新调整权重,正确调整为下面左边的权重,错误调整为下面右边的权重(其中D是上一次迭代每个样本权重的向量,α是上一次迭代分类器的权重)。

    5.每个分类器的权重为

    其中ε是该分类器的错误率=未正确分类的样本数/总样本数。

    6.每个分类器的权重*分类结果(-1或1)之和大于0,预测结果为1;小于0,预测结果为-1.

           
    监督学习 回归 简单线性回归  通过建立方程模拟自变量和因变量关系,其中因变量是连续变量的称为回归问题,而简单线性回归自变量只有1个,因变量1个,方程是一个一次方程(直线)。  1个连续型变量  所给定实例的y值  

     1.简单线性回归模型:y=β01x+ε,β0称为截距,β1称为斜率,ε称为偏差

    2.该算法的难点在于找到一条最佳的直线,什么时候最佳呢?有一种称为“最小二乘法”的概念表示每个点到这条直线的距离平方和最小就是最佳;

    3.根据“最小二乘法”,求得

    4.1中的方程式是真实y值和真实x值,ε是表达在预测值上加的一些偏差,实际求得的y是期望值。

    度量:最小二乘

           
    监督学习 回归 多元回归分析 ☆☆ 自变量多个的回归问题,称为多元回归分析。 多个连续型变量(也可以是标称型变量,但由于标称型变量只代表类别不代表具体值参与运算,所以需要独热编码,即有几个分类改成增加几个变量,某个变量值为1表示是某个分类,其他变量都为0) 所给定实例的y值  

     1.多元回归模型:y=β0+βx12x2+ ... +βpxp+ε.

    2.同样根据“最小二乘法”算得b0、b1、b2...,其中涉及到代数、矩阵运算。

    度量:最小二乘

           
    非监督学习 聚类 K-means ☆☆  给定需要分为k个分类,随机选择k个点作为中心点,计算每个点离这k个中心点的距离,将距离最小的作为该点的分类;再利用均值等计算这k个分类的新中心点,重复上面的计算,直到每个点的分类不再变化或迭代次数大于一定阈值结束。  连续型  所有样本的所属类别  

     1.需要给定划分为几个分类,有一个统计量SSE可以辅助测算划为分几类比较合理。

    2.初始点的选择会影响结果。

    度量:点与点的距离

           
    非监督学习 关联分析 Apriori ☆☆☆  关联算法的目的是找到形如A—>B的规则,涉及到两个部分,第一是频繁项挖掘,从单个项集逐渐增加元素组合判断是否大于最小支持度从而得到频繁项集;第二个部分是关联规则的生成,从一个频繁项集开始,创建一个规则列表(其中规则右部只含1个元素),然后判断这些规则的置信度是否大于最小置信度,再将剩下的规则合并创建新的规则列表(其中规则右部只含2个元素)判断是否大于最小置信度,以此类推。  

    标称型

    (类似购买商品清单的数据)

     发现形如A—>B的关联规则  

     1.关联规则有两部分,一是频繁项集挖掘,二是关联规则生成。

    2.频繁项集挖掘的是通过计算项集的支持度(项集出现次数/事务次数)是否大于给定的最小支持度实现的;

    关联规则的生成是同步计算规则的置信度(A—>B的置信度=support(A&B)/support(A))是否大于给定的最小置信度实现的。

    那么该算法的难点就转化为如何快速判断所有项集的支持度是否大于最小支持度和所有规则的置信度是否大于最小置信度的问题。

    3.Apriori的一个重要原理是,如果某个项集是频繁的,那么它的所有子集也是频繁的。这个观点直观上没什么用,但反过来就有用了,也就是如果一个项集是非频繁集,那么它的所有超集也是非频繁的。

    所以在判断所有项集的支持度是否大于最小支持度时,可以从单个项集开始,如果单个项集支持度小于最小支持度,那么就不用判断叠加其他元素的项集了,依此类推完成判断完所有项集。

    4.同理,如果某条规则不满足最小可信度要求,那么该规则的所有子集也就不满足最小可信度要求。

    所以在判断所有规则的置信度是否大于最小置信度时,可以先1个频繁项集开始,先生成右侧包含1个元素的规则列表判断置信度,置信度小于最小置信度的节点下面几层右侧包含多个元素的置信度也很低,依此类推。(事实上这个过程我不太熟,后面再说)

    度量:支持度,置信度

           
    非监督学习 频繁项挖掘 FP-growth ☆☆  事务是由元素项组成的元素项集,所有事务的n个元素项的组合有2^n-1个,频繁项挖掘就是返回大于给定的最小支持度的所有元素项集,只是FP-growth算法有一个FP-tree的概念更高效地进行遍历。

     标称型

    (类似购买商品清单的数据)

     所有频繁项集  

     1.一个事务是类似一次购买商品清单的数据,所有事务样本就是一堆类似购买清单的数据。

    2.元素项指的是每个商品,元素项集指的是元素项的组合(例如:多个商品,包括1个)。

    3.支持度就是出现次数/总事务数,支持度指的是元素项集的支持度。

    4.最小支持度是需要人为给定的,小于这个阈值的将去除。

    5.频繁项集是事务中大于最小支持度的所有元素项集。

    6.FP-tree是一个存储事务的存储结构,方便遍历,相比Apriori算法的多次遍历,FP-growth只需要遍历两次原始数据。

    度量:支持度

    优点: FP-growth是在Apriori基础上改进频繁项挖掘算法,计算快于Apriori算法。      【机器学习算法应用和学习_1】关联分析/频繁项集挖掘_FP-growth算法
    其他 预处理-降维 PCA(主成分分析)  ☆☆☆  将数据中方差最大的方向作为第一个坐标轴,第二个新坐标轴是和第一个坐标轴正交且具有最大方差的方向,依次类推,重复次数为原始数据中特征的数目。这样,大部分方差都包含在最前面几个新坐标轴中,所以可以忽略后面的坐标轴,即实现降维。  数值型  数据包含的特征减少  

    2.理解上,比如二维数据散点图,第一个坐标轴就是覆盖数据的最长那条线A,第二个坐标轴是正交(垂直)于它的方差最大的那条线B, 此时B的影响不是很大可以去掉,即转化成一维数据,更方便分类了。

    2.计算过程涉及到协方差,大致过程:

    3.其他降维技术还有因子分析、独立成分分析,PCA是应用范围最为广泛的。

     优点:降低数据复杂性,保留最重要的几个特征。

    缺点;不一定需要,可能损失有用信息。

         
    其他 矩阵分解 SVD  ☆☆  矩阵数据中经常是一小段携带了数据集的大部分信息,其他信息要么是噪声要么是没太大意义,矩阵分解将原始矩阵表示成新的易于处理的形式,这种新形式是两个或多个矩阵的乘积。  数值型(矩阵数据)  更小的多个矩阵的乘积表达式  

     1.理解上,例如用户是否看过图书的100w*1w大小的矩阵数据(行向量是用户,列向量是图书),事实上可以分解成三个小矩阵乘积的形式来近似。

    其中,Σ只有对角元素,其余为0,对象元素是从大到小排列,这些对角元素称为奇异值

    2.仅需保留90%能量信息(用平方和度量)或上万维度时保留前两三千的奇异值即可近似于原始矩阵。

       推荐算法里简化矩阵数据    
    其他 参数估计 EM算法(最大期望算法) ☆☆☆☆☆ 是一类通过迭代进行极大似然估计的优化算法,用于对包含隐变量或缺失数据的概率模型进行参数估计 包含隐变量或缺失数据的数据集 参数估计  

    1.在EM算法目的的理解上,例如应用在高斯混合模型中:

    假如从学校中分别抽取男100人,女100人,假设这两类人群分别都是服从高斯分布正态分布,一般都符合正态分布的,可以算出两类人群的均值和方差,这两样本均值就是对校园的两类人群总体的似然估计

    那么,假如我们不知道分男女,只是抽取了100人,那此时直接算均值和方差就不具有代表性了,因为其中有一个隐变量——性别,这实际是两个高斯分布混合在一起,那么EM算法就可以更好地进行参数估计

    2.EM算法分两步,第一步是期望步骤(E-step)——对极大似然取对数,第二步是最大化步骤(M-step)——对每个样例的每个可能类别z求联合分布概率和。

      用于很多机器学习算法中,比如高斯混合模型、隐马尔可夫模型的参数估计等等。    
    其他 网页权重 PageRank算法  ☆☆☆☆☆  RageRank是用于计算每个网页的PR值(权重)的一种算法。  所有网页链接关系(行表示入,列表示出)的矩阵数据  网页权重  

    1.核心思想:

    如果一个网页被很多其他网页链接到的话说明这个网页比较重要,也就是PageRank值会相对较高;
    如果一个PageRank值很高的网页链接到一个其他的网页,那么被链接到的网页的PageRank值会相应地因此而提高。

    2.网页PR值计算公式:

           

    算法使用一般步骤

    1.选择算法

    目的是什么——分类、回归、聚类等等

    自变量是什么——连续、标称?

    2.训练集训练算法

    3.测试集评估模型效果

    分类模型评估指标

    4.投入使用进行预测

    学习资料

    github《机器学习100天》

    中文版 https://github.com/MLEveryday/100-Days-Of-ML-Code

    英文版 https://github.com/Avik-Jain/100-Days-Of-ML-Code

    Without summary,you can't master it.
  • 相关阅读:
    br_
    -fpic -fPIC -fpie -fPIE
    (OK) cross_compile_readline_for_android-x86_64-6.0
    Installing the GNU Readline library
    How to get libreadline for Android?
    (OK)(OK) seem-tools-init-android-x86_64-6.0-rc1-0.sh
    (OK)(OK) seem-tools-CLI-semi-auto.sh---nic1_2-hostonly-bridged
    (OK)(OK) seem-tools-auto_create_vm_android.sh
    (OK) run my script at boot time in android-x86_64 (Chih-Wei Huang)
    【习题 3-4 UVA
  • 原文地址:https://www.cnblogs.com/everda/p/10985342.html
Copyright © 2011-2022 走看看