【数据挖掘实战】——家用电器用户行为分析及事件识别
项目地址:Datamining_project: 数据挖掘实战项目代码
目录
一、背景和挖掘目标
1、问题背景
2、原始数据
3、挖掘目标
二、分析方法与过程
1、初步分析
2、总体流程
第一步:数据抽取
第二步:探索分析
第三步:数据的预处理
第四步:构建专家样本
第五步: 构建用水事件行为识别模型
三、总结和思考
一、背景和挖掘目标
1、问题背景
- 智能家居是利用先进的技术,融合个性需求,将与家居生活有关的各个子系统有机地结合在一起,通过网络化综合智能控制和管理,实现“以人为本”的全新生活体验。
- 企业若能深入了解其产品在不同用户群的使用习惯,开发新功能,就能开拓新市场,实现产品的智能化。根据家居的智能化,分析客户行为,识别不同客户群的特征、加深对客户的理解等。(以热水器为例,分析客户行为)
- 针对不同的客户群提供个性化产品、改进新产品的智能化的研发和制定相应的营销策略。
2、原始数据
用户用水数据表:包括了洗浴、洗手、洗脸、洗菜、做饭等用水行为
3、挖掘目标
- 根据热水器采集到的数据,划分一次完整用水事件;
- 在划分好的一次完整用水事件中,识别出洗浴事件。
二、分析方法与过程
1、初步分析
- 热水器在状态发生改变或者有水流状态时,每2秒会采集一条流水数据。因为用户行为不仅仅只有洗浴还存在其他的用水事件:比如洗手、洗菜等,所以热水器采集的数据来自各种不同的用水事件。
- 基于热水器采集的数据,根据水流量和停顿时间间隔划分为不同大小的时间区间,每个区间是一个可理解的一次完整用水事件,并以热水器一次完整用水事件作为一个基本事件。
- 从独立的用水事件中识别出其中属于洗浴的事件。
2、总体流程
第一步:数据抽取
属性名称 | 属性说明 |
热水器编码 | 热水器出厂编号 |
发生时间 | 记录热水器处于某状态的时刻 |
开关机状态 | 热水器是否开机 |
即热 | 即时加热 |
加热中 | 热水器处于对水进行加热的状态 |
保温中 | 热水器处于对水进行保温的状态 |
有无水流 | 热水水流量大于等于10L/min为有水,否则为无 |
实际温度 | 热水器中热水的实际温度 |
热水量 | 热水器热水的含量 |
水流量 | 热水器热水的水流速度 单位:L/min |
节能模式 | 热水器的一种节能工作模式 |
预约洗 | 预约一个时间使用热水 |
即时洗 | 不预约直接使用热水器 |
加热剩余时间 | 加热到设定温度还需多长时间 |
当前设置温度 | 热水器加热时热水能够到达的最大温度 |
第二步:探索分析
为了探究用户真实用水停顿时间间隔的分布情况,统计用水停顿的时间间隔并作频率分布直方图。
停顿时间间隔为0~0.3分钟的频率很高,根据日常用水经验可以判断其为一次用水时间中的停顿;停顿时间间隔为6~13分钟的频率较低,分析其为两次用水事件之间的停顿间隔。两次用水事件的停顿时间间隔分布在3~7分钟与现场实验统计用水停顿的时间间隔近似。
第三步:数据的预处理
2、数据变换
一次完整用水事件的划分:用水状态记录中,水流量不为0表明用户正在使用热水;而水流量为0时用户用热水发生停顿或者用热水结束。水流量为0的状态记录之间的时间间隔如果超过一个阈值T,则从该段水流量为0的状态记录向前找到最后一条水流量不为0的用水记录作为上一次用水事件的结束;向后找到水流量不为0的状态记录作为下一个用水事件的开始。
#-*- coding: utf-8 -*-
#用水事件划分
import pandas as pdthreshold = pd.Timedelta('4 min') #阈值为分钟
inputfile = 'data/water_heater.xls' #输入数据路径,需要使用Excel格式
outputfile = 'tmp/dividsequence.xls' #输出数据路径,需要使用Excel格式data = pd.read_excel(inputfile)
data[u'发生时间'] = pd.to_datetime(data[u'发生时间'], format = '%Y%m%d%H%M%S')
data = data[data[u'水流量'] > 0] #只要流量大于0的记录
d = data[u'发生时间'].diff() > threshold #相邻时间作差分,比较是否大于阈值
data[u'事件编号'] = d.cumsum() + 1 #通过累积求和的方式为事件编号data.to_excel(outputfile)
用水事件阈值寻优:根据水流量和停顿时间间隔的阈值划分一次完整的用水事件。
# -*- coding: utf-8 -*-
# 阈值寻优
import numpy as np
import pandas as pdinputfile = 'data/water_heater.xls' # 输入数据路径,需要使用Excel格式
n = 4 # 使用以后四个点的平均斜率threshold = pd.Timedelta(minutes=5) # 专家阈值
data = pd.read_excel(inputfile)
data[u'发生时间'] = pd.to_datetime(data[u'发生时间'], format='%Y%m%d%H%M%S')
data = data[data[u'水流量'] > 0] # 只要流量大于0的记录def event_num(ts):d = data[u'发生时间'].diff() > ts # 相邻时间作差分,比较是否大于阈值return d.sum() + 1 # 这样直接返回事件数dt = [pd.Timedelta(minutes=i) for i in np.arange(1, 9, 0.25)]
h = pd.DataFrame(dt, columns=[u'阈值']) # 定义阈值列
h[u'事件数'] = h[u'阈值'].apply(event_num) # 计算每个阈值对应的事件数
h[u'斜率'] = h[u'事件数'].diff() / 0.25 # 计算每两个相邻点对应的斜率# df_test['col_name'].rolling(ma).mean()新版本 ---->pd.rolling_mean(df_test['col_name'], ma) 旧版本
# pd.rolling_mean(h[u'斜率'].abs(), n)
h[u'斜率指标'] = h[u'斜率'].rolling(n).mean() # 采用后n个的斜率绝对值平均作为斜率指标
ts = h[u'阈值'][h[u'斜率指标'].idxmin() - n]
# 注:用idxmin返回最小值的Index,由于rolling_mean()自动计算的是前n个斜率的绝对值平均
# 所以结果要进行平移(-n)if ts > threshold:ts = pd.Timedelta(minutes=4)print(ts)
属性构造:根据用水行为,需构造四类指标:时长指标、频率指标、用水的量化指标以及用水的波动指标。
属性解释:
候选洗浴事件:从大量的一次完整用水事件中筛选规则剔除可以明显判定不是洗浴的事件
筛选掉非常短暂的用水事件:一次完整的用水事件满足其中任意一个条件,就被判定为短暂用水事件,其筛选条件为:1、一次用水事件中总用水量(纯热水)小于y升;2、用水时长小于100秒;3、总用水时长小于120秒。
3、缺失值的处理
第四步:构建专家样本
第五步:构建用水事件行为识别模型
1、洗浴识别模型
根据建模样本数据和用户记录的包含用水的用途、用水开始时间、用水结束时间等属性的用水日志,建立BP神经网络模型识别洗浴事件。
# -*- coding: utf-8 -*-
# 建立、训练多层神经网络,并完成模型的检验
from __future__ import print_function
import pandas as pdinputfile1 = '../data/train_neural_network_data.xls' # 训练数据
inputfile2 = '../data/test_neural_network_data.xls' # 测试数据
testoutputfile = '../tmp/test_output_data.xls' # 测试数据模型输出文件
data_train = pd.read_excel(inputfile1) # 读入训练数据(由日志标记事件是否为洗浴)
data_test = pd.read_excel(inputfile2) # 读入测试数据(由日志标记事件是否为洗浴)
y_train = data_train.iloc[:, 4].as_matrix() # 训练样本标签列
x_train = data_train.iloc[:, 5:17].as_matrix() # 训练样本特征
y_test = data_test.iloc[:, 4].as_matrix() # 测试样本标签列
x_test = data_test.iloc[:, 5:17].as_matrix() # 测试样本特征from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activationmodel = Sequential() # 建立模型
model.add(Dense(11, 17)) # 添加输入层、隐藏层的连接
model.add(Activation('relu')) # 以Relu函数为激活函数
model.add(Dense(17, 10)) # 添加隐藏层、隐藏层的连接
model.add(Activation('relu')) # 以Relu函数为激活函数
model.add(Dense(10, 1)) # 添加隐藏层、输出层的连接
model.add(Activation('sigmoid')) # 以sigmoid函数为激活函数
# 编译模型,损失函数为binary_crossentropy,用adam法求解
model.compile(loss='binary_crossentropy', optimizer='adam', class_mode="binary")model.fit(x_train, y_train, nb_epoch=100, batch_size=1) # 训练模型
model.save_weights('../tmp/net.model') # 保存模型参数r = pd.DataFrame(model.predict_classes(x_test), columns=[u'预测结果'])
pd.concat([data_test.iloc[:, :5], r], axis=1).to_excel(testoutputfile)
model.predict(x_test)
2、模型检验
通过某热水器用户记录了两周的热水器用水日志,将前一周的数据作为训练数据,后一周的数据作为测试数据。根据该热水器用户提供的用水日志与多层神经网络模型识别结果的比较,总共21条检测数据,准确识别了18条数据,模型对洗浴事件的识别准确率为85.5%。
三、总结和思考
- 根据上述模型划分的结果,发现有时候会将两次(或多次)洗浴划分为一次洗浴,因为在实际情况中,存在着一个人洗完澡后,另一个人马上洗的情况,这中间过渡期间的停顿间隔小于阈值。针对两次(或多次)洗浴事件被合并为一次洗浴事件的情况,需要进行优化,对连续洗浴事件作识别,提高模型识别精确度。
- 判断连续洗浴的方法:对每次用水事件,建立一个连续洗判别指标。连续洗判别指标初始值为0,每当有一个属性超过设定的阈值,就给该指标加上相应的值,最后判别连续洗指标是否超过给定的阈值,如果超过给定的阈值,认为该次用水事件为连续洗事件。
相关文章:

