20_多易教育之《yiee数据运营系统》用户画像-算法实例篇

目录

一、算法实例KNN

二、算法实例NaiveBayes

        1、算法简介
        2、朴素贝叶斯的原理及理解
        3、算法计算示例
                1)、问题分析
                2)、计算过程
        4、算法实战:Bayes评论语义分类
                1)、语义情感分析算法Bayes
                2)、朴素Bayes算法工程实践
                        a)、语义情感分析算法Bayes
                        b)、朴素Bayes算法工程实践

三、算法实例LogisticRegression

        1、算法模型
        2、极大似然估计

多易教育,专注大数据培训; 课程引领市场,就业乘风破浪
多易教育官网地址
https://www.51doit.cn
多易教育在线学习平台
https://v.51doit.cn

一、算法实例KNN

在这里插入图片描述
《详见项目代码》

二、算法实例NaiveBayes

1、算法简介

朴素贝叶斯算法常用于分类与预测的问题,
        比如给一个1000本书进行分类,可以分为文学类,管理类,技术类,教育类等等,
        比如,预测一株很美的植物,在不同的地理环境,如吉林,北京,广州,深圳,大理,不同的地点,在不同的日照和阳光强度下,这株植物会生存下来吗?
        比如,邮箱中每天收到大量的邮件,如何预测哪些邮件是垃圾邮件?
        比如,一个电商网站,有大量的客户对店家或商品的评价,如何预测是好评还是中评、差评

        类似这些问题,都是分类预测问题,而且是概率预测问题。

2、朴素贝叶斯的原理及理解

学习贝叶斯之前,我们了解下条件概率的概念
条件概率:
        事件A发生的概率 P(A)
        事件A在另外一个事件B已经发生条件下的发生概率。条件概率表示为P(A|B),读作“在B条件下A的概率”,看下下边的这张图(网上找来的^ - ^):
       
根据文氏图,可以很清楚地看到在事件B发生的情况下,事件A发生的概率就是P(A∩B)除以P(B)。

P(A|B)=P(A∩B)/P(B)

因此,P(A∩B)=P(A|B)P(B)

所以,P(A|B)P(B)=P(B|A)P(A)

即:P(A|B)=P(B|A)P(A)/P(B) — — — 公式(一)

没错,公式(一):P(A|B)=P(B|A)P(A)/P(B) 就是贝叶斯定理
贝叶斯定理的意义: 如果求 P( A | B) 不好直接计算,则可以通过贝叶斯定理转换成计算P( B | A)

求一个事物属于那种类别的概率不好求,转而通过求 类别样本中该事物各特征出现的概率

3、算法计算示例
1)、问题分析

下面有一组衣服的历史销售记录数据,我们来预测下,随机到来的一位顾客可能更喜欢哪个类型的衣服
在这里插入图片描述
预测的本质为,求 P(购买 | (连衣裙-1)) ==》P( 购买 | (ONLY,蓝色,纯棉,透气) )
此概率在此场景中可以称之为 “后验概率”,此概率极其不好计算或预测,除非你拥有专门针对这款裙子在上百人中买或不买的历史数据
也就是说,该概率的结果值,只有把这款裙子摆在大量顾客前,统计他们买的情况,才知道!

然后,仔细考察上面的数据,发现,这一堆数据是多款裙子针对多个“随机顾客”所留下的记录样本,如果在这个样本空间中,求某款裙子可能被购买的概率,则好算,因为这些事情已经是发生过了,那么求出来的概率叫做“先验概率”

问题就变成, “后验概率” 如何通过“先验概率”来提前预知!

这就能借助到贝叶斯条件概率公式了:
P( 购买 | (ONLY,蓝色,纯棉,透气) )
        => P(ONLY,蓝色,纯棉,透气 | 购买)P(购买) / P(ONLY,蓝色,纯棉,透气)

而这个转换后的算式,其中的每一个元素都能通过先验样本数据计算出来

