线性回归-使用ClickHouse机器学习函数

图片

本文字数:5923;估计阅读时间:15 分钟

作者:Ensemble

审校:庄晓东(魏庄)

本文在公众号【ClickHouseInc】首发

图片

这原本是转发的ensemble analytics的文章。

【https://ensembleanalytics.io/blog/linear-regression-using-clickhouse】

介绍

本文是Ensemble的系列文章的一部分,本文将研究在ClickHouse中进行数据科学工作。这个系列文章包括:预测、异常检测、线性回归和时间序列分类等内容。

尽管这种类型的分析通常会在ClickHouse之外的编程语言(如Python或R)中进行,但我们更愿意尽可能地仅使用数据库来直接实现某些功能。

通过这样做,我们可以发挥 ClickHouse处理大规模数据集的高性能,并减少,甚至完全避免额外编写的代码的需要。这还意味着:我们可以在客户端使用较小的内存数据集,潜在地避免使用诸如Spark等框架进行分布式计算的需要。

可以在这里找到完整示例的notebook示例代码【https://app.hex.tech/d83ae9cc-7cbe-40f3-9899-0c348f283047/hex/9206f58c-0bde-4dae-94d7-aa9379773d84/draft/logic】。

关于此示例

在本文中,我们将进行简单的线性回归分析,用于两个变量 (交付距离和包裹交付时间)来预测包裹交付的时间。

我们将在分析的过程中,使用和展示地理数据,例如利用Clickhouse的geoDistance函数按地理坐标计算距离。

数据集

我们的数据集是Hugging Face的这个最后一英里交付数据集【https://huggingface.co/datasets/Cainiao-AI/LaDe】的一小部分。

尽管整个数据集的庞大而详细,但我们将查看由单一快递员(编号75号)在中国吉林市第53区交付的2,293个订单作为子集,以便更容易地学习本示例。

下面显示了数据的预览。我们只使用包含快递员取件和交付时间和位置的列,以及订单ID。

SELECT *
FROM deliveries
LIMIT 5┌─order_id─┬─────accept_gps_time─┬─accept_gps_lat─┬─accept_gps_lng─┬───delivery_gps_time─┬─delivery_gps_lat─┬─delivery_gps_lng─┐
│     7350 │ 2022-07-15 08:45:00 │       43.81204 │       126.5669 │ 2022-07-15 13:38:00 │         43.83002 │         126.5517 │
│     7540 │ 2022-07-21 08:27:00 │       43.81219 │      126.56692 │ 2022-07-21 14:27:00 │         43.82541 │        126.55379 │
│     7660 │ 2022-08-30 08:30:00 │       43.81199 │      126.56993 │ 2022-08-30 13:52:00 │         43.82757 │        126.55321 │
│     8542 │ 2022-08-19 09:09:00 │       43.81219 │      126.56689 │ 2022-08-19 15:59:00 │         43.83033 │        126.55078 │
│    12350 │ 2022-08-05 08:52:00 │       43.81215 │      126.56693 │ 2022-08-05 09:10:00 │         43.81307 │        126.56889 │
└──────────┴─────────────────────┴────────────────┴────────────────┴─────────────────────┴──────────────────┴──────────────────┘5 rows in set. Elapsed: 0.030 sec. Processed 2.29 thousand rows, 64.18 KB (75.64 thousand rows/s., 2.12 MB/s.)
Peak memory usage: 723.95 KiB.

利用我们的Hex Notebook【https://app.hex.tech/d83ae9cc-7cbe-40f3-9899-0c348f283047/hex/9206f58c-0bde-4dae-94d7-aa9379773d84/draft/logic】,我们可以轻松地绘制吉林周围交付位置的热力图,观察到交付集中发生在市中心地区:

图片

我们的模型还将考虑把取件时间作为第二个变量。因此,我们还将可视化按取件小时计算数的按订单数量的分布,并观察到大多数包裹在早上8点取件。

图片

数据准备

我们的模型将预测取件和交付之间所经过的时间(以分钟为单位),作为取件和交付位置之间距离(以米为单位)和取件小时的函数。

我们使用Clickhouse的geoDistance函数来计算给定它们的坐标(纬度和经度)的取件和交付位置之间的距离,同时我们使用Clickhouse的date_diff函数来计算取件和交付之间所经过的时间。

我们还使用randUniform函数向数据集添加一个随机生成的训练索引,该索引对于80%的数据设置为1,将用于训练,对于剩余的20%的数据设置为0,将用于测试模型的性能。

