推荐系统实战中LR模型训练(二)

article/2025/9/2 16:10:42

背景:
上一篇推荐系统实战中LR模型训练(一) 中完成了LR模型训练的代码部分。本文中将详细讲解数据准备部分,即将文本数据数值化为稀疏矩阵的形式。

  • 文本数据:
    在这里插入图片描述
  • 稀疏矩阵:
    在这里插入图片描述

实现过程:
文本数据格式如下:
用户ID / 物品ID / 收听时长 / 收听的时间点 / 性别 / 年龄段 / 收入 / 籍贯 / 物品名称 / 物品总时长 / 物品标签
在这里插入图片描述
LR模型在此处的目的是用户对某个物品(音乐)的点击率,本文中将通过用户对物品(音乐)的收听时长占比来表示用户对物品的喜好程度。本文中抽取的特征分为两类:

  • 用户特征(user_feature):性别、年龄段、收入
  • 物品特征(item_feature):物品名称

1.从原始数据中抽取相应的特征部分,得到dataset.tmp
代码如下:(1_fromMetaDataTofeatureData.py)

#coding=utf-8
import sysmeta_data = sys.argv[1]with open(meta_data, 'r') as fd:for line in fd:ss = line.strip().split('^A')if len(ss) != 11:continueuser_id = ss[0].strip()item_id = ss[1].strip()watch_time = ss[2].strip()total_time = ss[9].strip()#用户特征gender = ss[4].strip()age = ss[5].strip()income = ss[6].strip()#物品特征item_name = ss[8].strip()user_feature = '^A'.join([user_id, gender, age, income])item_feature = '^A'.join([item_id, item_name])label = round((float(watch_time) / float(total_time)), 1)final_label = '0'if label >= 1.0:final_label = '1'print '^B'.join([final_label, user_feature, item_feature])

得到的dataset.tmp部分数据如下图所示:
在这里插入图片描述

2.对dataset.tmp进行操作,数值化用户(user)特征,得到user_feature.data
代码如下:(gen_user_feature.py)

#coding=utf-8
import sysinput_file = sys.argv[1]#性别
# 0:女 1:男#年龄段
# 0-18   =  0
# 19-25  =  1
# 26-35  =  2
# 36-45  =  3
# 46-100 =  4#收入
# 0-2000 = 0
# 2000-5000 = 1
# 5000-10000 = 2
# 10000-20000 = 3
# 20000-100000 = 4user_feature_set = set()
with open(input_file, 'r') as fd:for line in fd:ss = line.strip().split('^B')if len(ss) != 3:continuelabel = ss[0].strip()user_feature = ss[1].strip()item_feature = ss[2].strip()user_feature_set.add(user_feature)for line in user_feature_set:user_id, gender, age, income = line.strip().split('^A')#genderindex = 0if gender == '男':index = 1gender_fea = ':'.join([str(index), '1'])#ageindex = 0if age == '0-18':index = 0elif age == '19-25':index = 1elif age == '26-35':index = 2elif age == '36-45':index = 3else:index = 4#gender偏移index += 2age_fea = ':'.join([str(index), '1'])#incomeindex = 0if income == '0-2000':index = 0elif income == '2000-5000':index = 1elif income == '5000-10000':index = 2elif income == '10000-20000':index = 3else:index = 4#gender和age偏移index += 7income_fea = ':'.join([str(index), '1'])print user_id, gender_fea, age_fea, income_fea

得到的user_feature.data部分数据如下图所示:
在这里插入图片描述

3.数值化物品特征
物品的特征主要通过物品名称来抽取,在本文中将运用jieba分词技术进行特征抽取和评分

第一步:物品名称去重,得到item.set
代码如下:(1_gen_item_set.py)

#coding=utf-8
import sysinput_file = sys.argv[1]item_feature_set = set()
with open(input_file, 'r') as fd:for line in fd:ss = line.strip().split('^B')if len(ss) != 3:continuelabel = ss[0].strip()user_feature = ss[1].strip()item_feature = ss[2].strip()item_feature_set.add(item_feature)for line in item_feature_set:item_id, item_name = line.strip().split('^A')print item_name

得到的item.set部分数据如下图所示:
在这里插入图片描述
第二步:jieba分词并打分,得到item的token:score列表(item_tokenlist.raw)
代码如下:(2_gen_item_tokenlist.py)