2)、计算过程

A1代表事件:购买
A2代表事件:不购买

首先,先来计算下历史数据中顾客购买与不购买的概率:

购买的衣服总数为6,衣服的总数为10,那么顾客购买衣服的概率为:

P(A1) = 6/10.0

不购买衣服的总数为4,衣服的总数为10,那么顾客不购买衣服的概率为:

P(A2) = 4/10.0 或 P(A2) = 1 - P(A1) = 1 - (6/10.0)

下面分别来计算下,在顾客购买的情况下,各类情况下的概率:

顾客购买,品牌为ONLY的条件概率:

购买的衣服中,为ONLY的个数为2,购买衣服的总数为6,衣服的总数为10,则品牌为ONLY顾客购买的条件概率为:

P(B1|A1) = 2 / 6.0

在总样本中,衣服为ONLY概率为:

P(B1) = 5 / 10.0

同理可以计算出:

品牌为森马,顾客购买的条件概率为:

P(B2|A1) = 4 / 6.0

在总样本中,衣服为森马的概率为:

P(B2) = 5 / 10.0

颜色为蓝色,顾客购买的条件概率为:

P(C1|A1) = 5 / 6.0

在总样本中,衣服为蓝色的概率为:

P(C1) = 5 / 10.0

顾客购买时,衣服为粉色的条件概率:

P(C2|A1) = 1 / 6.0

在总样本中,衣服为粉色的概率:

P(C2) = 5 / 10.0

顾客购买时,衣服的材质为纯棉的条件概率:

P(D1|A1) = 4 / 6.0

在总样本中,衣服为纯棉材质的概率:

P(D1) = 5 / 10.0

顾客购买时,衣服的材质为竹纤维的条件概率:

P(D2|A1) = 1 / 6.0

在总样本中,衣服为竹纤维材质的概率:

P(D2) = 5 / 10.0
现在应用贝叶斯定理,来做一个小小的预测:
顾客更喜欢购买下面哪一个产品:品牌为:ONLY、颜色为:蓝色、材质为:纯棉 与 品牌为:森马、颜色为:蓝色、材质为:竹纤维,哪一个产品?
我们计算下

P(A1|ONLY、蓝色、纯棉)

= ((P(B1|A1) * P(C1|A1) * P(D1|A1) )* P(A1) ) /( P(B1) * P(C1) * P(D1) )

=[ ((2/6.0)* (5/6.0)* (4/6.0)) * (6/10.0)] / [(5 / 10.0) * (5 / 10.0) * (5 / 10.0)]

P(A1|森马、蓝色、竹纤维)

= ( P(B2|A1) * P(C1|A1) * P(D2|A1))* P(A1) ) /( P(B2) * P(C1) * P(D2) )

= [ ((4 / 6.0)* (5/6.0)* (1 / 6.0)) * (6/10.0)] / [(5 / 10.0) * (5 / 10.0) * (5 / 10.0)]

我们来比较下两种商品购买的概率:

[ ((2/6.0)* (5/6.0)* (4/6.0)) * (6/10.0)] / [(5 / 10.0) * (5 / 10.0) * (5 / 10.0)]

[ ((4 / 6.0)* (5/6.0)* (1/ 6.0)) * (6/10.0)] / [(5 / 10.0) * (5 / 10.0) * (5 / 10.0)]

分母相同,分子偏大的结果更大,那么后者更大,所以我们推断,在纯棉蓝色ONLY家的连衣裙比竹纤维蓝色森马家的连衣裙更受顾客青睐,顾客购买前者的概率更大

细心的同学可能会发现,顾客不太喜欢竹纤维材质的连衣裙,因为影响分母结果的是这一项。

感兴趣的同学,可以计算下,其它的几类情况,比如:竹纤维蓝色ONLY,竹纤维粉色森马,然后比较所有情况的概率,就可以预测出顾客最喜欢哪种产品

