当前位置: 首页 > news >正文

如何使用遗传算法优化推荐结果

原文:towardsdatascience.com/how-to-optimize-recommendation-results-with-genetic-algorithm-46f29b5e3d9c

1. 基于 ALS 的简单电影推荐系统

推荐系统现在已应用于各种行业,包括电子商务、营销、视频流媒体、金融行业等。存在不同类型的算法,包括协同过滤、基于内容的过滤和基于强化学习的推荐。然而,有时推荐算法的实现只是一个起点——总是需要根据业务需求评估和进一步优化结果。在这篇文章中,我们将使用经典数据集的一个小子集进行推荐研究——MovieLens 数据集,以展示如何使用遗传算法进一步优化推荐结果。

在推荐算法方面,我们将使用广泛使用的协同过滤方法——ALS(替代最小二乘法),这是由 Spark MLlib 提供的。这种方法在处理大型数据集时特别受欢迎,尽管在我们的案例研究中,我们只使用了一个小数据集进行说明。以下是一个基于 ALS 的基本推荐系统的示例代码:

spark=SparkSession.builder.appName('Recommender').getOrCreate()data=spark.read.csv('movielens_ratings.csv',inferSchema=True,header=True)# To use a 80–20 train/test split(training,test)=data.randomSplit([0.8,0.2],seed=42)# Using the ALS algorithm provided by pysparkals=ALS(maxIter=5,regParam=0.01,userCol="userId",itemCol="movieId",ratingCol="rating",seed=42)model=als.fit(training)# Make predictions on the test dataset, which would be used to evaluate the model performances later.predictions=model.transform(test)

只需几行代码,我们就建立了一个简单的电影推荐模型。接下来的问题是,我们如何评估推荐系统的性能?

这个问题的答案实际上取决于如何构建问题,以及这个模型背后的业务背景。例如,如果我们只是构建推荐系统用于学习目的,那么我们可以简单地使用一些内置的回归评估函数来评估推荐输出,如下所示:

frompyspark.ml.evaluationimportRegressionEvaluator evaluator=RegressionEvaluator(metricName="rmse",labelCol="rating",predictionCol="prediction")prediction_rmse=evaluator.evaluate(predictions)print("The RMSE score for recommender is : "+str(prediction_rmse))

我们获得的 RMSE 值约为 1.6,考虑到客户评分范围在 1-5 之间,这个值相当高。然而,鉴于我们只使用了一个非常小的数据集进行训练,这仍然是可以预期的。

2. 考虑业务目标进行评估

在某些用例中,最终提供给客户的推荐可能不是直接基于 ALS 算法的输出。毕竟,当将推荐系统应用于生产时,对业务来说更相关的 KPI 将是模型的实际收入提升,而不仅仅是查看建模 KPI,如 RMSE 分数。

现在想象一下,一家在线流媒体初创公司计划部署我们的电影推荐系统。在这样做之前,业务团队希望了解模型带来的收入提升,以便为业务提供合理的依据。为了进行这项计算,我们需要知道每部电影的收入。例如,我们假设一些较老的电影需要较低的成本,而最新的电影成本较高。因此,与每部个别电影相关的净收入也会有所不同。

在整体考虑收入的部分,我们需要在最终推荐中考虑两个目标:客户购买电影的概率,这主要取决于推荐系统,以及业务的总收入。换句话说,我们现在正在看的是一个多目标优化问题。

考虑到这些,现在我们需要重新思考如何评估推荐系统。尽管客户对电影的潜在评分可以被视为从 0 到 5 的连续变量,但最终他们是否会购买特定电影仍然是一个二进制选择——要么“是”,要么“否”。为了简化,让我们假设只要客户给出的评分大于 2,那么他们就会购买电影进行观看。以下是将评分数据框转换为评分的代码示例:

df_val2=predictions.groupby('userId').pivot('movieId').max('rating')df_val2=df_val2.withColumn("userId",df_val2['userId'].cast("string"))#Convert to pandas df for further manipulationsdfp_actual=df_val2.toPandas()dfp_actual[dfp_actual.iloc[:,1:]<2]=0dfp_actual[dfp_actual.iloc[:,1:]>0]=1

