推荐算法中经典排序算法GBDT+LR

文章目录

    • 逻辑回归模型
      • 逻辑回归对于特征处理的优势
      • 逻辑回归处理特征的步骤
    • GBDT算法
    • GBDT+LR算法
      • GBDT + LR简单代码实现

逻辑回归模型

  • 逻辑回归(LR,Logistic Regression)是一种传统机器学习分类模型,也是一种比较重要的非线性回归模型,其本质上是在线性回归模型的基础上,加了一个Sigmoid函数(也就是非线性映射),由于其简单、高效、易于并行计算的特点,在工业界受到了广泛的应用。

  • 使用LR模型主要是用于分类任务,通常情况下也都是二分类任务,一般在推荐系统的业务中,会使用LR作为Baseline模型快速上线。

  • 从本质上来讲,逻辑回归和线性回归一样同属于广义线性模型。虽然说逻辑回归可以实现回归预测,但是在推荐算法中,我们都将其看作是线性模型并把它应用在分类任务中。

  • 总结:逻辑回归实际上就是在数据服从伯努利分布的假设下,通过极大似然的方法,运用梯度下降算法对参数进行求解,从而达到二分类。

  • Q&A

    • Q:为什么在推荐系统中使用逻辑回归而不是线性回归?
    • A:原因主要有三点
      1. 虽然两者都是处理二分类问题,但是线性回归主要是处理连续性特征,例如一个人的身高体重,而推荐系统中对于一个物品推荐给用户,物品的特征是离散的。因此不好用线性回归作为预测
      2. 逻辑回归模型具有较高的可解释性,可以帮助我们更好地理解推荐系统中不同因素对推荐结果的影响,而线性回归在这一点上无法实现我们的需求。
      3. 推荐系统中往往存在很多的噪音,逻辑回归可以更好地处理异常值,避免推荐结果被干扰。

逻辑回归对于特征处理的优势

  1. 特征选择:可以使用正则化技术来选择重要的特征,提高模型效率和准确性。
  2. 处理非线性特征:可以通过引入多项式和交互特征来处理非线性特征,从而预测结果更加准确。
  3. 处理缺失值和异常值:可以通过处理缺失值和异常值使得模型更佳健壮,从而预测结果更加准确。
  4. 训练模型速度:训练速度相对较快。

逻辑回归处理特征的步骤

  1. 特征选择:逻辑回归可以使用正则化技术(L1、L2正则化)来选择最重要的特征,从而降低维度并去除无关特征。选择相关的特征有助于提高模型的稳定性和准确性。
  2. 处理缺失值和异常值:逻辑回归可以使用缺失值插补和异常值检测来处理缺失值和异常值,从而避免对模型产生影响,提高模型的健壮性。
  3. 处理非线性特征:逻辑回归可以通过引入多项式和交互特征来处理非线性特征,从而增强模型的表现力。以多项式模型为例,逻辑回归可以使用幂函数或指数函数对特征进行转换,从而处理非线性变量。
  4. 特征标准化:逻辑回归可以使用特征标准化来消除特征数据值的量纲影响,避免数值范围大的特征对模型产生很大影响。
  5. 特征工程:逻辑回归也可以使用特征工程来创建新的特征,例如聚合或拆分现有特征、提取信号等。这有助于发现与目标变量相关的新信息,从而改进对数据的理解。

GBDT算法

  • GBDT(Gradient Boosting Decision Tree)算法是一种基于决策树的集成学习算法,它的学习方式是梯度提升,它通过不断训练决策树来提高模型的准确性。GBDT在每一次训练中都利用当前的模型进行预测,并将预测误差作为新的样本权重,然后训练下一棵决策树模型来拟合加权后的新数据。
  • GBDT中的B代表的是Boosting算法,Boosting算法的基本思想是通过将多个弱分类器线性组合形成一个强分类器,达到优化训练误差和测试误差的目的。具体应用时,每一轮将上一轮分类错误的样本重新赋予更高的权重,这样一来,下一轮学习就容易重点关注错分样本,提高被错分样本的分类准确率。GBDT由多棵CART树组成,本质是多颗回归树组成的森林。每一个节点按贪心分裂,最终生成的树包含多层,这就相当于一个特征组合的过程。
  • 理论上来说如果可以无限制的生成决策树,GBDT就可以无限逼近由所有训练样本所组成的目标拟合函数,从而达到减小误差的目的,同样这种思想后来也被运用在了ResNet残差神经网络上。
  • 在推荐系统中,我们使用GBDT算法来优化和提高个性化推荐的准确性。通过GBDT算法对用户历史行为数据进行建模和学习,可以很容易地学习到用户的隐式特征(例如品味,偏好,消费能力等)。另外,GBDT算法可以自动选择重要的特征,对离散型和连续型特征进行处理(如缺失值填充、离散化等),为特征工程提供更好的支持。

