欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

家用电器用户行为分析与事件识别

程序员文章站 2022-03-19 11:41:16
...

挖掘目标

1 根据热水器采集到的数据,划分一次完整的用水事件。
2 在划分好的一次完整的用水事件中,识别出洗浴事件。

分析方法、过程

家用电器用户行为分析与事件识别
1 对热水用户的历史用水数据进行选择性抽取,构建专家样本。
2 对步骤1形成的数据集进行数据探索与预处理。包括探索用水时间时间间隔的分布,规约冗余属性、识别用水数据的缺失值,并对缺失值进行处理,根据建模的需要进行属性构造等。
3 在步骤2的建模样数据基础上,建立洗浴事件识别模型,对洗浴事件识别模型进行分析评价。
4 对步骤3形成的模型结果应用并对洗浴事件划分进行优化。
5 调用洗浴时间识别模型,对实时监控的热水器流水数据进行洗浴时间自动识别。

数据抽取

1 数据量比较大,对原始数据采用无放回随机抽样200家用户2014.1.1——2014.12.31的用水记录建模
2 12个属性:热水器编码、发生时间、开关状态、加热中、保温中、有无水流、实际温度、热水量、水流量、节能模式、加热剩余时间、当前设置温度

数据探索分析

通过频率分布直方图分析用户用水停顿时间间隔的规律性
家用电器用户行为分析与事件识别

数据预处理

属性规约

9个属性:发生时间、开关状态、加热中、保温中、实际温度、热水量、水流量、加热剩余时间、当前设置温度
家用电器用户行为分析与事件识别

数据变换

家用电器用户行为分析与事件识别

(1)划分一次性用水事件

水流量不为0,表示用户正在用水
水流量为0,表示用户用水停顿或者停止用水

如果水流量为0的状态超过阈值T,则从该段水流量为0的状态向前寻找最后一条水流量不为0的用水记录作为上次用水事件的结束;向后寻找水流量不为0的用水记录作为下次用水事件的开始
家用电器用户行为分析与事件识别
划分步骤:
1 读取数据,识别第一条用水记录不为0的数据记录为R1,按顺序识别下一条水流量不为0的记录为R2;
2 若gap_i > T,则R_i+1与R_i之间的记录不能划分到同一次用水事件中,将R_i+1作为新的读取数据记录的开始; 若gap_i < T,则R_i+1与R_i之间的记录划分到同一次用水事件中,并将接下来水流量不为0的数据记录为R_i+2
3 循环执行步骤2,直到数据读取完毕,结束事件划分

# -*- coding: utf-8 -*-
"""
Created on Thu Jun 07 10:30:21 2018

@author: llllllllllllllllllllixu
"""

import pandas as pd

inputfile = 'eeeee/chapter10/test/data/water_heater.xls'
outputfile = 'eeeee/chapter10/test/data/dividsequence.xls'

data = pd.read_excel(inputfile)
data[u'发生时间'] = pd.to_datetime(data[u'发生时间'], format='%Y%m%d%H%M%S')
data = data[data[u'水流量'] > 0] 

threshold = pd.Timedelta(minutes=4)

d = data[u'发生时间'].diff() > threshold

data[u'事件编号'] = d.cumsum() +1

data.to_excel(outputfile)

查看d
家用电器用户行为分析与事件识别
查看结果
家用电器用户行为分析与事件识别

(2)用水事件阈值寻优模型

不同时间、不同地域,阈值也可能不同
建立阈值寻优模型寻找最优的阈值

# -*- coding: utf-8 -*-
"""
Created on Thu Jun 07 10:30:21 2018

@author: llllllllllllllllllllixu
"""

import pandas as pd
import numpy as np

inputfile = 'eeeee/chapter10/test/data/water_heater.xls'

data = pd.read_excel(inputfile)
data[u'发生时间'] = pd.to_datetime(data[u'发生时间'], format='%Y%m%d%H%M%S')
data = data[data[u'水流量'] > 0] 

threshold = pd.Timedelta(minutes=5)

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'事件数'].plot()

h[u'斜率'] = h[u'事件数'].diff() / 0.25

n = 4
h[u'斜率指标'] = pd.rolling_mean(h[u'斜率'].abs(), n)

ts = h[u'阈值'][h[u'斜率指标'].idxmin() - n]

if ts > threshold:
    ts = pd.Timedelta(minutes = 4)

print ts     #4

import matplotlib.pyplot as plt 
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.plot(np.arange(1,9,0.25), h[u'事件数'])
plt.xlabel(u'阈值')
plt.ylabel(u'事件数')
plt.show()

家用电器用户行为分析与事件识别
家用电器用户行为分析与事件识别

(3)属性构造

4类指标:时长指标、频率指标、用水量华指标、用水波动指标
家用电器用户行为分析与事件识别
家用电器用户行为分析与事件识别
家用电器用户行为分析与事件识别
家用电器用户行为分析与事件识别
家用电器用户行为分析与事件识别

(4)筛选得“候选洗浴事件”

从已经划分好的用水事件中识别出洗浴事件
满足任一条件就不是用水事件:
1)一次用水事件的总用水量(纯热水)小于y升
2)用水时长小于100秒(用水时间,不包括停顿)
3)总用水时长小于120秒(事件开始到结束)
家用电器用户行为分析与事件识别
家用电器用户行为分析与事件识别

数据清洗

家用电器用户行为分析与事件识别
在用水状态记录缺失的的情况下,填充一条状态记录使水流量为0,发生时间加2秒,其余属性状态不变。
家用电器用户行为分析与事件识别

模型构建

家用电器用户行为分析与事件识别
家用电器用户行为分析与事件识别

# -*- coding: utf-8 -*-
"""
Created on Thu Jun 07 10:30:21 2018

@author: llllllllllllllllllllixu
"""

import pandas as pd

inputfile1 = 'eeeee/chapter10/demo/data/train_neural_network_data.xls'
inputfile2 = 'eeeee/chapter10/demo/data/test_neural_network_data.xls'
testoutputfile = 'eeeee/chapter10/demo/tmp/test_output_data.xls'

data_train = pd.read_excel(inputfile1)
data_test = pd.read_excel(inputfile2)

x_train = data_train.iloc[:, 5:17].as_matrix()
y_train = data_train.iloc[:, 4].as_matrix()
x_test = data_test.iloc[:, 5:17].as_matrix()
y_test = data_test.iloc[:, 4].as_matrix()

from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation

model = Sequential()
model.add(Dense(11, 17))
model.add(Activation('relu'))
model.add(Dropout(0.2))
model.add(Dense(17, 10))
model.add(Activation('relu'))
model.add(Dropout(0.2))
model.add(Dense(10, 1))
model.add(Activation('sigmoid'))

model.compile(loss='binary_crossentropy', optimizer='adam', class_mode='binary')

model.fit(x_train, y_train, nb_epoch=200, batch_size=1)

model.save_weights('eeeee/chapter10/demo/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)

from keras.utils.vis_utils import plot_model
plot_model(model, to_file='model.png', show_shapes=True)

家用电器用户行为分析与事件识别

整理了好长时间,感觉这章很难理解啊!!!