【数据挖掘实战】——家用电器用户行为分析及事件识别
项目地址:Datamining_project: 数据挖掘实战项目代码 目录 一、背景和挖掘目标 1、问题背景 2、原始数据 3、挖掘目标 二、分析方法与过程 1、初步分析 2、总体流程 第一步:数据抽取 第二步:探索分析 第三步:数据的预处…...

肠道核心菌属——双歧杆菌属,了解并拥有它
双歧杆菌 双歧杆菌属(Bifidobacterium)是放线菌门严格厌氧的革兰氏阳性多形性杆状细菌。末端常常分叉,故名双歧杆菌。是人和动物肠道的重要核心菌群和有益生理菌群,也是母乳喂养婴儿中发现的第二大菌。 肥胖、糖尿病和过敏等各种疾…...
Python 之 Pandas 生成时间戳范围、Pandas 的时期函数 Period() 和时间序列 - 重采样 resample
文章目录一、生成时间戳范围1. 指定值2. 指定开始日期并设置期间数3. 频率 freq4. closed二、Pandas 的时期函数 Period()三、时间序列 - 重采样 resample在开始之前,我们先导入 numpy 和 pandas 库,同时导入 python 内置的模块。 import pandas as pd…...

利用Python和Sprak求曲线与X轴上方的面积
有n组标本(1, 2, 3, 4), 每组由m个( , , ...)元素( , )组成(m值不定), . 各组样本的分布 曲线如下图所示. 通过程序近似实现各曲线与oc, cd直线围成的⾯积. 思路 可以将图像分成若干个梯形,每个梯形的底边长为(Xn1 - Xn-1),面积为矩形的一半,…...

