AI应用实战课学习总结(5)回归分析预测实战

大家好,我是Edison。

最近入坑黄佳老师的《AI应用实战课》,记录下我的学习之旅,也算是总结回顾。

今天是我们的第5站,一起了解下回归分析是什么 以及 通过回归模型预测电商用户的生命周期价值(LTV)。

回归分析介绍

通过分析已有的数据,发现之间的关系,这就是回归分析。

所谓回归,就是让数据恢复其本来规律,用黑话讲就是建立特征与目标之间的映射关系,事实上呢就是求某种平均值。而我们想要找的这个关系,其实就是一个数学模型,它在统计学中通常被称为预测函数。

举个例子,给定一些父亲 和 儿子 身高的数据,将其画在二维坐标系中,就是一个个点,有没有可能从中分析找到一个准确的 数学模型 描述这种关系,进而可以预测一个人的升高呢,这就是统计学中经典的回归问题,这个要找到的数学模型就是预测函数。得到了这个预测函数,以后当给定一个新的父亲身高的参数时就可以预测一个较为准确的子女身高数值了。

回归分析主要有两种类别:

  • 根据变量的数目,可以分为一元回归 和 多元回归;

  • 根据自变量和因变量的表现形式,可以分为线性回归 和 非线性回归。

回归分析主要应用在以下场景:

  • 确定变量之间的关系

  • 预测数值

  • 趋势分析

我们在第三站《预测带货直播销售额》就是一个典型的回归分析案例。当然,回归算法有很多种,那篇文章中使用到的线性回归只是其中最简单的一种。

这里,Edison强烈推荐大家学习B站博主“五分钟机器学习”的视频,它在基础篇通俗易懂地讲解了 线性回归、逻辑回归、K近邻、决策树、KMeans、SVM、随机森林等算法,在进阶篇中介绍了梯度下降算法,简洁易懂,适合快速扫盲。

传送门:https://space.bilibili.com/10781175/channel/series

此外,B站博主“梗直哥”有一个关于线性回归、代价函数、损失函数的动画讲解,个人觉得是我目前看到这个话题讲的最通俗易懂的,也推荐给你看看,你可以了解到一些核心内容,如线性回归模型、最小二乘法、均方误差 以及 梯度下降法。

传送门:https://www.bilibili.com/video/BV1RL411T7mT

因为这些博主的讲解已经是很通俗易懂并且真的讲的不错了,这里Edison就不再多赘述了。相信有了上面这些基础,我们就可以开始下面的回归模型实战了。

预测电商用户LTV案例

问题背景:

  • 某电商系统记录了过去12个月的订单数据

  • 订单数据包括:用户ID、购买物品、金额、时间等

问题目标:

  • 根据历史数据,确定类似用户的生命周期价值(LTV,Life Time Value)

生命周期价值(LTV),它是衡量一个用户在其整个生命周期内为企业带来的总价值的一个指标。它考虑了用户的获取成本、留存率、复购率以及用户的平均消费额等多个因素,对于企业的长期规划和盈利分析至关重要。

回归分析代码实战

Step1 读取数据 及 数据预处理

import numpy as np # 导入NumPy
import pandas as pd # 导入Pandas
df_sales = pd.read_csv('eshop-orders.csv') # 导入数据集
df_sales # 输出数据

输出的数据展现成下面的样子:

由于订单数据中只有每单的单价,因此我们先计算下每单的总价:

df_sales['总价'] = df_sales['数量'] * df_sales['单价'] # 计算每单的总价

然后我们看看订单数据的日期范围在哪个区间内:

df_sales['消费日期'] = pd.to_datetime(df_sales['消费日期']) # 转换日期格式
print('日期范围: %s ~ %s' % (df_sales['消费日期'].min(), df_sales['消费日期'].max()))# 输出日期范围

输出的日期范围:2022-06-01 09:09:00 ~ 2023-06-09 12:31:00然后我们先构建一个前3个月的数据集,先用这个数据集去做特征工程和测试,看看能否去预测用户未来一年的LTV。

df_sales_3m = df_sales[(df_sales. 消费日期 > '2022-06-01') & (df_sales. 消费日期 <= '2022-08-30')] # 构建仅含前3个月数据的数据集
df_sales_3m.reset_index(drop=True) # 重置索引

可以看到,数据从8.7万行到1.4万行了:

最后,我们获取一下用户ID列表(数据去重):

数据去重后,共计370个用户:

Step2 特征工程

