google-bigquery - BigQuery ML 评估指标 (nDCG = 1)
问题描述
我正在使用 BigQuery ML 来训练矩阵分解模型,以便根据客户的交易历史向他们推荐产品。
我的问题是nDCG (由谷歌计算)是 1,我不知道为什么。这显然是错误的。
我的理论是,以前购买的产品具有最高的预测评级,因此以完美的评级“混乱”预测,从而产生完美的 nDCG。但事实并非如此,通常一个新产品排在第 4 位或第 6 位。
此外,我在谷歌文档中找不到任何关于如何计算 nDCG 的内容来解释这种行为。
我希望有人可以解释这种行为或帮助我解决根本问题。
输入数据
输入数据基于隐式反馈,评级是二进制编码的。
1 -> bought the product previously
0 -> no previous transaction
输入数据仅包含交易历史中存在的cust prod组合。
所以每个输入都有一个等级1。它看起来像这样,有 80,3M 行:
| cust_code | prod_code | rating |
| --------- | ----------- | ------ |
| CUST0000000001 | PRD0900001 | 1 |
| CUST0000000001 | PRD0900027 | 1 |
| CUST0000000009 | PRD0900008 | 1 |
| CUST0000000009 | PRD0900034 | 1 |
询问
训练模型的查询:
CREATE OR REPLACE MODEL `my_model`
OPTIONS(MODEL_TYPE = 'MATRIX_FACTORIZATION',
FEEDBACK_TYPE = 'IMPLICIT',
USER_COL = "cust_code",
ITEM_COL = "prod_code",
RATING_COL = "rating",
DATA_SPLIT_METHOD = 'AUTO_SPLIT') AS
SELECT
cust_code,
prod_code,
rating,
FROM
`project_id.dataset.source_table`
解决方案
推荐阅读
- apache-spark - 改进 parquet 中多个 spark 数据集的读取和连接
- c++ - 使用指向数组的指针的 C++ 迭代器范围
- java - Reverse Integer leetcode:为什么只有在 INT_MAX 加上 7 或更大时才会发生溢出?
- java - 通过修改现有参数进行批处理
- powerbi - 如何使用工作日来衡量平均销售额?
- javascript - 使用 dd/mm/yyyy 进行年龄验证
- xml - xslt xml表格记录分页
- javascript - 我无法使用 onload 命令绑定 javascript 代码
- python - 转换包含实数的字符串列表
- swift - CoreML 模型在 coremltools 和 Xcode 之间产生不同的结果