Spark(二)—— 标签计算、用户画像应用

摘要:
特征提取、选择和构建:特征提取业务日志WEB公共数据捕获第三方合作为解决的问题选择最有用的特征集手动过滤算法基于相关系数计算特征的重要性:RandomForest的维度太多,PCA自动降维模型与算法用户画像系统架构用户画像实现示例1:性别判断性别判断属于数据挖掘中的分类问题。需求描述根据用户数据判断用户的性别。已知数据1:用户使用应用程序的行为数据2:用户浏览网页对象的行为数据的实现代码UserPictur

一、标签计算

数据

86913510	{"reviewPics":[],"extInfoList":null,"expenseList":null,"reviewIndexes":[1,2],"scoreList":[{"score":5,"title":"环境","desc":""},{"score":5,"title":"服务","desc":""},{"score":5,"title":"口味","desc":""}]}

86913510	{"reviewPics":null,"extInfoList":[{"title":"contentTags","values":["午餐","分量适中"],"desc":"","defineType":0},{"title":"tagIds","values":["684","240"],"desc":"","defineType":0}],"expenseList":null,"reviewIndexes":[2],"scoreList":null}

77287793	{"reviewPics":null,"extInfoList":null,"expenseList":null,"reviewIndexes":[1,2],"scoreList":null}

77287793	{"reviewPics":null,"extInfoList":[{"title":"contentTags","values":["干净卫生","服务热情"],"desc":"","defineType":0},{"title":"tagIds","values":["852","22"],"desc":"","defineType":0}],"expenseList":null,"reviewIndexes":[1,2],"scoreList":null}

处理过程分析

(1)第一步:筛选出extInfoList不为空的记录,并去除values中的标签值

获取到的记录形式

86913510 午餐,分量适中
77287793 干净卫生,服务热情

(2)第二步:分离标签

获取到的记录形式

86913510 午餐,1
86913510 午餐,1
86913510 分量适中,1
77287793 干净卫生,1
77287793 服务热情,1

(3)第三步:统计标签

获取到的记录形式

JSON解析代码


public class JsonParse {

