【发布时间】:2018-12-04 13:51:00
【问题描述】:
我正在探索 Python 中的推荐系统,到目前为止,我已经使用 KNN 模型通过“像您一样的用户也购买了...”的方法来推荐品牌。我的数据表中每个客户都有一行,每个品牌都有一个列,其中填充了1 或0,以表明客户是否购买了该品牌。
我现在希望将此方法推广到产品级建议,但很难了解这种方法将如何扩展。我尝试了相同的方法,但无法使用足够大的查询来查询我的数据库 (BigQuery),从而为每个产品 (10,000+) 生成一列。
例如,我的来源是导出到 BigQuery 的 Google Analytics(分析)每日数据,我正在按照以下示例创建输入数据:
SELECT
customDimension.value AS UserID,
MAX(IF(UPPER(hits_product.productSKU) LIKE "SKU1",1,0)) AS SKU1,
MAX(IF(UPPER(hits_product.productSKU) LIKE "SKU2",1,0)) AS SKU2,
MAX(IF(UPPER(hits_product.productSKU) LIKE "SKU3",1,0)) AS SKU3
# plus 10,000 more...
FROM
`PROJECT.DATASET.ga_sessions_20*` AS t
CROSS JOIN
UNNEST (hits) AS hits
CROSS JOIN
UNNEST(t.customdimensions) AS customDimension
CROSS JOIN
UNNEST(hits.product) AS hits_product
WHERE
parse_DATE('%y%m%d',
_table_suffix) BETWEEN DATE_SUB(CURRENT_DATE(), INTERVAL 1 day)
AND DATE_SUB(CURRENT_DATE(), INTERVAL 1 day)
AND customDimension.index = 2
AND customDimension.value NOT IN ("true","false","undefined")
AND customDimension.value IS NOT NULL
AND hits.eventInfo.eventCategory = 'Ecommerce'
AND hits.eventInfo.eventAction = 'Purchase'
GROUP BY
UserID
对每个 SKU 使用一行运行此查询会生成错误:
查询过大。最大查询长度为 256.000K 个字符,包括 cmets 和空白字符。
在这种情况下,如何创建产品级推荐?数据是否通常以不同的形式引入 python 并转换为代码中的 maxrix?
在这一点上我完全被难住了,所以欢迎任何建议。
【问题讨论】:
-
您能否详细说明“...无法使用大到足以为每个产品 (10,000+) 生成列的查询来查询我的数据库 (BigQuery)。”?听起来您无法在 BigQuery 中执行 1-0 扩展,不是吗?要回答您的问题,是的,您可以在 Python 中创建此矩阵。如果您还想在 Python 中进行推荐“数学”,您只需要注意数据的维度,具体取决于您机器上的规格......有多少客户(行)与多少列(产品)将被创建?
-
您可以做的另一件事是对产品采取帕累托式方法 - 限制推荐范围内的产品数量。您的产品购买分布情况如何?它是否严重向右倾斜?我想,这甚至可以延伸到客户——不为最低p%的最低价值客户提供建议......
-
@blacksite 我已经用示例查询更新了我的问题,但基本上你的假设是正确的!如果我要在 python 中创建矩阵,从 BigQuery 中提取的最佳格式是什么?
-
绝对正确,矩阵将非常稀疏 - 每个客户都至少购买了一件商品,但大多数 SKU 都没有购买,我有信心将其分割,但我需要先获取数据?
-
还有一个问题...所以 BigTable 表的原始列/模式类似于
[customer_id, sku1, sku2, sku3, ..., skuN],而不是类似于[customer_id, sku]的每个客户购买的每个产品一行?
标签: python machine-learning scikit-learn recommendation-engine