Data Fountain光伏發電量預測 Top1 開源分享

Data Fountain光伏發電量預測 Top1 開源分享

9 人贊了文章

知乎第一篇文章,開源我們DataInsight團隊的全部思路和python代碼,主要分享給數據分析和競賽初學者,(我去年6月開始學慣用R分析數據,第一次和維克多老師學到了線性回歸和R語言,積累了一年多其實也沒會太多,然而要說比賽需要多高的代碼能力,或者什麼背景,都是瞎扯。。我原來就是個焊電路板的,機器學習的知識,大多都是問同學,網上找,憑興趣學。)

從今年3月開始關注數據比賽和舉辦比賽的平台,知道了國際有名的Kaggle,國內的比較活躍的應該有阿里天池,Data Fountain,Data Castle,個人感覺參加比賽是學習數據分析很好的途徑,簡單的說,贏了拿獎金,輸了攢經驗。。

有了比賽這個想法後3月參加了一個天池的給出體檢數據,預測高血壓高血糖的比賽,萬事開頭難,花了7天才把數據整理成可以使用的狀態,最後衝擊複賽失敗,排名152/3000被淘汰,現在看來很正常,因為前7天花在清洗數據,清理好了就急著跑模型,當時剛聽說xgb lgb這類東西,別人寫好的拿來就能用,真的舒服,而且在datacamp(不錯的學習網站,推薦)學到了一招叫做模型融合,後面一個月全花在模型融合上了,因為跑一次融合要6-8個小時。。在當時看來,融合是最最牛逼的黑科技,可以超越一切的力量!現在看來,數據探索性分析,異常值判定和預處理,特徵工程,模型,融合,可能沒法說哪個更重要,只是投入產出比不同(融合屬於投入多,提升少的)。想要超過別人,只用現成的東西可能不太夠,說白了你會的網上都查得到,那麼大家都知道,那麼怎麼搞!後面會寫到,不盲目相信任何經驗,只有叛逆和創新才會幫你。。

Data Fountain與國家電投這個系列賽,7-9月同時舉辦4個比賽,為什麼要參加光伏發電預測這個比賽呢?因為這是數據集看起來最簡單的比賽! 就一個csv文件,2M多點,9000條訓練數據,8000條測試,對機器沒啥要求,容易上手啊,快速出結果啊,馬上出排名啊,刺激。

團隊: DataInsight 最終排名: A, B榜第一,和三個隊友們一起戰鬥是一生銘記的快樂時光。

目錄:這個目錄可以看做是相對完整的參加比賽的思路和流程

1 數據探索與數據預處理

  • 1.1 賽題回顧
  • 1.2 數據探索性分析與異常值處理
  • 1.3 相關性分析

2 特徵工程

  • 2.1 光伏發電領域特徵
  • 2.2 高階環境特徵

3 模型構建與調試

  • 3.1 預測模型整體結構
  • 3.2 LSTM模型
  • 3.3 模型融合與總結

4 參考文獻

1 數據探索與數據預處理

1.1 賽題回顧

賽題目標很簡單,給一組特徵,預測瞬時發電量,訓練集9000個點,測試集8000個,特徵包含光伏板的屬性和外部環境等,具體說明可以參考官網:

光伏電站人工智慧運維大數據處理分析 - DF,CCF大數據競賽平台

1.2 數據探索性分析與異常值處理

探索性分析個人理解可以首先做圖,幫助自己了解一下數據,比如下圖是訓練集ID-發電量的散點圖,可見發電量是有周期性的,因為一天中從早到晚,發電量隨著光強變化。同時發現,一個周期即一天大概有200個ID,那麼訓練集9000條應該是45天左右的數據。

發電量的周期性

比如下圖,是一些特徵的散點圖,可見異常值的存在。

幾個特徵的散點圖

發現異常值接下來比較關鍵的是異常值的處理,包括異常值判定,即什麼樣的數值算是異常值,還有異常值處理,即如何處置異常值。

常用的異常值判定方法可以參考以下連接,我沒學過統計,也沒學會高等數學,不太懂其中原理,就不亂說了

有哪些比較好的做異常值檢測的方法?

這個比賽里我們在判定異常值之前做了另外一組圖:觀察各個特徵的分布

轉換效率的分布

平均功率的分布

大多數特徵符合正態分布的,或者兩個峰的分布(可以看做是兩個正態分布?)那麼異常值的判定就用最基本的方法: 平均值 pm 3*標準差之外的任何值,即為異常值。

那麼接下來需要處理異常值:

