摘要:家庭用戶的用電預測用電量可以反映一個國家經濟發展的水平,對用電量進行全面的理解有助于減少家庭的電費支出。處理缺失值在原始計量數據,特別是用戶電量抽取過程中,發現存在缺失現象。若將這些值拋棄掉,會嚴重影響用電預測的結果。
家庭用戶的用電預測
用電量可以反映一個國家經濟發展的水平,對用電量進行全面的理解有助于減少家庭的電費支出。對企業而言,對用電量全面的理解有助于提高經營的效率。對于政府而言,全面的了解用電量可以減少政府對發電,供電等需要的基建投資,為政府對當地經濟發展制定更好更全面的規劃。
鑒于智能電表的興起以及太陽能電池板等發電技術的廣泛采用,有大量的用電數據可供選擇。該數據代表了功率的相關變量,這些變量又可用于建模甚至預測未來的電力消耗。像長期短期記憶網絡(LSTM)這樣的神經網絡能夠處理多個輸入變量的問題。這在時間序列預測中具有很大的益處,而傳統的線性方法難以適應多變量或多輸入預測問題。
第一步 準備工作在本教程中,您將了解如何在 Keras 深度學習庫中開發多變量時間序列預測的 LSTM 模型。完成本教程后,您將知道:
如何將原始數據集轉換為可用于時間序列預測的類型
如何搭建解決多變量時間序列預測問題的 LSTM 模型
如何做出預測并將結果重新調整到原始單位
特征介紹
date: 日期格式為 dd/mm/yy
time: 時間格式為 hh:mm:ss
Global_active_power: 家庭消耗的總有功功率(千瓦),在交流電路中,電源在一個周期內發出瞬時功率的平均值(或負載電阻所消耗的功率),稱為"有功功率"
Global_reactive_power: 家庭消耗的總無功功率(千瓦),在具有電感或電容的電路中,在每半個周期內,把電源能量變成磁場(或電場)能量貯存起來,然后,再釋放,又把貯存的磁場(或電場)能量再返回給電源,只是進行這種能量的交換,并沒有真正消耗能量,我們把這個交換的功率值,稱為" 無功功率"
voltage: 平均電壓(伏特)
Global_intensity: 平均電流強度(安培)
sub_metering_1: 廚房的有功功率
sub_metering_2: 用于洗衣機等電器的有功功率
sub_metering_3: 空調熱水器等電器的有功功率
這里我們使用的是時間序列預測模型,利用歷史數據來預測之后的 Global_active_power。
第二步 導入數據并進行數據預處理# 將txt文檔讀入并轉換為 csv 文件格式 df = pd.read_csv(path, sep=";", parse_dates={"dt" : ["Date", "Time"]}, infer_datetime_format=True, low_memory=False, na_values=["nan","?"], index_col="dt")
上面代碼執行了以下操作:1)將 "Date" 和 "Time" 兩列合并為 "dt"2)將上面的數據轉換為時間序列類型,將時間作為索引。
# 我們查看前 5 條數據 df.head()
我們可以看出?Global_active_power 大于?Global_reactive_power,?voltage 基本穩定在 233 伏特。
# 了解數據的分布 df.describe()
我們可以通過上表了解數據的分布特征,比如均值和方差,還有最小值等等。
處理缺失值在原始計量數據,特別是用戶電量抽取過程中,發現存在缺失現象。若將這些值拋棄掉,會嚴重影響用電預測的結果。為了達到較好的建模效果,需要對缺失值進行處理。
# 找到所有有缺失值的列 total = df.isnull().sum().sort_values(ascending=False) display(total) # 用各列的均值填充缺失值 for j in range(0,7): df.iloc[:,j] = df.iloc[:,j].fillna(df.iloc[:,j].mean()) # 查看是否還有缺失值 df.isnull().sum()第三步 數據可視化
大部分真實的數據集都難以觀察,因為它們有很多列變量,以及很多行數據。理解信息這方面大量都依賴于視覺。查看數據基本等價于了解數據。然而,基本上我們只能理解視覺上的二維或者三維數據,最好是二維。所以數據可視化能夠幫助我們提高對數據的理解。
對數據集中呈現的結構和相關性進行觀察,會讓它們易于理解。一個準確的機器學習模型給出的預測,應當能夠反映出數據集中所體現的結構和相關性。要明確一個模型給出的預測是否可信,對這些結構和相關性進行理解是首當其沖的。
了解數據分布我們可以使用 resample 函數使特征按不同單位進行聚合。例如:使用參數 "H" 調用此函數使時間索引的數據按小時聚合。下面我們對?Global_active_power?按天進行聚合,并比較它的總和和平均值。 可以看出,重采樣數據集的平均值和總和具有相似的結構。
# 對 Global_active_power 數據按天進行聚合,并比較均值和總和 df.Global_active_power.resample("D").sum().plot(title="Global_active_power resampled over day for sum") plt.tight_layout() plt.show() df.Global_active_power.resample("D").mean().plot(title="Global_active_power resampled over day for mean", color="red") plt.tight_layout() plt.show()
# 對 "Global_active_power" 按季度進行聚合 df["Global_active_power"].resample("Q").mean().plot(kind="bar") plt.xticks(rotation=60) plt.ylabel("Global_active_power") plt.title("Global_active_power per quarter (averaged over quarter)") plt.show() # 對"Voltage" 按月進行聚合 df["Voltage"].resample("M").mean().plot(kind="bar", color="red") plt.xticks(rotation=60) plt.ylabel("Voltage") plt.title("Voltage per quarter (summed over quarter)") plt.show()
我們可以看出每個月電壓平均值變化幅度非常小,基本保持穩定。
# 下面我們比較對不同特征以天進行重采樣的數值 cols = [0, 1, 2, 3, 5, 6] i = 1 groups=cols # 統計以天進行重采樣的平均值 values = df.resample("D").mean().values # 對每個column進行繪圖 plt.figure(figsize=(15, 10)) for group in groups: # 對每個特征添加子圖 plt.subplot(len(cols), 1, i) # 進行繪圖 plt.plot(values[:, group]) # 添加標題 plt.title(df.columns[group], y=0.75, loc="right") # 更換子圖位置 i += 1 plt.show()
# 下面我們看看 ‘Global_active_power‘ 數值分布情況 sns.distplot(df["Global_active_power"]);
可以看出家庭消耗的總有功功率主要集中在 0-2kw 范圍內
特征相關性分析# 查看 "Global_intensity" 和 "Global_active_power" 特征之間的關系 data_returns = df.pct_change() sns.jointplot(x="Global_intensity", y="Global_active_power", data=data_returns) plt.show()
# 查看 "Voltage" 和 "Global_active_power" 之間的關系 sns.jointplot(x="Voltage", y="Global_active_power", data=data_returns) plt.show()
從上面的兩個圖中可以看出 "Global_intensity" 和 "Global_active_power" 是線性相關的。 但 "Voltage" 和 "Global_active_power" 的相關性較低, 這是機器學習所要觀察的。
# 對各特征按月進行聚合 plt.title("resampled over month",size=15) sns.heatmap(df.resample("M").mean().corr(),linewidths=0.1,vmax=1.0, square=True, cmap=plt.cm.RdBu, linecolor="white", annot=True) # 對各特征按年進行聚合 plt.title("resampled over year",size=15) sns.heatmap(df.resample("A").mean().corr(),linewidths=0.1,vmax=1.0, square=True, cmap=plt.cm.RdBu, linecolor="white", annot=True)
從上面可以看出,采用重采樣技術可以改變特征之間的相關性, 這對于特征工程非常重要。
第四步 多變量LSTM預測模型在可以使用深度學習之前,必須將時間序列預測問題調整為監督學習問題,形成輸入和輸出序列對,利用前一時間的 Global_active_power 和其他特征預測當前時間的 Global_active_power。
# 下面我們對 ‘Global_active_power" 向前移動一個單位 df["Global_active_power"].resample("h").mean().shift(1) # 下面我們對 ‘Global_active_power" 向后移動一個單位 df["Global_active_power"].resample("h").mean().shift(-1)
因為這里我們預測 ‘Global_active_power" 不僅用到過去時間的 ‘Global_active_power" 還會用到其他的特征,比如:"Voltage‘,這時候我們把此類問題叫做多變量時間序列預測。下面我們展示將時間序列問題轉換為監督學習問題的過程。
def series_to_supervised(data, n_in=1, n_out=1, dropnan=True): n_vars = 1 if type(data) is list else data.shape[1] dff = pd.DataFrame(data) cols, names = list(), list() # 輸入序列(t-n, ... t-1) for i in range(n_in, 0, -1): cols.append(dff.shift(i)) names += [("var%d(t-%d)" % (j+1, i)) for j in range(n_vars)] # 預測序列 (t, t+1, ... t+n) for i in range(0, n_out): cols.append(dff.shift(-i)) if i == 0: names += [("var%d(t)" % (j+1)) for j in range(n_vars)] else: names += [("var%d(t+%d)" % (j+1, i)) for j in range(n_vars)] # 組合起來 agg = pd.concat(cols, axis=1) agg.columns = names # 丟掉NaN if dropnan: agg.dropna(inplace=True) return agg
我們將數據以小時進行聚合,這樣也可以減少計算時間,可以快速獲得測試模型的結果。 我們以小時進行聚合(原始數據以分鐘為單位)。這將把數據大小從 2075259 減少到 34589,但依然保持數據的整體結構。
# 將數據按小時聚合 df_resample = df.resample("h").mean() df_resample.shape對特征進行歸一化
數據歸一化處理是數據挖掘的一項基礎工作。不同指標往往具有不同的量綱,數值間的差別可能很大,不進行處理可能會影響數據分析的結果。為了消除指標間的量綱和取值范圍差異的影響,需要進行標準化處理,將數據按照比例進行縮放,使之落入特定的區域,以便于進行綜合分析。
同樣我們必須對用戶電量的各指標進行處理,這里我們用到最小最大規范化。
# 把所有特征進行規范化 values = df_resample.values # 特征歸一化 scaler = MinMaxScaler(feature_range=(0, 1)) scaled = scaler.fit_transform(values) # 轉化為監督問題
# 轉化為監督問題 reframed = series_to_supervised(scaled, 1, 1) # 刪除不需要的特征 reframed.drop(reframed.columns[[8,9,10,11,12,13]], axis=1, inplace=True) print(reframed.head())把數據集拆分成訓練集和測試集
這里,我們將前三年的數據作為訓練集,后一年的樣本作為測試集,并將數據改為 3 維格式。?
# 對樣本集拆分成訓練集和測試集 values = reframed.values n_train_time = 365*24*3 train = values[:n_train_time, :] test = values[n_train_time:, :] train_X, train_y = train[:, :-1], train[:, -1] test_X, test_y = test[:, :-1], test[:, -1] # 把數據轉換為3維 train_X = train_X.reshape((train_X.shape[0], 1, train_X.shape[1])) test_X = test_X.reshape((test_X.shape[0], 1, test_X.shape[1])) print(train_X.shape, train_y.shape, test_X.shape, test_y.shape)搭建 LSTM 模型
模型架構1)LSTM 在第一個可見層中有 100 個神經元2)丟棄 20%,防止過擬合3)輸出層中 1 個神經元,用于預測 Global_active_power4)使用平均絕對誤差(MAE)損失函數和隨機梯度下降的 Adam 優化器5)該模型 epoch 為 20,批次大小為 70?
# 搭建網絡模型 model = Sequential() model.add(LSTM(100, input_shape=(train_X.shape[1], train_X.shape[2]))) model.add(Dropout(0.2)) model.add(Dense(1)) model.compile(loss="mean_squared_error", optimizer="adam") # 訓練網絡 history = model.fit(train_X, train_y, epochs=20, batch_size=70, validation_data=(test_X, test_y), verbose=2, shuffle=False) # 統計 loss 值 plt.plot(history.history["loss"]) plt.plot(history.history["val_loss"]) plt.title("model loss") plt.ylabel("loss") plt.xlabel("epoch") plt.legend(["train", "test"], loc="upper right") plt.show() # 做出預測 yhat = model.predict(test_X) test_X = test_X.reshape((test_X.shape[0], 7))
我們可以看出模型的收斂速度很快。
第五步 模型評估預測模型對訓練集進行預測而得到的準確率并不能很好地反映預測模型對未來的性能,為了有效判斷一個預測模型的性能表現,需要一組沒有參加預測模型建立的數據集,并在該模型上評價預測模型的準確率,這組獨立的數據集叫做測試集。在測試集進行預測并且評估,我們怎樣對模型進行性能衡量?
回歸問題的評價指標:通常用相對/絕對誤差,平均絕對誤差,均方誤差,均方根誤差等指標來衡量,分類問題的評價指標:準確率,精確率,召回率,ROC曲線,混淆矩陣。
我們將預測與測試數據集相結合,并反演縮放。以預測值和實際值為原始尺度,我們可以計算模型的誤差分數。 在這種情況下,我們計算出與變量本身相同的單位產生誤差的均方根誤差(RMSE)。
#對預測值進行反演縮放 inv_yhat = np.concatenate((yhat, test_X[:, -6:]), axis=1) inv_yhat = scaler.inverse_transform(inv_yhat) inv_yhat = inv_yhat[:,0] # 對真實值進行反演縮放 test_y = test_y.reshape((len(test_y), 1)) inv_y = np.concatenate((test_y, test_X[:, -6:]), axis=1) inv_y = scaler.inverse_transform(inv_y) inv_y = inv_y[:,0] # 計算 RMSE rmse = np.sqrt(mean_squared_error(inv_y, inv_yhat)) print("Test RMSE: %.3f" % rmse)
## 我們比較下 200 小時真實值和預測值 aa=[x for x in range(200)] plt.plot(aa, inv_y[:200], marker=".", label="actual") plt.plot(aa, inv_yhat[:200], "r", label="prediction") plt.ylabel("Global_active_power", size=15) plt.xlabel("Time step", size=15) plt.legend(fontsize=15) plt.show()第六步 思考,如何進一步的改進模型?
能不能進一步的改進模型呢?下面提出了一些可能的改進模型的方案,有興趣的話可以試一試哦。1.在缺失值處理中利用其他的插值方法2.使用復雜的模型3.調整 epoch 和 batch_size
第七步 總結今天我們一起制作了一個家庭用戶用電預測的應用,大家可以在項目源碼地址 fork 這個項目http://www.momodel.cn:8899/explore/5cde0ed11afd94371e5697ff?type=app
我們首先對數據進行預處理,處理缺失值;接著進行數據可視化,了解數據的結構和相關性;然后搭建 LSTM 模型,其中最為關鍵的是將問題轉化為監督學習問題;最后我們對模型進行評估,并提出了優化模型的建議。
使用我們的模型同樣也可以預測溫濕度和股價等等,只需要略加修改就行,來做出自己的應用吧。
參考資料:https://wenku.baidu.com/view/3973baa6951ea76e58fafab069dc5022aaea46b9.htmlhttps://blog.csdn.net/sinat_22510827/article/details/80996937https://blog.csdn.net/weixin_40651515/article/details/83895707https://www.jianshu.com/p/bebf8ca6a946
Mo(網址:momodel.cn)是一個支持 Python 的人工智能在線建模平臺,能幫助你快速開發、訓練并部署模型。
Mo 人工智能俱樂部?是由網站的研發與產品設計團隊發起、致力于降低人工智能開發與使用門檻的俱樂部。團隊具備大數據處理分析、可視化與數據建模經驗,已承擔多領域智能項目,具備從底層到前端的全線設計開發能力。主要研究方向為大數據管理分析與人工智能技術,并以此來促進數據驅動的科學研究。目前俱樂部每周六在杭州舉辦以機器學習為主題的線下技術沙龍活動,不定期進行論文分享與學術交流。希望能匯聚來自各行各業對人工智能感興趣的朋友,不斷交流共同成長,推動人工智能民主化、應用普及化。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/20029.html
摘要:霧計算所用的設備,就是小服務器或路由器,是處于大型數據中心與終端用戶之間的設備,可以放到小區工廠企業家庭等里面。 現在正在流行的云計算,是把大量數據放到云里去計算或存儲。這樣,就解決了目前電腦或手機存儲量不夠,或者是運算速度不夠快的問題,當然也帶來了其他很多好處。 這個所謂的云的核心,就是裝了大量服務器和存儲器的數據中心。由于目前的半導體芯片和其他配套硬件還很耗電,全球數據中心的用電功率...
摘要:現在正在流行的云計算,是把大量數據放到云里去計算或存儲。霧計算的效果與特點最初霧計算這個名字還是由美國紐約哥倫比亞大學的斯特爾佛教授起的,不過他當時的目的是利用霧來阻擋黑客入侵。而一直在推動網絡邊緣化,準備把很多云計算的工作逐步移到霧計算。 現在正在流行的云計算,是把大量數據放到云里去計算或存儲。這樣,就解決了目前電腦或手機存儲量不夠,或者是運算速度不夠快的問題,當然也帶來了其他很多好處。...
摘要:日前據悉,冰島數據中心大量的比特幣服務器被盜,這是冰島有史以來最大的犯罪活動。冰島警方逮捕了名犯罪人員,其中包括一名數據中心安保人員,沉重打擊了針對數據中心的一系列盜竊活動。日前據悉,冰島數據中心大量的比特幣服務器被盜,這是冰島有史以來最大的犯罪活動。冰島警方逮捕了11名犯罪人員,其中包括一名數據中心安保人員,沉重打擊了針對數據中心的一系列盜竊活動。而這些罪犯是針對加密貨幣開采服務器為目標而...
摘要:電力行業的應用特點非常符合云計算的服務模式和技術模式。可以說,云計算在美國電網企業的應用發展將成為全球電網行業的風向標。而這些都是智能電網云計算技術研究工作的重要組成部分。 電力行業的應用特點非常符合云計算的服務模式和技術模式。云計算就是將原本分散的資源聚集起來,再以服務的形式提供給受眾,實現集團化運作、集約化發展、精益化管理、標準化建設。采用云計算,不僅可以實現電力行業內數據采集和共享,最...
閱讀 2928·2023-04-25 19:08
閱讀 1420·2021-11-16 11:45
閱讀 1976·2021-10-13 09:40
閱讀 4141·2021-09-30 09:47
閱讀 2418·2019-08-30 15:44
閱讀 2282·2019-08-30 13:03
閱讀 1393·2019-08-30 12:56
閱讀 1894·2019-08-26 14:04