(▲由Python大本營付費下載自視覺中國)
作者 | 李明江/張良均/周東平/張尚佳來源 | 機械工業出版社《Python3智能數據分析快速入門》
機器學習對數據集有一定的要求,這就需要在訓練之前對數據進行處理,使之符合訓練要求。Pandas 提供了多種數據預處理的方法,包括缺失值處理、重複值處理、連續特徵離散化處理、啞變量處理等方法。
缺失值處理
數據中的某個或某些特徵的值是不完整的,這些值稱為缺失值。對缺失值處理前需先識別缺失值,Pandas 提供 isnull 方法,能夠識別出缺失值,返回 bool。isnull 方法結合其他操作,找出缺失值的數量及佔比,如代碼清單 7-31 所示。
識別缺失值後,需對缺失值進行處理,常見的處理方式分為 3 種:刪除法、替換法、插值法。
1.刪除法
刪除法是指將含有缺失值的特徵或者記錄刪除。刪除法分為刪除觀測記錄和刪除特徵兩種,觀測記錄指刪除行,特徵指刪除列,它屬於利用減少樣本量來換取信息完整度的一種方法,是一種最簡單的缺失值處理方法。Pandas 提供了簡便的刪除缺失值的方法dropna,通過參數控制,該方法既可以刪除觀測記錄,也可以刪除特徵,其基本語法格式
如下。
pandas.DataFrame.dropna(self, axis=0, how='any', thresh=None, subset=None, inplace=False)dropna 方法常用的參數及其說明如表 7-16 所示。
使用 dropna 方法刪除指定列的缺失值,設置參數為 subset,如代碼清單 7-33 所示。
2.替換法
替換法是指用一個特定的值替換缺失值。特徵可分為數值型和類別型,兩者出現缺失值時的處理方法是不同的。缺失值所在特徵為數值型時,通常用其均值、中位數和眾數等描述其集中趨勢的統計量來代替缺失值;缺失值所在特徵為類別型時,則選擇用眾數來替換缺失值。f illna 方法用於替換缺失值,其基本語法格式如下。
DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None)fillna 方法常用的參數及其說明如表 7-17 所示。
使用 fillna 方法替換缺失值,如代碼清單 7-34 所示。
使用 f illna 方法替換缺失值,不指定替換值,設置參數為 method,如代碼清單 7-35 所示。
3.插值法
刪除法簡單易行,但是會引起數據結構變動,樣本減少;替換法使用難度較低,但是會影響數據的標準差,導致信息量變動。在面對數據缺失問題時,除了這兩種方法之外,還有一種常用的方法—插值法。
interpolate 方法用於對缺失值進行插值。針對 DataFrame 的 interpolate 方法,其基本語法格式如下。
DataFrame.interpolate(method='linear', axis=0, limit=None, inplace=False, limit_direction='forward', limit_area=None, downcast=None, **kwargs)interpolate 方法常用的參數及其說明如表 7-18 所示。
interpolate 方法提供了多種插值方法,常用插值方法及其說明如表 7-19 所示。
使用常用插值方法插值,如代碼清單 7-36 所示。
除了常用的插值方法,interpolate 還提供其他方法。至於使用何種插值方法,可根據實際情況靈活選擇。
重複數據處理
重複數據處理是機器學習經常面對的問題之一。對重複數據進行處理前,需要分析重複數據產生的原因以及去除這部分數據後可能造成的不良影響。
drop_duplicates 方法用於去除一個或多個特徵的重複記錄。針對 DataFrame 的 drop_duplicates 方法的基本語法格式如下。
DataFrame.drop_duplicates(self, subset=None, keep='first', inplace=False)drop_duplicates 方法常用的參數及其說明如表 7-20 所示。
使用 drop_duplicates 方法去除數據中的重複記錄,默認對所有特徵起作用,即只有所有特徵的重複記錄對應的索引(行)相同的情況下才會執行去除操作,如代碼清單 7-37所示。
連續特徵離散化處理
某些算法,如 ID3 決策樹算法和 Apriori 算法等,要求數據是離散的,此時就需要將連續型特徵(數值型)轉換成離散型特徵(類別型),即連續特徵離散化。連續特徵離散化是在數據的取值範圍內設定若干個離散的劃分點,將取值範圍劃分為一些離散化的區間,最後用不同的符號或整數值代表落在每個子區間中的數據值。因此離散化涉及兩個子任務,即確定分類數以及如何將連續型數據映射到這些類別型數據上。其原理如圖 7-2 所示。
常用的離散化方法有 3 種:等寬法、等頻法和通過聚類分析離散化(一維)。通過聚類分析離散化(一維)涉及聚類算法,此處暫不介紹。
1.等寬法
等寬法指將數據的值域分成具有相同寬度的區間,與製作頻率分布表類似。cut 函數用於實現等寬法,其基礎語法格式如下。
pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False)cut 函數常用的參數及其說明如表 7-21 所示。
表 7-21 cut 函數常用的參數及其說明
使用等寬法離散化的缺陷從代碼清單 7-39 中可以很明顯地看出:等寬法離散化對數據分布具有較高要求,若數據分布不均勻,那麼各個類的數目也會變得非常不均勻,有些區間包含許多數據,而另外一些區間的數據則極少。這會嚴重損壞所建立的模型。
2.等頻法
等頻法在等寬法的基礎上實現,將切分區間指定為被切分數據的分位數,這樣能保證切分區間的數據大體相等。結合函數對數據應用等頻法,如代碼清單 7-40 所示。
相較於等寬法,等頻法避免了數據分布不均勻的問題,但同時也可能將數值非常接近的兩個值分到不同的區間以滿足每個區間中固定的數據個數。
啞變量處理
啞變量又稱虛擬變量,通常取 0 或 1。機器學習中有相當一部分的算法模型都要求輸入的特徵為數值型,但實際數據中特徵的類型不一定只有數值型,還會存在相當一部分的類別型,這部分的特徵需要經過啞變量處理才可以放入模型之中。啞變量處理的原理如圖 7-3 所示。
get_dummies 函數用於啞變量處理,其基本語法格式如下。
pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False, drop_first=False)使用 get_dummies 函數對類別型特徵進行啞變量處理,如代碼清單 7-41 所示。
代碼清單 7-41 啞變量處理
從代碼清單 7-41 的結果中可以發現,對於一個類別型特徵,若其取值有 m 個,則經過啞變量處理後就變成了 m 個二元特徵,並且這些特徵互斥,每次只有一個激活,這使得數據變得稀疏。
綜上所述,對類別型特徵進行啞變量處理主要解決了部分算法模型無法處理類別型數據的問題,這在一定程度上起到了擴充特徵的作用。由於數據變成了稀疏矩陣的形式,因此也加快了算法模型的運算速度。
小結
本章延續第 6 章,是 Pandas 的進階篇。主要介紹了如下內容:
1)常見數據源類型如 CSV、Excel、資料庫、剪切板、pickle 的讀取和寫入操作。
2)統計分析、分組運算、透視表和交叉表這 3 種針對數據的操作方法。
3)缺失值處理、重複值處理、連續特徵離散化處理、啞變量處理等常見數據處理方法。
課後習題
1.選擇題
(1)下列關於資料庫數據讀寫,下列說法正確的有 。
A. read_sql_table 可以使用 sql 語句讀寫資料庫數據
B. Pandas 除了 read_sql 沒有其他資料庫讀寫函數了
C. 使用 read_sql 函數讀取資料庫數據不需要使用資料庫連接
D. read_sql 既可以使用 sql 語句讀取資料庫數據,也可以直接讀取資料庫表
(2)【多選】關於 Pandas 數據讀寫,下列說法正確的有 。
A. read_excel 能夠讀取 xls 後綴的文件
B. read_sql 能夠讀取資料庫的數據
C. to_csv 方法能夠將 DataFrame 寫入 CSV
D. to_sql 方法能夠將 DataFrame 寫入資料庫
(3)對數值型數據應用 describe 方法返回的特徵不包括 。
A. 中位數 B. 標準差 C. 數目 D. 方差
(4)關於移動窗口 rolling 方法,下列說法正確的是 。
A. 接收 offset 時,對應的索引需為時間類型
B. 接收 int 時,空值不會保留
C. 接收 offset 時,空值不會保留
D. 返回 Rolling 對象
(5)關於 agg 方法,下列說法錯誤的是 。
A. 返回標量值和數組 B. 可接收 NumPy 函數
C. 可對分組的不同列指定作用的函數 D. 可同時接收多個函數
(6)【多選】下列關於 groupby 方法說法正確的是 。
A. groupby 能夠實現分組聚合
B. groupby 方法返回的結果能夠直接查看
C. groupby 是 Pandas 提供的一個用來分組的方法
D. groupby 方法是 Pandas 提供的一個用來聚合的方法
(7)使用 pivot_table 函數製作透視表用下列那個參數設置行分組鍵 。
A. data B. values C. columns D. index
(8)【多選】以下關於缺失值的說法中,正確的是 。
A. isnull 方法可用於計算缺失值數量
B. dropna 方法既可以刪除觀測記錄,也可以刪除特徵
C. f illna 方法可用來切換缺失值
D. Pandas 庫中的 interpolate 模塊包含了多種插值方法
(9)以下關於 drop_duplicates 函數的有關說法中,錯誤的是 。
A. 對 DataFrame 和 Series 類型的數據有效
B. 僅支持單一特徵的數據去重
C. 數據有重複時默認保留第一個數據
D. 該函數不會改變原始數據排列
(10)連續數據離散化的處理方法不包括 。
A. 等寬法 B. 等頻法 C. 使用聚類算法 D. 使用 Apriori 算法
2.填空題
(1)read_csv 函數用於設置分隔符的參數是 。
(2)使用 方法能夠一次性得出 DataFrame 所有數值型特徵的非空值數目、均值、四分位數、標準差。
(3)pivot_table 函數默認的聚合函數是 。
(4)創建交叉表的函數是 。
(5)常用的啞變量處理的函數是 。
3.操作題
(1)一組數據:5,10,11,13,15,35,50,55,72,92,204,215。使用等寬法對其進
行離散化處理。
(2)對表 7-23 中的筆記本電腦數據按 CPU 進行分組,並求出每組最大主頻、最小核心數
目、最低的價格,並顯示在一個 DataFrame 中。
關於作者
李明江:資深大數據專家,貴州省計算機學會常務理事,黔南州大數據專家委員會委員,黔南州計算機學會會長,黔南州教育信息化建設專家庫專家,黔南民族師範學院計算機與信息學院院長,全國高校大數據教育聯盟理事。主持過多項省廳級科研項目,並在《計算機應用研究》《科技通報》上發表過多篇大數據分析與數據挖掘相關技術的研究論文,著有《數據挖掘的應用與實踐:案例與探析》《計算機網絡技術與應用》等。
張良均:資深大數據挖掘與分析專家、模式識別專家、AI技術專家。有10餘年大數據挖掘與分析經驗,擅長Python、R、Hadoop、Matlab等技術實現的數據挖掘與分析,對機器學習等AI技術驅動的數據分析也有深入研究。為電信、電力、政府、網際網路、生產製造、零售、銀行、生物、化工、醫藥等多個行業上百家大型企業提供過數據挖掘應用與諮詢服務,實踐經驗非常豐富。華南師範大學、中南財經政法大學、廣東工業大學、西安理工大學、廣西科技大學、重慶交通大學、桂林電子科技大學等校外碩導。撰寫了《Python數據分析與挖掘實戰》《R語言數據分析與挖掘實戰》《數據挖掘:實用案例分析》《Hadoop大數據分析與挖掘實戰》等多部暢銷書,累計銷量近20萬冊。
本文摘自機械工業出版社《Python3智能數據分析快速入門》,經出版社授權發布。