简易版电商推荐系统开发实战

  • 数据来源
  • 数据转换
    • Pandas->MySQL
    • 用Sqoop把数据导入Hive
  • 推荐算法
    • Mahout安装
    • itembase协同过滤算法
  • 进行推荐
  • 实验结果

这是从Hive离线计算开发实战中看到小项目改造而来

数据来源

  • 数据来源于天池大赛中的user_log_format1.csv文件

  • 用户行为表 user_info

    DataFields Definition
    user_id 用户ID
    item_id 商品ID
    cat_id 商品类别ID
    seller_id 商家ID
    brand_id 品牌ID
    time_tamp 时间戳
    action_type 取值范围{0,1,2,3}
    0:点击 1:加购物车 2:购买 3:收藏
  • 这里我们用到用户ID列、商品ID列和动作列

数据转换

Pandas->MySQL

我们提取需要的列 和 部分数据(100w)

  • # 我们提取需要的列 和 部分数据(100w)
    import numpy as np
    import pandas as pd
    # 对操作行为进行打分 值可以自己调
    def change(data, single_col, name):if data[single_col] == 0:return 0.1if data[single_col] == 1:return 0.6if data[single_col] == 2:return 1.0if data[single_col] == 3:return 0.4#读入文件
    user_log = pd.read_csv('./datasets/data_format1/user_log_format1.csv')
    #取需要的数据和字段
    df1 = user_log.loc[:1000000,['user_id','item_id','action_type']]
    df1['score'] = df1.apply(lambda x:change(x,'action_type','score'),axis=1)
    df2 = df1.loc[:,['user_id','item_id','score']]
    

将df2的数据导入MySQL数据库

  • -- 需要安装sqlalchemy包
    from sqlalchemy import create_engine
    import sqlalchemy
    # 创建和mysql的借口 前一个root表示用户名 后一个root是密码 localhost可修改自己的位置 test指的是数据库名
    conn = create_engine('mysql+mysqldb://root:root@localhost/test?charset=utf8')
    # 流式写入 存入的表名为data 位置是test index不写入
    pd.io.sql.to_sql(df2,'data',con=conn,schema='test',index=False)
    #关闭
    conn.dispose()
    

查看一下MySQL是否有数据 我这里是在test数据库中的data表

  • root@localhost [test]>select * from data limit 10;
    +---------+---------+-------+
    | user_id | item_id | score |
    +---------+---------+-------+
    |  328862 |  323294 |   0.1 |
    |  328862 |  844400 |   0.1 |
    |  328862 |  575153 |   0.1 |
    |  328862 |  996875 |   0.1 |
    |  328862 | 1086186 |   0.1 |
    |  328862 |  623866 |   0.1 |
    |  328862 |  542871 |   0.1 |
    |  328862 |  536347 |   0.1 |
    |  328862 |  364513 |   0.1 |
    |  328862 |  575153 |   0.1 |
    +---------+---------+-------+
    10 rows in set (0.00 sec)
    

用Sqoop把数据导入Hive

Sqoop的安装部署可以查看链接 这里需要确保Hadoop集群、Hive已经启动 并且Sqoop安装完成

  • # 把对应地址(localhost)上的test数据库中的data表导入到 对应的hdfs上
    sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root
    --table data --target-dir 'hdfs://localhost:9000/usr/hive/warehouse/default/tm'
    --fields-terminated-by '\t' -m 1;
    

在Hive中创建对应的表

  • create table default.tm(user_id bigint,item_id bigint,score double
    )
    row format delimited fields terminated by '\t'
    location '/usr/hive/warehouse/default/tm';
    

查看Hive表

select * from tm limit 10;
OK
328862  323294  0.1
328862  844400  0.1
328862  575153  0.1
328862  996875  0.1
328862  1086186 0.1
328862  623866  0.1
328862  542871  0.1
328862  536347  0.1
328862  364513  0.1
328862  575153  0.1

推荐算法

Mahout安装

  • 这里采用的是Mahout,一个Apach SoftWare Foundation 旗下的开源项目

  • Mahout包含许多实现,包括聚类、分类、推荐等

  • Mahout下载链接

  • # 将下载下来的Mahout包进行解压
    tar -zxvf apache-mahout-distribution-0.10.1.tar.gz
    cd apache-mahout-distribution-0.10.1
    bin/mahout  #测试是否安装成功
    

itembase协同过滤算法