利用机器学习(mediapipe),进行人手的21个3D手关节坐标检测
感知手的形状和动作的能力可能是在各种技术领域和平台上改善用户体验的重要组成部分。例如,它可以构成手语理解和手势控制的基础,并且还可以在增强现实中将数字内容和信息覆盖在物理世界之上。虽然自然而然地出现在人们手中,但是强大的实时手感知力无疑是一项具有挑战性的计…...

【添砖java】谁说编程第一步是hello world
编程第一步明明是下载编译器和配置环境(小声逼逼)。 Windows下的java环境安装: java的安装包分为两类,一类是JRE(Java Runtime Environmental),是一个独立的java运行环境;一类是JDK…...

el-table大数据量渲染卡顿问题
1、场景描述 在项目开发中,遇到在表格中一次性加载完的需求,且加载数量不少,有几百几千条,并且每条都可能有自己的下拉框,输入框来做编辑功能,此时普通的el-table肯定会导致浏览器卡死,那么怎么…...
MyBatis-Plus 实现分页的几种写法
简介MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。快速开始添加依赖全新的 MyBatis-Plus 3.0 版本基于 JDK8ÿ…...

记一次Binder内存不足导致的应用被杀
每个进程的可用Binder内存大小是 1M-8KB 也就是900多KB 事情的起因的QA压测过程发生进程号变更,怀疑APP被杀掉过,于是开始看日志(实际后来模拟的时候可以发现app确实被杀掉了) APP的压测平台会上报进程号变更时间点,发…...

