惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Fortinet All Blogs
V
Visual Studio Blog
T
Tor Project blog
量子位
Jina AI
Jina AI
Hugging Face - Blog
Hugging Face - Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
有赞技术团队
有赞技术团队
博客园 - 司徒正美
博客园_首页
罗磊的独立博客
美团技术团队
人人都是产品经理
人人都是产品经理
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
IT之家
IT之家
C
Check Point Blog
博客园 - 聂微东
爱范儿
爱范儿
Schneier on Security
Schneier on Security
T
Threat Research - Cisco Blogs
T
Tailwind CSS Blog
L
LINUX DO - 热门话题
大猫的无限游戏
大猫的无限游戏
V
Vulnerabilities – Threatpost
C
Cisco Blogs
GbyAI
GbyAI
Spread Privacy
Spread Privacy
博客园 - 叶小钗
博客园 - 【当耐特】
T
Tenable Blog
雷峰网
雷峰网
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Apple Machine Learning Research
Apple Machine Learning Research
小众软件
小众软件
J
Java Code Geeks
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
宝玉的分享
宝玉的分享
Microsoft Azure Blog
Microsoft Azure Blog
Simon Willison's Weblog
Simon Willison's Weblog
N
Netflix TechBlog - Medium
T
The Exploit Database - CXSecurity.com
腾讯CDC
C
CERT Recently Published Vulnerability Notes
P
Proofpoint News Feed
阮一峰的网络日志
阮一峰的网络日志
Scott Helme
Scott Helme
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Martin Fowler
Martin Fowler

元视角