这里我们将原始订单数据转换为每一个用户的R、M、F值,R指Recency(用户的新近度,用来衡量用户是否在近期进行了消费),M指Money(用户共计消费了多少钱),F指Frequency(用户共计进行了多少次交易,即消费的频次)。
从这里我们也可以看出,在做这类用户交易数据分析时,不仅仅要看用户的共计消费金额,还需要将这些用户特征都考虑进去,才能对用户进行一个较为准确的画像。举个例子,有的用户可能在该电商平台中消费了很多钱,其他可能就是一次性买了一个高端电脑,然后就跟电商平台说拜拜了。那么,这个用户的M值就很大,比如10000元。但是,他的F值很低,只有1次。

因此,这个用户最后的LTV会是一个综合考量后的值。下面的代码展示了本示例中的R、M、F值的抽取:

# Recency
df_R_value = df_sales_3m.groupby('用户码'). 消费日期.max().reset_index() # 找到每个用户的最近消费日期,构建df_R_value 对象
df_R_value.columns = ['用户码','最近购买日期'] # 设定字段名
df_R_value['R值'] = (df_R_value['最近购买日期'].max() - df_R_value['最近购买日期']).dt.days # 计算最新日期与上次消费日期间的天数
df_user_LTV = pd.merge(df_user_LTV, df_R_value[['用户码','R值']], on='用户码') # 把上次消费日期距最新日期的天数(R 值)整合至df_user 对象中# Money
df_M_value = df_sales_3m.groupby('用户码').总价.sum().reset_index() # 计算每个用户前3 个月的消费总额,构建df_M_value 对象
df_M_value.columns = ['用户码','M值'] # 设定字段名
df_user_LTV = pd.merge(df_user_LTV, df_M_value, on='用户码') # 把消费总额(M 值)整合至df_user对象中# Frequency
df_F_value = df_sales_3m.groupby('用户码'). 消费日期.count().reset_index() # 计算每个用户的消费次数,构建df_F_value 对象
df_F_value.columns = ['用户码','F值'] # 设定字段名
df_user_LTV = pd.merge(df_user_LTV, df_F_value[['用户码','F值']], on='用户码') # 把消费频率(F 值)整合至df_user 对象中

df_user_LTV.head() # 输出df_user_LTV 的前几行数据

展示的前几行R、M、F值数据:

现在我们有了特征(X),就需要再得到标签(y)了。这里的标签就是我们要预测的年度LTV值,特征就是R、M、F三个值。

df_user_1y = df_sales.groupby('用户码')['总价'].sum().reset_index() # 计算每个用户的整年消费总额,构建df_user_1y 对象
df_user_1y.columns = ['用户码','年度LTV'] # 设定字段名

df_LTV = pd.merge(df_user_LTV, df_user_1y, on='用户码', how='left') # 计算整体LTV,训练数据集
df_LTV # 输出df_LTV

到此,一个完整的特征集 和 标签 的 每个用户的LTV表 如下,从中我们也可以看出每个用户的年度LTV 和 他的R/M/F值的一些关系:

X = df_LTV.drop(['用户码','年度LTV'],axis=1) # 特征集
X.head() # 输出特征集 :R,M,F值

y = df_LTV['年度LTV'] # 标签集
y.head() #输出标签集 :LTV值

Step3 拆分训练集 和 测试集

这里我们选择80%训练集,20%测试集:

from sklearn.model_selection import train_test_split #导入train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=7) #拆分训练集和测试集

Step4 使用线性回归拟合模型

from sklearn.linear_model import LinearRegression #导入线性回归模块
model = LinearRegression() #创建线性回归模型

model.fit(X_train, y_train) #拟合模型

Step5 评估线性回归拟合效果

y_train_preds =  model.predict(X_train) # 用模型预测训练集
y_test_preds = model.predict(X_test) # 用模型预测测试集from sklearn.metrics import r2_score, median_absolute_error #导入Sklearn评估模块
print('训练集上的R平方分数: %0.4f' % r2_score(y_true=y_train, y_pred=y_train_preds))
print('测试集上的R平方分数: %0.4f' % r2_score(y_true=y_test, y_pred=y_test_preds))

得到的R平方分数如下:

训练集上的R平方分数: 0.6187

测试集上的R平方分数: 0.4778

可以看出,它在训练集上的效果还不错,但在测试集上的分数差了一丢丢,但也没差多少吧。

Step6 拟合效果数据可视化

这里仍然使用matplotlib绘制一个散点图和预测直线做数据可视化,看看模型的预测值和实际值的差异对比:

