机器学习算法——常规算法,在同的业务场景也需要使用不同的算法(一)

在这里插入图片描述


👨‍💻个人主页@开发者-曼亿点

👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 曼亿点 原创

👨‍💻 收录于专栏机器学习

🅰

请添加图片描述



前言

  机器学习可以处理的业务场景非常丰富,从基础的回归、聚类和分类等场景到图片识别、语音识别和文本分析等。不同的业务场景也需要使用不同的算法,所以如果想对机器学习在业务的解决方案上有一定认识,则需要掌握多种场景的不同种类的算法,了解不同算法的属性、优势和缺陷,对之后的算法应用会有很大的帮助。


🎶 算法分类/font>


  分类算法是用来解决分类问题的算法,关于场景的抽象方法在前面章节中已经介绍了,分类算法是场景最丰富的一类算法,广告的投放和疾病预测等都可以抽象成分类问题。分类算法一般都是监督学习算法,因为需要通过已有的打标数据来生成分类模型。在这一部分选取了几种比较典型的分类算法进行介绍,分别是K近邻(KNN)、朴素贝叶斯(NBM)、逻辑回归(LR)(注:这里LR作为二分类算法,LR也是回归算法的一种)、随机森林(RF)和线性支持向量机(SVM)。

(1)K近邻

  很多人在刚接触机器学习算法的时候,都会觉得这些算法很难理解,有很多公式需要记、需要推导,为了防止大家对学习机器学习算法的学习产生抗拒心理,我们先从最简单的算法(K近邻)入手学习。K近邻算法主要解决的是分类问题,而且原理非常好理解,只要有一点数学基础,差不多用20分钟就可以进行推导,稍微有一些代码能力的话,半个小时就可以实现一版简单的K近邻程序。下面具体来看一下K近邻。

1.基本概要

  K 近邻(K-Nearest Neighbor,KNN)是一种非常简单的机器学习算法,主要用来解决分类问题,KNN 是监督学习分类算法,在分类前需要有打标数据。从字面意思来理解,KNN 是一种 LazyLearning(也可称为“惰性学习”,可理解为考虑问题的最简化情况)模式的算法,因为它的分类只考虑距离目标点最临近的K个点的类别,具体是怎么实现的呢?我们通过引用 KNN 在维基百科中的一张图(见图 1)来讲解。
在这里插入图片描述

  图 1表示在二维空间中的一个分类场景,三角形和正方形的图形代表已经打标过的两种数据的分布,打问号的圆形数据是我们需要进行分类的预测对象。首先在算法推导前需要先设置K值。
  1)当 K=3 时,我们找出距离预测集,也就是圆形数据最近的3个数据,这3个数据中有2个三角形、1个正方形。所以圆形数据会被分到跟三角形数据一类,因为在 K=3 的半径区间中三角形的数量占优。
  2)当 K=5 时,找出距离圆形数据最近的5个数据点,分别是3个正方形和2个三角形,那么预测点会被分到属于正方形的这一类。
  通过上面的这个例子我们可以了解到,K值对预测对象的最终预测结果的影响是很大的。K值取得太小可能会造成参与评估的样本集太小,结果没有说服力;K值取得过大,会把距离目标队列距离过远的一些噪音数据也考虑进去,造成结果的不准确性。所以在实际的算法使用过程中,需要对K这个参数进行反复的调试,才可以达到一个比较理想的效果。
  下面来了解 KNN 算法的一些特性。首先,KNN 不同于其他一些算法的地方是 KNN不光可以解决Z分类场景的问题,同时也可以解决多分类的问题,因为无论需要分类的目标列有几种可能,KNN 只考虑与目标的距离最近的下个点的集合中哪个类别的点数量最占优势。另外,因为 KNN 的原理和实现都较为简单,所以后期调优过程中的工作量相对来讲比较小。KINN 比较大的问题就是对样本分布比例不均衡的情况可能会造成结果的不准确性,如图 2所示。
  在上面的这个二维空间中,正方形和六边形表示已经打标好的数据集,我们需要对五角星进行分类。通过上图的数据分布,从距离的角度直观来看,五角星应该属于正方形这一类,因为五角星的周围都是正方形。但是由于整个数据集的分布不平衡,六边形的数量远多于正方形的数量,所以当 K=9 或者更大的时候,预测集会被错误分类。所以 KNN 在目标数据集数量比例分布不平衡的情况下,可能会造成预测结果的不准确。KNN 的另外一个问题就是计算成本很高,因为每个预测点都需要对全量数据集进行一次距离的计算和排序,这样就会造成非常大的计算资源开销。上面我们介绍了 KNN的一些基本概念和特性,下面来看一下具体的算法推导过程。
