当前位置: 首页>大数据>正文

Spark协同过滤算法-酒店推荐

要基于用户的收藏和酒店的详情数据来构建一个推荐系统,我们可以使用协同过滤算法,这是推荐系统中常用的技术。协同过滤主要分为用户基于(User-Based)和项目基于(Item-Based)两种,这里我们可以使用Spark MLlib的ALS(交替最小二乘法)算法来实现

from pyspark.sql import SparkSession  
from pyspark.ml.evaluation import RegressionEvaluator  
from pyspark.ml.recommendation import ALS  
from pyspark.sql.functions import col  
  
# 初始化Spark  
spark = SparkSession.builder.appName("HotelRecommendationSystem").getOrCreate()  
  

# 加载用户收藏数据  
user_favorite_data = spark.read.csv("user_favorite_data.csv", header=True, inferSchema=True)  
  
# 将用户收藏数据转换为适合ALS算法的格式  
# 假设用户收藏数据有两列: userId 和 hotelId  
user_favorite_ratings = user_favorite_data.selectExpr("userId as user", "hotelId as item", "rate as rating")  
  
# 训练ALS模型  
als = ALS(maxIter=5, regParam=0.01, userCol="user", itemCol="item", ratingCol="rating",  
          implicitPrefs=False)  
model = als.fit(user_favorite_ratings)  
  
# 为特定用户生成推荐  
# 假设我们想要为userId为100的用户生成推荐  
user_recommendations = model.recommendForAllUsers(10)  
  
# 显示推荐结果  
user_recommendations.show()  
  
# 如果想要评估模型性能(需要额外的测试集数据)  
# test_ratings = ... # 加载测试集数据  
# predictions = model.transform(test_ratings)  
# evaluator = RegressionEvaluator(metricName="rmse", labelCol="rating",  
#                                 predictionCol="prediction")  
# rmse = evaluator.evaluate(predictions)  
# print("Root-mean-square error = " + str(rmse))  
  
# 停止Spark会话  
spark.stop()

用户收藏数据为user_favorite_data.csv

userId,hotelId,rate
1,101,5
1,102,5
1,103,1
2,102,5
3,102,5
3,101,5
4,102,5

结果为

Row(user=2, recommendations=[Row(item=102, rating=4.99945592880249), Row(item=101, rating=2.5780627727508545), Row(item=103, rating=0.3075242340564728)])
Row(user=4, recommendations=[Row(item=102, rating=4.99945592880249), Row(item=101, rating=2.5780627727508545), Row(item=103, rating=0.3075242340564728)])
Row(user=1, recommendations=[Row(item=102, rating=5.000006675720215), Row(item=101, rating=4.999855995178223), Row(item=103, rating=0.9745686054229736)])
Row(user=3, recommendations=[Row(item=102, rating=5.000061511993408), Row(item=101, rating=4.9977707862854), Row(item=103, rating=0.6122428774833679)])
  

在上面的代码中,我们首先加载了酒店详情数据(虽然详情数据在这里可能不需要,但如果有其他用途,可以保留),然后加载了用户收藏数据。用户收藏数据被转换成了三列DataFrame,其中user和item列分别代表用户和酒店的ID,rating列代表用户对酒店的评分(这里我们假设用户收藏了一个酒店就相当于给了它一个评分,如1.0)。

然后,我们使用ALS算法训练了一个模型。maxIter参数定义了训练过程中的最大迭代次数,regParam是正则化参数,用于防止过拟合。implicitPrefs参数设置为False,因为我们这里使用的是显式反馈(用户明确地收藏了酒店)。

之后,我们使用recommendForAllUsers方法为所有用户生成推荐。你可以通过修改这个方法的参数来为特定用户生成推荐,或者生成top-N推荐。

最后,我们展示了推荐结果。如果需要评估模型的性能,你可以使用测试集数据并计算RMSE(均方根误差)。但请注意,对于隐式反馈数据(如用户点击、浏览等),通常需要使用不同的评估方法。

这个是基于收藏协同过滤算法, 可以改成基于点击的,基于购买的协同过滤算法。

这个是基于酒店的数据, 也可以改为基于商品购买的数据。


https://www.xamrdz.com/bigdata/7zw1931731.html

相关文章: