8热水器用户行为分析与事件识别
8熱水器用戶行為分析與事件識(shí)別
8.1背景與挖掘目標(biāo)
國(guó)內(nèi)某智能熱水器,在狀態(tài)發(fā)生改變或有水流狀態(tài)時(shí)會(huì)采集數(shù)據(jù),該廠商根據(jù)采集到的數(shù)據(jù)進(jìn)行用戶行為分析,熱水器不僅可以用來(lái)細(xì)雨還可以洗手、洗臉、刷牙、洗菜等。本案例基于熱水器采集的時(shí)間序列數(shù)據(jù),將順序排列的離散的用水時(shí)間節(jié)點(diǎn)根據(jù)水流量和停頓時(shí)間間隔劃分不同大小的時(shí)間區(qū)間,每個(gè)時(shí)間區(qū)間可以理解成一次完整用水事件。
挖掘目標(biāo):第一,根據(jù)熱水器采集到的數(shù)據(jù),劃分一次完整用水事件;第二,劃分好的完整用水事件中識(shí)別出洗浴事件。
數(shù)據(jù)大體情況如下
8.2 分析方法與過(guò)程
第一:對(duì)熱水器用戶的歷史用水?dāng)?shù)據(jù)進(jìn)行選擇性抽取,構(gòu)建專家樣本
第二:對(duì)步驟一形成的數(shù)據(jù)集進(jìn)行數(shù)據(jù)探索分析與預(yù)處理,包括探索用水事件時(shí)間間隔的分布、規(guī)約冗余屬性、識(shí)別用水?dāng)?shù)據(jù)的缺失值,并對(duì)缺失值進(jìn)行處理,根據(jù)建模的需要進(jìn)行屬性構(gòu)造,根據(jù)以上處理對(duì)用水?dāng)?shù)據(jù)建立用水事件時(shí)間間隔識(shí)別模型和劃分一次完整用水事件模型,在再一次完整用水事件劃分結(jié)果的基礎(chǔ)上,剔除短暫用水事件縮小識(shí)別范圍
第三:在第二得到的建模樣本數(shù)據(jù)的基礎(chǔ)上,建立洗浴事件識(shí)別模型,對(duì)洗浴事件識(shí)別模型進(jìn)行模型分析評(píng)價(jià)
第四:在第三中形成的模型結(jié)果應(yīng)用并對(duì)洗浴事件劃分進(jìn)行優(yōu)化
第五:調(diào)用洗浴事件識(shí)別模型,對(duì)實(shí)時(shí)監(jiān)控的熱水器流水?dāng)?shù)據(jù)進(jìn)行洗浴事件自動(dòng)識(shí)別。
8.3 數(shù)據(jù)預(yù)處理
本案例的數(shù)據(jù)集的特點(diǎn)是數(shù)據(jù)量涉及上萬(wàn)個(gè)用戶而且每個(gè)用戶每天的用水?dāng)?shù)據(jù)多達(dá)數(shù)萬(wàn)條存在缺失值、與分析主題無(wú)關(guān)屬性或未直接反應(yīng)應(yīng)用水事件的屬性等,在數(shù)據(jù)預(yù)處理階段,針對(duì)這些情況相應(yīng)的應(yīng)用了缺失值處理、數(shù)據(jù)規(guī)約和屬性構(gòu)造等來(lái)解決這些問(wèn)題。
8.3.1數(shù)據(jù)規(guī)約
??案例采集到的數(shù)據(jù)屬性非常的多,加之我們建模也需要不了這么多的數(shù)據(jù),現(xiàn)在對(duì)建模數(shù)據(jù)進(jìn)行數(shù)據(jù)規(guī)約
屬性規(guī)約:要對(duì)熱水器用戶的洗浴行為的一般規(guī)律進(jìn)行挖掘分析,所以熱水器編號(hào)可以去除,在數(shù)據(jù)中的有無(wú)水流通過(guò)可以通過(guò)水流量反應(yīng),觀察數(shù)據(jù)我們發(fā)現(xiàn)節(jié)能模式的數(shù)據(jù)都是關(guān),對(duì)建模沒(méi)有什么影響,現(xiàn)在我們可以把它去除。
數(shù)值規(guī)約:當(dāng)熱水器的開(kāi)關(guān)狀態(tài)為關(guān)時(shí)并且流水量為0時(shí),說(shuō)明熱水器不處于工作狀態(tài),數(shù)據(jù)記錄可以刪除。
數(shù)據(jù)規(guī)約后的數(shù)據(jù)如下圖:
8.3.2數(shù)據(jù)變換
案例的挖掘目標(biāo)是對(duì)熱水器用戶的洗浴事件進(jìn)行識(shí)別,這就需要從原始數(shù)據(jù)中識(shí)別出哪些狀態(tài)記錄是一個(gè)完整的用水事件,再識(shí)別出完整用水事件中的洗浴事件;而一次完整的用水事件是根據(jù)水流量和停頓時(shí)間間隔的閾值去劃分的,SO,本案例還應(yīng)建立閾值尋優(yōu)模型,為了提高在一次完整用水事件中識(shí)別出洗浴事件,本案例建立了篩選規(guī)則以剔除那些肯定不是洗浴事件的數(shù)據(jù),得到建模數(shù)據(jù)樣本集。
(1)?一次完整用水事件劃分模型
本案例首先需要在大量的記錄中劃分出哪些連續(xù)的數(shù)據(jù)是一次完整的用水事件。
在用水狀態(tài)記錄中,水流量不為0表面用戶正在使用熱水,而水流量為0時(shí)用戶用熱水發(fā)生提頓或者結(jié)束。如果水流量為0的狀態(tài)記錄之間的時(shí)間間隔超過(guò)閾值T,則從該段水流量為0的狀態(tài)向前找到最后一條水流量不為0 的用水記錄作為上一次用水事件結(jié)束;向后找到水流量不為0的狀態(tài)記錄作為下一個(gè)用水事件的開(kāi)始。
代碼如下:
# encoding=utf-8
#劃分一次用水事件代碼
import pandas as pd
threshold=pd.Timedelta(minutes=4)#閾值為4
inputfile=r'E:\PythonProject\python Data Analysis andMining\chapter10\demo\data\water_heater.xls'
outputfile=r'E:\PythonProject\python Data Analysis andMining\chapter10\demo\tmp\dividsequence.xls'
data=pd.read_excel(inputfile)
data[u'發(fā)生時(shí)間']=pd.to_datetime(data[u'發(fā)生時(shí)間'],format='%Y%m%d%H%M%S')
data=data[data[u'水流量']>0]#只要流水量大于0的記錄
d=data[u'發(fā)生時(shí)間'].diff()>threshold#相鄰時(shí)間做差分,比較是否大于閾值
data[u'事件編號(hào)']=d.cumsum()+1#通過(guò)累計(jì)求和的方式為事件編號(hào)
data.to_excel(outputfile)
?
結(jié)果如下:
(2)?用水事件閾值尋優(yōu)模型
考慮到不同地區(qū)人們的用水習(xí)慣不同,以及不同季節(jié)使用熱水器時(shí)停頓的時(shí)長(zhǎng)也可能不同,固定的停頓時(shí)長(zhǎng)閾值對(duì)于某些特殊的情況的處理是不理想的,存在把一個(gè)事件劃分為兩個(gè)事件或者把兩個(gè)事件合為一個(gè)事件的情況。所以考慮要在不同的時(shí)間段內(nèi)更新閾值,本案例建立閾值尋優(yōu)模型來(lái)更新尋找最優(yōu)的閾值這樣可以解決因時(shí)間變化和地域不同導(dǎo)致閾值存在差異的問(wèn)題??
???? 我選取了某熱水電器用戶的數(shù)據(jù)進(jìn)行了不同閾值的劃分,得到了相應(yīng)的時(shí)間個(gè)數(shù),閾值變化與劃分得到的事件個(gè)數(shù)如下圖
在上圖中我們發(fā)現(xiàn)有的地方下降趨勢(shì)明顯有的較為平緩,下降趨勢(shì)明顯的說(shuō)明用戶的停頓習(xí)慣比較集中,平緩的說(shuō)明用戶的停頓習(xí)慣趨于穩(wěn)定,所以取該段時(shí)間作為閾值,這樣的話不會(huì)將短時(shí)間的用水事件合并,又不會(huì)將長(zhǎng)的用水時(shí)間拆開(kāi)。
#閾值尋優(yōu)
import numpy as np
n=4#使用以后4個(gè)點(diǎn)的平均斜率
threshold=pd.Timedelta(minutes=5)#專家閾值
def event_num(ts):
??? d=data[u'發(fā)生時(shí)間'].diff()>ts#相鄰時(shí)間做差分,比較是否大于閾值
??? return d.sum()+1#這樣直接返回事件數(shù)
dt=[pd.Timedelta(minutes=i) for i in np.arange(1,9,0.25)]
h=pd.DataFrame(dt,columns=[u'閾值'])#定義閾值列
h[u'事件數(shù)']=h[u'閾值'].apply(event_num)#計(jì)算每個(gè)閾值對(duì)應(yīng)的事件數(shù)
h[u'斜率']=h[u'事件數(shù)'].diff()/0.25#計(jì)算每?jī)蓚€(gè)相鄰點(diǎn)對(duì)應(yīng)的斜率
h[u'斜率指標(biāo)']=pd.rolling_mean(h[u'斜率'].abs(),n)#采用后n個(gè)斜率絕對(duì)值平均作為斜率指標(biāo)
ts=h[u'閾值'][h[u'斜率指標(biāo)'].idxmin()-n]
#用idxmin返回最小值的Index,由于rolling——mean()自動(dòng)計(jì)算的是前n個(gè)斜率的絕對(duì)值平均,所以結(jié)果要進(jìn)行平移(-n)
if ts>threshold:
??? ts=pd.Timedelta(minutes=4)
print ts
得到的結(jié)果是最優(yōu)閾值為4分鐘
(3)?屬性構(gòu)造
本案例研究的是用水行為,可構(gòu)造4類指標(biāo):時(shí)長(zhǎng)指標(biāo)、頻率指標(biāo)、用水的量化指標(biāo)以及用水波動(dòng)指標(biāo)。
(4)?篩選得“候選洗浴事件”
洗浴事件的識(shí)別是建立在一次用水事件識(shí)別的基礎(chǔ)上,也就是從已經(jīng)劃分好的一次用水事件中識(shí)別出哪些一次用水事件是洗浴事件
8.4 模型構(gòu)建
本案例使用神經(jīng)網(wǎng)絡(luò)模型,在訓(xùn)練神經(jīng)網(wǎng)絡(luò)的時(shí)候選取了“候選洗浴事件”的11個(gè)屬性作為網(wǎng)絡(luò)的輸入。分別為,洗浴時(shí)間點(diǎn)、總用水時(shí)長(zhǎng)、總停頓時(shí)長(zhǎng)、用水時(shí)長(zhǎng)、總用水量、平均水流量、水流量波動(dòng)和停頓時(shí)長(zhǎng)波動(dòng)。在訓(xùn)練神經(jīng)網(wǎng)絡(luò)的時(shí)候發(fā)現(xiàn)含二層隱層的神經(jīng)網(wǎng)絡(luò)訓(xùn)練效果較好,其中2個(gè)隱層的節(jié)點(diǎn)數(shù)分別為17,10,訓(xùn)練效果較好。
訓(xùn)練多層神經(jīng)網(wǎng)絡(luò)的代碼如下:
#建立、訓(xùn)練多層神經(jīng)網(wǎng)絡(luò),并完成模型的檢驗(yàn)
inputfile1=r'E:\PythonProject\python Data Analysis andMining\chapter10\demo\data\train_neural_network_data.xls'
inputfile2=r'E:\PythonProject\python Data Analysis andMining\chapter10\demo\data\test_neural_network_data.xls'
testoutputfile=r'E:\PythonProject\python Data Analysisand Mining\chapter10\demo\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,Activation
model=Sequential()#建立模型
model.add(Dense(input_dim=11,output_dim=17))#輸入層隱藏層的連接
model.add(Activation('relu'))
model.add(Dense(input_dim=17,output_dim=10))#隱藏層到隱藏層的連接
model.add(Activation('relu'))#激活函數(shù)
model.add(Dense(input_dim=10,output_dim=1))#隱藏層到輸出層的連接
model.add(Activation('sigmoid'))
model.compile(loss='binary_crossentropy',optimizer='adam')
model.fit(x_train,y_train,nb_epoch=100,batch_size=20)
model.save_weights(r'E:\PythonProject\python Data Analysisand Mining\chapter10\demo\tmp\net.model')
r=pd.DataFrame(model.predict_classes(x_test),columns=[u'預(yù)測(cè)結(jié)果'])
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)
我們做的只是一個(gè)案例,訓(xùn)練數(shù)據(jù)比較小,不太準(zhǔn)確,當(dāng)數(shù)據(jù)量增大時(shí),模型會(huì)越來(lái)越準(zhǔn)確。
總結(jié)
以上是生活随笔為你收集整理的8热水器用户行为分析与事件识别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 老男孩培训 | 0基础转行,大专学历,工
- 下一篇: THE HERMIT