现在我们已经将客户的实际评分调整为二进制值。在预测评分方面,通常我们可以为每个客户按从高到低的顺序对推荐的不同电影的预测分数进行排序,然后选择前 K 部电影作为对该特定客户的最终推荐。以下是实现此功能的代码块:

#Pivoting the predictions into user-movie matrixdf_val=predictions.groupby('userId').pivot('movieId').max('prediction')df_val=df_val.withColumn("userId",df_val['userId'].cast("string"))dfp_pred=df_val.toPandas()dfp_pred.set_index('userId',inplace=True)rank_df=dfp_pred.rank(1,ascending=False,method='first')rank_df[rank_df>K]=0rank_df[rank_df>0]=1

在完成上述数据操作后,我们现在可以使用一些典型的分类 KPI(关键绩效指标)来评估推荐性能,例如精确率、召回率和 F1 分数。

关于与每个产品相关的收入,我们只是为了说明目的而随机生成数字。

3. 使用 DEAP 进行 GA 多目标优化

与推荐算法类似,多目标优化也有各种解决方案。在这篇文章中,我们将探讨遗传算法(GA)在多目标优化中的应用。

与梯度下降等优化方法不同,GA 不假设目标函数有任何特殊属性,这在使用上提供了更多的灵活性。GA 的一般工作流程如下:首先,用户需要初始化一个潜在候选者的种群,然后评估每个个体的适应性(适应性可以被视为目标函数的输出)。之后,最佳个体将被选为下一代父母的候选。随后,算法中将发生交叉和变异,并计算适应性值以选择下一代的父母。这个过程将持续进行,直到获得一个令人满意的解决方案。

DEAP是一个可以用来有效实现 GA 的 Python 库。它提供了 GA 所需的必要函数,包括创建适应度函数、生成个体和种群等。

尽管 DEAP 已经很好地帮助用户有效地使用 GA 进行优化,但在开始时理解和应用所有相关函数和参数可能仍然有些挑战。幸运的是,有一些示例项目可供参考。

实质上,我们试图实现的是调整每个电影个体的权重指标,然后将其与从 ALS 模型生成的分数相乘,以获得调整后的分数。有了调整后的分数,将被推荐给用户的前 3 部电影将相应更新。GA 将通过多次迭代来调整权重指标,以最大化两个目标。

我在这里不会过多地详细介绍 DEAP 库的具体功能,你可以随时参考官方网站获取更多信息。只想强调我们需要定义用于 GA 优化的“evaluate”函数的部分。如提到的示例笔记本所示,这个 evaluate 函数的输入需要是权重指标,而输出需要是两个要优化的目标函数的元组,在我们的案例中是 F1 分数和总收益。以下是一个示例代码:

defevaluate_recommender(dfp_actual,dfp_pred,w_lst,K,rev):movie_ids=dfp_actual.columns.tolist()revenue={k:ifork,iinzip(movie_ids,rev)}weights={k:ifork,iinzip(movie_ids,w_lst)}weights_normalized={i:weights[i]/sum(weights.values())foriinmovie_ids}dfp_actual=dfp_actual.astype('float')dfp_pred=dfp_pred.astype('float')foriinmovie_ids:dfp_pred[i]=dfp_pred[i].apply(lambdax:x*weights_normalized[i])dfp_pred.fillna(0,inplace=True)#Consider the top K matchingsrank_df=dfp_pred.rank(1,ascending=False,method='first')rank_df[rank_df>K]=0rank_df[rank_df>0]=1val_df=rank_df*dfp_actual##Here just to calculate some relevant eval metricsval_res={"Predicted":rank_df.sum(axis=0),"Actual":dfp_actual.sum(axis=0),"Match":val_df.sum(axis=0),"Precision":val_df.sum(axis=0)/rank_df.sum(axis=0),"Recall":val_df.sum(axis=0)/rank_df.sum(axis=0),"Weights":pd.Series(weights),"Weights_Normalized":pd.Series(weights_normalized),"Base_Revenue":pd.Series(revenue),"Total_Revenue":(pd.Series(revenue)*val_df.sum(axis=0))}val_res=pd.DataFrame(val_res)val_res.fillna(0,inplace=True)recall=val_res.Match.sum()/val_res.Actual.sum()precision=val_res.Match.sum()/val_res.Predicted.sum()f1_score=2*(precision*recall)/(precision+recall)total_rev=val_res.Total_Revenue.sum()returnval_res,recall,precision,f1_score,total_rev
defevaluate(weights_lst):res_df,recall,precision,f1_score,total_rev=evaluate_recommender(dfp_actual,dfp_pred,weights_lst,3,rev)return(f1_score,total_rev)