.NET 生态下的 Agent 框架选型:从 ReAct 到原生推理 - 元视角 从「能用」到「好用」:LLM 流式响应实现方式的探索之路 - 元视角 当我用 2000 条聊天记录,让 AI 为我画一幅自画像 - 元视角 基于 Supabase 的 AI 应用开发探索 - 元视角 微博 × MCP:社交媒体新玩法解锁 - 元视角 四点钟海棠花未眠 - 元视角 Semantic Kernel × MCP:智能体的上下文增强探索 - 元视角 基于 K-Means 聚类分析实现人脸照片的快速分类 - 元视角 容器技术驱动下的代码沙箱实践与思考 - 元视角 温故而知新:后端通用查询方案的再思考 - 元视角 浅议 CancellationToken 在前后端协同取消场景中的应用 - 元视角 Semantic Kernel 视角下的 Text2SQL 实践与思考 - 元视角 关于 ChatGPT 的流式传输,你需要知道的一切 - 元视角 RAG 的是与非、Rewrite 和 Rerank - 元视角 使用 EFCore 和 PostgreSQL 实现向量存储及检索 - 元视角 基于 LLaMA 和 LangChain 实践本地 AI 知识库 - 元视角 使用 llama.cpp 在本地部署 AI 大模型的一次尝试 - 元视角 如何为 Git 配置多个 SSH Key - 元视角 C# 使用 LibUsbDotNet 实现 USB 设备检测 - 元视角 基于 C# 实现样式与数据分离的打印方案 - 元视角 基于 SVG 的图形交互方案实践 - 元视角 前端视频播放技术概览 - 元视角 温故而知新,再话 Python 动态导入 - 元视角 后 GPT 时代,NLP 不存在了? - 元视角 视频是不能 P 的系列:使用 Milvus 实现海量人脸快速检索 - 元视角 GDI+下字体大小自适应方案初探 - 元视角 小爱音箱集成 ChatGPT 的不完全教程 - 元视角 程序员视角下的三体世界随想 - 元视角 关于 Docker 容器配置信息的渐进式思考 - 元视角 在 Docker 容器内集成 Crontab 定时任务 - 元视角 为你的服务器集成 LDAP 认证 - 元视角 似花还似非花 - 元视角 视频是不能 P 的系列:使用 Dlib 实现人脸识别 - 元视角 浅议分布式链路追踪与日志的整合 - 元视角 关于 Git 大文件上传这件小事 - 元视角 .NET 进程内队列 Channel 的入门与应用 - 元视角 使用 Fody 实现 .NET 的静态编织 - 元视角 .NET Core + ELK 搭建可视化日志分析平台(下) - 元视角 聊一聊前端图片懒加载背后的故事 - 元视角 支持外部链接跳转的 Vue Router 扩展实现 - 元视角 视频是不能 P 的系列:OpenCV 和 Dlib 实现表情包 - 元视角 不得不说的 ASP.NET Core 集成测试 - 元视角 再议 DDD 视角下的 EFCore 与 领域事件 - 元视角 Vue.js 前端项目容器化部署实践极简教程 - 元视角 再见,人间四月天 - 元视角 Python 图像风格化迁移助力画家梦想 - 元视角 利用 ASP.NET Core 中的标头传播实现分布式链路追踪 - 元视角 利用 gRPC 实现文件的上传与下载 - 元视角 七种武器:延迟队列的原理和实现总结 - 元视角 gRPC 流式传输极简入门指南 - 元视角 Envoy 集成 Jaeger 实现分布式链路追踪 - 元视角 浅议非典型 Web 应用场景下的身份认证 - 元视角 gRPC 借助 Any 类型实现接口的泛化调用 - 元视角 分布式丛林探险系列之 Redis 集群模式 - 元视角 分布式丛林探险系列之 Redis 主从复制模式 - 元视角 gRPC 搭配 Swagger 实现微服务文档化 - 元视角 SSL/TLS 加密传输与数字证书的前世今生 - 元视角 使用 Python 自动识别防疫健康码 - 元视角 你不可不知的容器编排进阶技巧 - 元视角 ASP.NET Core 搭载 Envoy 实现 gRPC 服务代理 - 元视角 再话 AOP,从简化缓存操作说起 - 元视角 ASP.NET Core 搭载 Envoy 实现微服务身份认证(JWT) - 元视角 ASP.NET Core 搭载 Envoy 实现微服务的监控预警 - 元视角 ASP.NET Core 搭载 Envoy 实现微服务的反向代理 - 元视角 ASP.NET Core gRPC 打通前端世界的尝试 - 元视角 EFCore 实体命名约定库:EFCore.NamingConventions - 元视角 ASP.NET Core gRPC 集成 Polly 实现优雅重试 - 元视角 ASP.NET Core gRPC 健康检查的探索与实现 - 元视角 ASP.NET Core gRPC 拦截器的使用技巧分享 - 元视角 SnowNLP 使用自定义语料进行模型训练 - 元视角 使用 HttpMessageHandler 实现 HttpClient 请求管道自定义 - 元视角 ABP vNext 的实体与服务扩展技巧分享 - 元视角 ABP vNext 对接 Ant Design Vue 实现分页查询 - 元视角 源代码探案系列之 .NET Core 跨域中间件 CORS - 元视角 源代码探案系列之 .NET Core 限流中间件 AspNetCoreRateLimit - 元视角 源代码探案系列之 .NET Core 并发限制中间件 ConcurrencyLimiter - 元视角 通过 EmbededFileProvider 实现 Blazor 的静态文件访问 - 元视角 低代码,想说爱你不容易 - 元视角 记一次失败的 ThoughtWorks 面试经历 - 元视角 从 C# 1.0 到 C# 9.0,历代 C# 语言特性一览 - 元视角 通过 Python 分析 2020 年全年微博热搜数据 - 元视角 基于 Python 和 Selenium 实现 CSDN 一键三连自动化 - 元视角 使用多线程为你的 Python 爬虫提速的 N 种姿势,你会几种? - 元视角 实现网页长截图的常见思路总结 - 元视角 温故而知新,由 ADO.NET 与 Dapper 所联想到的 - 元视角 视频是不能 P 的系列:OpenCV 人脸检测 - 元视角 作为技术宅的我,是这样追鬼滅の刃的 - 元视角 使用 Python 抽取《半泽直树》原著小说人物关系 - 元视角 厉害了!打工人用 Python 分析西安市职位信息 - 元视角 使用 dotTrace 对 .NET 应用进行性能分析与优化 - 元视角 一道 HashSet 面试题引发的蝴蝶效应 - 元视角 基于选项模式实现.NET Core 的配置热更新 - 元视角 Dapper.Contrib 在 Oracle 环境下引发 ORA-00928 异常问题的解决 - 元视角 .NET Core 中对象池(Object Pool)的使用 - 元视角 利用 MySQL 的 Binlog 实现数据同步与订阅(下):EventBus 篇 - 元视角 利用 MySQL 的 Binlog 实现数据同步与订阅(中):RabbitMQ 篇 - 元视角 利用 MySQL 的 Binlog 实现数据同步与订阅(上):基础篇 - 元视角 记一次从已损坏的 Git 仓库中找回代码的经历 - 元视角 .NET Core 原生 DI 扩展之属性注入实现 - 元视角 .NET Core 原生 DI 扩展之基于名称的注入实现 - 元视角
通过 Python 预测 2021 年双十一交易额 - 元视角
飞鸿踏雪 · 2021-10-27 · via 元视角