在这里插入图片描述

2.算法推导

  通过上面的介绍,我们可以了解到 KNN 的算法原理,下面来看具体的推导过程。
  1)因为 KNN 是监督学习,所以首先要加载打标好的数据集(多分类或者二分类数据),然后需要设定一个K值。
  2)在预测的过程中,需要针对每一个预测对象计算它与所有数据集的距离,这个距离的计算一般通过求欧式距离来实现,欧式距离可以描述两点在n维空间的真实距离(物理距离 )。求解方法比较简单,已知两个n维向量 x=(x,x,x,…,x„)和 y=(yyy…,y),那
么这两个向量的欧式距离公式可以表示为
在这里插入图片描述
将结果进行排序,选取跟预测数据距离最近的K个点组成决策集合
  在决策集中,比较各个类别数据点的个数,选取个数最多的类别作为预测数据点的最终类别。
  整个 KNN的推导过程比较简单,主要涉及距离计算和排序两个功能点。这里只是针对最简单的 KNN 情况进行介绍,具体的实现可以有很多的优化方式,如可以在计算前先排除掉与预测集数据距离较大的一些噪音点,从而提高计算效率。

3.工程实现

上面介绍了整个算法的推导,现在看一下如何通过工程来实现KNN。

import math
import operator
def euclideanDistance(inst1,inst2,length):
      distance =0
                  for x in range(length):
           distance +=pow((instl[x]-inst2[x]),2)return math.sqrt(distance)

 
              def getNeighbors(trainingSet,testInstance,k):
          distances =[]
                 length=len(testInstance)-1
                       for x in range(len(trainingSet)):
                         dist=euclideanDistance(testInstance, trainingSet[x], length)distances.append((trainingSet[x],dist))
distances.sort(key=operator.itemgetter(1))
         neighbors =[]
               for xin range(k):
                neighbors.append(distances[x][0])
        return neighbors


     def getResponse(neighbors):
              classVotes ={}
                 for x in range(len(neighbors)):
            response = neighbors[x][-1]
          if response in classVotes:
         classVotes[response]+=1
         else:
            classVotes[response]=1
                sortedVotes=sorted(classVotes.iteritems(),key= operator.itemgetter (1).reverse=True)
             return sortedVotes[0][0]

  使用的 Python 版本为 Python 2.7,这里引入了Python的numpy和operator 两个库.
下面看一下代码中几个函数的输入和输出。

  • euclideanDistance:这个函数主要是求两个向量的欧式距离,输入的3个参数分别是向量 1、向量2和向量的维度。
  • getNeighbors:在数据集中找到所需要预测数据的 K个最临近点并返回,输入的3
    个参数分别是数据集、预测集以及K值。
  • getResponse:返回对目标值的预测结果,输入的是 getNeighbors 函数的返回值。
    下面通过一个实例,来看看上面代码的运行结果。输入打标好的数据集:

