生活随笔
收集整理的這篇文章主要介紹了
家用电器用户行为分析与事件识别
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
挖掘目標(biāo)
1 根據(jù)熱水器采集到的數(shù)據(jù),劃分一次完整的用水事件。
2 在劃分好的一次完整的用水事件中,識(shí)別出洗浴事件。
分析方法、過(guò)程
1 對(duì)熱水用戶(hù)的歷史用水?dāng)?shù)據(jù)進(jìn)行選擇性抽取,構(gòu)建專(zhuān)家樣本。
2 對(duì)步驟1形成的數(shù)據(jù)集進(jìn)行數(shù)據(jù)探索與預(yù)處理。包括探索用水時(shí)間時(shí)間間隔的分布,規(guī)約冗余屬性、識(shí)別用水?dāng)?shù)據(jù)的缺失值,并對(duì)缺失值進(jìn)行處理,根據(jù)建模的需要進(jìn)行屬性構(gòu)造等。
3 在步驟2的建模樣數(shù)據(jù)基礎(chǔ)上,建立洗浴事件識(shí)別模型,對(duì)洗浴事件識(shí)別模型進(jìn)行分析評(píng)價(jià)。
4 對(duì)步驟3形成的模型結(jié)果應(yīng)用并對(duì)洗浴事件劃分進(jìn)行優(yōu)化。
5 調(diào)用洗浴時(shí)間識(shí)別模型,對(duì)實(shí)時(shí)監(jiān)控的熱水器流水?dāng)?shù)據(jù)進(jìn)行洗浴時(shí)間自動(dòng)識(shí)別。
數(shù)據(jù)抽取
1 數(shù)據(jù)量比較大,對(duì)原始數(shù)據(jù)采用無(wú)放回隨機(jī)抽樣200家用戶(hù)2014.1.1——2014.12.31的用水記錄建模
2 12個(gè)屬性:熱水器編碼、發(fā)生時(shí)間、開(kāi)關(guān)狀態(tài)、加熱中、保溫中、有無(wú)水流、實(shí)際溫度、熱水量、水流量、節(jié)能模式、加熱剩余時(shí)間、當(dāng)前設(shè)置溫度
數(shù)據(jù)探索分析
通過(guò)頻率分布直方圖分析用戶(hù)用水停頓時(shí)間間隔的規(guī)律性
數(shù)據(jù)預(yù)處理
屬性規(guī)約
9個(gè)屬性:發(fā)生時(shí)間、開(kāi)關(guān)狀態(tài)、加熱中、保溫中、實(shí)際溫度、熱水量、水流量、加熱剩余時(shí)間、當(dāng)前設(shè)置溫度
數(shù)據(jù)變換
(1)劃分一次性用水事件
水流量不為0,表示用戶(hù)正在用水
水流量為0,表示用戶(hù)用水停頓或者停止用水
如果水流量為0的狀態(tài)超過(guò)閾值T,則從該段水流量為0的狀態(tài)向前尋找最后一條水流量不為0的用水記錄作為上次用水事件的結(jié)束;向后尋找水流量不為0的用水記錄作為下次用水事件的開(kāi)始
劃分步驟:
1 讀取數(shù)據(jù),識(shí)別第一條用水記錄不為0的數(shù)據(jù)記錄為R1,按順序識(shí)別下一條水流量不為0的記錄為R2;
2 若gap_i > T,則R_i+1與R_i之間的記錄不能劃分到同一次用水事件中,將R_i+1作為新的讀取數(shù)據(jù)記錄的開(kāi)始; 若gap_i < T,則R_i+1與R_i之間的記錄劃分到同一次用水事件中,并將接下來(lái)水流量不為0的數(shù)據(jù)記錄為R_i+2
3 循環(huán)執(zhí)行步驟2,直到數(shù)據(jù)讀取完畢,結(jié)束事件劃分
"""
Created on Thu Jun 07 10:30:21 2018@author: llllllllllllllllllllixu
"""import pandas
as pdinputfile =
'eeeee/chapter10/test/data/water_heater.xls'
outputfile =
'eeeee/chapter10/test/data/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] threshold = pd.Timedelta(minutes=
4)d = data[
u'發(fā)生時(shí)間'].diff() > thresholddata[
u'事件編號(hào)'] = d.cumsum() +
1data.to_excel(outputfile)
查看d
查看結(jié)果
(2)用水事件閾值尋優(yōu)模型
不同時(shí)間、不同地域,閾值也可能不同
建立閾值尋優(yōu)模型尋找最優(yōu)的閾值
"""
Created on Thu Jun 07 10:30:21 2018@author: llllllllllllllllllllixu
"""import pandas
as pd
import numpy
as npinputfile =
'eeeee/chapter10/test/data/water_heater.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] threshold = pd.Timedelta(minutes=
5)
def event_num(ts):d = data[
u'發(fā)生時(shí)間'].diff() > ts
return d.sum() +
1dt = [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)
h[
u'斜率'] = h[
u'事件數(shù)'].diff() /
0.25n =
4
h[
u'斜率指標(biāo)'] = pd.rolling_mean(h[
u'斜率'].abs(), n)ts = h[
u'閾值'][h[
u'斜率指標(biāo)'].idxmin() - n]
if ts > threshold:ts = pd.Timedelta(minutes =
4)
print ts
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'事件數(shù)'])
plt.xlabel(
u'閾值')
plt.ylabel(
u'事件數(shù)')
plt.show()
(3)屬性構(gòu)造
4類(lèi)指標(biāo):時(shí)長(zhǎng)指標(biāo)、頻率指標(biāo)、用水量華指標(biāo)、用水波動(dòng)指標(biāo)
(4)篩選得“候選洗浴事件”
從已經(jīng)劃分好的用水事件中識(shí)別出洗浴事件
滿(mǎn)足任一條件就不是用水事件:
1)一次用水事件的總用水量(純熱水)小于y升
2)用水時(shí)長(zhǎng)小于100秒(用水時(shí)間,不包括停頓)
3)總用水時(shí)長(zhǎng)小于120秒(事件開(kāi)始到結(jié)束)
數(shù)據(jù)清洗
在用水狀態(tài)記錄缺失的的情況下,填充一條狀態(tài)記錄使水流量為0,發(fā)生時(shí)間加2秒,其余屬性狀態(tài)不變。
模型構(gòu)建
"""
Created on Thu Jun 07 10:30:21 2018@author: llllllllllllllllllllixu
"""import pandas
as pdinputfile1 =
'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, Activationmodel = 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'預(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)
整理了好長(zhǎng)時(shí)間,感覺(jué)這章很難理解啊!!!
總結(jié)
以上是生活随笔為你收集整理的家用电器用户行为分析与事件识别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。