隻需七步就能掌握Python數據準備
更多深度文章,請關注:
https://yq.aliyun.com/cloud
上圖為CRISP-DM模型中的數據準備
下麵七個步驟涵蓋了數據準備的概念,個別任務以及從Python生態係統中處理整個任務過程的不同方法。
維基百科將數據清理定義為:
它是從記錄集、表或者數據庫檢測和更正(或刪除)損壞或不正確的記錄的過程。指的是識別數據的識別數據的不完整、不正確、不準確或不相關的部分,然後替換、修改或刪除它們。數據清理(data cleaning)可以與數據整理(data wrangling)的工具交互執行,也可以通過腳本進行批處理。
數據整理(data wrangling)被維基百科定義為:
它將數據從一個原始形式手動轉換或者映射到另一種格式的過程,這樣可以在半自動化工具的幫助下更方便的使用數據。這可能包括進一步的整理,數據可視化,數據聚合,訓練統計模型,以及許多其他潛在的用途。數據再加工過程通常遵循一套通用步驟,首先從數據源中提取原始數據中的數據,使用算法(例如排序)或通過預定義的數據結構將數據解析,最後將所得到的內容用數據接收器接收並且存儲到數據庫中以便將來使用。
本文包含了一組特定的數據準備技術,並且可以根據需求在給定情況下使用其他完全不同的技術。這裏所用的解決方法都是一種正統的和普遍的方法。
步驟1:為了準備而準備(Preparing for the Preparation)
首先,其他人已經告訴過你:數據準備不隻是機器學習任務之前的一個可有可無步驟,而是一個機器學習的非常必須組成部分。
由於Python是生態係統,我們提到的大部分內容都與Pandas相關。對於Pandas新手來說,Pandas是一個數據操作和分析庫,是Python科學編程的基礎之一,非常適合於數據準備相關的許多任務。
數據準備可以在上麵所示的CRISP-DM模型中看到(可以合理地認為“數據理解”也屬於我們的數據準備的範圍)。我們的數據準備與KDD流程的框架有很多相同的地方,特別是前3個主要步驟**選擇、預處理、轉換**。我們可以把這些細節分解成更細小,但在宏觀層麵上,KDD過程的還包括了什麼是數據整理(data wrangling)。
KDD流程
如果對Pandas感興趣,並且想進行更全麵的了解,可以參考一下文件。
• 10 Minutes to pandas,Pandas文件
• Intro to pandas data structures,由Greg Reda介紹
• Modern Pandas (in 7 parts),湯姆•奧格斯格爾(Tom Augspurger)
下麵是關於三名大牛,關於數據準備的一些想法。
• 數據準備技巧,技巧和工具: Matthew Mayo
第二步:探索性數據分析(Exploratory Data Analysis)
探索性數據分析(EDA)是任何大型的數據分析,數據科學或機器學習項目的組成部分。在處理數據之前了解數據不僅僅是一個好主意,而且是一個優先項。在Chloe Mawer的文章“探索性數據分析的價值”中,她提到:
在高水平階段,EDA是使用視覺和定量方法來理解和總結數據集的做法,而不對其內容做出任何假設。在進入機器學習或統計建模之前,這是一個重要的步驟,因為它提供了解決現有問題的適當模型。
基本要點是,我們需要提前知道我們的數據構成,這樣才能有效地選擇預測算法或描繪數據準備的其他步驟。用先進的算法拋出我們的數據集,寄希望於最好的並不是一個策略。
了解我們的要求也很重要:如果有一個人可讀的輸出是一個高優先級,為了證明我們的結果,使用神經網絡可能不會削減它的優先級。在給定的情況下,決策樹可能不能提供最高的分類準確性,但為了可解釋的過程,也許任何這樣犧牲的是準確性的方法是可接受的。
Chloe表示,EDA通常涉及以下方法的組合:
• 原始數據集中每個字段的單變量可視化和匯總統計信息。
• 用於評估數據集中每個變量與感興趣目標變量之間的雙變量可視化和評估庴的匯總統計。
• 多變量可視化理解數據中不同字段之間的交互
• 縮小尺寸以了解數據中的字段,這些字段占據了觀察值之間的最大差異,並允許處理數據量的減少。
• 將數據集中的類似觀察值聚類分組,通過將數據折疊成幾個小數據點,可以更容易地識別行為模式。
要更全麵地了解為什麼EDA很重要,請閱讀Chloe的文章。
虹膜數據集的分布可視化的摘錄
對於應用於泰坦尼克號數據集(Titanic dataset)的示例性數據分析過程,請閱讀:
• 泰坦尼克號EDA,由Tarek Dib
要了解如何使用Seaborn(統計數據可視化庫)請參閱:
• 可視化數據集的分布,Seaborn
一些可能對數據探索有用的附加庫:
• Dora - 由Nathan Epstein在Python中進行探索性數據分析的工具
• Pandas-profiling - 由Jos Polfliet創建pandas DataFrame對象的HTML分析報告
有關分類數據的快速詞匯,請參閱以下內容:
• 數據科學的定性研究方法?, Kevin Gray
在Python中生成一個wordcloud Andreas Mueller
步驟3:處理缺失值(Dealing with Missing Values)
我們有各種各樣的處理缺失數據的策略,並沒有一個是通用。
不同類型的數據和流程處理缺失值有不同最佳做法。然而,由於這種類型的知識既體現在經驗上,也是基於領域的,所以我們重點關注可以采用的最基本的策略。
那些討厭的缺失值
處理缺失值的一些常見方法包括:
• 丟棄實例(dropping instances)。
• 丟棄屬性(dropping attributes)。
• 估算所有缺失值的屬性均值。
• 估算所有缺失值的屬性中位數。
• 估算所有缺失值的屬性模式
• 使用回歸來估計屬性缺失值
如上所述,所使用的建模方法的類型一定會對您的決策產生影響。例如,決策樹不適合缺失值。此外,你可以從技術處理中想到,更多用於從數據集中確定缺失值的統計方法。但列出的方法都是可靠的,經過驗定的和常用的方法。
• 使用缺少的數據,Pandas文檔
• pandas.DataFrame.fillna,Pandas文檔
有很多方法可以在Pandas DataFrame中完成填充缺失值,並將其替換為所需的內容。以下是幾個基本的例子:
關於處理缺失價值的一些額外意見,特別是估算。
• 如何處理您的數據中的缺失值:第一部分,雅各布•約瑟夫
• 如何處理您的數據中的缺失值:第二部分,雅各布•約瑟夫
步驟4:處理異常值(Dealing with Outliers)
你能找到異常嗎?
關於處理異常值的一些討論:
• 異常值:掉落或不掉落 The Analysis Factor
• 從數據中移除異常值可以嗎? Stack Exchange
異常值可能是數據收集不佳的結果,或者它們可能是真的異常的數據。這是兩種不同的場景,必須采取不同的方式,所以沒有適合所有的“一刀切”的建議,類似於處理缺失值的建議。有時候在建模時包含異常值也是合適的。
來自Analysis Factor的一篇文章有一個特別好的觀點:
一個選擇是嚐試轉換。平方根和對數轉換都拉高。如果異常值是一個因變量,這可以使假設更好,如果異常值是一個獨立變量,可以減少單個點的影響。
我們將決定是否在數據集中放棄異常值。但是,如果您的模型確實要求以某種方式處理異常值數據,這裏有幾種討論方法:
• 處理異常值的3種方法 Alberto Quesada
• 在Python中使用標準偏差去除異常值 Punit Jajodia
• 使用百分位數刪除Pandas DataFrame中的異常值 Stack Overflow
步驟5:處理不平衡數據(Dealing with Imbalanced Data)
如果你的另一個強大的數據集缺少缺失值和異常值是由兩個類組成:一個包含95%的實例,另一個包括僅5%的數據集呢?或者是更糟 - 99.8%vs 0.2%?
如果是這樣,你的數據集就是不平衡的。這可能是有問題的,但沒有必要把數據折騰到一邊。或許你應該尋找更好的解決方法。
盡管這可能不是真正的數據準備任務,但是在數據準備階段(EDA的重要性)早期就是要知道一個數據集的特征,數據的有效性當然也可以在這個準備階段被初步評估。
首先,看看湯姆•福切特關於如何處理的這個問題:
• 學習不平衡課程,湯姆Fawcett
接下來,看看關於處理類不平衡的技術問題的討論:
• 7種技術處理不平衡數據,葉武和Rick Radewagen
認清和處理不平衡是重要的。
為什麼我們會遇到不平衡的數據,以及為什麼我們可以在某些領域比其他領域更頻繁地處理不平衡數據的一個很好的解釋是:
在那些領域中使用的數據通常不到少於1%,但也有例外(比如使用信用卡的欺詐者,用戶點擊廣告或損壞的服務器掃描其網絡。)然而,大多數機器學習算法對於不平衡數據集處理並不是很好。(7技術處理不平衡數據)可以幫助您訓練分類器來檢測異常類。
步驟6:數據轉換(Data Transformations)
維基百科給數據轉換定義是:
在統計學中,數據變換是將確定性數學函數應用於數據集中的每個點。也就是,每個數據點zi被變換值yi = f(zi),代替,其中f是函數。通常應用變換,使得數據看起來更接近地滿足要應用的統計推斷過程的假設,或提高圖形的可解釋性或外觀。
數據轉換是數據準備最重要的方麵之一,而且數據轉換的過程要比其他步驟更為精密。當缺失的數值顯示在數據中時,它們通常易於查找,並且可以通過上述常見方法之一處理或者通過在域中隨時間的洞察而獲得的更複雜的措施來處理。然而,當需要數據轉換時,如果不需要轉換類型,通常就不容易識別。
我們來看幾個具體的轉換。
Scikit的學習文檔概述了一些最重要的預處理轉換的理論依據,即標準化,歸一化和二進製值化。
• 預處理數據,Scikit學習文檔。
單熱編碼“將分類特征轉換為使用分類和回歸算法更好的格式”。詳情參閱下麵的文章:
• 什麼是熱編碼,什麼時候用於數據科學? HåkonHapnes Strand
• 如何在Python中進行熱編碼? Stack Overflow
• 什麼時候你應該記錄一個分配(數字)的日誌嗎?,Stack Exchange
步驟7:完成接觸和前進(Finishing Touches & Moving Ahead)
你的數據是“幹淨的”。為了我們的目的,這意味著你現在需要有一個有效和可用的Pandas DataFrame。
如果您想要將數據送入機器學習算法,以便嚐試構建模型,則可能需要以更合適的方式顯示數據。在Python生態係統中,這通常是一個numpy ndarray(或矩陣)。你可以看看下麵的一些初步的想法:
• 將Pandas DataFrame轉換為數組,並評估多線性回歸模型, Stack Overflow
非常簡單的數據準備過程
有了幹淨的數據,你還想在Python中進行機器學習。請看下下麵的文章!
• 使用Python掌握機器學習的更多步驟,Matthew Mayo
如果你不想繼續建模,怎麼辦?或者,如果你這樣做,但是你想將這些數據輸出到更適合你的情況的存儲形式?以下是有關Pandas DataFrame存儲的一些信息:
• 將Pandas DataFrame寫入MySQL,Stack Overflow
• Quick HDF5 with Pandas Giuseppe Vettigli
不要忘記在前進之前還有其他數據集相關的注意事項,特別是將數據集分成培訓和測試集,以適用於各種機器學習任務的過程:
• Numpy:如何將數據集(數組)分割/分割成訓練和測試數據集,例如交叉驗證?,Stack Overflow
• 有沒有Python函數將數據分成列車,交叉驗證和測試集?,Quora
• 做數據科學:Kaggle演練第3部分 - 清潔數據,由Brett Romero
• 機器學習工作流程從Python第1部分:數據準備Matthew Mayo
作者介紹:
Matthew Mayo是數據科學家,KDnuggets的編輯,以及機器學習愛好者和全能數據愛好者。他對無監督學習,深層神經網絡,自然語言處理,算法設計和優化以及分布式數據處理和分析方法特別感興趣。它擁有CS碩士學位和數據挖掘研究生文憑
個人網站:https://www.kdnuggets.com/author/matt-mayo
本文由北郵@愛可可-愛生活老師推薦,阿裏雲雲棲社區組織翻譯。
文章原標題《7 Steps to Mastering Data Preparation with Python》,作者:Matthew Mayo, KDnuggets,譯者:袁虎,審閱:我是主題曲哥哥
文章為簡譯,更為詳細的內容,請查看原文
最後更新:2017-06-06 23:31:53