GBDT+LR算法

  • 在推荐系统中使用GBDT+LR结合算法主要是用于处理点击率预估,这个也是facebook在2014年发表的论文Practical Lessons from Predicting Clicks on Ads at Facebook。根据点击率预估的结果进行排序,所以GBDT+LR用于排序层。
  • GBDT+LR架构图
    在这里插入图片描述
  • 整个模型主要分为两个步骤,上面的GBDT和下面的LR。主要分为五个步骤:
    1. GBDT训练:使用GBDT对原始数据进行训练并生成特征。在训练过程中,每棵树都是基于前一棵树的残差进行构建。这样,GBDT可以逐步减少残差,生成最终的目标值。
    2. 特征转换:使用GBDT生成的特征进行转换。这些特征是树节点的输出,每个特征都对应于一个叶子节点。在转换过程中,每个叶子节点都会被转换为一个新的特征向量,代表这个叶子节点与其他节点的相对位置,并将这些特征向量连接起来形成新的训练集(用于下一步LR)。
    3. 特征归一化:对生成的特征进行归一化处理,确保不同维度的特征在训练过程中具有相等的权重。
    4. LR训练:使用LR对转换后的特征进行二分类或回归。特征向量被送入LR模型中进行训练,以获得最终的分类模型。在训练过程中,使用梯度下降法来更新模型参数,以最小化损失函数,损失函数的选择取决于分类问题的具体情况。
    5. 模型预测:训练完成后,使用LR模型对新的数据进行预测。GBDT+LR模型将根据特征生成函数和逻辑回归模型预测新数据的类别或值。
  • GBDT + LR优缺点
    • 优点:
      提高模型预测精度
      模型具有鲁棒性和可扩展性
      具有良好的可解释性
    • 缺点:建模复杂度高
      训练时间计算成本高
      对异常值和噪声数据敏感

GBDT + LR简单代码实现