trainset =〔[1,1,1,‘a’],[2,2,2,‘a’],[1,1,3,‘a’],[4,4,4,‘b’], [0,0.0,"a”,[4,4.5,4,‘b’]]

  trainSet 是一个4维数据集,最后一个字段是目标列,一共有6个点,分为a和b两种类别。预测集是 testInstance=[5,5,5]。
  把这两组数据带入上面的函数中可得

def main():
      trainset =[[1,1,1,'a'],[2,2,2,'a',[1,1,3,'a'],[4,4,4,'b'],[0,0,0,'a’],[4,4.5,4,'b']]
testInstance =[5,5,5]
k=5
        neighbors =getNeighbors(trainSet, testInstance,k)
          response =getResponse(neighbors)
          print "\nNeighbors Are:",
         print (neighbors)
         print "\nResponse is:",
         print repr(response)

以上介绍了 KNN 的算法原理以及推导,并且通过 Python 代码进行了实现。KNN 作为最简单的机器学习算法比较适合新手入门了解。KNIN 算法在文本分类和图像分类等场景有许多的应用,常常作为业务场景下的重要分类模块来使用。如果想对 KNN 有更深刻的了解,请查看相关资料并且通过大数据集进行实验。

(2)朴素贝叶斯

  如果你是一个计算机相关专业毕业的学生,那么一定听说过贝叶斯这个人。贝叶斯(Bayes)定理是由英国数学家贝叶斯发明的,用来描述两个条件概率的关系。朴素贝叶斯是贝叶斯定理的简单实现,是常见的一种利用先验概率进行分类的分类器。朴素贝叶斯的基础建立在一个假设条件之上,即所有特征的条件之间相互独立。下面来详细介绍下朴素贝叶斯分类算法。

1.基本概要

  朴素贝叶斯模型(Naive Bayesian Mode,NBM)作为以条件概率为基础的分类器,是一种监督学习算法,常被用于文本分类和垃圾邮件过滤等场景中。为了更好地帮助大家理解员叶斯理论,下面摘选一段维基百科上的介绍。贝叶斯理论解决的是逆向概率问题。设一个袋子里有N个白球,M个黑球,计算从这个袋子摸出黑球的概率是很容易的,这是~个正向概率求解的问题。但是如果我们把问题反过来,如果我们事先不知道袋子里有多少个黑球、多少个白球,我们摸一个球出来,通过所摸出球的颜色对袋子里的黑白球比例进行推测,这就是逆向概率问题。贝叶斯定理主要是通过已知的正向概率求解逆向概率
  下面来了解贝叶斯理论是如何应用到实际的分类场景中去的。朴素贝叶斯分类是一种机器学习的监督学习算法,监督学习意味着我们已经有了一份打标好的数据作为训练样本,可以把训练样本的数据分为两类,特征列和目标列。特征列表示的是那些特征字段的数据,目标列是打标字段。贝叶斯理论在分类场景中解决的问题就是:当我们已知目标列和特征列各自分布的概率情况下,特征列概率已知,求解目标列每个值的概率。
 &emsp这里涉及几个概率论中的知识点,首先是朴素贝叶斯中“朴素”两个字的概念,朴素”表示的是一种比较理想的环境,就是特征数据之间彼此独立。例如有两个特征分别是m和n,P(m)表示 m发生的概率,那么 P(mn)表示 m 和n同时发生的概率、当m和"独立的情况下:P(mn)=P(m)xP(n)。下面再看下“条件概率”的含义,P(A|B)(见图5)是指当事件 B发生的情况下,事件A发生的概率。
在这里插入图片描述
根据概率论的概念可得:
在这里插入图片描述
其实根据图 5 可以得出如下公式也是成立的。
在这里插入图片描述
也就是说通过 P(A∩B)这个两个概率图交叉的媒介,可得到
在这里插入图片描述
贝叶斯定理的最终公式为
在这里插入图片描述
  其中、P(A)是A的先验概率,因为在计算 P(A)的时候不考虑 B的影响。P(A|B)称为A的后验概率,因为这个概率中 A的概率计算是在 B已经发生了的基础上。实际上在做分类的时候,场景可以抽象为已知一条数据的特征,预测这条数据的目标结果概率,P(目标结果概率|特征 )。下面通过一个案例对朴素贝叶斯进行推导。

2.算法推导

前面介绍了贝叶斯公式是如何推导的,得到

在这里插入图片描述
  看一下如何通过这个公式进行分类,用一个生活中的例子来描述贝叶斯算法分类的过程,我们的场景是判断一个女生是否接受男生约会的邀请,前提是女生知道男生的身高以及男生是否拥有房产。这个场景下的数据集见表

身高/cm是否有房是否约会
180约会
160没房不约会
160不约会
170约会
180没房约会

  在这个数据集中,“身高”和“是否有房”是两个特征项,“是否约会”是目标列。我们希望通过贝叶斯算法,当已知一个男士的“身高”和“是否有房”这两个特征数据之后判断他约会成功的概率。假设有一个男士M的身高是180,没有房产,现在来预测M约会成功的概率。根据贝叶斯公式,最终要计算的是男士M的后验概率,这个后验概率是通过他的“身高”和“是否有房”两个前提条件得到的。公式为

在这里插入图片描述

把A看作“约会”,B看作“身高 180”和“没有房”。通过公式表示为
在这里插入图片描述
鑫朴素贝叶斯定理中、前提条件是特征彼此独立。根据上面一个小节所介绍的特征独立的公式 P(mn)=P(m)xP(n),可以将公式变形为

在这里插入图片描述
这时可以发现,上面的式子中的右侧所有乘机因子都是可以通过历史数据求解得到的。下面来逐个求解这些因子。

  • P(身高180|约会):表示的是在成功约会的人中,身高180cm 的人占的比例。我们从总的数据集中提取成功约会人员的数据(见表)。
身高/cm是否有房是否约会
180约会
170约会
180没房约会

从上面的表格里看到,约会成功的人中身高180cm的比例是 2/3。

  • P(没有房|约会):跟上面同样的道理,约会成功的人中没有房的概率是 113。
  • P(约会):一共5个人,3个人约会成功,所以P(约会)=315。
  • P(身高180):身高是180cm的概率为2/5。
  • P(没有房):没有房的概率为 2/5。

把上面这些求解的概率因子带入可得

在这里插入图片描述

  通过上面的结果,我们就可以推断出身高180cm 的男士即使没有房产,约会成功的概率也是非常高的,这就解决了一个“约会成功”或“约会不成功”这样的二分类问题。通过这个例子的推导,我们就了解了如何通过朴素贝叶斯定理来进行分类。

3.工程实现

  前面介绍了朴素贝叶斯分类器的实现原理以及推导过程,这一小节将介绍如何在工程上实现朴素贝叶斯分类器。朴素贝叶斯常被用作对文本类的数据进行分类,常见的有新闻分类或是垃圾邮件过滤。在处理文本数据的时候,其主要原理是通过发现每一个类别的文本可能出现的关键词的概率,然后通过这种概率计算后验概率。
  在这里采用开源的一款朴素贝叶斯分类器来实现,具体的源码可以参考https://github.com/muatik/naive-bayes-classifer,代码可读性非常好,建议充分阅读一遍,可以加深对贝叶斯算法的认识。
  1)安装贝叶斯分类器。本实验的实验环境是 MacOS 系统,Python 2.7的环境下,首先安装贝叶斯分类器的代码包:

sudo pip install naiveBayesClassifier

  2)文本数据集。这里有一组数据集,为了文本分词方便起见,使用的是英文语料(中文分词原理可以参考下文马尔科夫的实现)。数据集有两类文本,分别是“health”和“politics”两种。数据源包含两个字段,特征列是“text”,目标列是“category”。

newsSet =[
i'text': 'not to eat too much is not enough to lose weight','category' : 'health' }
i'text':'Russia try to invade Ukraine','category': 'politics'},
{'text': 'do not neglect exercise','category': "health'},
('text':'Syria is the main issue, Obama says', 'category': 'politics'),
{'text': 'eat to lose weight','category': "health'},
{'text':'you should not eat much','category': "health'}
]

  3)利用贝叶斯算法分类。

from naiveBayesClassifier import tokenizer
from naiveBayesClassifier.trainer import Trainer
from naiveBayesclassifier,classifier import Classifier
newsTrainer = Trainer(tokenizer)
newsSet =[
{'text': 'not to eat too much is not enough to lose weight', 'category': 'health'},
('text':'Russia try to invade Ukraine', 'category': 'politics'},
{'text':'do not neglect exercise','category': 'health'),
('text':'Syria is the main issue, Obama says', 'category': 'politics'),
('text':'eat to lose weight','category': 'health'},{'text':'you should not eat much','category': 'health'}
]
for news in newsSet:
       newsTrainer.train(news['text'],news['category'])
newsClassifier=Classifier(newsTrainer.data, tokenizer)
classification =newsClassifier.classify("eat more, you will become fatter")
print(classification)

  因为贝叶斯分类算法是监督学习,所以首先通过 train 函数输入特征列和目标列,训练生成分类模型 newsClassifer,接着就可以通过这个分类模型对预测样本“eat more,youwil become fatter”进行预测,最终得到的预测结果是这句话归于“health”或是“politics”
  贝叶斯分类理论是基于概率的一种分类算法。最终结果返回了预测集属于“health"或是“politics”两种类别各自的概率。结果已经表明了“eat more,you wil become fatter”这句话属于“health”类别的概率较大。具体的算法流程是通过比对预测集每个词在不同种类的训练样本中出现的频率大小来综合判断的。正是基于这种条件概率的算法推导方式,使得贝叶斯分类在文本分类场景下得到了广泛的应用,在处理垃圾软件过滤和黄色文本过滤方面都有着不错的效果。
以上主要是对朴素贝叶斯分类的算法理论进行了介绍。通过上文的介绍,我们可以了解朴素贝叶斯的分类原理是基于概率论的条件概率公式,比较容易理解,而且在很多场景下具有比较好的性能。同时,因为输出结果是概率值,朴素贝叶斯可以很容易地从二分类场景扩展到多分类场景中去,这个特性也是贝叶斯分类算法比较好的特性。如果想更深入地了解贝叶斯算法的更多场景和其他扩展算法,可以多浏览相关的论文文献,建议阅读一些比较成熟的开源项目源码。


结束语🥇

以上就是机器学习
持续更新机器学习教程,欢迎大家订阅系列专栏🔥机器学习
你们的支持就是曼亿点创作的动力💖💖💖
请添加图片描述

  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曼亿点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值