gpt4 book ai didi

python - 创建协同过滤产品推荐矩阵的方法

转载 作者:行者123 更新时间:2023-11-30 09:05:16 25 4
gpt4 key购买 nike

我正在探索 python 中的推荐系统,到目前为止,我已经使用 KNN 模型来通过“像您这样的用户也购买了……”方法来推荐品牌。我的数据表为每个客户提供一行,为每个品牌提供一列,并填充 10 以指示客户是否购买了该品牌。

我现在希望将其提升为产品级别的建议,但很难了解这种方法将如何扩展。我尝试了相同的方法,但无法使用足够大的查询来查询我的数据库 (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 使用一行运行此查询会生成错误:

The query is too large. The maximum query length is 256.000K characters, including comments and white space characters.

在这种情况下,如何创建产品级推荐?数据通常会以不同的形式引入 python 并在代码中转换为 maxrix 吗?

我现在完全被难住了,所以非常欢迎任何建议。

最佳答案

我不确定如何在 BigQuery(或任何 SQL 方言)中有效地创建您想要的 1-0(one-hot-esque)编码,但我绝对知道如何在 Python 中创建它。

聚合这些数据以供在 Python 中使用的最有效方法可能是执行以下操作...

您的 BigQuery 表似乎遵循以下结构:

enter image description here

来自this question ,看起来您可以使用如下方式将每个 SKU 聚合到一行中:

SELECT UserID, STRING_AGG(SKU) AS SKU_string FROM my_transactions_table GROUP BY UserID

这应该给你这个(采用上面的示例表):

enter image description here

从这里开始,在 Python 中使用这些数据真的很容易:

>>> import pandas as pd
>>> df = pd.read_csv('~/Desktop/test.csv', sep='\t')
>>> df
UserID SKU_string
0 1 a,b,c
1 2 b,b
2 3 c,b,a

我们可以使用 scikit-learn 的 CountVectorizer 类来统计每个用户每个产品的出现次数:

>>> from sklearn.feature_extraction.text import CountVectorizer
>>> vec = CountVectorizer(tokenizer=lambda x: x.split(','))
>>> X = vec.fit_transform(df['SKU_string'])
>>> X
<3x3 sparse matrix of type '<class 'numpy.int64'>'
with 7 stored elements in Compressed Sparse Row format>
>>> pd.DataFrame(X.toarray(), columns=vec.get_feature_names())
a b c
0 1 1 1
1 0 2 0
2 1 1 1

如果您愿意,可以将该矩阵连接回 DataFrame 和您可能选择的其他用户元数据:

>>> df = df.join(pd.DataFrame(X.toarray(), columns=['product_{}'.format(x) for x in vec.get_feature_names()]))
>>> df
UserID SKU_string product_a product_b product_c
0 1 a,b,c 1 1 1
1 2 b,b 0 2 0
2 3 c,b,a 1 1 1

但是,如果您有如您所说的那么多不同的产品,我很可能会建议您不要这样做。 10,000 个产品会创建 10,000 个额外的非稀疏列,如果您有很多客户,这些列可能会占用大量内存。

此外,如果您想将 X 对象(scipy.sparse.csr_matrix)严格转换为一零编码,请尝试以下操作:

>>> import numpy as np
>>> import scipy.sparse
>>> def booleanize_csr_matrix(mat):
... ''' Convert sparse matrix with positive integer elements to 1s '''
... nnz_inds = mat.nonzero()
... keep = np.where(mat.data > 0)[0]
... n_keep = len(keep)
... result = scipy.sparse.csr_matrix(
... (np.ones(n_keep), (nnz_inds[0][keep], nnz_inds[1][keep])),
... shape=mat.shape
... )
... return result
...
>>> pd.DataFrame(booleanize_csr_matrix(X).toarray(), columns=vec.get_feature_names())
a b c
0 1.0 1.0 1.0
1 0.0 1.0 0.0
2 1.0 1.0 1.0

从那里,您可以使用各种算法根据用户推荐项目...您可以查看 sklearn.metrics.pairwise.cosine_similarity用于测量每个用户的购买向量之间的角度。

关于python - 创建协同过滤产品推荐矩阵的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53614449/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com