import sys
reload(sys)
sys.setdefaultencoding('utf-8')sys.path.append("./")
import jieba
import jieba.posseg
import jieba.analysein_meta_file = sys.argv[1]with open(in_meta_file, 'r') as fd:for line in fd:name = line.strip()token_score_list = []for x, w in jieba.analyse.extract_tags(name, withWeight=True):token_score_list.append('^A'.join([x, str(w)]))fea = '^B'.join(token_score_list)print ' '.join([name, fea])

得到的item_tokenlist.raw部分数据如下图所示:
在这里插入图片描述
第三步:对分词后的每一个token进行编号,得到tokenid_token.data
代码如下:(3_gen_uniq_token.py)

import sys
reload(sys)
sys.setdefaultencoding('utf-8')sys.path.append("./")
import jieba
import jieba.posseg
import jieba.analysein_meta_file = sys.argv[1]token_set = set()
with open(in_meta_file, 'r') as fd:for line in fd:name = line.strip()for x, w in jieba.analyse.extract_tags(name, withWeight=True):token_set.add(x)token_list = list(token_set)for tu in enumerate(token_list):print '     '.join([str(tu[0]), tu[1]])

得到的tokenid_token.data部分数据如下图所示:
在这里插入图片描述

第四步:结合第三步的结果tokenid_token.data将第二步item_tokenlist.raw中的token换成tokenid,进一步得到name_tokenid.fea
代码如下:(4_gen_item_tokenid_format.py)

#coding=utf-8
import sysin_token_dict_file = sys.argv[1]
in_item_tokenlist_file = sys.argv[2]#user_feature特征偏移:gender(2)+age(5)+income(5)
offset = 12token_dict = {}
with open(in_token_dict_file, 'r') as fd:for line in fd:ss = line.strip().split('       ')if len(ss) != 2:continuetokenid, token = sstoken_dict[token] = tokenidwith open(in_item_tokenlist_file, 'r') as fd:for line in fd:ss = line.strip().split(' ')if len(ss) != 2:continuename, ts_list_str = sstmp_list = []for ts in ts_list_str.strip().split('^B'):sss = ts.strip().split('^A')if len(sss) != 2:continuetoken, score = sssif token not in token_dict:continuetokenid = token_dict[token]tmp_list.append(':'.join([str(int(tokenid) + 12), str(round(float(score), 2))]))print '\t'.join([name, ' '.join(tmp_list)])

得到的name_tokenid.fea部分数据如下图所示:
在这里插入图片描述
第五步:得到物品名称和物品ID的对应数据name_id.dict
代码如下:(5_gen_itemid_name.py)

#coding=utf-8
import sysraw_input_file = sys.argv[1]item_info_set = set()
with open(raw_input_file, 'r') as fd:for line in fd:ss = line.strip().split('^B')if len(ss) != 3:continuelabel = ss[0].strip()user_info = ss[1].strip()item_info = ss[2].strip()item_info_set.add(item_info)for i_info in item_info_set:itemid, name = i_info.strip().split('^A')print '     '.join([name, itemid])

得到的name_id.dict部分数据如下图所示:
在这里插入图片描述

第六步:结合第四步和第五步的数据,得到item_id token_id的对应数据itemid_tokenid_fea.data
代码如下:(6_gen_itemid_tokenidfea.py)

#coding=utf-8
import sysname_id_dict_input_file = sys.argv[1]
name_tokenid_input_file = sys.argv[2]name_id_dict = {}
with open(name_id_dict_input_file, 'r') as fd:for line in fd:ss = line.strip().split('       ')if len(ss) != 2:continuename = ss[0].strip()itemid = ss[1].strip()name_id_dict[name] = itemidwith open(name_tokenid_input_file, 'r') as fd:for line in fd:ss = line.strip().split('       ')if len(ss) != 2:continuename = ss[0].strip()tokenid_fea = ss[1].strip()if name not in name_id_dict:continueitemid = name_id_dict[name]print '\t'.join([itemid, tokenid_fea])