import pandas as pd
import numpy as np
import lightgbm as lgb
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import f1_score, accuracy_score, precision_score, recall_score
from sklearn.preprocessing import OneHotEncoder# 读取数据集
# 数据集地址https://grouplens.org/datasets/movielens/
ratings = pd.read_csv("../../data/ml-1m/ratings.dat", sep="::", header=None, names=["user_id", "movie_id", "rating", "timestamp"], encoding='ISO-8859-1', engine="python")
movies = pd.read_csv("../../data/ml-1m/movies.dat", sep="::", header=None, names=["movie_id", "title", "genres"], encoding='ISO-8859-1', engine="python")
# 将两个数据集根据movie_id合并,并去掉timestamp,title
data = pd.merge(ratings, movies, on="movie_id").drop(columns=["timestamp", "title"])
# print(data.head(50))# genres字段转换为多个二值型变量(使用pandas的get_dummies函数)
genres_df = data.genres.str.get_dummies(sep="|")
# genres_df = pd.get_dummies(data['genres'])
# print(genres_df.head(50))
data = pd.concat([data, genres_df], axis=1).drop(columns=["genres"])
# print(data.head(50))# 提取出用于训练 GBDT 模型和 LR 模型的特征和标签
features = data.drop(columns=["user_id", "movie_id", "rating"])
# print(features.head(50))
label = data['rating']# 划分训练集和测试集(8,2开)
split_index = int(len(data) * 0.8)
train_x, train_y = features[:split_index], label[:split_index]
test_x, test_y = features[split_index:], label[split_index:]# 训练GBDT模型
n_estimators=100
gbdt_model = lgb.LGBMRegressor(n_estimators=n_estimators, max_depth=5, learning_rate=0.1)
gbdt_model.fit(train_x, train_y)
gbdt_train_leaves = gbdt_model.predict(train_x, pred_leaf=True)
gbdt_test_leaves = gbdt_model.predict(test_x, pred_leaf=True)# 将GBDT输出的叶子节点ID转换为one-hot编码的特征
one_hot = OneHotEncoder()
one_hot_train = one_hot.fit_transform(gbdt_train_leaves).toarray()
one_hot_test = one_hot.fit_transform(gbdt_test_leaves).toarray()# 训练LR模型
lr_model = LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,intercept_scaling=1, l1_ratio=None, max_iter=100,multi_class='auto', n_jobs=None, penalty='l2',random_state=None, solver='lbfgs', tol=0.0001, verbose=0,warm_start=False)
lr_model.fit(one_hot_train, train_y)# 在测试集上评估模型性能
y_pred = lr_model.predict(one_hot_test)
print(f"Accuracy: {accuracy_score(test_y, y_pred)}")
print(f"Precision: {precision_score(test_y, y_pred, average='macro')}")
print(f"Recall: {recall_score(test_y, y_pred, average='macro')}")
print(f"F1-Score (macro): {f1_score(test_y, y_pred, average='macro')}")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/733952.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅谈Redis和分布式系统

浅谈Redis Redis用于存储数据,且在内存当中进行存储。 但是在日常编写代码中,定义一个变量也就属于在内存当中存储一个数据。 Redis主要会在分布式系统当中发挥重要作用,如果只是单机程序,直接通过变量存储数据的方式会比使用Re…

Listener(监听器)

文章目录 Listener和ServletContext1.0 ServletContext对象介绍1.1 Listener概述1.2 Listener快速入门① xml版本② 注解版本 1.3 案例:模拟spring框架 Listener和ServletContext 补充:1.ServletContext 表示上下文对象,属于接口&#xff0c…

MySQL主从读写分离之Proxysql(openEuler版)

实验目的: 基于proxysql实现MySQL的主从读写分离。 实验过程: 前期准备: 一共有四台虚拟机,其中三台为配置好的一主两从虚拟机,还有一台干净的虚拟机用来配置proxysql。 主机名地址master192.168.27.137node1192.…

bat文件给多个Android设备安装apk

本文是安装一个apk 1、确保以下3个文件在同一个目录下 1>要安装的apk,这里是mmb.apk 2>设备名单,保存在.txt文件中,一行一个设备名,设备名通过adb devices获取,截图中是两个设备 txt文件中的样式 3>要运行…

【Pytorch】进阶学习:深入解析 sklearn.metrics 中的 classification_report 函数---分类性能评估的利器

【Pytorch】进阶学习:深入解析 sklearn.metrics 中的 classification_report 函数—分类性能评估的利器 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合…

外包干了3个月,技术退步明显。。。。

先说一下自己的情况,本科生,2019年我通过校招踏入了南京一家软件公司,开始了我的职业生涯。那时的我,满怀热血和憧憬,期待着在这个行业中闯出一片天地。然而,随着时间的推移,我发现自己逐渐陷入…

定制repo(不再切换python和google源)

文章目录 定制repo(不再切换python和google源)前言各用各的repo定制repo2/repo3源码自动识别repo2/repo3项目完整解决方案: 定制repo(不再切换python和google源) 众知,Android/AOSP/ROM系统开发&#xff0c…

读算法的陷阱:超级平台、算法垄断与场景欺骗笔记05_共谋(中)

1. 默许共谋 1.1. 又称寡头价格协调(Oligopolistic Price Coordination)或有意识的平行行为(Conscious Parallelism) 1.1.1. 在条件允许的情况下,它会发生在市场集中度较高的行业当中 1.1.…

论文笔记 Where Would I Go Next? Large Language Models as Human Mobility Predictor