import matplotlib.pyplot as plt # 导入Matplotlib 的pyplot 模块
plt.rcParams["font.family"]=['SimHei'] #用来设定字体样式
plt.rcParams['font.sans-serif']=['SimHei'] #用来设定无衬线字体样式
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
plt.scatter(y_test, y_test_preds) # 预测值和实际值的散点图
plt.plot([0, max(y_test)], [0, max(y_test_preds)], color='gray', lw=1, linestyle='--') # 绘图
plt.xlabel(' 实际值') #x 轴
plt.ylabel(' 预测值') #y 轴
plt.title(' 实际值与预测值') # 标题

最终的预测直线如下所示:

Step7 更多回归模型做对比

除了线性回归之外,我们可以用多种回归模型来做一个效果的对比,比如下面我们引入决策树和随机森林来和线性回归一起做个对比,修改一下之前的代码如下:

(1)导入模型 和 创建模型

from sklearn.linear_model import LinearRegression #导入线性回归模块
from sklearn.tree import DecisionTreeRegressor #导入决策树回归模型
from sklearn.ensemble import RandomForestRegressor #导入随机森林回归模型

model_lr = LinearRegression() #创建线性回归模型
model_dtr = DecisionTreeRegressor() #创建决策树回归模型
model_rfr = RandomForestRegressor() #创建随机森林回归模型

(2)进行拟合

model_lr.fit(X_train, y_train) #拟合线性回归模型
model_dtr.fit(X_train, y_train) #拟合决策树回归模型
model_rfr.fit(X_train, y_train) #拟合随机森林回归模型

(3)得到R平方分数

from sklearn.metrics import r2_score, median_absolute_error #导入Sklearn评估模块# 线性回归
y_train_preds =  model_lr.predict(X_train) # 用模型预测训练集
y_test_preds = model_lr.predict(X_test) # 用模型预测测试集
print('线性回归 - 训练集上的R平方分数: %0.4f' % r2_score(y_true=y_train, y_pred=y_train_preds))
print('线性回归 - 测试集上的R平方分数: %0.4f' % r2_score(y_true=y_test, y_pred=y_test_preds))# 决策树回归
y_train_preds =  model_dtr.predict(X_train) # 用模型预测训练集
y_test_preds = model_dtr.predict(X_test) # 用模型预测测试集
print('决策树回归 - 训练集上的R平方分数: %0.4f' % r2_score(y_true=y_train, y_pred=y_train_preds))
print('决策树回归 - 测试集上的R平方分数: %0.4f' % r2_score(y_true=y_test, y_pred=y_test_preds))# 随机森林回归
y_train_preds =  model_rfr.predict(X_train) # 用模型预测训练集
y_test_preds = model_rfr.predict(X_test) # 用模型预测测试集
print('随机森林回归 - 训练集上的R平方分数: %0.4f' % r2_score(y_true=y_train, y_pred=y_train_preds))
print('随机森林回归 - 测试集上的R平方分数: %0.4f' % r2_score(y_true=y_test, y_pred=y_test_preds))

下面是三种回归模型的R平方分数:可以看到决策树和随机森林在训练集上的效果十分好,但在测试集上的效果相差很大,这就是典型的过拟合现象。

线性回归 - 训练集上的R平方分数: 0.6187

线性回归 - 测试集上的R平方分数: 0.4778

决策树回归 - 训练集上的R平方分数: 1.0000

决策树回归 - 测试集上的R平方分数: 0.3481

随机森林回归 - 训练集上的R平方分数: 0.9127

随机森林回归 - 测试集上的R平方分数: 0.5569

小结

本文介绍了机器学习中的起点:回归分析,并进行了一个电商用户生命周期价值(LTV)的分析预测实战,最后还进行了多种回归模型的拟合效果对比,相信里已经有了一个直观的印象,对吧?

推荐学习

黄佳,《AI应用实战课》(课程)

黄佳,《图解GPT:大模型是如何构建的》(图书)

黄佳,《动手做AI Agent》(图书)

 

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

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

相关文章

Gitlab Runner安装与配置

由于格式和图片解析问题,为了更好阅读体验可前往 阅读原文本篇使用Docker安装Gitlab runner进行runner的安装和注册,其他方式请参考官方文档非Docker安装Gitlab runner请确保runner版本和gitlab版本兼容以及docker相关版本兼容问题下载镜像 docker pull gitlab/gitlab-runner…

笔记本电脑清灰以及升级硬盘与内存