由於這些測量點是有時序關係的,直接用上一個有效值代替異常值。

關於異常值、空缺值的處理,想多寫一點點:

面對異常值/空缺值的情況,首先一定要判斷這些值是怎麼空缺的,比如完全隨機的空缺 (比如設備臨時沒電,測不出值了,只好空缺)和有規律的空缺處理(比如做問卷時候,收入很高而且來源不正經的人可能會亂寫、不寫自己的收入)

完全隨機空缺,刪除改行的問題不大,甚至數據某一列空缺比例過高,直接刪除也OK,但是如果是有規律的空缺,可能填補一下比較穩妥,比如用已有其他的值做個回歸,聽起來比較靠譜一些。基本上可以參考這個圖來進行處理:

towardsdatascience.com/

對於異常值、空缺值的判斷和處理有多重要呢?

分享個小事故,沒有組隊之前,我自己做這個題目大概第7天的時候,跑了個LightGBM,排名記得是60多,有一天早上發現了數據的周期性,隨後只是按照上述的方法判定,填補了異常值,直接第一了,那時候是比賽初期,我的A榜成績到了0.848(成績演算法:1/(1+RMSE))多,第二的隊伍在0.845多,(參加的同學知道這是多麼大的差距)導致我在接下來的一周都處於領先。。(並藉此陸續招募了3位比我強很多的隊友。。)當然其他隊也會發現這一點,最後我們A榜成績定格在0.8532,大家一點點把精確度逼向極限,也是比賽的樂趣吧。所以異常值的判斷,處理得好,是可以對預測精確度有極大幫助的!但是對於不同的數據,究竟使用什麼方法呢?我覺得最靠譜的是依據數據的規律,比如這裡的周期性和分布特徵,多嘗試不同方法。根據線下成績來定。

1.3 相關性分析

首先我們觀察了各特徵與發電量的皮爾森相關係數,結果記錄在表1中,這可以在一定程度上判斷特徵對於預測的作用。

通過數據可視化,我們發現光照強度/40的曲線基本和發電量的曲線一致,平均功率除以480的曲線基本和發電量的曲線一致,如圖。

也看看其他特徵,相關度似乎不明顯。

至於不明顯相關的變數,後面會嘗試各種組合和變換。到這裡探索性分析就結束了。這一步還是很值得花時間的,投入產出比很高。對於數據越了解,後面構造特徵的思路就越多,個人覺得比賽千萬不能求快,略過探索性分析和可視化。

2 特徵工程

特徵工程就是想盡一些辦法,發現和製造對於預測有幫助的特徵。為什麼要做特徵工程?

"Applied machine learning" is basically feature engineering.

—?Andrew Ng, Machine Learning and AI via Brain simulations[1]

這句話算是我們比賽的指導思想的一部分,雖然我們是帶著一種挑戰各種演算法,不信任何經驗,只看實際效果的叛逆精神在比賽,但是這句話是真的必須要信的。。。

說白了基本上特徵決定了你模型能達到的準確度極限,模型只能幫你逼近這個極限。換句話說,沒有好的特徵組合,模型再強也是沒用。

特徵工程大概可以從兩個方面入手:領域特徵,多項式特徵。領域特徵就是尋找在問題專業領域內起作用的特徵,亂說個例子,沒有根據的,可能醫學上,血液中鈣和鉀的含量不會直接影響你的某個指標,但是鈣鉀比例會影響,多項式特徵就有點玄學了,通過選取一些已有特徵,對他們進行加減乘除各種運算都可以,構造一些特徵,只要能幫助你預測,就是好特徵。

  • 2.1 光伏發電領域特徵

領域特徵是通過查閱文獻、不斷嘗試得到的:

查閱文獻就是可以搜索哪些因素可以顯著影響發電量,拿來直接用上,有很多論文討論影響發電量的因素的。那麼為什麼查閱文獻後,還有「不斷嘗試」呢?你以為所有論文都那麼穩妥那麼靠譜嗎?很多論文的很多結論,會幫你掉很多分哈哈哈。

舉幾個例子,有用的,可以加分的

  1. 距離周期內峰值的距離(dis2peak), 反應一個測量點在一天,也就是一個周期中的位置,考慮是,每天中差不多的時間,太陽,溫度等狀態都差不多,發電量也就相似。

2. 溫差(板溫-現場溫度), 原有特徵板溫,現場溫度看起來與發電量都沒太大關係,但是做個差值,會發現溫差與發電量強相關。(對比以下兩圖)