CREATE TABLE deliveries_dataset (order_id UInt32,delivery_time Float64,delivery_distance Float64,Hour7 Float64,Hour8 Float64,Hour9 Float64,Hour10 Float64,Hour11 Float64,Hour12 Float64,Hour13 Float64,Hour14 Float64,Hour15 Float64,Hour16 Float64,training Float64)
ENGINE = MERGETREE
ORDER BY order_id
INSERT INTO deliveries_dataset
SELECT order_id,date_diff('minute', accept_gps_time, delivery_gps_time) as delivery_time,geoDistance(accept_gps_lng, accept_gps_lat, delivery_gps_lng, delivery_gps_lat) as delivery_distance,if(toHour(accept_gps_time) = 7, 1, 0) as Hour7,if(toHour(accept_gps_time) = 8, 1, 0) as Hour8,if(toHour(accept_gps_time) = 9, 1, 0) as Hour9,if(toHour(accept_gps_time) = 10, 1, 0) as Hour10,if(toHour(accept_gps_time) = 11, 1, 0) as Hour11,if(toHour(accept_gps_time) = 12, 1, 0) as Hour12,if(toHour(accept_gps_time) = 13, 1, 0) as Hour13,if(toHour(accept_gps_time) = 14, 1, 0) as Hour14,if(toHour(accept_gps_time) = 15, 1, 0) as Hour15,if(toHour(accept_gps_time) = 16, 1, 0) as Hour16,if(randUniform(0, 1) <= 0.8, 1, 0) as training
FROM deliveries

当可视化时,交付距离和交付时间呈正相关,随着行程变得更长,方差增大。这在直觉上是符合我们的期望的,因为更长的行程变得更难预测。

图片

模型训练

我们使用Clickhouse的stochasticLinearRegression函数来拟合线性回归模型,基于包含训练数据的数据集的80%。

考虑到该函数使用梯度下降,我们通过减去训练集均值并除以训练集标准差来缩放交付距离(这是唯一的连续特征)。我们取目标的对数,以确保模型预测的交付时间永远不会为负数。

CREATE VIEW deliveries_model AS WITH(SELECT avg(delivery_distance) FROM deliveries_dataset WHERE training = 1) AS loc,(SELECT stddevSamp(delivery_distance) FROM deliveries_dataset WHERE training = 1) AS scale
SELECTstochasticLinearRegressionState(0.1, 0.0001, 15, 'SGD')(log(delivery_time), assumeNotNull((delivery_distance - loc) / scale),Hour7,Hour8,Hour9,Hour10,Hour11,Hour12,Hour13,Hour14,Hour15,Hour16)  AS  STATE
FROM  deliveries_dataset WHERE training = 1

模型评估

现在,我们可以使用拟合的模型对我们数据集的剩余20%进行预测。我们将通过比较预测的交付时间与实际值来计算模型的准确性。

CREATE VIEW deliveries_results AS WITH(SELECT avg(delivery_distance) FROM deliveries_dataset WHERE training = 1) AS loc,(SELECT stddevSamp(delivery_distance) FROM deliveries_dataset WHERE training = 1) AS scale,(SELECT state from deliveries_model) AS model
SELECTtoInt32(delivery_time) as ACTUAL,toInt32(exp(evalMLMethod(model, assumeNotNull((delivery_distance - loc) / scale),Hour7,Hour8,Hour9,Hour10,Hour11,Hour12,Hour13,Hour14,Hour15,Hour16))) AS PREDICTED
FROM deliveries_dataset  WHERE training = 0

我们现在有一个包含20%数据集测试部分的实际交付时间和预测交付时间的表格。

SELECT * FROM deliveries_results LIMIT 10┌─ACTUAL─┬─PREDICTED─┐
│    410 │       370 │
│    101 │       122 │
│    361 │       214 │
│    189 │        69 │
│    122 │        92 │
│    454 │       365 │
│    155 │       354 │
│    323 │       334 │
│    145 │       153 │
│     17 │        20 │
└────────┴───────────┘10 rows in set. Elapsed: 0.015 sec. Processed 9.17 thousand rows, 267.76 KB (619.10 thousand rows/s., 18.07 MB/s.)
Peak memory usage: 2.28 MiB.

我们还可以在我们的notebook中按下面的方式可视化这些数据:

图片

为了解释以上图表,如果模型表现完美,我们预期的预测和实际值在每种情况下都匹配,这意味着所有点都将排列在橙色曲线上。实际上,我们的模型确实存在误差,我们将对其进行分析。

模型性能

从上面的可视化中,我们可以看到我们的模型对于较短的行程(少于120分钟)表现相当好,但随着距离变得更长,预测精度开始下降,因为它们变得更复杂且难以预测。

这符合我们在现实世界中的经验,即行程越长送达越困难,预测也就越困难。

更科学地说,我们可以通过查看模型的平均绝对误差(MAE)和均方根误差(RMSE)来评估模型的性能。这给我们在整个数据集上大约1小时的值:

