摘要:
合集:AI案例-NLP-零售
AI问题:语义相似度识别
数据集:BestBuy2014-2015用户搜索行为数据集
数据集价值:预测用户最有兴趣购买的商品
解决方案:商品相似度评测
一、问题描述
人们在关键字搜索时生成的数据可用于预测用户的兴趣。BestBuy消费电子公司已提供了来自用户的数百万次搜索的数据,时间范围覆盖了 2014年11月到2015年3月。这些数据可用于预测用户最有兴趣购买的Xbox游戏,这将用于向游客推荐游戏。
二、数据集内容
数据结构
文件train.csv和test.csv中的数据包含了用户在关键字搜索后,点击了哪些物品的信息。
train.csv的每一行描述了一个用户对单个物品的点击。它包含以下字段:
- user:用户ID
- sku:用户点击的库存保有单位(物品)
- category:sku所属的类别
- query:用户输入的搜索词
- click_time:点击sku的时间
- query_time:运行查询的时间
test.csv包含与train.csv相同的字段,除了sku。你的任务是估计在这些测试查询中点击了哪些sku。
说明:在网络搜索和电子商务领域中,SKU(Stock Keeping Unit,库存保有单位)是一种用于唯一标识库存中某个特定产品的编码。SKU通常由字母和数字组成,可以是产品型号、品牌、尺寸、颜色等信息的组合。SKU的目的是帮助商家跟踪库存、管理销售和进行产品分类。例如,在一个电子商务网站上,同一款T恤可能有不同的颜色和尺寸,每种颜色和尺寸的组合都有一个唯一的SKU。这样,商家可以更容易地了解哪些产品的需求较高,从而更好地管理库存和采购。当用户在网站上搜索商品时,搜索结果通常会显示与查询相关的SKU。例如,如果用户搜索“红色T恤”,搜索结果可能会显示具有红色SKU的T恤。
由于BestBuy数据库的内部结构,无法保证用户的点击是由给定查询的搜索结果产生的。我们所知道的是,用户在query_time进行了查询,然后在click_time点击了sku,但我们不知道点击是否来自搜索结果。click_time不应当比query_time晚超过五分钟。
此外,small_product_data.xml中还有关于这些xbox产品的信息。
数据样例
user | sku | category | query | click_time | query_time |
---|---|---|---|---|---|
0001cd0d10bbc585c9ba287c963e00873d4c0bfd | 2032076 | abcat0701002 | gears of war | 22:56.1 | 21:42.9 |
00033dbced6acd3626c4b56ff5c55b8d69911681 | 9854804 | abcat0701002 | Gears of war | 35:42.2 | 35:33.2 |
00033dbced6acd3626c4b56ff5c55b8d69911681 | 2670133 | abcat0701002 | Gears of war | 36:08.7 | 35:33.2 |
00033dbced6acd3626c4b56ff5c55b8d69911681 | 9984142 | abcat0701002 | Assassin creed | 37:23.7 | 37:00.0 |
0007756f015345450f7be1df33695421466b7ce4 | 2541184 | abcat0701002 | dead island | 15:34.3 | 15:26.2 |
000878e35cb70ace315dbdbef54c22477066f07e | 3046066 | abcat0701002 | Rocksmith | 44:36.8 | 44:22.9 |
数据集版权许可协议
Creative Commons Attribution-NoDerivs 3.0 ( CC BY-ND 3.0 ).
三、解决方案样例
安装开发包
通过conda安装python (Version 3.12.x)、pandas、numpy等传统机器学习开发包。参考文章《安装传统机器学习开发包》。
工作流程
源码:BestBuy_Search_Query.ipynb
1、导入必要的库
import pandas as pd
import numpy as np
pandas
提供了高性能、易用的数据结构和数据分析工具。numpy
用来存储和处理大型矩阵,并能够高效地进行矩阵运算。
2、读入训练数据集和测试数据集
trainDS = pd.read_csv('./train.csv')
testDS = pd.read_csv('./test.csv')
# 删除无意义的字段
# 只留下 (query,sku)两个字段
trainDF = trainDS.drop(['user','category','click_time','query_time'], axis = 1)
3、从训练数据集中提取数据字典
建立用户查询字段query和商品sku映射关系:
for row in trainDF.values:
query = prepare(row[1])
sku = row[0]
try:
mapping[query][sku] += 1
except KeyError:
try:
mapping[query][sku] = 1
except KeyError:
mapping[query] = {}
mapping[query][sku] = 1
4、将数据字典应用到测试数据集
在测试数据集testDS中,新增一字段recommend_sku定义为查询与推荐的商品的映射值。根据训练集合中(query,sku)的映射建立测试数据集中query和recommend_sku的对应关系。
# Adding a new column 'recommend_sku' to test dataset
testDS['recommend_sku'] = ''
testDS.head()
for row in testDS.values:
test_case_number += 1
query = prepare(row[2])
if query in mapping:
mapping_number += 1
for sku in sorted(mapping[query], key = mapping[query].get, reverse = True):
# print(sku)
testDS.at[test_case_number - 1, 'recommend_sku'] = sku
break
print("Used mapping in %s / %s (%s)" % (mapping_number, test_case_number, 1.0 * mapping_number / test_case_number))
# 输出
testDS.to_csv('output.csv', index = False)
运行结果
输出:在测试集合中使用了训练集合中(query,sku)的映射数据的命中率为93%。
Used mapping in 26277 / 28241 (0.9304557204065012)
output.csv
user | category | query | click_time | query_time | recommend_sku |
---|---|---|---|---|---|
00025eb02b249434554fe2cacd8562db325df127 | abcat0701002 | child eden | 05:24.1 | 04:34.6 | 2628429 |
00033dbced6acd3626c4b56ff5c55b8d69911681 | abcat0701002 | Revelations | 38:14.7 | 37:58.4 | 2613542 |
000548d17532b70071b7d59edd4797aed1823c60 | abcat0701002 | Gears of war | 34:43.6 | 33:43.2 | 9854804 |
0006f15231a422156a9d005735d0969a5e5a0ac4 | abcat0701002 | batman | 14:48.4 | 14:33.7 | 2173065 |
000a16ce5371b0fb3ad0c7f6183a5476b434a95b | abcat0701002 | Assassins creed: revelations | 31:53.1 | 31:39.8 | 2613542 |
000a16ce5371b0fb3ad0c7f6183a5476b434a95b | abcat0701002 | Assassins creed: revelations | 33:07.0 | 31:39.8 | 2613542 |
源码许可协议
The MIT License (MIT)
Copyright (c) 2012 Zygmunt Zając