挖掘目標
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,直到數據讀取完畢,結束事件劃分
"""
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'發生時間'] = 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() > thresholddata[
u'事件編號'] = d.cumsum() +
1data.to_excel(outputfile)
查看d
查看結果
(2)用水事件閾值尋優模型
不同時間、不同地域,閾值也可能不同
建立閾值尋優模型尋找最優的閾值
"""
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'發生時間'] = 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() +
1dt = [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.25n =
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
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秒,其余屬性狀態不變。
模型構建
"""
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'預測結果'])
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)
整理了好長時間,感覺這章很難理解啊!!!
總結
以上是生活随笔為你收集整理的家用电器用户行为分析与事件识别的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。