3. 電壓A/轉換效率=實際板面所受光照, 板面所受光照應該是直接影響發電量的,由於一天中日照角度的變化,數據提供的光照強度不能直接反應板面所受光照。通過查閱有關資料,轉換效率計算方法為光伏板輸出功率/日照功率, 其中光伏板輸出功率我們用電壓A代表,已知轉換效率的情況下,電壓A/轉換效率可以表示板面實際光光照。

2.2 高階環境特徵

特種工程中一種思想是利用已有特徵的組合,計算其高階特徵, 我們發現 板溫,現場溫度,光照強度,風速,風向 即環境因素的兩兩之間的2階交互項可以提供較好的預測效果。

對於這個多項式特徵,Python有個Poly feature可以使用,只要你選擇幾個特徵,它直接幫你生成若干高階特徵,但是個人認為這裡的特徵選擇很重要,沒有根據的選擇特徵去生成高階特徵,是不可取的,容易引發維度災難等情況,多次試驗表明,這個題目,只有使用環境特徵的2階交互項,才是最優的,加上或者減去一個或者若干個,都不行。我覺得可能的解釋是,光照會影響發電量,溫度會影響發電量,而光照又影響溫度,所以他們的交互項是有意義的,同理光照和風速,風向的交互也一樣,互相影響,同時共同影響發電量。

原始特徵有20個,特徵工程後,我們有60多個特徵。

3 模型構建與調試

這部分先給融合模型,對於初學的同學如果這部分看的不太理解,不了解這裡面的單模型,很建議後面簡單了解下XGBoost, LghtGBM, LSTM,DNN這些當前比較流行的一些預測器,都算是大家經常提到的比賽大殺器,其實一般的使用也就Python一句話的事,了解下輸入輸出是什麼,如何調參就可以了,不需要知道太多細節。當然了解的多當然好,有時候修改底層代碼可以讓你單模型奪冠,比如阿里的某一個比賽中,第一的隊伍是依靠修改了Xgboost的二階導數讓模型更快地收斂。所以學習的深度大家根據需求和時間自己確定。

3.1 預測模型整體結構

這是一個連續目標變數回歸預測問題,很多模型都能有效的解決此類問題。但是,不同的模型原理和所得結果之間是存在差異的。在比賽中我們借鑒了Stacking的思想,融合了LightGBM、XGBoost以及LSTM三個模型。其中前兩類可以看作是樹模型,LSTM為神經網路模型。這兩類模型原理相差較大,產生的結果相關性較低,融合有利於提高預測準確性。我們提出的具體的模型結構如圖,說明如下:

這是一個我們想出來的四層的融合結構,第一層我們使用Xgboost_1對特徵組合F1進行學習,得到Xgboost_1的預測結果(包括對於訓練集和測試集的預測結果),該結果會作為新特徵,加入特徵組合F2,F3中,分別作為第二層LightGBM_1 和 LightGBM_2的輸入特徵,LightGBM_1的結果再次作為新特徵,加入特徵組合F4中,作為第三層Xgboost_2的輸入特徵,同時第三層包含一個LSTM模型,該模型使用特徵組合F5訓練,第二層LightGBM_2的結果則與第三層Xgboost_2,LSTM的預測結果進行加權融合作為最終結果。

3.2 基於LSTM的模型構建與調試

這個應該是我們獲勝的一個關鍵點了,所以這裡特殊說明。隊長大佬一個人把LSTM提到了和我們三個人一起弄的樹模型差不多的分數,再去融合,確實不容易。這也就是分工的好處,幾個人的特徵都不一樣。

長短期記憶網路(Long Short-Term Memory, LSTM)是一種循環神經網路,能夠處理一些由長時信息引起的問題。在本次比賽中,我們使用了一個包含200個單元的LSTM單層網路,結構如圖。由於賽題的時序性質,LSTM效果很好。

LSTM結構

LSTM訓練過程

3.3 模型融合與總結

在本問題中,一個嚴重的問題是過擬合,我們發現模型在訓練樣本中表現優越,但是在驗證數據集以及測試數據集中表現不佳,在採取了特徵,樣本抽樣進入訓練,減少樹深度和正則化參數後等常規方法後,我們發現和驗證以下創新的方法可以提升融合後的模型表現。

1. 重複使用部分特徵

在Light GBM模型中,我們對於環境特徵(板溫,現場溫度,光照強度,風速,風向)執行了一次複製,即這些特徵會在訓練中出現兩次,結果顯示訓練集誤差幾乎一致,但是線上線下驗證集誤差都更小,也就是說,使用重複特徵,減少了過擬合的程度,使得模型的泛化,預測效果更佳。

