我正在尝试构建一个产品推荐器。我使用的是pyspark-ml推荐的ALS矩阵分解模型。我有类似下面示例数据的数据,其中我有客户和产品id以及客户购买产品的次数(prch_cnt(。我正试着训练这个模型以获得隐含的偏好。我想知道的是,在将prch_cnt提供给模型之前,我是否需要对其进行规范化。因此,例如,下面cutomer_id=5和product_id=1的prch_cnt应该是prch_cnt=3/(3+1+1(,还是prch_cnt=3就可以了?我的理解是,对于评级等显性数据,每个产品的值范围通常是固定的(比如1到5颗星(,否则你必须将其标准化。我想知道是否也需要固定的可能值范围或匹配的量表?
数据:
+------------+--------+-------------------+
|customer_id |prch_cnt|product_id |
+------------+--------+-------------------+
|5 |3.0 |1 |
|5 |1.0 |2 |
|5 |1.0 |2 |
|7 |10.0 |1 |
|7 |1.0 |2 |
|9 |150.0 |2 |
+------------+--------+-------------------+
代码:
from pyspark.ml.recommendation import ALS
als = ALS(implicitPrefs=True,
nonnegative = True,
userCol="customer_id",
itemCol="product_id",
ratingCol="prch_cnt",
coldStartStrategy="drop")
model = als.fit(training)
# top 5 customer recs
userRecs = model.recommendForAllUsers(5)
如果评级列中没有固定值(显式或隐式(,您将以相同的方式获得预测值。
示例:
最初我的评分是0,1,2,3,所以我得到了预测值(-1.686,2.,3.(最大3
但后来我改变了我的评分值,包括了5分和10分,所以现在我的预测值达到了6
-------+------+-----------+
|movieId|userId| prediction|
+-------+------+-----------+
| 29| 3| 6.34046|
| 94| 3| 4.3311176|
| 26| 3| 3.6043417|
| 2| 3| 3.0270371|
| 46| 3| 2.3173037|
| 0| 3| 2.3090997|
| 86| 3| 1.1750394|
| 56| 3| 1.1681526|
| 76| 3| 0.6635845|
| 79| 3| 0.17606063|
| 14| 3| -0.2127747|
| 91| 3| -0.587868|
| 66| 3|-0.72813153|
| 37| 3| -1.1676543|
| 70| 3| -1.21106|
| 52| 3| -1.3105489|
| 8| 3| -1.6253037|
| 7| 3| -1.7214308|
+-------+------+-----------+
我希望它能消除你的疑虑。