SELECTavg(abs(ACTUAL - PREDICTED)) AS MAE,sqrt(avg(pow(ACTUAL - PREDICTED, 2))) AS RMSE
FROM deliveries_results┌───────────────MAE─┬──────────────RMSE─┐
│ 58.18494623655914 │ 78.10208373578114 │
└───────────────────┴───────────────────┘1 row in set. Elapsed: 0.022 sec. Processed 9.17 thousand rows, 267.76 KB (407.90 thousand rows/s., 11.91 MB/s.)
Peak memory usage: 2.28 MiB.

如果我们将这限制在实际值小于2小时(120分钟)的较短行程中,我们可以看到我们的模型在MAE和RMSE方面表现更好,更接近30分钟:

SELECTavg(abs(ACTUAL - PREDICTED)) AS MAE,sqrt(avg(pow(ACTUAL - PREDICTED, 2))) AS RMSE
FROM deliveries_results
WHERE ACTUAL < 120┌────────────────MAE─┬──────────────RMSE─┐
│ 29.681159420289855 │ 41.68671981213744 │
└────────────────────┴───────────────────┘1 row in set. Elapsed: 0.014 sec. Processed 9.17 thousand rows, 267.76 KB (654.46 thousand rows/s., 19.11 MB/s.)
Peak memory usage: 2.35 MiB.

结论

在本文中,我们演示了如何使用简单的线性回归函数基于2个输入变量来预测输出值。

模型在较短距离时的性能还可以,但随着输出变量变得更难预测,性能开始下降。尽管如此,我们还是可以看出,在ClickHouse内完全进行的简单线性回归,并且仅使用2个变量,确实具有一定的预测能力,并且在其他数据集和领域中可能表现的更好。

完整的示例说明可以在此处找到【https://app.hex.tech/d83ae9cc-7cbe-40f3-9899-0c348f283047/hex/9206f58c-0bde-4dae-94d7-aa9379773d84/draft/logic】。

图片

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

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

相关文章

Java面试第一站:计算机网络基础知识

该系列会持续更新&#xff0c;关注我&#xff0c;第一时间获取我的最新动态哟 Java面试中&#xff0c;经常会问到跟计算机网络知识相关的考点&#xff0c;有的小伙伴不是很明白。考察网络知识有什么意义&#xff1f; 因为编程的时候&#xff0c;多数的情况下是不用我们来编写 …

春节专题|产业7问:区块链厂商的现在和未来——数字资产厂商

2023转瞬即逝&#xff0c;不同于加密领域沉寂一整年后在年末集中爆发&#xff0c;对于我国的区块链厂商而言&#xff0c;稳中求胜才是关键词&#xff0c;在平稳发展的基调下&#xff0c;产业洗牌也悄无声息的到来。 从产业总体而言&#xff0c;在经过了接近3年的快速发展后&…

【鸿蒙手机】获取UDID,并添加签名认证

一、打开开发者模式 1、手机型号华为nova 10 pro , HarmonyOS版本 4.0&#xff0c;路径&#xff1a;设置-> 关于本机-> 多次连续点击”软件版本“ 这一行&#xff0c;一般是是5到7次&#xff08;我是点击了5次&#xff09;&#xff0c;第一次会弹出输入密码&#xff0c;验…

SPSSAU【文本分析】|文本情感

文本情感分析 文本分析模块中&#xff0c;SPSSAU共提供两种方式的情感分析&#xff0c;分别是按词情感分析和按行情感分析。按词情感分析是指针对提取的关键词进行情感分析&#xff0c;并且进行可视化展示&#xff1b;按行情感分析是指针对分析的原始数据以‘行’为单位进行情…

安装cockpit

1、下载cockpit yum -y install cockpit 下载相关环境 yum install qemu-kvm libvirt libvirt-daemon virt-install virt-manager libvirt-dbus 2、启动libvirtd systemctl start libvirtd.service systemctl enable libvirtd.service 3、设置开机自启动 systemctl enabl…

2022长安杯复现

案件情况 某地警方接到受害人报案称其在某虚拟币交易网站遭遇诈骗&#xff0c;该网站号称使用“USTD 币”购买所谓的“HT 币”&#xff0c;受害人充 值后不但“HT 币”无法提现、交易&#xff0c;而且手机还被恶意软件锁定 勒索。警方根据受害人提供的虚拟币交易网站调取了对应…

【开源】JAVA+Vue.js实现农村物流配送系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统登录、注册界面2.2 系统功能2.2.1 快递信息管理&#xff1a;2.2.2 位置信息管理&#xff1a;2.2.3 配送人员分配&#xff1a;2.2.4 路线规划&#xff1a;2.2.5 个人中心&#xff1a;2.2.6 退换快递处理&#xff1a;…

【c++】STL之stack和queue详解

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;掌握stack和queue库&#xff0c;了解deque库 >…

N叉树的前序遍历