CF(collaborative filtering )物以类聚人以群分,做协同过滤的话首先特征工程把用户-物品的评分矩阵创建出来

  • 基于用户的协同过滤

    • 给用户A找到最相似的N个用户
    • N个用户消费过哪些物品
    • N个用户消费过的物品中-A用户消费过的就是推荐结果
  • 基于物品的协同过滤

    • 给物品A找到最相似的N个物品
    • A用户消费记录找到这些物品的相似物品
    • 从这些相似物品先去重-A用户消费过的就是推荐结果
  • 基于模型的算法

    • 用户-物品矩阵比较稀疏的时候,直接去取物品向量、用户向量,计算相似度不太适合
    • 于模型的方法可以解决用户-物品矩阵比较稀疏的问题
    • 矩阵分解
      • 把大的矩阵拆成两个小的 用户矩阵、物品矩阵 MxK KxN K<<M K<<N
      • 大矩阵 约等于 用户矩阵 乘 物品矩阵
      • 使用als(交替最小二乘法)来优化损失 spark ML recommandation 包封装了als
      • 优化之后的用户矩阵 取出用户向量
      • 优化之后的物品矩阵 取出物品向量
      • 用户向量点乘物品向量 得到最终评分的预测
  • 相似度计算

    • 余弦相似度皮尔逊相关系数(矩阵需稠密型、连续型)
    • 向量的夹角余弦值
    • 皮尔逊会对向量的每一个分量做中心化
    • 余弦只考虑方向不考虑向量长度
    • 如果评分数据是连续的数值比较适合中,余弦、皮尔逊计算相似度
  • 杰卡德相似度

    • 交集/并集

      • 比如说商品A被用户1、用户2、用户3购买;
      • 商品B被用户2、用户4购买;
      • 那么A和B的杰卡德相似度是1/4 = (被购买用户的交集 用户2 )/(被购买用户的并集 用户1、2、3、4)
    • 计算评分是0、1布尔值的相似度

    • 使用不同相似度计算方式实现协同过滤

    • 如果买/没买点/没点数据0/1适合使用杰卡德相似度

    • from sklearn.metrics import jaccard_score
      jaccard_score(df[ltemA]df[ltemB’])
      from sklearn.metrics.pairwise import pairwise_distances
      user_ similar= 1-pairwise_distances(df.value,metric="jaccard)
      
  • 杰卡德实验 可参考网站

进行推荐

  • 实现算法需要设置两个存储路径 一个是设置中间生成数据和结果数据

    • 中间生成数据的名字是temp/ ,如果之前运行过在这个文件内有很多中间结果,需要清空这个文件夹

      hadoop fs -rm -r temp/

    • 存放结果的数据可以自己指定目录

  • bin/mahout recommenditembased --similarityClassname SIMILARITY_PEARSON_CORRELATION
    --input /usr/hive/warehouse/default/tm
    --output /tm --numRecommendations 10# 参数介绍
    --similarityClassname 相似度计算公式 SIMILARITY_PEARSON_CORRELATION(Pearson)
    --input 输入文件
    --output 输出文件夹
    --numRecommendations  给每个用户推荐几个商品
    --booleanData 当加入这个参数 只有前两行有用查看更多相似度计算公式可以命令 bin/mahout recommenditembased
    -similarityClassname (-s) similarityClassname    Name of distributedsimilarity measures class toinstantiate, alternativelyuse one of the predefinedsimilarities([SIMILARITY_COOCCURRENCE,SIMILARITY_LOGLIKELIHOOD,SIMILARITY_TANIMOTO_COEFFICIENT, SIMILARITY_CITY_BLOCK,SIMILARITY_COSINE,SIMILARITY_PEARSON_CORRELATION,SIMILARITY_EUCLIDEAN_DISTANCE])
    

实验结果

# 可以看到 最前面的是用户ID 后面是10个推荐的商品ID以及权重16 [424167:0.28469178,854805:0.25879237,108933:0.1,997672:0.1,262468:0.1,682218:0.1,797137:0.1,913466:0.1,231154:0.1,612219:0.1]
19  [1064480:0.6515591,772398:0.6515591,571895:0.6515591,202248:0.6515591,814146:0.58494866,39706:0.5675884,829554:0.520801,215832:0.47399485,906379:0.45204273,180464:0.36228114]
244 [990197:0.1,44924:0.1,1061499:0.1,506304:0.1,218810:0.1,922009:0.1,589702:0.1,134979:0.1,333637:0.1,737808:0.1]
259 [768828:0.98034495,653198:0.91623175,758011:0.91623175,229252:0.72734666,309859:0.72734666,990881:0.72734666,491983:0.72734666,508126:0.54786074,209698:0.54786074,4285:0.4138005]
281 [210909:0.6562717,314100:0.61027277,578774:0.48745078,717024:0.43397224,885957:0.4,367064:0.36655146,301792:0.36305127,289968:0.36065727,783997:0.35788584,97630:0.3468627]
330 [729259:1.0,776354:1.0,1097610:1.0,230306:1.0,1026495:1.0,248939:1.0,728272:1.0,1032462:1.0,1088352:1.0,778611:1.0]
445 [397396:1.0,71395:1.0,820768:1.0,995421:1.0,767743:1.0,395439:1.0,279642:1.0,729079:1.0,101215:1.0,234362:1.0]
499 [300105:0.7064565,1046717:0.1,655269:0.1,808026:0.1,212957:0.1,261388:0.1,58227:0.1,255526:0.1,952466:0.1,339398:0.1]
...


今天也是爱zz的一天哦!

简易版电商推荐系统开发实战Hive相关推荐

  1. 微信小程序电商项目开发实战漫谈

    原创文章,若转载请于明显处标明出处和相关链接:https://www.toutiao.com/i6567868839856439822/,否则追究其法律责任! 2018年小程序内容电商风口已成,如果我 ...

  2. 电商系统开发实战-用户微服务基础模块开发

    电商系统开发实战-用户微服务基础模块开发 1.用户微服务项目开发之收货地址查询接口开发 1.1 配置文件配置 application.yml server:port: 9001spring:appli ...

  3. 微软ASP.NET 电商网站开发实战 MVC6 +HTML5 +WCF+WebAPI+NoSQL+mongoDB+Redis+Core视频 代码 面试题...

    <微软ASP.NET 电商网站开发实战 MVC6 +HTML5 +WCF+WebAPI+NoSQL+mongoDB+Redis+Core 视频 代码 面试题 >下载网盘:https://y ...

  4. 简易版电商系统实现记录

    前言 最近手上没啥活就干脆把之前一直想练的一个项目拿出来做做,挺有意思的一点就是平时都是自己在别人搭好的项目结构上直接写业务逻辑,当自己从0开始写项目的时候还是遇到了一些问题,也算是更宏观的学习如何做 ...

  5. web项目电商网站开发实战(1)

    [前言] 商城项目实战day1心得:    今天正式进入商城的项目实战.以前,总是写个小程序,里面弄个main方法.或者做个小网页,验证验证一下是否有做出符合要求的效果就可以.通过今天第一天的实战效果 ...

  6. Django项目之Web端电商网站的实战开发(一)

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 项目源码下载 目录 一丶项目介绍 二丶电商项目开发流程 三丶项目需求 四丶项目架构概览 五丶项目数据库设计 六丶项目框架搭建 一丶 ...

  7. 3.创建项目并初始化业务数据(电商推荐系统)

    文章目录 一.在IDEA中创建maven项目 1.项目框架搭建 2.声明项目中工具的版本信息 3.添加项目依赖 二.数据加载准备 1.Products数据集 2.Ratings数据集 3.日志管理配置 ...

  8. 视频教程-全新大数据企业电商数据仓库项目实战教程-大数据

    全新大数据企业电商数据仓库项目实战教程 张长志技术全才.擅长领域:区块链.大数据.Java等.10余年软件研发及企业培训经验,曾为多家大型企业提供企业内训如中石化,中国联通,中国移动等知名企业.拥有丰 ...

  9. 《推荐系统开发实战》之推荐系统的前世今生与古往今来

    转载请注明出处:http://blog.csdn.net/gamer_gyt 博主微博:http://weibo.com/234654758 Github:https://github.com/thi ...

最新文章

  1. Mybatis 3.5.X 解析LocalDateTime 错误问题
  2. Hadoop核心机制详细解析
  3. oracle数组元素所在key,oracle可变数组(VARRAY)
  4. R语言绘制空间热力图
  5. 如何用auto_ptr做为函数的参数进行传递
  6. 算法入门经典第六章 例题6-2 铁轨
  7. CentOS curses 中文乱码问题
  8. java调用go接口_go语言调用API实线分词
  9. linux命令 创建目录权限,linux创建用户并设置目录权限
  10. PGM:基于模板的表示
  11. IT、电商、系统、架构等名称名词解释
  12. Shell字符串的替换
  13. django建议入门-FYI
  14. 纪念一下获得十大优秀学生
  15. L-半胱氨酸修饰的金纳米粒子(Cys-GNPs)和牛血清白蛋白/生物素化白蛋白纳米粒
  16. BeEF-XSS详细使用教程
  17. 误差卡尔曼中的四元数运动学-第二章
  18. 时间序列中Hurst指数的计算(python代码)
  19. 建筑施工复习资料-立杆基础
  20. OpenGL编程入门学习

热门文章

  1. 双向链表实现水浒排行增删改查
  2. FBEC2020 | 何亦凡:虚拟货币直接促使了各国央行研究法定数字货币
  3. PostgreSQL查询表名称及表结构
  4. 《汉武大帝》中涉及的一些东西
  5. 用 Python3 OpenCV 将视频转成字符动画
  6. 设计巧妙的保险丝熔断指示电路
  7. 原生js实现漂浮广告
  8. 【音频】Mya Marie Harrison的精品音樂
  9. oracle rac环境下修改1521集群端口
  10. Limitations of the Lipschitz constant as a defense against adversarial examples