4、算法实战:Bayes评论语义分类
1)、语义情感分析算法Bayes
先验样本数据:
0,a c c d e e e b u r
0,a c c e e d f p
1,b b r r u u f d
1,b b p r u u e c

-- 训练贝叶斯模型
p(a|0) =
p(c|0)=
p(d|0)=
p(e|0)=
p(b|0)=
p(f|0)=
p(b|1)=
.....


朴素贝叶斯来计算下面这篇文档该分到哪一类
?,b p r r c u
朴素贝叶斯计算过程:
P(0|b p r r c u)  =  P(b p r r c u | 0)*P(0)/P(b p r r c u )
=P(b|0)*P(p|0)*P(r|0)*P(c|0)*P(u|0) P*(0) / P(b)*P(p)*P(r)*P(c)*P(u)
=1/18 * 1/18 * 1/18 * 4/18 * 1/18 * 1/2   / 分母

P(1|b p r r c u)
=P(b|1)*P(p|1)*P(r|1)*P(c|1)*P(u|1) P*(1) /P(b)*P(p)*P(r)*P(c)*P(u)
=4/16 * 1/16 *3/16 * 1/16 * 4/16 * 1/2   / 分母


朴素贝叶斯意义:   
求满足某特征组合条件下的,是某类事物的概率,通过样本不好统计
转而求 :在某类事物中,满足这些特征的物品占比有多大
2)、朴素Bayes算法工程实践
a)、文本语义分析特征工程
 现有样本数据:
docid,label,doc
doc0,1,苹果 官网 苹果 宣布 骁龙 安卓
doc1,0,苹果 梨 香蕉 桔子 肥料 甜度
doc2,0,苹果 梨 桔子 保鲜 甜度
doc3,1,苹果 科技 手机 官网 宣布 安卓 骁龙

要应用mllib中的bayes算法模型,需要将样本文档向量化,而一旦向量化,文档中的每一个词应该由一个“数字”来表示,我们所用的方案为:
①.第一点,我们的向量应该是统一长度的,而文章的词数有多有少,就产生了矛盾,解决办法是:
把向量长度定得比任何一篇文档中的词的个数大得多的多!(假设长度为40)

doc0,1,苹果 官网 苹果 宣布 骁龙 安卓

②.提取词的特征,并向量化
将这篇文档中的每一个词,求它的hashcode % 向量长度,那么这个结果值就约束了这个词在向量中位置!
        假设 : 苹果.hashcode % 40 = 3
        再求苹果这个词在doc0中的tf-idf值作为这个词的特征值
        补充:TF-IDF:
                TF词频 = 该篇文档中该词出现的频次;
                IDF:逆文档频率 = Lg(文档总篇数/(1+出现这个词的文档篇数))

得到的结果一定是个稀疏向量:

2.56.56.76.17.2
b)、文本语义分类模型训练实现
/**
  * @date: 2019/8/13
  * @site: www.doitedu.cn
  * @author: hunter.d 涛哥
  * @qq: 657270652
  * @description: 评论样本数据bayes分类模型训练
  */
object BayesModelTrainer {

  def main(args: Array[String]): Unit = {

    val spark = SparkUtil.getSparkSession(this.getClass.getSimpleName)
    import spark.implicits._

    val poor = spark.read.textFile("G:\\testdata\\comment\\poor")
      .rdd
      .map(line => {
        import scala.collection.JavaConversions._
        val words: Array[String] = HanLP.segment(line).map(term => term.word).toArray
        (0d, words)
      }).toDF("label","words")

    val general = spark.read.textFile("G:\\testdata\\comment\\general")
      .rdd
      .map(line => {
        import scala.collection.JavaConversions._
        val words: Array[String] = HanLP.segment(line).map(term => term.word).toArray
        (1d, words)
      }).toDF("label","words")


    val good = spark.read.textFile("G:\\testdata\\comment\\good")
      .rdd
      .map(line => {
        import scala.collection.JavaConversions._
        val words: Array[String] = HanLP.segment(line).map(term => term.word).toArray
        (2d, words)
      }).toDF("label","words")

    val sample = poor.union(general).union(good)


    // 提取特征,向量化
    val hashingTF = new HashingTF().setNumFeatures(1000000).setInputCol("words").setOutputCol("tfvec")
    val tf = hashingTF.transform(sample)

    val idf = new IDF().setInputCol("tfvec").setOutputCol("tfidfvec")
    val idfDF = idf.fit(tf).transform(tf).drop("words","tfvec")

    // 训练模型
    val naiveBayes = new NaiveBayes()
      .setSmoothing(0.01)
      .setLabelCol("label")
      .setFeaturesCol("tfidfvec")
    val model = naiveBayes.fit(idfDF)


    // 保存模型
    model.save("recommend_sys/data/bayes/model")

    spark.close()

  }
}