arxiv 2023 08的论文 1 intro 1.1 人类流动性的独特性 人类流动性的独特特性在于其固有的规律性、随机性以及复杂的时空依赖性 ——>准确预测人们的行踪变得困难近期的研究利用深度学习模型的时空建模能力实现了更好的预测性能 但准确性仍然不足,且产生的结果…

爬虫(五)

1. 前端JS相关 三元运算 v1 条件 ? 值A : 值B; # 如果条件成立v1值A,不成立v1等于值Bres 1 1 ? 99 : 88 # res99特殊的逻辑运算 v1 11 || 22 # Ture v2 9 || 14 # 9 v3 0 || 15 # 15 v3 0 || 15 || "zhangfei" # 15赋值和…

201909 青少年软件编程(Scratch)等级考试试卷(一级)

第1题:【 单选题】 小明在做一个采访的小动画,想让主持人角色说“大家好!”3秒钟,用下列程序中的哪一个可以实现呢?( ) A: B: C: D: 【正确答案】: B 【试题解析】 : 第2题&#xff1a…

领域模型设计-COLA架构

前言 当我们需要创建的新应用的时候,往往需要站在一个长远的角度来设计我们的系统架构。有时候我们接手一个老的应用的时候,会发现由于创建之初没有好好规划系统架构,导致我们后期开分成本和维护成本都非常高。近些年来领域模型的系统设计非常…

《AI歌手:音乐产业的未来之音?》

引言 随着人工智能技术的快速发展,AI歌手作为一种新兴的演艺模式逐渐走进了人们的视野。AI歌手以其独特的魅力和无限的潜力引发了人们对于音乐产业未来的思考。本文将围绕AI歌手的音乐呈现、市场认可、替代性以及其他类似AI应用等方面展开讨论,探究AI歌手是否有望成为音乐产…

Matlab|10节点潮流计算程序(通用性强)

主要内容 潮流计算程序matlab 牛拉法 采用matlab对10节点进行潮流计算,采用牛拉法,程序运行可靠,牛拉法实现通用性强,可替换参数形成其他节点系统的潮流计算程序。 下载链接

DDoS和CC攻击的原理

目前最常见的网络攻击方式就是CC攻击和DDoS攻击这两种,很多互联网企业服务器遭到攻击后接入我们德迅云安全高防时会问到,什么是CC攻击,什么又是DDoS攻击,这两个有什么区别的,其实清楚它们的攻击原理,也就知…

攻击技术:命令和控制服务器(C2)是什么意思

在攻击者使用的众多策略中,最阴险的策略之一是命令和控制服务器(C2)。通过这篇文章,我们想准确地解释它是什么。 这些服务器充当计算机黑客行动的大脑,协调受感染设备的操作并允许攻击者随意操纵它们。 在网络安全领…

AJAX学习(一)

版权声明 本文章来源于B站上的某马课程,由本人整理,仅供学习交流使用。如涉及侵权问题,请立即与本人联系,本人将积极配合删除相关内容。感谢理解和支持,本人致力于维护原创作品的权益,共同营造一个尊重知识…

Apache的运用与实战

WEB服务器 1、WEB服务简介 # 目前最主流的三个Web服务器是Apache、Nginx、 IIS。 - WEB服务器一般指网站服务器,可以向浏览器等Web客户端提供网站的访问,让全世界浏览。 - WEB服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息…

Feign实现微服务间远程调用续;基于Redis实现消息队列用于延迟任务的处理,Redis分布式锁的实现;(黑马头条Day05)

目录 延迟任务和定时任务 使用Redis设计延迟队列原理 点评项目中选用list和zset两种数据结构进行实现 如何缓解Redis内存的压力同时保证Redis中任务能够被正确消费不丢失 系统流程设计 使用Feign实现微服务间的任务消费以及文章自动审核 系统微服务功能介绍 提交文章-&g…

stable diffusion 零基础入门教程

一、前言 Midjourney 生成的图片很难精准的控制,随机性很高,需要大量的跑图,但Stable Diffusion可以根据模型较精准的控制。 SD 效果图展示: 二、Stable Diffusion 介绍 Stable Diffusion 是一款基于人工智能技术开发的绘画软件…