自此终于得到数值化后的物品特征数据itemid_tokenid_fea.data,如下图所示:
在这里插入图片描述
4.将数值化后的用户特征数据和物品特征数据组合起来,得到最终的训练数据dataset.final
代码如下:(final_merge_feature.py)

import sysuser_fea_file = sys.argv[1]
item_fea_file = sys.argv[2]
base_file = sys.argv[3]user_dict = {}
with open(user_fea_file, 'r') as fd:for line in fd:ss = line.strip().split(' ')if len(ss) != 4:continueuserid, gender_fea, age_fea, income_fea = ssuser_dict[userid] = ' '.join([gender_fea, age_fea, income_fea])item_dict = {}
with open(item_fea_file, 'r') as fd:for line in fd:ss = line.strip().split('\t')if len(ss) != 2:continueitemid, item_fea = ssitem_dict[itemid] = item_feawith open(base_file, 'r') as fd:for line in fd:ss = line.strip().split('^B')if len(ss) != 3:continuelabel, user_info, item_info = ssuserid = user_info.strip().split('^A')[0]itemid = item_info.strip().split('^A')[0]if userid not in user_dict:continueif itemid not in item_dict:continueprint ' '.join([label, user_dict[userid], item_dict[itemid]])

最终得到的训练集数据dataset.final如下图所示:
在这里插入图片描述
自此完成了将文本数据数值化为稀疏矩阵工作,最终得到的数据dataset.final可以直接输入到推荐系统实战中LR模型训练(一)LR模型中进行训练,训练结果如下图所示:
在这里插入图片描述


http://chatgpt.dhexx.cn/article/XbN07fRP.shtml

相关文章

机器学习 | LR逻辑回归模型

逻辑回归(Logistic Regression,简称LR)名为“回归”却是用来分类工作、在线性数据上表现优异的分类器。 视频教程:第07讲:逻辑回归是线性分类器的佼佼者 LR是数据挖掘领域常用的一种分类模型,常用于解决二分类问题,例如垃圾邮件判定、经济预测、疾病诊断(通过年龄、性…

推荐系统实战中LR模型训练(一)

背景: 在“批量导入数据到Redis” 中已经介绍了将得到的itema item1:score1,item2:score2…批量导入到Redis数据库中。本文的工作是运用机器学习LR技术,抽取相应的特征,进行点击率的估计。 点击率(Click-Through-Rate, CTR&#…

Prometheus TSDB存储原理

Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https://blog.csdn.net/m0_56069948/article/details/122285941 Prometheus 包含一个存储在本地磁盘的时间序列数据库,同时也支持与远程…

数据库必知必会:TiDB(8)TiDB 数据库 SQL 执行流程

数据库必知必会:TiDB(8)TiDB 数据库 SQL 执行流程 数据库 SQL 执行流程DML语句读流程概述SQL的Parse与CompileSQL的Execute DML语句写流程概述执行 DDL语句流程概要执行 知识点回顾 数据库 SQL 执行流程 在TiDB中三个重要组件: …

时不我待,TSDB崛起正当时

近期有小伙伴问Jesse,为什么你们要在现在这个时点做TSDB,这是个好时点吗?我认为这是个挺好的问题,因为再强的个人也比不上一个团队,再牛的团队也需要顺势而为。我们其实一直在深度思考“Why Now”的问题,因…

时间序列数据库TSDB排名

DB-Engines 中时序列数据库排名 我们先来看一下DB-Engines中关于时序列数据库的排名,这是当前(2016年2月的)排名情况: 下面,我们就按照这个排名的顺序,简单介绍一下这些时序列数据库中的一些。下面要介绍的…

TiDB Server

目录 TiDB Server架构 Online DDL GC 缓存管理 热点小表缓存 例题 TiDB Server架构 Protocol Layer:负责处理客户端的连接 Parse,Compile:负责SQL语句的解析与编译,并生成执行计划 Executor,DistSQL&#xff0…

Prometheus TSDB

TSDB 概述: Head: 数据库的内存部分 Block: 磁盘上持久块,是不变的 WAL: 预写日志系统 M-map: 磁盘及内存映射 粉红色框是传入的样品,样品先进入Head中存留一会,然后到磁盘、内存映射中(蓝色框)。然后当内…

TiDB体系结构之TiDB Server

TiDB体系结构之TiDB Server TiDB ServerTiDB Server主要组成模块SQL语句的解析和编译行数据与KV的转化SQL读写相关模块在线DDL相关模块TiDB的垃圾回收TiDB Server的缓存 TiDB Server TiDB Server的主要作用如下: 处理客户端连接SQL语句的解析和编译关系型数据与KV…

TSDB助力风电监控

各位小伙伴大家好,本期Jesse想再来跟大家聊聊TSDB的应用场景,在此也感谢尹晨所著的《时序数据库在风电监控系统中的应用》一文,其为我们探究TSDB在风电系统中的应用提供了重要的帮助。 本文仅代表个人观点,如有偏颇之处&#xff…

dbt-tidb 1.2.0 尝鲜

作者: shiyuhang0 原文来源: https://tidb.net/blog/1f56ab48 本文假设你对 dbt 有一定了解。如果是第一次接触 dbt,建议先阅读 官方文档 或 当 TiDB 遇见 dbt 本文中的示例基于官方维护的 jaffle_shop 项目。关于此项目的细节介绍&a…

为啥用 时序数据库 TSDB

前言 其实我之前是不太了解时序数据库以及它相关的机制的,只是大概知晓它的用途。但因为公司的业务需求,我意外参与并主导了公司内部开源时序数据库influxdb的引擎改造,所以我也就顺理成章的成为时序数据库“从业者”。 造飞机的人需要时刻…

Prometheus 学习之——本地存储 TSDB

Prometheus 学习之——本地存储 TSDB 文章目录 Prometheus 学习之——本地存储 TSDB前言一、TSDB 核心概念二、详细介绍1.block1)chunks2)index3)tombstone4)meta.json 2.WAL 总结 前言 Prometheus 是 CNCF 收录的第二个项目&…

