當前位置:
首頁 > 科技 > 如何高效實現 9 萬數據的異常排查?附完整心路歷程

如何高效實現 9 萬數據的異常排查?附完整心路歷程

作者 | Einstellung

責編 | 郭芮

首先介紹一下背景。筆者參加的一個關於風機開裂故障分析的預警比賽。訓練數據有將近5萬個樣本,測試數據近9萬。數據來自SCADA採集系統。採集了10分鐘之內的75個特徵值的數據信息,label是一周以內風機是否會發生故障的label。

數據介紹

每個樣本10分鐘之內大概採集到了450條數據,一共75個特徵,也就是差不多75*450個信息。最後三個特徵完全沒有數據,所以一開始做的時候,我們就把最後三個特徵進行刪除,所以實際上是對72個特徵進行的數據分析。

最開始,用的是seaborn畫的正常風機和不正常風機的頻率分布圖,比如說對於輪轂轉速這個特徵:

大部分特徵都是這樣,沒有很好的區分度。正是因為如此,也一直沒有嘗試出來非常好的模型。後來我們嘗試用MATLAB畫圖,每個特徵出兩個圖:

看起來要比seaborn好一些(後兩個圖和第一個不是一個特徵)。我們在做數據分析這一塊很大的問題是在於只去查了各個特徵的物理含義,做了頻率和頻數分布圖,看看是否有沒有好的特徵,然後就直接進入了下一步。忘了考慮是否可能會出現因為採集問題而導致的異常值和空缺值問題。這一點導致後面我們的很多工作都需要推倒重來。

數據分析

我們從統計上來看,並沒有找到很好的區分度特徵,然後就考慮從物理上來找。在老師的建議下,我們嘗試了有輪轂轉速,風速為6.5m/s時,y方向振動值的特徵:

依舊沒有很好的區分度,對於其他風速嘗試也是如此。

隨後我們討論到了閾值、記0等方式構造新特徵。在考慮記0這個新特徵構造辦法時,突然發現大氣壓力這個特徵居然有0的情況。根據物理學的知識來講,風機的大氣壓力是不可能為0的。然後我們才想起來,沒有對數據的異常值進行處理。刪除了有8萬多條整行全為0的數據,導致某些文件為空,也就是這個風機沒有數據信息。當然,也有某些風機是某幾行為0。

除了刪除空缺值,我們還對其他明顯是異常的數據進行了一些數據清洗工作。因為之前我們對於數據特徵數統計分析是根據未清洗的數據做的分析,所以分析的可靠性也有點問題,後面就產生了一些不必要的麻煩。我們也做了一些相關性分析的工作,大部分特徵相關性十分的高。幾十個特徵兩兩組合然後進行相關性分析,會有數千個結果,相關性分析沒有辦法進行下去。後來,我們就沒有考慮相關性的事情。

特徵工程

我們最開始嘗試對前72個特徵構造均值,作為基準嘗試看看效果如何。

也包括絕對值差分累計、差分均值、差分方差,用隨機森林進行調參。

測試集輸出預測結果如下:

測試效果來看,並沒有取得十分理想的效果。

之後想起來沒有考慮數據清洗,之前的工作全部推倒從來。我們在此期間,也調查整理關於這72個特徵和風機葉片開裂故障的原因,發現從文獻上沒有找到和葉片開裂故障有很好相關性的特徵,對於特徵進行的改造也沒有很好的區分效果。後期我們諮詢過相關行業的工程師,他們說這些特徵中也沒有十分強相關性的特徵。我們就考慮到特徵之間兩兩交叉相乘看看效果。

交叉相乘之後的文件有數千個特徵,生成的文件有將近2G大小。考慮到伺服器性能不高,計算曠日持久。不對特徵進行篩選,直接進行交叉之後跑演算法這條路被我們放棄了。

後來阜特科技的楊工幫我們篩選了一些比較重要的特徵,我們在此基礎之上進行了一些特徵交叉和重要性排序的操作,特徵縮小到了幾百個(包含交叉、均值、方差等,經過重要性排序),然後用它來跑得模型。