對比加入重複特徵的訓練集與普通訓練集的訓練曲線,如圖15,可見使用重複特徵的模型驗證誤差小於不使用重複特徵的模型,而兩者的訓練誤差幾乎相同的。

很多文獻和實驗表明特徵選擇時去除相關性高的特徵是有利的,但是在本問題中我們發現重複特徵雖然和已有特徵的相關性很高,但是這種做法是可以提高預測準確度的,我們認為這有可能與單個樹模型在抽樣特徵的時候,重複特徵會有更大的機率被抽到有關,這限制了模型的學習能力。

關於這一點是否具有通用性,需要其他數據集的實驗驗證。

2.在每折交叉驗證後進行預測

單模型的參數調整對於模型的表現有很大的影響,我們使用了網格搜索,交叉驗證的方法,獲得規定參數範圍內最優的參數組合,在確定參數後,對於單模型再次在訓練中使用交叉驗證,一方面是可以對比不同模型的效果,一方面是我們在4折交叉驗證中,每折訓練結束後,都對測試集用本折交叉驗證得到的模型進行一次預測。具體的說,比如對Xgboost模型,4折交叉驗證,得到4個不同的「Xgboost模型」,用這4個模型分別對測試集做一次預測,最後Xgboost的預測結果是4次預測結果的平均值,這個過程可以看作是對於訓練集合的一次抽樣,Xgboost最終結果實際上是4個子模型結果的融合,抽樣和融合可以減少過擬合,我們發現這樣的處理對於本題目的預測精度有提高。

3.每個單模型所使用的特徵都不同

每個單模型(包括LSTM),我們有90%的特徵是一致的,還有大約10%特徵是每個單模型獨有的,通過這種方式增加模型間的差異性,擺脫對於單一特徵組合的依賴,增加了模型的泛化能力,可以獲得更好的融合效果。

現在各種平台的比賽,用單模型很難拿好成績,傳說Kaggle冠軍曾用600多個模型融合才拿到第一,所以融合單模型是一個必然的趨勢,想用融合的同學,Kaggle的融合導論可以研究看一看,包含各種比賽獲勝的融合經驗:

Kaggle Ensembling Guide

我們也是從中學習他人經驗,同時既然是比賽,我們就想嘗試用一點別人沒用過的東西。


我們團隊四個人是QQ群認識的,網路一線牽,我們全程不管是落後多少,始終在查找新的文獻資料,始終在思考性的突破口。正是一次又一次的嘗試,讓我們的特徵更加強效,模型更加完善,最終產出高分結果。

總結一下,有以下幾個方面對於提高成績很有幫助:

l 合理的數據預處理

我們觀察到了數據中的異常點,並將訓練數據和測試數據使用相同的方式進行異常值修復(前值填充)

l 高效的特徵構造與選擇

我們通過查閱光伏發電領域文獻與資料,構造了如二極體節點流,計算轉換效率等強有力的特徵。

l 精心設計融合模型

基於LightGBM、XGBoost和LSTM三種模型而構造的融合模型,可以綜合三種模型的互補優勢,同時減小過擬合的影響。

參考文獻

[1] 王坤. 考慮多重不確定性因素的光伏出力預測研究[D]. 華北電力大學, 2013.

[2] 王玉清. PN結反向飽和電流的實驗研究[J]. 延安大學學報(自然科學版), 2010, 29(1):53-55.

[3] 呂學梅, 孫宗義, 曹張馳. "電池板溫度及輻射量對光伏發電量影響的趨勢面分析." 創新驅動發展 提高氣象災害防禦能力——S6短期氣候預測理論、方法與技術 2013:922-927.

[4] 竇硯林. 風力發電機風速、功率、功率曲線的分析[J]. 科學導報, 2014(z2)

[5] Hall M A. Correlation-based feature selection for machine learning[J]. 1999.

[6] colah.github.io/posts/2

[7] kaggle.com/willkoehrsen

最後引用決賽現場華北電力大學王老師的一句話:這個隊,從一開始的宣傳視頻,就能看出很有激情。


推薦閱讀:

從產品經理到數據分析師的第一步
該拿什麼拯救上不懂吳恩達機器學習課的數理盲......
基於 XGBoost 對 Santander 銀行用戶購買行為進行預測
乾貨 | 數據挖掘過關40題,你是否都能通關...
K-means聚類演算法

TAG:大數據分析 | 機器學習 | 數據挖掘 |