尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

如何使用遗传算法优化推荐结果
📅 发布时间:2026/6/18 12:21:14

原文: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 的模型

相关新闻

  • 碧蓝航线Alas智能管家:解放双手的终极自动化方案
  • Step-GUI 技术报告解读
  • iOS微信红包助手2025终极教程:轻松实现智能自动抢红包

最新新闻

  • 高效利用Microchip开发资源:从工具链到实战调试全解析
  • Playnite开源游戏库管理神器:三招解决多平台游戏统一管理痛点
  • 2026年6月大型污水处理厂便携式污泥浓度计十大品牌排名:基于市政水务实测数据的技术量化与选型深度分析 - 仪表品牌榜
  • Loop:重新定义macOS窗口管理的优雅之道
  • 10个高效使用Tag Editor的技巧:批量编辑、脚本处理和自动重命名
  • 2026防火软接实力口碑榜 采购商照着选不踩坑价格透明 - mypinpai

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号