特徵裡面有一些特徵是離散特徵,對於這些特徵我們進行單獨處理,進行離散化。比如說偏航要求值總共有3個值分別是1,2,3。我們對其進行離散化處理,一個特徵就變成了三個特徵。每個樣本統計出現這三個特徵的頻率。

演算法

我們最後主要用的演算法是Xgboost,期間也嘗試過LightGBM,因為算力不夠的原因,沒有辦法嘗試一些演算法(包括楊工說的SVM以及深度學習的想法),最後主要用Xgboost進行調參,直接一起調參的話算力不夠,我們是單個調參以及兩兩調參組合的形式進行參數調整。

調完這個參數之後,把最好的輸出結果拿出來放在下一個參數調優里進行調整:

還可以調整好幾個參數,最後結果輸出:

即使是單個調參和兩兩調參,對於我們而言,計算速度還是太慢,我們為此也嘗試了Hyperopt方法。通俗的說,我們用的是擲骰子方法,也就是在一個劃定參數區域內隨機地擲骰子,哪個參數被擲成幾,我們就用這個數來訓練模型。最後返回一個擲的最好的參數結果。這個方法有很大的局限性,一是結果的隨機性,二是很容易局部收斂。但是,如果用來粗糙地驗證一個特徵構造的好壞,也不失為一個好方法。

最終結果

我們首先把數據進行分類處理。對於那些空缺值的數據,我們直接給label為1(表示異常),對於空缺值的處理只能摸獎。在分析訓練樣本的分布時,我們還發現有一些閾值的特徵,就是那些特徵大於某些值或者小於某些值之後故障風機要明顯比正常風機多出很多,這樣,我們可以用閾值判斷直接給label,剩下不能判斷的再用演算法進行判斷。然後最後時間比較緊,閾值部分的沒有做,除去了空缺值之後,其他的全部用演算法進行判斷。

楊工告訴我們,應該做分析的時候分析「輪轂轉速」大於3的數據,因為風機工作才可以檢測出來異常,如果風機不工作是很難判斷的。但是因為時間比較緊,對於訓練集我們就沒有進行這樣的操作,於是測試集也沒有進行這樣的劃分。全部都一起塞進演算法里了。

總結一下。我們對於特徵進行交叉和重要性排序,綜合考慮楊工說的重要特徵和演算法反饋的重要特徵排序,最後生成一百多個特徵的特徵文件用來訓練(訓練樣本是經過數據清洗過後的樣本)。

測試集分為兩部分,一部分是空缺值,直接標1,另一部分放演算法里出結果。

總結

首先最大的一個坑是開始沒有做數據清洗的工作,後來發現了之後從新來了一遍。再後來是楊工和我們說應該分析工作風機,拿工作風機來進行訓練。如果這樣做的話又要推倒從來,當時時間已經十分緊張了,心有餘而力不足。對於比賽或者說數據分析工作來說,數據的理解是第一位的。否則很可能會做不少無用功。有的時候,受限於專業背景,我們很難充分地理解數據和業務場景,這時候應該向專業人士進行請教,把這些工作都做好之後再進行數據分析要好很多。

其次,提高自己地代碼和演算法的能力。既要懂演算法又要能擼出一手好代碼,這樣才能提高效率。我寫代碼寫得太慢,十分制約我的想法實現速度。演算法不太懂,也不能很好地參與到演算法討論環節。

另外,版本控制十分重要。我們每天都在實現新的想法,文件很多也很亂。經常出現剛發一個文件,過一段時間就找不到那個文件或者忘了有沒有發那個文件地情況。

聲明:本文為公眾號 經管人學數據分析 投稿,版權歸對方所有。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 CSDN 的精彩文章:

馬雲闢謠被迫離職;阿里又又又越獄了 iOS 12;Safari 再爆漏洞
人工智慧靈魂注入,燃燒你的卡路里——2018,你AI了嗎!

TAG:CSDN |