4. 理解优化结果

在使用 DEAP 进行优化时,我们可以从日志中观察到,在迭代的开始阶段,总收益和 F1 分数都在持续提高,并在后期逐渐稳定。

最终优化的 F1 分数和收益是 0.67 和 75204,与优化前的分数相比,分别提升了 35%和 46%。看起来我们通过优化获得了很好的改进!

顺便提一下:在讨论多目标优化时,在许多情况下,目标之间可能存在权衡。例如,在增加总收益的同时,我们可能会看到 F1 分数的下降。然而,在我们的案例中,这种权衡并没有观察到——F1 分数和总收益都在向积极方向趋势。

为什么在我们的案例研究中没有观察到目标权衡?我认为主要原因是我们正在观察一个简单的优化,数据集非常小,因此总收益和 F1 分数的优化实际上并不相互冲突。看一下权重优化后的最终推荐输出,大多数实际的电影购买(如果不是全部)已经被推荐系统的前 3 个推荐所覆盖。实际上,我们获得的最终优化解决方案可能被称为优化问题的支配解,即优化解在两个目标上均优于所有其他中间解。更多细节可以在这篇文章中找到。

感谢阅读!如果您有任何反馈,请通过在此帖子上评论的方式与我们联系。如果您感兴趣,也可以查看我的其他帖子:

使用 Statsmodels 进行时间序列分析

时间序列分析 – 基于 ARIMA 的模型

http://www.jsqmd.com/news/145551/

相关文章:

  • 碧蓝航线Alas智能管家:解放双手的终极自动化方案
  • 如何3步解锁付费内容:面向普通用户的完整访问指南
  • 基于树莓派4B的小项目设计:温湿度监控系统实战案例
  • PaddlePaddle镜像能否运行Diffusion模型?图像生成探索
  • Stakpak Agent 新手教程
  • 基于Zephyr的nRF52环境监测设备构建实战案例
  • Step-GUI 技术报告解读
  • 纪念币预约自动化工具使用全攻略:告别手忙脚乱的预约时代
  • D触发器电路图实战入门:搭建简单仿真示例
  • Poppler Windows终极指南:免费PDF工具箱快速上手
  • iOS微信红包助手2025终极教程:轻松实现智能自动抢红包
  • 百度网盘密码一键解锁神器:告别繁琐查找,3秒获取访问权限
  • 如何在 Azure 数据工厂中并行化复制活动
  • Windows右键菜单管理终极指南:快速检测与修复冲突问题
  • Arduino IDE串口打印乱码原因深度剖析
  • SONY手机介绍
  • PaddlePaddle镜像如何批量处理推理请求?Batch Inference实现
  • 【拯救HMI】工业HMI通讯协议进阶:OPC UA协议的核心优势与应用
  • 3分钟掌握PlantUML在线绘图:免费高效的UML设计神器
  • 百度网盘提取码自动获取工具:告别手动搜索的终极解决方案
  • SillyTavern桌面版终极打包方案:三步实现跨平台一键启动
  • 终极NVIDIA显卡优化指南:解锁隐藏性能的完整教程
  • xnbcli:星露谷物语XNB文件处理利器
  • 5分钟掌握PlantUML在线编辑器:零基础绘制专业UML图
  • Screen Translator:智能屏幕翻译助手的完整使用指南
  • 纪念币预约神器:零基础快速上手终极指南
  • League Akari:让英雄联盟游戏体验更智能的游戏辅助工具
  • 海口专业厨房食堂设备工程部2025年12月推荐 - 2025年品牌推荐榜
  • 基于SpringBoot+Vue的疫苗预约系统开发毕设
  • 5大深度优化技巧:NVIDIA Profile Inspector显卡性能全面解锁指南