ML.NET库学习005:基于机器学习的客户细分实现与解析
文章目录
- ML.NET库学习005:基于机器学习的客户细分实现与解析
- 项目主要目的和原理
- 目的
- 原理
- 项目概述
- 实现的主要功能
- 主要流程步骤
- 使用的主要函数方法
- 关键技术
- 主要功能和步骤
- 功能详细解读
- 详细步骤解析
- 数据集及其处理步骤
- 数据集处理步骤
- 关键处理步骤原理
- 1. 数据清洗与预处理
- 2. 特征工程
- 3. 数据可视化
- 4. 预测模型构建
- 总结
- 意义
- 改进方向
ML.NET库学习005:基于机器学习的客户细分实现与解析
项目主要目的和原理
目的
本项目的目的是通过机器学习技术对客户进行细分,以便企业能够根据不同的客户群体制定差异化的营销策略。通过对客户的消费行为数据进行分析,识别出具有相似特征的不同客户群。
原理
- 数据预处理:将原始交易数据和优惠信息数据转化为适合聚类分析的格式。
- 特征工程:
- 使用主成分分析(PCA)对高维特征进行降维。
- 对类别变量进行One-Hot编码,将其转换为数值型数据。
- 模型训练:使用K-means算法进行无监督学习,将客户划分为若干个簇。
- 模型评估与保存:对模型的聚类效果进行评估,并将训练好的模型持久化保存。
项目概述
实现的主要功能
- 数据预处理和格式转换。
- 特征工程:
- PCA降维。
- One-Hot编码。
- K-means聚类模型的训练与评估。
- 模型的持久化保存。
主要流程步骤
- 数据加载:从CSV文件中读取交易数据和优惠信息数据。
- 数据预处理:将原始数据转化为适合聚类分析的格式(Pivot Table)。
- 特征工程:
- 使用PCA对高维特征进行降维。
- 对类别变量(如客户姓名)进行One-Hot编码。
- 模型训练:使用K-means算法对处理后的数据进行聚类。
- 模型评估:计算并输出聚类效果的评估指标。
- 模型保存:将训练好的模型保存为ZIP文件。
使用的主要函数方法
DataHelpers.PreProcessAndSave:用于数据预处理和格式转换。MLContext.Data.LoadFromTextFile:用于加载CSV文件中的数据。ProjectToPrincipalComponents:用于PCA降维。OneHotEncoding:用于对类别变量进行编码。KMeans:用于训练聚类模型。
关键技术
- 主成分分析(PCA):一种常用的降维技术,用于减少数据的维度同时保留主要信息。
- One-Hot编码:将类别变量转换为数值型向量的技术。
- K-means算法:一种经典的无监督学习算法,用于聚类任务。
主要功能和步骤
功能详细解读
- 数据预处理:
- 将原始交易数据和优惠信息数据进行整合,生成适合聚类分析的Pivot Table格式。
- 特征工程:
- PCA降维:将高维的连续型特征(如交易金额、频率等)降维至二维空间。
- One-Hot编码:将类别变量(如客户姓名)转换为数值型向量,以便模型能够处理。
- K-means聚类:
- 使用K-means算法将客户划分为若干个簇,每个簇代表一组具有相似特征的客户。
- 模型评估与保存:
- 计算并输出聚类效果的评估指标(如轮廓系数)。
- 将训练好的模型持久化保存为ZIP文件,以便后续使用。
详细步骤解析
- 数据加载与预处理:
string relativePath = @"..\..\..\data"; string fullPath = GetAbsolutePath(relativePath);// 加载交易数据和优惠信息数据 string offersCsvPath = Path.Combine(fullPath, "offers.csv"); string transactionsCsvPath = Path.Combine(fullPath, "transactions.csv");// 生成Pivot Table格式的数据 DataHelpers.PreProcessAndSave(transactionsCsvPath, offersCsvPath, pivotCsvPath); - 数据加载与特征工程:
var context = new MLContext();// 加载Pivot Table格式的数据 IDataView data = context.Data.LoadFromTextFile<PivotData>(pivotCsvPath, hasHeader: true);// PCA降维 IEstimator<ITransformer> pcaPipeline = context.Transforms.Pca("Features", "PCAFeatures", 2);// One-Hot编码 IEstimator<ITransformer> oneHotPipeline = context.Transforms.OneHotEncoding("LastName");// 特征工程 pipeline var featurePipeline = pcaPipeline.Append(oneHotPipeline); - 模型训练与评估:
// 使用K-means算法进行聚类 IEstimator<ITransformer> clusteringPipeline = context.Clustering.Trainers.KMeans("Cluster", "Features", numberOfClusters: 3);// 训练模型 ITransformer model = featurePipeline.Append(clusteringPipeline).Fit(data);// 预测并评估 var predictions = model.Transform(data); var metrics = context.Clustering.Evaluate(predictions); - 模型保存:
string modelName = "customer_clustering_model.zip"; context.Model.Save(model, data.Schema, modelName);
数据集及其处理步骤
Offer #,Campaign,Varietal,Minimum Qty (kg),Discount (%),Origin,Past Peak1,January,Malbec,72,56,France,FALSE2,January,Pinot Noir,72,17,France,FALSE3,February,Espumante,144,32,Oregon,TRUE4,February,Champagne,72,48,France,TRUE5,February,Cabernet Sauvignon,144,44,New Zealand,TRUE6,March,Prosecco,144,86,Chile,FALSE7,March,Prosecco,6,40,Australia,TRUE8,March,Espumante,6,45,South Africa,FALSE9,April,Chardonnay,144,57,Chile,FALSE10,April,Prosecco,72,52,California,FALSE11,May,Champagne,72,85,France,FALSE12,May,Prosecco,72,83,Australia,FALSE13,May,Merlot,6,43,Chile,FALSE14,June,Merlot,72,64,Chile,FALSE15,June,Cabernet Sauvignon,144,19,Italy,FALSE16,June,Merlot,72,88,California,FALSE17,July,Pinot Noir,12,47,Germany,FALSE18,July,Espumante,6,50,Oregon,FALSE19,July,Champagne,12,66,Germany,FALSE20,August,Cabernet Sauvignon,72,82,Italy,FALSE21,August,Champagne,12,50,California,FALSE22,August,Champagne,72,63,France,FALSE23,September,Chardonnay,144,39,South Africa,FALSE24,September,Pinot Noir,6,34,Italy,FALSE25,October,Cabernet Sauvignon,72,59,Oregon,TRUE26,October,Pinot Noir,144,83,Australia,FALSE27,October,Champagne,72,88,New Zealand,FALSE28,November,Cabernet Sauvignon,12,56,France,TRUE29,November,Pinot Grigio,6,87,France,FALSE30,December,Malbec,6,54,France,FALSE31,December,Champagne,72,89,France,FALSE32,December,Cabernet Sauvignon,72,45,Germany,TRUE
数据集中的关键字段(如Campaign、Varietal、Minimum Qty (kg)、Discount (%)等),我们可以对葡萄酒销售数据进行深入分析,以揭示数据背后的模式、趋势和潜在价值。帮助企业优化库存管理、制定促销策略,并为市场营销提供数据支持。
数据集处理步骤
-
实现的主要功能
- 数据清洗与预处理:处理缺失值和异常值。
- 特征工程:提取关键特征,如旺季/淡季判断、葡萄酒类型分布等。
- 数据分析建模:使用统计方法和机器学习算法进行数据建模与预测。
-
主要流程步骤
- 数据加载与预处理。
- 特征提取与工程化。
- 数据可视化与描述性分析。
- 预测模型构建与验证(如折扣率预测)。
关键处理步骤原理
1. 数据清洗与预处理
- 目的:确保数据质量,为后续分析打下基础。
- 实现步骤:
- 检查缺失值:使用
isnull()方法判断是否有缺失值。 - 处理异常值:通过统计方法(如四分位数)识别并处理异常值。
- 数据类型转换:将非数值型字段(如Campaign、Varietal)进行编码处理。
- 检查缺失值:使用
2. 特征工程
- 目的:提取对业务有价值的关键特征,提升模型性能。
- 实现步骤:
- 时间相关特征:从Campaign中提取月份信息,判断是否为销售旺季。
- 数量与折扣关系:分析Minimum Qty (kg)和Discount (%)之间的关系。
- 品种分布:统计各葡萄酒品种的销量占比。
3. 数据可视化
- 目的:直观展示数据特征,帮助业务人员理解数据背后的趋势。
- 实现步骤:
- 销售量与折扣的关系:绘制散点图或折线图。
- 品种分布:使用柱状图展示各品种的销售占比。
- 时间序列分析:绘制销量随时间的变化趋势。
4. 预测模型构建
- 目的:基于历史数据预测未来的折扣率或销量,辅助企业制定促销策略。
- 实现步骤:
- 数据集划分:将数据划分为训练集和测试集。
- 模型选择:尝试线性回归、随机森林等算法。
- 模型评估:使用均方误差(MSE)、R²等指标评估模型性能。
总结
本项目通过机器学习技术实现了客户细分功能,主要使用了PCA降维、One-Hot编码和K-means聚类等关键技术。整个流程包括数据预处理、特征工程、模型训练与评估以及模型保存。
意义
- 精准营销:通过对客户的细分,企业可以针对不同群体制定差异化的营销策略。
- 客户洞察:帮助企业更好地理解客户的行为模式和需求。
改进方向
- 数据增强:引入更多维度的客户行为数据(如地理位置、时间戳等)。
- 模型调优:通过网格搜索或随机搜索优化K-means算法的超参数(如簇的数量)。
- 可视化分析:对聚类结果进行可视化分析,帮助业务人员更直观地理解客户群体。
通过不断优化和改进,该系统可以更好地支持企业的精准营销决策,提升客户满意度和企业收益。
相关文章:
ML.NET库学习005:基于机器学习的客户细分实现与解析
文章目录 ML.NET库学习005:基于机器学习的客户细分实现与解析项目主要目的和原理目的原理 项目概述实现的主要功能主要流程步骤使用的主要函数方法关键技术 主要功能和步骤功能详细解读详细步骤解析 数据集及其处理步骤数据集处理步骤关键处理步骤原理1. 数据清洗与…...
分布式id探索
一、为什么要使用分布式id? 随着数据量增加,数据需要进行水平拆分,但表自增id无法满足唯一性; 二、分布式id的特点 1唯一性 2 趋势递增、单调递增(数据库中存放的数据结构数据从小到大有序排列)࿰…...
互联网协议套件中的服务类型(RFC 1349)技术解析与总结
1. 背景与核心目标 RFC 1349 是对 IP 协议头部 服务类型(Type of Service, TOS)字段语义的更新与澄清文档,发布于 1992 年。其主要目标包括: 重新定义 TOS 字段的用途:明确 TOS 字段的语义,解决历史标准中的…...
java-初识List
List: List 是一个接口,属于 java.util 包,用于表示有序的元素集合。List 允许存储重复元素,并且可以通过索引访问元素。它是 Java 集合框架(Java Collections Framework)的一部分 特点: 有序…...
【Linux系统】—— 简易进度条的实现
【Linux系统】—— 简易进度条的实现 1 回车和换行2 缓冲区3 进度条的准备代码4 第一版进度条5 第二版进度条 1 回车和换行 先问大家一个问题:回车换行是什么,或者说回车和换行是同一个概念吗? 可能大家对回车换行有一定的误解࿰…...
一文学会:用DeepSeek R1/V3 + AnythingLLM + Ollama 打造本地化部署的个人/企业知识库,无须担心数据上传云端的泄露问题
文章目录 前言一、AnythingLLM 简介&基础应用1.主要特性2.下载与安装3.配置 LLM 提供商4.AnythingLLM 工作区&对话 二、AnythingLLM 进阶应用:知识增强使用三、AnythingLLM 的 API 访问四、小结1.聊天模式2.本地存储&向量数据库 前言 如果你不知道Olla…...
开源身份和访问管理方案之keycloak(一)快速入门
文章目录 什么是IAM什么是keycloakKeycloak 的功能 核心概念client管理 OpenID Connect 客户端 Client Scoperealm roleAssigning role mappings分配角色映射Using default roles使用默认角色Role scope mappings角色范围映射 UsersGroupssessionsEventsKeycloak Policy创建策略…...
C++STL(六)——list模拟
目录 本次所需实现的三个类一、结点类的模拟实现构造函数 二、迭代器类的模拟实现为什么有迭代器类迭代器类的模板参数说明构造函数运算符的重载- -运算符的重载和!运算符的重载*运算符的重载->运算符的重载引入模板第二个和第三个参数 三、list的模拟实现3.1 默认成员函数构…...
HTML5--网页前端编程(下)
HTML5–网页前端编程(下) 9.常用标签下 (1)表格标签 用来展示数据,显示数据,规整条理,可读性好 基本语法 <table><tr> <td>单元格内的文字</td> <td>单元格内的文字</td>… </tr> <tr> <td>单元格内的文字&l…...
Spring 的 ResponseEntity 包装器使用详解
简介 在 Spring 中,ResponseEntity 是 HTTP 响应的包装器。它允许自定义响应的各个方面: HTTP 状态码 响应主体 HTTP 请求头 使用 ResponseEntity 允许完全控制 HTTP 响应,并且它通常用于 RESTful Web 服务中从控制器方法返回响应。 基…...
Git 分布式版本控制工具使用教程
1.关于Git 1.1 什么是Git Git是一款免费、开源的分布式版本控制工具,由Linux创始人Linus Torvalds于2005年开发。它被设计用来处理从很小到非常大的项目,速度和效率都非常高。Git允许多个开发者几乎同时处理同一个项目而不会互相干扰,并且在…...
linux部署ollama+deepseek+dify
Ollama 下载源码 curl -L https://ollama.com/download/ollama-linux-amd64.tgz -o ollama-linux-amd64.tgz sudo tar -C /usr -xzf ollama-linux-amd64.tgz启动 export OLLAMA_HOST0.0.0.0:11434 ollama serve访问ip:11434看到即成功 Ollama is running 手动安装deepseek…...
torch_bmm验算及代码测试
文章目录 1. torch_bmm2. pytorch源码 1. torch_bmm torch.bmm的作用是基于batch_size的矩阵乘法,torch.bmm的作用是对应batch位置的矩阵相乘,比如, mat1的第1个位置和mat2的第1个位置进行矩阵相乘得到mat3的第1个位置mat1的第2个位置和mat2的第2个位置…...
Vue3 特点
不强制要求组件有根节点 // vue2 <template><div><h1>标题</h1><p>内容</p></div> </template>// vue3 <template><h1>标题</h1><p>内容</p> </template> 注意事项 虽然 Vue 3 不再强制…...
mysql8 C++源码中创建表函数,表字段最大数量限制,表行最大存储限制
在 MySQL 8 的 C 源码中,表的最大字段数量限制体现在 MAX_FIELDS 宏定义中。这个宏定义了表中可以拥有的最大字段数量。 代码中的体现 在 mysql_prepare_create_table 函数中,有以下代码段检查表的字段数量是否超过最大限制: cpp if (alt…...
CTFHub-RCE系列wp
目录标题 引言什么是RCE漏洞 eval执行文件包含文件包含php://input读取源代码远程包含 命令注入无过滤过滤cat过滤空格过滤目录分隔符过滤运算符综合过滤练习 引言 题目共有如下类型 什么是RCE漏洞 RCE漏洞,全称是Remote Code Execution漏洞,翻译成中文…...
【OneAPI】通过网页预渲染让搜索引擎收录网页
API简介 网页预渲染,适用于动态网页以及单页面的SEO,支持网页缓存。 您无须更改代码即可让搜索引擎收录您的网页。只要将需要预渲染的页面转发的本接口即可。 如果您使用Nginx作为网页服务器,推荐使用以下配置: #您的网站locat…...
从大规模恶意攻击 DeepSeek 事件看 AI 创新隐忧:安全可观测体系建设刻不容缓
作者:羿莉(萧羿) 全球出圈的中国大模型 DeepSeek 作为一款革命性的大型语言模型,以其卓越的自然语言处理能力和创新性成本控制引领行业前沿。该模型不仅在性能上媲美 OpenAI-o1,而且在推理模型的成本优化上实现了突破…...
【学习笔记】企业数字化转型顶层设计与企业架构TOGAF9.2-第0章 导论
数据要素资产化迈入关键发展期 围绕发挥数据要素乘数作用,研究实施“数据要素x”行动:从供需两端发力,在智能制造、商贸流通、交通物流、金融服务、医疗健康等若干重点领域,加强场景需求牵引,打通流通障碍、提升供给质量…...
Vue3 Ref全家桶深度解析:掌握响应式编程精髓
Vue3 Ref全家桶深度解析:掌握响应式编程精髓 一、Ref核心概念 1.1 响应式数据容器 const count ref(0) // 相当于创建了一个响应式容器: {value: 0,__v_isRef: true,// 其他响应式系统属性 }1.2 全家桶全景图 #mermaid-svg-VkHPjjlo16rOyItj {font-f…...
如何避免大语言模型中涉及丢番图方程的问题
希尔伯特第十问题是一个著名的数学问题,涉及不定方程(又称为丢番图方程)的可解答性。然而在大模型中,我们希望问题都是确定的可解的,或者说要尽可能的想办法避免不确定的不可解问题。由于丢番图方程问题是不可判定问题(即不存在一个有效的算法能够解决该类问题的所有实例…...
SpringCloud - Sentinel服务保护
前言 该博客为Sentinel学习笔记,主要目的是为了帮助后期快速复习使用 学习视频:7小快速通关SpringCloud 辅助文档:SpringCloud快速通关 源码地址:cloud-demo 一、简介 官网:https://sentinelguard.io/zh-cn/index.h…...
Java 使用腾讯翻译 API 实现含 HTML 标签文本,json值,精准翻译工具
注意:需搭配标题二的腾讯翻译工具使用 一-1、翻译标签文本工具 package org.springblade.common.utils;import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern;public class TencentTranslationFor…...
前端导出pdf,所见即所得
一、推荐方案:html2canvas jsPDF(图片式PDF) javascript import html2canvas from html2canvas; import jsPDF from jspdf;const exportPDF async (elementId, fileName) > {const element document.getElementById(elementId);// 1.…...
单片机上SPI和IIC的区别
SPI(Serial Peripheral Interface)和IC(Inter-Integrated Circuit)是两种常用的嵌入式外设通信协议,它们各有优缺点,适用于不同的场景。以下是它们的详细对比: — 1. 基本概念 SPI࿰…...
03-DevOps-安装并初始化Gitlab
Gitlab可以理解为是自己搭建的GitHub,也就是自己的代码仓库。 开启macvlan 在192.168.1.10服务器上,构建Macvlan网络,这种网络模式可以为每个容器独立分配ip。 docker network create -d macvlan \--subnet192.168.1.0/24 \--ip-range192.16…...
RabbitMQ 从入门到精通:从工作模式到集群部署实战(五)
#作者:闫乾苓 系列前几篇: 《RabbitMQ 从入门到精通:从工作模式到集群部署实战(一)》:link 《RabbitMQ 从入门到精通:从工作模式到集群部署实战(二)》: lin…...
DFS+回溯+剪枝(深度优先搜索)——搜索算法
DFS也就是深度优先搜索,比如二叉树的前,中,后序遍历都属于DFS。其本质是递归,要学好DFS首先需要掌握递归。接下来咱们就一起来学习DFS涉及的算法。 一、递归 1.什么是递归? 递归可以这样理解把它拆分出来࿰…...
使用PyCharm创建项目以及如何注释代码
创建好项目后会出现如下图所示的画面,我们可以通过在项目文件夹上点击鼠标右键,选择“New”菜单下的“Python File”来创建一个 Python 文件,在给文件命名时建议使用英文字母和下划线的组合,创建好的 Python 文件会自动打开&#…...
ArrayList和LinkedList有什么区别?在什么情况下使用ArrayList更高效?
ArrayList和LinkedList在Java中是两种常用的数据结构,分别基于数组和链表实现。它们在性能、内存使用和适用场景上各有特点。 ArrayList与LinkedList的主要区别 数据结构: ArrayList:基于动态数组实现,元素存储在连续的内存空间…...