1、工具准备(1)螺丝刀:最好使用手柄较粗(容易发力)、有磁吸(螺丝不易掉)、以及批头可以替换的螺丝刀。(2)撬片:拆机常用的是三角撬片,越薄越好;没有的话也可以用废弃的银行卡替代。(3)磁吸定位板:用于存放螺丝,没有的话也可以用瓶盖替代。(4)气吹与毛刷:用于…

读量子霸权02数字时代的终结

2000年前希腊人创造的安提基西拉仪器是计算机雏形,可计算月球运转。安提基西拉代表古代模拟宇宙巅峰。巴比奇未实现最先进机械计算机梦想。图灵被誉为“计算机科学之父”,提出图灵机概念。数字计算机比模拟计算机准确。图灵测试提出机器能否像人思考。1. 爱琴海的海底 1.1. 2…

行为树(BehaviorTree )的实现与应用

前言 我最近学习使用C#脚本实现Unity行为树,并使用行为树实现了对“空洞骑士”中,“假骑士”的AI行为逻辑的简单实现。本文主要记录了在这个过程中的一些要点。 行为树的原理及实现教程来自这位大佬的博客:游戏AI行为决策——Behavior Tree(行为树) 一、运作逻辑 行为树的…

48. django下载与基本使用

1.版本 django1.x:默认不支持异步 django2.x:默认不支持异步 django3.x:自带异步功能 2. 下载 2.1 pip安装pip install django==3.2.122.2 安装注意事项 计算机名称不能出现中文 注意python解释器版本与django版本的兼容性 项目中的文件名称不能出现中文 多个项目文件尽量不…

互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(一):从.NET IoT入门开始

前言 为什么我会想着制作一个智能桌面机器人呢?自问自答一下,看过我之前文章的小伙伴应该都知道我之前有为稚晖君开源的ElectronBot桌面机器人开发过一个桌面上位机软件叫电子脑壳,由于ElectronBot桌面机器人必须连接电脑才能使用,所以限制比较多,网友又对独立版本的桌面机…

C#进阶-在Ubuntu上部署ASP.NET Core Web API应用

随着云计算和容器化技术的普及,Linux 服务器已成为部署 Web 应用程序的主流平台之一。ASP.NET Core 作为一个跨平台、高性能的框架,非常适合在 Linux 环境中运行。本篇博客将详细介绍如何在 Linux 服务器上部署 ASP.NET Core Web API 应用,包括部署准备、应用发布、配置反向…

【CodeForces训练记录】Codeforces Round 996 (Div. 2)

训练情况赛后反思 开局连WA就知道这把完蛋了,应该要掉大分了,A题没考虑清楚,B题犯傻了一时间没看出来结论 A题 当且仅当两个人贴贴的时候,轮到谁走谁就输,后手可以把先手逼到两边,如果两人之间有一段距离,两人都必须往中间靠,如果两个人都往同一边走距离不变为无效操作…

2025 特斯拉 焕新 Model Y 增减配置详细参数对比分析图解 All In One

2025 特斯拉 焕新 Model Y 增减配置详细参数对比分析图解 All In One2025 特斯拉 焕新 Model Y 增减配置详细参数对比分析图解 All In One 焕新 Model Y 增配风阻降低到 0.22 Cd ✅ 车身变长到 4797 mm ✅ 车头保险杠新增一颗摄像头 ✅ 新增前排座椅通风 ✅ 新增后排座椅电动折…

Kernel Memory 让 SK 记住更多内容

Kernel Memory (KM) 是一种多模态 AI 服务,专注于通过自定义的连续数据混合管道高效索引数据集。它支持检索增强生成(RAG)、合成记忆、提示工程以及自定义语义记忆处理。KM 支持自然语言查询,从已索引的数据中获取答案,并提供完整的引用和原始来源链接。 通过 KM 我们可以…

大普时钟模块(Clock Module)

时钟模块(Clock Module) 同步精度高、保持能力强、温度稳定度高、频率准确度高、短稳性能强。 CM11T系列时钟模块,内置TCXO、超宽温,同步精度50ns CM55、CM22系列时钟模块,内置OCXO、超高精度 CM30系列时钟模块,内置OCXO、高频低噪 CM66系列时钟模块,内置OCXO+GNSS接收机 …

《CPython Internals》阅读笔记:p97-p117

《CPython Internals》学习第 7 天,p97-p117 总结,总计 21 页。 一、技术总结 1.词法分析(lexical analysis) 根据《Compilers-Principles, Techniques, and Tools》(《编译原理》第2版)第 5 页:The first phase of a compiler is called lexical analysis or scanning. T…