MLlib之朴素贝叶斯数学原理到现实问题编程

MLlib之朴素贝叶斯数学原理到现实问题编程

1.样本数据:

+-------+------+-------+-----+----+-------+
|  name |  job | income| age | sex| label |
+-------+------+-------+-----+----+-------+
|张飞   |老师  |中     |青年 |男  |出轨   |
|赵云   |老师  |中     |中年 |女  |出轨   |
|陆小凤 |老师  |低     |青年 |男  |没出   |
|花满楼 |老师  |高     |老年 |女  |出轨   |
|田汉   |老师  |低     |青年 |女  |没出   |
|唐嫣   |程序员|高     |青年 |男  |没出   |
|刘亦菲 |程序员|高     |青年 |女  |出轨   |
|汪小敏 |程序员|中     |中年 |男  |没出   |
|刘晓庆 |程序员|中     |中年 |男  |没出   |
|任我行 |程序员|中     |老年 |男  |出轨   |
|郭靖   |公务员|中     |老年 |女  |没出   |
|黄蓉   |公务员|低     |老年 |女  |没出   |
|段正淳 |公务员|高     |中年 |男  |出轨   |
|段誉   |公务员|低     |中年 |女  |没出   |
|虚竹   |公务员|低     |青年 |男  |出轨   |
+-------+------+-------+-----+----+-------+

未知数据:

+------+------+------+-----+----+
| name | job  |income|age  | sex|
+------+------+------+-----+----+
|曹操  |老师  |中    |青年 |女  |
|小乔  |程序员|高    |中年 |女  |
|吕布  |公务员|低    |青年 |男  |
+------+------+------+-----+----+

需求:
通过以上的样本数据推算数为知数据的出轨概率?

思想:
朴素贝叶斯逻辑:
在这里插入图片描述

P(A|B)事件A在另外一个事件B已经发生的条件下的发生的概率,读作在B条件下A的概率!

我们最终要求出的是曹操出轨的概率即:
在出轨的人里面,特征值满足 [职业=老师,收入=中,年龄=青年,性别=女]这种情况的比例有多大?
P(出轨| [老师 |中 |青年 |女 ])若这四个特征看成一个特征概率为0我们无法计算,所以将特征分开
P(出轨|曹操的特征)=P(出轨)*P(曹操的特征|出轨)/P(曹操的特征)
我们将P(曹操的特征)分割在组合算出

P ( 职业=老师 | 出轨) * P(收入=中 | 出轨) * P(年龄=青年 | 出轨) * P(性别=女 | 出轨)P(出轨)/ P (职业=老师) * P(收入=中) P(年龄=青年)* P(性别=女) 这是最终的曹操的出轨率

小乔和吕布也是一样的额推导过程!
代码逻辑:
1.将样本数据导入并使数据数字化
2.创建一个空的向量稠密型数据,并将数字的数据导入进去
3.开始训练模型了,训练好了在保存
4.再将未知的数据导入并使数据数字化.创建稠密型的向量数组,并将数字化的数据导入进去
5.加载刚刚训练好的模型
6.进行数据预测,并得到结果.
代码实现"
1.将样本数据导入并使数据数字化

 //加载样本数据并使数据数字化
    val yb: DataFrame = spark.read.option("header","true").csv("data/bayes/yangben")
    yb.createTempView("num")
    val sample1= spark.sql(
      """
        |select
        |cast(job as double)as job,
        |cast(income as double)as income,
        |cast(age as double)as age,
        |cast(sex as double)as sex,
        |cast(label as double)as label
        |from
        |(
        |select
        |case when job='老师' then 1.0 when job='程序员' then 2.0 else 3.0 end as job ,
        |case when income='低' then 1.0 when income='中' then 2.0 else 3.0 end as income,
        |case when age='青年' then 1.0 when age='中年' then 2.0 else 3.0 end as age,
        |case when sex='男' then 1.0 else 3.0 end as sex,
        |case when label='出轨' then 1.0 else 2.0 end as label
        |from
        |num
        |)t
        |
      """.stripMargin)

2.创建一个空的向量稠密型数据,并将数字的数据导入进去

//将所有的特征,组合到一个字段(Vector 类型)中  udf
    val to_vec = (arr:scala.collection.mutable.WrappedArray[Double])=>{Vectors.dense(arr.toArray)}
    spark.udf.register("to_vec",to_vec)

    val sample2: DataFrame = sample1.selectExpr("to_vec(array(job,income,age,sex)) as features","label")

3.开始训练模型了,训练好了在保存

//构造sparkMLlib中的算法对象
    val Bayes: NaiveBayes = new NaiveBayes()
      .setFeaturesCol("features") //设置样本数据中,特征数据所在的字段
      .setLabelCol("label") //设置样本数据中,类别标签所在的字段
      .setSmoothing(1.0) //设置拉普拉斯平滑系数

    //输入样本给算法,进行模型训练
    val model: NaiveBayesModel = Bayes.fit(sample2)

    //将模型结果保存
    model.save("userprofile/data/demo/bayes/model")

    spark.stop()

4.再将未知的数据导入并使数据数字化.创建稠密型的向量数组,并将数字化的数据导入进去

   val wz: DataFrame = spark.read.option("header","true").csv("data/bayes/weizhi")
    // 特征值处理
    // 特征要数值化
    val test2 = wz.selectExpr(
      "name",
      "cast(case job when '老师' then 1.0 when '程序员' then 2.0 else 3.0 end as double) as job",
      "cast(case income when '低' then 1.0 when '中' then 2.0 else 3.0 end as double) as income",
      "cast(case age when '青年' then 1.0 when '中年' then 2.0 else 3.0 end as double) as age",
      "cast(case sex when '男' then 1.0 else 2.0 end as double) as sex"
    )
// 特征向量化
    val to_vec = (arr:mutable.WrappedArray[Double])=>{Vectors.dense(arr.toArray)}
    spark.udf.register("to_vec",to_vec)
    val test3 = test2.selectExpr("name","to_vec(array(job,income,age,sex)) as features")

5.加载刚刚训练好的模型

// 加载训练好的模型
    val model = NaiveBayesModel.load("userprofile/data/demo/bayes/model/")

6.进行数据预测,并得到结果.

 // 将处理好的带预测数据,输入模型的预测方法,得出预测结果
    val predict: DataFrame = model.transform(test3)

    predict.show(10,false)


    spark.close()
发布了54 篇原创文章 · 获赞 11 · 访问量 1931

猜你喜欢

转载自blog.csdn.net/weixin_45896475/article/details/104429685
今日推荐