要基于用户的收藏和酒店的详情数据来构建一个推荐系统,我们可以使用协同过滤算法,这是推荐系统中常用的技术。协同过滤主要分为用户基于(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(均方根误差)。但请注意,对于隐式反馈数据(如用户点击、浏览等),通常需要使用不同的评估方法。
这个是基于收藏协同过滤算法, 可以改成基于点击的,基于购买的协同过滤算法。
这个是基于酒店的数据, 也可以改为基于商品购买的数据。