三、算法实例LogisticRegression

分类算法
分类预测的结果还拥有一定的概率含义!
生产中使用非常频繁!

1、算法模型

在这里插入图片描述

在介绍Logistic Regression之前我们先简单说一下线性回归,,线性回归的主要思想就是通过历史数据拟合出一条直线,用这条直线对新的数据进行预测。

我们知道,线性回归的公式如下:
z=θ0+θ1x1+θ2x2+θ3x3…+θnxn=θTx
z=θ0+θ1x1+θ2x2+θ3x3…+θnxn=θTx
而对于Logistic Regression来说,其思想也是基于线性回归(Logistic Regression属于广义线性回归模型)。其公式如下:
hθ(x)=11+e−z=11+e−θTx
hθ(x)=11+e−z=11+e−θTx

其中,
y=11+e−x
y=11+e−x
被称作sigmoid函数,我们可以看到,Logistic Regression算法是将线性函数的结果映射到了sigmoid函数中。
sigmoid的函数图形如下:
在这里插入图片描述
我们可以看到,sigmoid的函数输出是介于(0,1)之间的,中间值是0.5,于是之前的公式 hθ(x)hθ(x) 的含义就很好理解了,因为 hθ(x)hθ(x) 输出是介于(0,1)之间,也就表明了数据属于某一类别的概率,例如 :
hθ(x)hθ(x)<0.5 则说明当前数据属于A类;
hθ(x)hθ(x)>0.5 则说明当前数据属于B类。
所以我们可以将sigmoid函数看成样本数据的概率密度函数。

有了上面的公式,我们接下来需要做的就是怎样去估计参数 θθ 了。

首先我们来看, θ函数的值有特殊的含义,它表示 hθ(x)hθ(x) 结果取1的概率,因此对于输入x分类结果为类别1和类别0的概率分别为:
P(y=1|x;θ)=hθ(x)
P(y=1|x;θ)=hθ(x)

P(y=0|x;θ)=1−hθ(x)
P(y=0|x;θ)=1−hθ(x)

2、极大似然估计

根据上式,接下来我们可以使用概率论中极大似然估计的方法去求解损失函数,首先得到概率函数为:
P(y|x;θ)=(hθ(x))y∗(1−hθ(x))1−y
P(y|x;θ)=(hθ(x))y∗(1−hθ(x))1−y

因为样本数据(m个)独立,所以它们的联合分布可以表示为各边际分布的乘积,取似然函数为:
L(θ)=∏i=1mP(y(i)|x(i);θ)
L(θ)=∏i=1mP(y(i)|x(i);θ)

L(θ)=∏i=1m(hθ(x(i)))y(i)∗(1−hθ(x(i)))1−y(i)
L(θ)=∏i=1m(hθ(x(i)))y(i)∗(1−hθ(x(i)))1−y(i)

取对数似然函数:
l(θ)=log(L(θ))=∑i=1mlog((hθ(x(i)))y(i))+log((1−hθ(x(i)))1−y(i))
l(θ)=log(L(θ))=∑i=1mlog((hθ(x(i)))y(i))+log((1−hθ(x(i)))1−y(i))