    public static String parseTag(String json) {

        JSONObject jsonObject = JSONObject.parseObject(json);
        JSONArray extInfoList = jsonObject.getJSONArray("extInfoList");
        if (extInfoList == null) {
            return "";
        }
        for (Object obj : extInfoList) {
            JSONObject jsonObject1 = (JSONObject) obj;
            if (jsonObject1.getString("title").equals("contentTags")) {
                String array2 = jsonObject1.getString("values");
                return array2.replace("[", "").replace("]", "").replace(""", "");
            }

        }
        return "";
    }

}

Spark统计代码


object TagCompute {

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

    //创建Spark配置对象
    val conf = new SparkConf().setMaster("local[4]").setAppName("MyApp")
    //通过conf创建sc
    val sc = new SparkContext(conf)
    //读取文件
    val rdd1 = sc.textFile("/Users/opensource/dev-problem/source/temptags.txt");
    //计算
    val rdd2 = rdd1.map(line => line.split("	"))
      .map(e => e(0) -> JsonParse.parseTag(e(1)))
      // (77287793,环境优雅,性价比高,干净卫生,停车方便,音响效果好)
      .filter(e => e._2.length > 0)
      //(70611801,["环境优雅","性价比高"])
      .map(e => e._1 -> e._2.split(",")(0))
      //     (77287793,环境优雅,性价比高,干净卫生,停车方便,音响效果好)
      .flatMapValues(e => e)
      //((70611801,价格实惠),1)
      .map(e => (e._1, e._2) -> 1)
      //((78824187,干净卫生),7)
      .reduceByKey(_ + _)
      //(73963176,List((环境优雅,6)))
      .map(e => e._1._1 -> List((e._1._2, e._2)))
      //(83084036,List((干净卫生,1), (价格实惠,1)))
      .reduceByKey(_ ::: _)
      //(79197522,List(服务热情:2, 干净卫生:1, 技师专业:1, 体验舒服:1, 放松舒服:1, 价格实惠:1))
      .map(e => e._1 -> e._2.sortBy(_._2).reverse.take(10).map(a => a._1 + ":" + a._2.toString));

    //85648235	List(味道赞:17, 服务热情:15, 干净卫生:13, 上菜快:12, 回头客:11, 性价比高:10, 体验好:9, 价格实惠:8, 环境优雅:8, 分量足:7)
    rdd2.map(e => e._1 + "	" + e._2).foreach(println);


  }

}

二、用户画像

用户画像介绍

根据用户的信息和行为动作,用标签将用户的特征描绘出来,用于描绘的标签就是用户画像。这些标签都是根据一些行为来推算出来。构建用户画像的核心工作,主要是利用存储在服务器上的海量日志和数据库里的大量数据进行分析和挖掘,给用户贴“标签”,而“标签”是能表示用户某一维度特征的标识。

在这里插入图片描述

用户画像作用

在这里插入图片描述

挑战

  • 记录和存储亿级用户的画像
  • 支持和扩展不断增加的维度和偏好
  • 毫秒级更新
  • 支撑个性化推荐、广告投放、精细化营销的产品

用户画像处理流程

明确问题、需求、数据预处理

数据清洗、缺失值处理、噪声数据

特征工程

数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限。

特征:对解决问题有帮助的属性。

特征的提取、选择与构造:

  • 特征提取
    • 业务日志
    • WEB公开数据抓取
    • 第三方合作
  • 针对所解决的问题选择最有用的特征集合
  • 通过相关系数计算特征的重要性
    • 人工筛选
    • 算法筛选:Random Forest
    • 维度过多,PCA自动降维

模型与算法

在这里插入图片描述

用户画像系统架构

在这里插入图片描述

在这里插入图片描述

用户画像实现

(1)实例一:性别判断

性别判断属于数据挖掘中分类问题。

(2)需求描述
根据用户数据判断用户性别。

(3)已知数据

  • 数据1:用户使用App的行为数据
  • 数据2:用户浏览网页的行为数据

(4)实现代码


object UserPicture {

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


    //创建Spark配置对象
    val conf = new SparkConf().setMaster("local[4]").setAppName("MyApp");

    val spark = SparkSession
      .builder()
      .appName("Spark SQL basic example")
      .config(conf)
      .getOrCreate();

    //创建训练集
    val training = spark.createDataFrame(Seq(
      (1.0,Vectors.dense(2.0,1.1,0.1)),
      (1.0,Vectors.dense(2.0,1.1,0.1)),
      (1.0,Vectors.dense(2.0,1.1,0.1)),
      (1.0,Vectors.dense(2.0,1.1,0.1))
    )).toDF("label","features");


    val lr = new LogisticRegression();
    println(lr.explainParams())

    //Set the maximum number of iterations.
    lr.setMaxIter(10)
      //Set the regularization parameter.
      .setRegParam(0.01)

    //Fits a model to the input data.
    val model1 = lr.fit(training)



    var paramMap = ParamMap(lr.maxIter -> 20).put(lr.maxIter,30)
      .put(lr.regParam -> 0.1,lr.threshold -> 0.55)

    //The parent estimator that produced this model.
    //extractParamMap with no extra values.
    println(model1.parent.extractParamMap())

  }

}


参考文档

Spark大数据互联网项目实战推荐系统
腾讯防刷负责人:基于用户画像大数据的电商防刷架构
让机器读懂用户--大数据中的用户画像
大数据开发用户画像案例分析
大数据工程师 dmp用户画像系统开发项目(完)
Spark大数据互联网项目实战推荐系统(全套)

免责声明:文章转载自《Spark(二)—— 标签计算、用户画像应用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇React 踩坑--input中的value与defaultValueWindows窗口的层次关系(转)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

怎么使用vscode合并分支

1.切换分支到本地开发2.代码完成后提交代码到本地仓库3.切换分支到需要merge的test分支先pull一下,之后再合并分支—我开发的是这个feature,就合并这个分支4.当合并分支后,需要重新提交到远程:点击一下,直接提交...

【转】Kettle集群

本文转自:http://blog.csdn.net/dqswuyundong/article/details/5952009KettleCluster Kettle是一个开源ETL工具,以其效率和可扩展性而闻名于业界。其高效的一个重要原因是其多线程和集群功能。Kettle的多线程采用了管道并发机制,这在另一篇文章中专门介绍。本文主要介绍水壶集群。群集允许转换...

ESXi挂载NFS共享存储

使用万兆交换机,ESXi使用NFS协议连接存储。本文介绍的是通过NFS协议挂载共享存储上的VS01卷,共享存储上已经赋予ESXi主机访问该卷的权限。...

linux下ifconfig, DNS以及route配置

Linux基本网络配置命令1.ifconfig查看网络接口信息。普通用户使用的ifconfig的完整路径:/sbin/ifconfigifconfig网络接口名称:显示指定接口的详细信息。...

mac 安装xcode命令行工具

重印:https://segmentfault.com/a/1190000018045211?utm_source=tag-Newest1.启动终端,输入命令:xcode select--install,然后一直单击install。2.安装成功后,输入命令:gcc-v以检查是否成功。如果在第一步中报告了错误,提示为:xcode select:error:co...

一些替代Xshell的软件推荐

TransmitTransmit是一个30美元价格的共享软件,它覆盖了几乎所有的常用功能,包括远程文件编辑和文件夹同步,尽管其有30美元的价格,很多Windows用户也希望Transmit能出一个Win版的。FireFTPFireFTP是一个Firefox扩展,能直接集成一个强大的FTP客户端到我们最喜爱的浏览器Firefox上。CyberduckCyber...