突然间,十月以某种始料未及的方式结束了,也许是因为今年雨水变多的缘故,总觉得这个秋天过去得平平无奇,仿佛只有观音禅寺的满地银杏叶儿,真正地宣布着秋天的到来,直到看见朋友在朋友圈里借景抒怀,『 霜叶红于二月花 』,秋天终于没能迁就我的一厢情愿,我确信她真的来了。当然,秋天不单单会带来这些诗情画意的东西,更多的时候我们听到的是双十一、双十二,这些曾经由光棍节而催生出的营销活动,在过去的十多年间渐渐成为了一种文化现象,虽然我们的法定节日永远都只有那么几天,可这并不妨碍我们自己创造出无数的节日,从那一刻开始,每个节日都可以和购物产生联系,这种社会氛围让我们有了某种仪式感,比如,零点时为了抢购商品恨不得戳破屏幕。再比如,在复杂的满减、红包、优惠券算法中复习数学知识。可当时间节点来到 1202 年,你是否依然对剁手这件事情乐此不疲呢,在新一轮剁手行动开始前,让我们来试试通过 Python 预测一下今年的交易额,因为在这场狂欢过后,没有人会关心你买了什么,而那个朴实无华的数字,看起来总比真实的人类要生动得多。

思路说明

其实,我一直觉得这个东西,完全不需要特意写一篇文章,因为用毕导的话说,这个东西我们在小学二年级就学过。相信只要我说出 最小二乘法线性回归 这样两个关键词,各位就知道我在说什么了!博主从网上收集了从 2009 年至今历年双十一的交易额数据,如果我们将其绘制在二维坐标系内,就会得到一张散点图,而我们要做的事情,就是找到一条曲线或者方程,来对这些散点进行拟合,一旦我们确定了这样一条曲线或者方程,我们就可以预测某一年双十一的交易额。如图所示,是 2009 年至今历年双十一的交易额数据,在 Excel 中我们可以非常容易地得到对应的散点图:

在 Excel 中绘制散点图 在 Excel 中绘制散点图

如果有朋友做过化学或者生物实验,对接下来的事情应该不会感到陌生,通常我们会在这类图表中添加趋势线,由此得到一个公式,实际上这就是一个回归或者说拟合的过程,因为 Excel 内置了线性、指数型、对数型等多种曲线模型,所以,我们可以非常容易地切换到不同的曲线,而评估一个方程好坏与否的指标为 $R^2$,该值越接近 1 表示拟合效果越好,如图是博主在 Excel 中得到的一条拟合方程:

在 Excel 中添加趋势线 在 Excel 中添加趋势线

那么,在 Python 中我们如何实现类似的效果呢?答案是 scikit-learn,这是 Python 中一个常用的机器学习算法库,主要覆盖了以下功能:分类回归聚类数据降维模型选择数据预处理,我们这里主要利用了回归这部分的 LinearRegression 类,顾名思义,它就是我们通常说的线性回归。事实上,这个线性并不是单指一元一次方程,因为我们还可以使用二次或者三次多项式,因为上面的 Excel 图表早已告诉我们,一元一次方程误差太大。

实现过程

OK,具体是如何实现的呢?首先,我们从 CSV 文件中加载数据,这个非常简单,利用 Pandas 库中的 read_csv() 方法即可:

df = pd.read_csv('./历年双十一交易额.csv', index_col = 0)

接下来,我们使用下面的方法来获取 年份 和 交易额 这两列数据:

year = np.array(df.index.tolist())
sales = np.array(df.Sales.tolist())

此时,我们可以非常容易地用 matplotlib 库绘制出对应的图表:

plt.scatter(year, sales, marker='o')
plt.xlabel('年份')
plt.ylabel('交易额(亿)')
plt.title('历年双十一交易额变化趋势')

通过 matplotlib 绘制散点图 通过 matplotlib 绘制散点图

接下来,我们来看看如何对这组数据做线性回归,以一元一次方程为例:

X = (year - 2008).reshape(-1, 1)
X = np.concatenate([X], axis= -1)
Y = sales
lr = LinearRegression()
lr.fit(X, Y)
print('方程系数:', lr.coef_)
print('方程截距:',lr.intercept_)

这里,首先我们需要把 2009 到 2020 这个范围内的年份转化为更方便计算的 1、2、3 …,所以,每一个数都减去了 2008,这样我们就得到了横坐标 X 以及 纵坐标 Y。接下来,我们只需要将其传入 fit() 方法即可。有时候,你可能会看到下面这样的代码,即用于划分 训练集测试集 的的代码片段:

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=0)

