只需七步就能掌握Python資料準備
摘要:本文主要講述瞭如何在python中用七步就能完成中資料準備。
上圖為CRISP-DM模型中的資料準備
下面七個步驟涵蓋了資料準備的概念,個別任務以及從Python生態系統中處理整個任務過程的不同方法。
維基百科將資料清洗定義為:
它是從記錄集、表或者資料庫檢測和更正(或刪除)損壞或不正確的記錄的過程。指的是識別資料的不完整、不正確、不準確或不相關的部分,然後替換、修改或刪除它們。資料清洗(data cleaning)可以與資料整理(data wrangling)的工具互動執行,也可以通過指令碼進行批處理。
資料整理(data wrangling)被維基百科定義為:
1. 它將資料從一個原始形式手動轉換或者對映到另一種格式的過程,這樣可以在半自動化工具的幫助下更方便的使用資料。這可能包括進一步的整理,資料視覺化,資料聚合,訓練統計模型,以及許多其他潛在的用途。資料再加工過程通常遵循一套通用步驟,首先從資料來源中提取原始資料中的資料,使用演算法(例如排序)或通過預定義的資料結構將資料解析,最後將所得到的內容用資料接收器接收並且儲存到資料庫中以便將來使用。
本文包含了一組特定的資料準備技術,並且可以根據需求在給定情況下使用其他完全不同的技術。這裡所用的解決方法都是一種正統的和普遍的方法。
步驟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碩士學位和資料探勘研究生文憑
個人網站:http://www.kdnuggets.com/author/matt-mayo