1.题目 这道题是2024-2-18的签到题&#xff0c;题目难度为简单。 考察的知识点为DFS算法&#xff08;树的前序遍历&#xff09;。 题目链接&#xff1a;N叉树的前序遍历 给定一个 n 叉树的根节点 root &#xff0c;返回 其节点值的 前序遍历 。 n 叉树 在输入中按层序遍历…

Anaconda虚拟环境管理:指令总结!

哈喽大家好&#xff0c;我是chowley&#xff0c;这次来记录一个经典问题——python虚拟环境咋配&#xff1f; 当我们需要在同一台机器上同时运行多个项目时&#xff0c;经常会遇到Python环境不兼容的问题。比如&#xff0c;一个项目需要Python 2.7&#xff0c;而另一个项目需要…

关于Spring Boot应用系统避免因为日切(日期切换)导致请求结果变更的一种解决方案

一、前言 在系统开发过程中&#xff0c;有些业务功能面临日切&#xff08;日期切换&#xff09;问题&#xff0c;比如结息跑批问题&#xff0c;在当前工作日临近24点的时候触发结息&#xff0c;实际交易时间我们预期的是当前时间&#xff0c;但是由于业务执行耗时&#xff0c;…

Pulsar-架构与设计

Pulsar架构与设计 一、背景和起源二、框架概述1.设计特点2.框架适用场景 三、架构图1.Broker2.持久化存储&#xff08;Persistent storage&#xff09;3.Pulsar元数据&#xff08;Metadata store&#xff09; 四、功能特性1.消息顺序性2.消息回溯3.消息去重4.消息重投递5.消息重…

5、Linux 常用指令

一、帮助指令 1.man 指令 语法 man [命令或配置文件] //功能描述&#xff1a;获得帮助手册上的信息查看 ls 命令的帮助信息 man ls信息作用NAME命令名称SYNOPSIS如何使用命令DESCRIPTION描述命令SEE ALSO相关的手册 2.help 指令 语法 help [命令] //功能描述&#xff1a;获得…

神经网络代码实现

目录 神经网络整体框架 核心计算步骤 参数初始化 矩阵拉伸与还原 前向传播 损失函数定义 反向传播 全部迭代更新完成 数字识别实战 神经网络整体框架 核心计算步骤 参数初始化 # 定义初始化函数 normalize_data是否需要标准化def __init__(self,data,labels,layers,…

Java实现Dfs算法(基本讲解)

目录 一、Dfs算法的概念 二、Dfs算法的设计步骤 三、Dfs算法模板 四、Dfs算法经典例题 &#xff08;1&#xff09;全排列 &#xff08;2&#xff09;N皇后 一、Dfs算法的概念 Depth First Search 即 DFS&#xff0c;意为深度优先搜索&#xff0c;是所有的搜索手段之一。它…

设计usb转ttl模块的一些问题

这个是我之前设计的usb转ttl模块&#xff0c;用到的是CH340N芯片&#xff0c;目前遇到的问题以及疑问有以下几个&#xff0c;望大佬们解答&#xff1a; 1 想设计的是一块可以选择3.3V或者5V输出&#xff0c;所以我用了在TTL输出那里加了VCC、VCC3.3V、5V这几个引脚&#xff0c…

EXCEL中不错的xlookup函数

excel中一般要经常用vlookup函数&#xff0c;但其实经常麻烦要正序&#xff0c;从左边到右边&#xff0c;还要数列&#xff0c;挺麻烦的&#xff0c;xlookup的函数还不错&#xff0c;有个不错的一套视频介绍,B站的&#xff0c;地址是&#xff1a;XLOOKUP函数基础用法&#xff0…

Eliminating Domain Bias for Federated Learning in Representation Space【文笔可参考】

文章及作者信息&#xff1a; NIPS2023 Jianqing Zhang 上海交通大学 之前中的NeurIPS23论文刚今天传到arxiv上&#xff0c;这次我把federated learning的每一轮看成是一次bi-directional knowledge transfer过程&#xff0c;提出了一种促进server和client之间bi-direction…

Day4. 文件IO的基本概念和读写

温习&#xff1a; 文件的拷贝&#xff08;单个字符&#xff09;(fgetc/fputc) #include <stdio.h>int main(void) {FILE* fp NULL;FILE* fq NULL;char ch 0;fp fopen("str.txt","r");if (fp NULL){perror("file to fopen!");retur…

网络模型及传输基本流程

1.OSI 七层模型 OSI &#xff08; Open System Interconnection &#xff0c;开放系统互连&#xff09;七层网络模型称为开放式系统互联参考模型&#xff0c;是一个逻辑上的定义和规范; 把网络从逻辑上分为了 7 层 . 每一层都有相关、相对应的物理设备&#xff0c;比如路由器…