阿里云IoT物模型上报数据流转到实例内TSDB

阿里云物联网平台上存储的数据最多为30天,为了能让数据永久保存下来,就需要把物联网平台的数据流转到其他的数据库,对于企业版实例,内部有一个实例内的时空数据库TSDB,正好可以利用。下边就介绍一下物联网平台的物模型…

使用TSDB自动检测时序数据的异常情况

本期Jesse就带大家来继续了解一下TSDB的应用问题,小伙伴们,让我们直接步入正题吧。 本文仅代表个人观点,如有偏颇之处,还请海涵~ 现今,每天都有数千亿个传感器产生大量时序数据。公司收集大量数据使得分析…

TSDB 存储引擎介绍

本文介绍 DolphinDB 在2.0版本中新推出的存储引擎 TSDB。 1. OLAP 与 TSDB 适用的场景 OLAP 是 DolphinDB 在2.0版本之前的唯一存储引擎。数据表中每个分区的每一列存为一个文件。数据在表中的存储顺序与数据写入的顺序一致,数据写入有非常高的效率。 OLAP 引擎的…

TSDB与Blockchain

各位小伙伴们我们又见面了,伴随着区块链技术的推广,很多企业也在思考是否将其应用。其实TSDB与区块链有很多共通之处,本期Jesse就来和大家聊聊TSDB与区块链。本文参考了Nicolas Hourcard的文章“You Don’t Need a Blockchain, You Need a Ti…

FlashDB嵌入式数据库之TSDB数据存储解析

一、驱动层:SFUD(Serial Flash Universal Driver) 是一款开源的串行 SPI Flash 通用驱动库 二、中间层:FAL(FLASH ABSTRACTION LAYER))FLASH 抽象层 三、应用层:FlashDB(FlashDB 是一…

时间序列数据库 (TSDB)

参考文档:时间序列数据库 TSDB_时间序列数据库 TSDB-阿里云帮助中心 什么是时序数据库 时序数据是随时间不断产生的一系列数据,简单来说,就是带时间戳的数据。数据可能来自服务器和应用程序的指标、物联网传感器的读数、网站或应用程序上的…

TSDB在高速公路大数据平台的应用

好久没有跟大家聊TSDB的应用场景了,Jesse也在国庆期间进行了补课,今天就跟大家聊聊TSDB在高速公路大数据平台的应用。本文借鉴了郝建明、袁逸涛发表在《上海船舶运输科学研究生学报》的《基于时序数据库的高速公路数据集成平台》一文,感谢二位…