家用电器用户行为分析与事件识别
挖掘目标
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)
整理了好长时间,感觉这章很难理解啊!!!
推荐阅读
-
jQuery事件模型默认行为执行顺序及trigger()与 triggerHandler()比较实例分析
-
第10章 家用电器用户行为分析与事件识别
-
python数据分析与挖掘实战---chapter10家用电器用户行为分析与事件识别
-
家用电器用户行为分析与事件识别代码详解+修改后运行无误的代码
-
网站用户行为分析——HBase的安装与配置
-
jQuery事件模型默认行为执行顺序及trigger()与 triggerHandler()比较实例分析
-
网站用户行为分析——HBase的安装与配置
-
Python 实现 RFM 模型(详):用户行为分析模型,商业实践与数据分析实战(含可视化)
-
家用电器用户行为分析与事件识别