考虑到我们这里的样本数据本来就不多,毕竟,这股消费主义的风潮在中国刚刚流行了十二年,所以,我们要珍惜这份福报,就不划分 训练集测试集 了(逃。此时,我们会得到两个重要的参数,即方程系数 lr.coef_ 和 方程截取 lr.intercept_,而一旦有了这两个参数,我们就能确定一个线性方程,即传说中的 $y=ax+b$ :

f = lambda x: lr.coef_[0] * x + lr.intercept_
print('2021年交易额预测:', f(13))

此时,f(13) 就是 2021 年双十一的交易额,显然,这是一个预测值,大概是 3592 亿,这属实是有点离谱啦,都没能超过 2020 年的 4982 亿,我们前面提到过 $R^2$,在 scikit-learn 中我们使用下面的方法来计算它:

print('R^2:', lr.score(X_test, Y_test))

没错,score() 函数需要这样一组测试数据,我们利用前面划分 训练集测试集 的方法就可以得到它。我们发现,这个值大概是 0.73,这要不离谱都说不过去,这一点我们从图上就可以看出来:

历年双十一交易额变化趋势预测:一次方程 历年双十一交易额变化趋势预测:一次方程

这样显然不行啊,那怎么办呢?遥想古人利用“割圆术”无限逼近圆形进而计算出圆周率的这种执着,我们是不是可以通过提高“次数”来解决欠拟合的问题呢?换句话说,我们来试试一元二次方程,此时,我们只需要调整下横坐标 X 的构造过程:

X = (year - 2008).reshape(-1, 1)
X = np.concatenate([X**2, X], axis= -1)

简单来说,如果你需要构造一个 N 次多项式,那么,只需要由高到底依次写出来即可,所以,你可以想象得到,对于三次多项式,我们可以这样构造:

X = (year - 2008).reshape(-1, 1)
X = np.concatenate([X**3, X**2, X], axis= -1)

对于二次多项式,我们可以得到下面的结果,其 $R^2$ 为 0.92,预测 2021 年双十一交易额为 5218 亿:

历年双十一交易额变化趋势预测:二次方程 历年双十一交易额变化趋势预测:二次方程

同理,对于三次多项式,我们可以得到下面的结果,其 $R^2$ 为 0.96,预测 2021 年双十一交易额为 6213 亿:

历年双十一交易额变化趋势预测:三次方程 历年双十一交易额变化趋势预测:三次方程

整体上看,三次方程的拟合效果更好一点,达到了 0.96,但这个和大学时候做实验追求的 0.99 相比,多少有一点尴尬,屏幕前的你,是否想到了更好的曲线模型呢,我们常常说某某行业取得了指数级的增长,难道说指数模型更适合这个问题?关于这一点博主没能去亲自验证,因为看起来在 scikit-learn 中没有指数型函数的计算模型,可当博主在 Excel 中添加了指数型的趋势线以后,发现结果有点出人意料,因为它的 $R^2$ 只有 0.8314,而按这个方程计算出的交易额则约为2万多亿,好家伙,这都赶上恒大目前拖欠的债务了,想想就觉得离谱,指数型函数对应的曲线如下:

历年双十一交易额变化趋势预测:指数函数 历年双十一交易额变化趋势预测:指数函数

此时此刻,坐在屏幕前的你,更倾向于选择那种计算模型呢,个人觉得三次方程更好一点,因为它的 $R^2$ 是目前最好的,当然,scikit-learn 还有类似可解释的方差分数、最大误差、平均绝对误差、均方误差、均方误差对数等等不同的指标,大家可以参考 官方文档 来做更进一步的探索,一切都只有等到下个月双十一过后方能揭晓,就让我们拭目以待!本文中使用的源代码,已更新至 Github 供大家参考,如果大家对博客中的内容有什么意见或者建议,欢迎大家在评论区积极留言,谢谢大家!

本文小结

恍惚中惊觉,十月份就这样结束了,这意味是 2021 年只剩下 60 多天。上了年纪的人总不免开始怀念,那些偷偷从树叶间隙里溜走的时光,去年的这个时候我在做些什么呢?大概刚刚追完「半泽直树」第二部吧!在疫情愈发常态化的日子里,人对于未来总有种难以言说的失控感,某君有言道,『不知道明天和意外哪一个先来』,虽然机器学习可以通过“训练”过去达到“预测”未来的目的,可人生并没有哪一个方程可以完美拟合,虽然这个世界早已为你规划好一条叫做“随大流”的路,一个人的过去、当下就像无数个离散的点,这些点构成了我们人生的轨迹,某种我们通常称之为回忆的东西,可这些点是否会向着预期的方向延伸,也许,永远没有人会知道答案,这个世界上有相当多的数字,譬如自然对数、圆周率、黄金分割比等等,都是前辈先哲从自然世界中寻找到的,可对于我们的人生而言,并没有这样明显的答案,所以,每次做数据分析的时候,我都有种奇怪的感觉,因为我不明白这些数字背后,到底和我们本身有着什么样的关联,可这个世界偶尔会感应到你的失落,当你听着「明年今日」,而心里想的是去年今日,我想,这一页可以翻过去,这篇文章可以结尾,这样就可以了吧…