l(θ)=log(L(θ))=∑i=1my(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))
l(θ)=log(L(θ))=∑i=1my(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))
最大似然估计就是要求得使 l(θ)取最大值时的θ ,这里可以使用梯度上升法求解。我们稍微变换一下:
J(θ)=−1ml(θ)
J(θ)=−1ml(θ)

因为乘了一个负的系数−1m−1m,然后就可以使用梯度下降算法进行参数求解了

多易教育,专注大数据培训; 课程引领市场,就业乘风破浪
多易教育官网地址
https://www.51doit.cn
多易教育在线学习平台
https://v.51doit.cn

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课程简介:  本项目课程是一门极具综合性和完整性的大型项目课程;课程项目的业务背景源自各类互联网公司对海量用户浏览行为数据和业务数据分析的需求及企业数据管理、数据运营需求。 本课程项目涵盖数据采集与预处理、数据仓库体系建设、用户画像系统建设、数据治理(元数据管理、数据质量管理)、任务调度系统数据服务层建设、OLAP即席分析系统建设等大量模块,力求原汁原味重现一个完备的企业级大型数据运营系统。  拒绝demo,拒绝宏观抽象,拒绝只讲不练,本课程高度揉和理论与实战,并兼顾各层次的学员,真正从0开始,循序渐进,每一个步骤每一个环节,都会带领学员从需求分析开始,到逻辑设计,最后落实到每一行代码,所有流程都采用企业级解决方案,并手把手带领学员一一实现,拒绝复制粘贴,拒绝demo化的实现。并且会穿插大量的原创图解,来帮助学员理解复杂逻辑,掌握关键流程,熟悉核心架构。   跟随项目课程,历经接近100+小时的时间,从需求分析开始,到数据埋点采集,到预处理程序代码编写,到数仓体系搭建......逐渐展开整个项目的宏大视图,构建起整个项目的摩天大厦。  由于本课程不光讲解项目的实现,还会在实现过程中反复揉和各种技术细节,各种设计思想,各种最佳实践思维,学完本项目并勤于实践的话,学员的收获将远远超越一个项目的具体实现,更能对大型数据系统开发产生深刻体悟,对很多技术的应用将感觉豁然开朗,并带来融会贯通能力的巨大飞跃。当然,最直接的收获是,学完本课程,你将很容易就拿到大数据数仓建设或用户画像建设等岗位的OFFER课程模块: 1. 数据采集:涉及到埋点日志flume采集系统,sqoop业务数据抽取系统等; 2. 数据预处理:涉及到各类字典数据构建,复杂结构数据清洗解析,数据集成,数据修正,以及多渠道数据的用户身份标识打通:ID-MAPPING等;3. 数据仓库:涉及到hive数仓基础设施搭建,数仓分层体系设计,数仓分析主题设计,多维分析实现,ETL任务脚本开发,ETL任务调度,数据生命周期管理等;4. 数据治理:涉及数据资产查询管理,数据质量监控管理,atlas元数据管理系统,atlas数据血缘管理等;5. 用户画像系统:涉及画像标签体系设计,标签体系层级关系设计,各类标签计算实现,兴趣类标签的衰减合并,模型标签的机器学习算法应用及特征提取、模型训练等;6. OLAP即席分析平台:涉及OLAP平台的整体架构设计,技术选型,底层存储实现,Presto查询引擎搭建,数据服务接口开发等;7. 数据服务:涉及数据服务的整体设计理念,架构搭建,各类数据访问需求的restapi开发等;课程所涉及的技术: 整个项目课程中,将涉及到一个大型数据系统中所用到的几乎所有主要技术,具体来说,包含但不限于如下技术组件:l Hadoopl Hivel HBasel SparkCore /SparkSQL/ Spark GRAPHX / Spark Mllibl Sqoopl Azkabanl Flumel lasal Kafkal Zookeeperl Solrl Prestop

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值