Zabbix4.0架构理解-zabbix的工作方式
目录 1.1、zabbix4.0架构图 1.2、zabbix的进程 1、 zabbix server 2、zabbix agent 3、 zabbix proxy 4、 java gateway 5、zabbix get 1.3、zabbix的几种工作方式 1、通过zabbix agent 2、通过zabbix proxy 3、通过 zabbix java gateway 4、其他 1.3、zabbix 数据走…...

MySQL中的一些非常实用的函数、语法
前言我最近几年用MYSQL数据库挺多的,发现了一些非常有用的小玩意,今天拿出来分享到大家,希望对你会有所帮助。1.group_concat在我们平常的工作中,使用group by进行分组的场景,是非常多的。比如想统计出用户表中&#x…...

RT-Thread移植到STM32F407
文章目录第一步:获取RT-Thread源码第二步:项目结构介绍第三步:拷贝示例代码到裸机工程第四步:删除无用文件第五步:修改工程目录结构第六步:添加工程文件路径第七步:编译第八步:修改配…...
VR全景到底有多全能?为何屡受关注?
告别两年的“冰封”时期,现在疫情放开已经有一段时间了,各个行业的市场和经济已经逐步回暖,但是疫情对广大群众造成的心理阴影还是迟迟未有退散。就拿去电影院看电影来说,以前看电影是看心情,现在看电影则是看环境&…...

剑指 Offer 30. 包含min函数的栈
摘要 剑指 Offer 30. 包含min函数的栈 一、栈解析 package Stock;import java.util.Stack;/*** Classname JZ30min函数栈* Description TODO* Date 2023/2/24 18:59* Created by xjl*/ public class JZ30min函数栈 {/*** description 最小栈的含义是每次从栈中获取的数据都是…...

stm32f407探索者开发板(二十二)——通用定时器基本原理讲解
文章目录一、三种定时器的区别二、通用定时器特点2.1 功能特点描述2.2 计数器模式三、通用定时器工作过程四、附一、三种定时器的区别 STM32F40x系列总共最多有14个定时器 三种(4)STM32定时器区别 二、通用定时器特点 2.1 功能特点描述 STM3 F4的通…...
cmake 入门三 常用变量和指令
cmake常用变量 一、cmake 变量引用的方式: 前面我们已经提到了,使用${}进行变量的引用。在IF 等语句中,是直接使用变量名而不通过${}取值 二,cmake 自定义变量的方式: 主要有隐式定义和显式定义两种,一…...

Linux基础命令-find搜索文件位置
文章目录 find 命令介绍 语法格式 命令基本参数 参考实例 1)在root/data目录下搜索*.txt的文件名 2)搜索一天以内最后修改时间的文件;并将文件删除 3)搜索777权限的文件 4)搜索一天之前变动的文件复制到test…...

获取浏览器硬件资源的媒体数据(拍照、录音、录频、屏幕共享)
目录一、window.navigator 对象包含有关访问者浏览器的信息取二、MediaDevices1.使用麦克风2.使用摄像头(和音频一样)3.拍照4.录屏三、MediaRecorder(录制,可录制音频视屏)一、window.navigator 对象包含有关访问者浏览器的信息取 <!DOCTYPE html>…...
Java入门教程||Java 日期时间||Java 正则表达式
Java 日期时间java.util包提供了Date类来封装当前的日期和时间。Date类提供两个构造函数来实例化Date对象。第一个构造函数使用当前日期和时间来初始化对象。Date( )第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。Date(long millisec)Date对象创建…...

详解八大排序算法
文章目录前言排序算法插入排序直接插入排序:希尔排序(缩小增量排序)选择排序直接选择排序堆排序交换排序冒泡排序快速排序hoare版本挖坑法前后指针版本快速排序的非递归快速排序总结归并排序归并排序的非递归实现:计数排序排序算法复杂度及稳定性分析总结前言 本篇…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...

【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

《Docker》架构
文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器,docker,镜像,k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...

FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...

goreplay
1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具,可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长,测试它所需的工作量也会呈指数级增长。GoRepl…...