前言:
本文主要是介紹下在乙個實際的機器學習系統中,該怎樣對資料進行預處理。個人感覺資料預處理部分在整個系統設計中的工作量佔了至少1/3。首先資料的採集就非常的費時費力,因為這些資料需要考慮各種因素,然後有時還需對資料進行繁瑣的標註。當這些都有了後,就相當於我們有了元素的raw資料,然後就可以進行下面的資料預處理部分了。本文是參考的ufldl網頁教程:data preprocessing,在該網頁的底部可以找到其對應的中文版。
基礎知識:
一般來說,演算法的好壞一定程度上和資料是否歸一化,是否白化有關。但是在具體問題中,這些資料預處理中的引數其實還是很難準確得到的,當然了,除非你對對應的演算法有非常的深刻的理解。下面就從歸一化和白化兩個角度來介紹下資料預處理的相關技術。
資料歸一化:
資料的歸一化一般包括樣本尺度歸一化,逐樣本的均值相減,特徵的標準化這3個。其中資料尺度歸一化的原因是:資料中每個維度表示的意義不同,所以有可能導致該維度的變化範圍不同,因此有必要將他們都歸一化到乙個固定的範圍,一般情況下是歸一化到[0 1]或者[-1 1]。這種資料歸一化還有乙個好處是對後續的一些預設引數(比如白化操作)不需要重新過大的更改。
逐樣本的均值相減主要應用在那些具有穩定性的資料集中,也就是那些資料的每個維度間的統計性質是一樣的。比如說,在自然中,這樣就可以減小中亮度對資料的影響,因為我們一般很少用到亮度這個資訊。不過逐樣本的均值相減這只適用於一般的灰度圖,在rgb等色彩圖中,由於不同通道不具備統計性質相同性所以基本不會常用。
特徵標準化是指對資料的每一維進行均值化和方差相等化。這在很多機器學習的演算法中都非常重要,比如svm等。
資料白化:
資料的白化是在資料歸一化之後進行的。實踐證明,很多deep learning演算法效能提高都要依賴於資料的白化。在對資料進行白化前要求先對資料進行特徵零均值化,不過一般只要 我們做了特徵標準化,那麼這個條件必須就滿足了。在資料白化過程中,最主要的還是引數epsilon的選擇,因為這個引數的選擇對deep learning的結果起著至關重要的作用。
在基於重構的模型中(比如說常見的rbm,sparse coding, autoencoder都屬於這一類,因為他們基本上都是重構輸入資料),通常是選擇乙個適當的epsilon值使得能夠對輸入資料進行低通濾波。但是何謂適當的epsilon呢?這還是很難掌握的,因為epsilon太小,則起不到過濾效果,會引入很多雜訊,而且基於重構的模型又要去擬合這些雜訊;epsilon太大,則又對元素資料有過大的模糊。因此一般的方法是畫出變化後資料的特徵值分布圖,如果那些小的特徵值基本都接近0,則此時的epsilon是比較合理的。如下圖所示,讓那個長長的尾巴接近於x軸。該圖的橫座標表示的是第幾個特徵值,因為已經將資料集的特徵值從大到小排序過。
文章中給出了個小小的實用技巧:如果資料已被縮放到合理範圍(如[0,1]),可以從epsilon = 0.01或epsilon = 0.1開始調節epsilon。
基於正交化的ica模型中,應該保持引數epsilon盡量小,因為這類模型需要對學習到的特徵做正交化,以解除不同維度之間的相關性。(暫時沒看懂,因為還沒有時間去研究過ica模型,等以後研究過後再來理解)。
教程中的最後是一些常見資料的預處理標準流程,其實也只是針對具體資料集而已的,所以僅供參考。
資料預處理 時間相關處理總結
3 耗時 pandas 時間格式 df time pd.datetime df time 方法1 df time df time astype datetime64 ns 方法2import datetime 今天的日期,獲取當日年月日 today datetime.datetime.now 日期格...
關於預處理
1.能用巨集定義開始或者結束一段注釋嗎?例如 define bsc define bmc define emc 那麼 bsd my single line comment bmc my single line comment emc 正確嗎?答案是不正確的,這是因為 注釋先於預處理指令被處理 當這兩...
鏈結相關 預處理
鏈結 當多個檔案同時被編譯時,不同檔案中的函式的使用,比如main中使用了其他檔案的函式,那麼這是有問題的。因為main不認識該函式 解決以上問題的辦法有2個,1 用 extern 來宣告別的檔案中的函式或變數,而此時,如果多個檔案需要該檔案中的函式時,每個檔案都要宣告一次,這樣不好。所以就引入第2...