12.24 使用“pdpipe”,通過Pandas快速建立管道

全文共3944字,預計學習時長

12分鐘

使用“pdpipe”,通過Pandas快速建立管道

圖源:Unsplash

今天,小芯給大家帶來的是如何使用一個名為pdpipe的小庫,通過Pandas 數據幀創建直觀且有用的管道。

這是一個很有意思的項目。

事不宜遲,我們開始吧~

使用“pdpipe”,通過Pandas快速建立管道

基礎知識介紹:

Pandas是Python生態系統中一個十分強大的庫,它用於數據分析和機器學習領域。它們在Excel/CSV文件和SQL表所在的數據世界,和Sciki-learn或TensorFlow發揮其魔力的建模世界之間搭建起完美的橋樑。


數據科學流通常由一系列步驟構成——數據集必經過清理、縮放和驗證,以備強大的機器學習算法使用。


當然,這些任務可以通過Pandas等軟件包提供的許多單步函數/方法來完成,但更好的方法是使用管道。幾乎所有情況下,管道通過自動執行重複的任務,不僅減少了出錯的概率,還節省了時間。


在數據科學領域,R語言中的-dplyr和Python生態系統中的Scikit learn是兩個典型實例,用以說明具有管道特徵的軟件包。


數據科學流通常由一系列步驟構成——必須對數據集進行清理、縮放和驗證,以備使用。

使用“pdpipe”,通過Pandas快速建立管道

圖源:Unsplash

此外,Pandas還提供了一個.pipe方法,可用於用戶定義函數的類似用途。不過,本文將討論另一個名為pdpipe的小庫,它利用Pandas 數據幀專門解決管道問題。


幾乎所有情況下,管道通過自動執行重複的任務,既減少了出錯的概率,還節省了時間。

使用“pdpipe”,通過Pandas快速建立管道

用Pandas創建管道


Jupyter notebook的例子可在筆者的Github repo中找到(Jupyternotebook can be found here in my Github repo)。來看看如何用這個庫創建有用的管道。


數據集


出於演示目的,將使用美國房價數據集(從Kaggle下載)。可以在Pandas中加載數據集,其彙總的統計信息顯示如下:

使用“pdpipe”,通過Pandas快速建立管道

但是,數據集還有一個包含文本數據的“Address”字段。


使用“pdpipe”,通過Pandas快速建立管道

添加大小限定符列


為了方便演示,在數據集中添加一個列來限定房子的大小,代碼如下:

使用“pdpipe”,通過Pandas快速建立管道

之後數據集如下所示,


使用“pdpipe”,通過Pandas快速建立管道

最簡單的管道——一次操作


從最簡單的管道開始,由一個操作組成(不要擔心,很快就會增加難度)。


假設機器學習團隊和該領域專家認為大可忽略掉用於建模的Avg. Area HouseAge數據。那麼,就可以從數據集中刪除此列。


對於此任務,使用pdpipe中的ColDrop方法創建一個管道對象drop-age,並將數據幀傳遞至此管道。


import pdpipe as pdp

drop_age = pdp.ColDrop(‘Avg. Area House Age’)

df2 = drop_age(df)

果不其然,生成的數據幀如下所示,


使用“pdpipe”,通過Pandas快速建立管道

只需添加多個管道鏈階


使用“pdpipe”,通過Pandas快速建立管道

圖源:Unsplash

只有能夠進入到多個階段時,管道才有用、實用。有多種方法可以在 pdpipe中執行此操作。不過,最簡單且最直觀的方法是使用運算符“+”。這就像用手連接管道一樣!


比方說,除了刪除age列之外,我們還想對House_size列進行獨熱編碼 (one-hot-encode),以便可以在數據集上輕鬆運行分類算法或迴歸算法。


pipeline = pdp.ColDrop(‘Avg. Area House Age’)

pipeline+= pdp.OneHotEncode(‘House_size’)

df3 = pipeline(df)

因此,首先使用ColDrop方法創建一個管道對象,用以刪除Avg.Area House Age列。此後,只需通過常用的Python+=語法將OneHotEncode方法添加到此管道對象即可。


生成的數據幀如下所示。請注意,附加指示符列House_size_Medium和House_size_Small是在獨熱編碼過程中創建而來。


使用“pdpipe”,通過Pandas快速建立管道

根據行值刪除一些行


接下來,可能希望根據行值移除數據行。

使用“pdpipe”,通過Pandas快速建立管道

圖源:Unsplash

具體來說,如果有些地區房價低於25萬,可能要全部刪除該地區的數據。使用applybycol方法將任一用戶定義的函數應用於數據幀,再使用ValDrop方法根據特定值刪除行。可以很容易地將這些方法鏈接到管道中,便能有所選擇地刪除行(仍添加至現有的管道對象,它已經完成了列刪除和獨熱編碼的工作)。


def price_tag(x):

if x>250000:

return 'keep'

else:

return'drop'pipeline+=pdp.ApplyByCols('Price',price_tag,'Price_tag',drop=False)

pipeline+=pdp.ValDrop(['drop'],'Price_tag')

pipeline+= pdp.ColDrop('Price_tag')

第一種方法是通過應用用戶定義的函數Price_tag(),根據Price列中的值標記行,


使用“pdpipe”,通過Pandas快速建立管道

第二種方法是在Price_tag列中查找字符串drop並刪除匹配的行。


最後,第三種方法是刪除Price_tag列,清理數據幀。畢竟,這個Price_tag列只是臨時用於標記特定的行,應該在用完後刪除。


所有這些只需把多個操作階段鏈接到同一管道上即可!


現在,可以回顧一下管道一開始對數據幀做了些什麼,


•刪除特定列

•對一個用於建模的分類數據列進行編碼

•基於用戶定義函數的標籤數據

•根據標籤刪除行

•刪除臨時標記欄


這些都使用以下五行代碼,


pipeline = pdp.ColDrop('Avg. Area House Age')

pipeline+= pdp.OneHotEncode('House_size')

pipeline+=pdp.ApplyByCols('Price',price_tag,'Price_tag',drop=False)

pipeline+=pdp.ValDrop(['drop'],'Price_tag')

pipeline+= pdp.ColDrop('Price_tag')df5 = pipeline(df)

使用“pdpipe”,通過Pandas快速建立管道

Scikit-learn和NLTK階段

有許多更有用且更加直觀的方法可用於數據幀操作。不過,本文只需證明,連Scikit learn和NLTK軟件包中的一些操作也包含在 pdpipe 中,可用於生成非常棒的管道。

Scikit-learn中的縮放估計器

創建機器學習模型最常見的任務之一就是數據的縮放。Scikit-learn提供了幾種不同的縮放類型,如最值縮放或標準化縮放(減去數據集的平均值,然後除以標準差)。


可以在管道中直接鏈接此種縮放操作。下面的代碼演示了它的用法,


pipeline_scale=

pdp.Scale('StandardScaler',exclude_columns=['House_size_Medium','House_size_Small'])df6= pipeline_scale(df5)

在此,應用Scikit-learn包中的標準縮放尺度估計器將數據轉換為聚類或神經網絡擬合。可以有選擇地排除不需要此種縮放的列,就像對指示列House_size_Medium和House_size_Small所做的那樣。


瞧!得到縮放後的數據幀,


使用“pdpipe”,通過Pandas快速建立管道

NLTK中的標記解析器 (Tokenizer)


可以注意到,數據幀中的地址字段現在毫無用處。但是,如果可以從這些字符串中提取壓縮碼或狀態,這些字段可能對某種可視化或機器學習任務有用。


為此,可以使用單詞標記解析器 Word Tokenizer。


NLTK是用於文本挖掘和自然語言處理(NLP)的常用且強大的Python庫,它提供了一系列的標記解析器方法。此處,可以使用一個這樣的標記解析器來分割地址字段中的文本,並從中提取狀態的名稱。可以看到,狀態的名稱是地址字符串中倒數第二個單詞。因此,以下鏈式管道做這項工作,


def extract_state(token):

returnstr(token[-2])pipeline_tokenize=pdp.TokenizeWords('Address')pipeline_state =pdp.ApplyByCols('Address',extract_state,

result_columns='State')pipeline_state_extract = pipeline_tokenize +pipeline_statedf7 = pipeline_state_extract(df6)

生成的數據幀如下所示,

使用“pdpipe”,通過Pandas快速建立管道

使用“pdpipe”,通過Pandas快速建立管道

小結


總結一下這個演示中顯示的所有操作,如下所示,


使用“pdpipe”,通過Pandas快速建立管道

所有這些操作都可以在類似的數據集上頻繁使用,在數據集準備好進行下一級建模之前,有一組簡單的順序代碼塊作為預處理操作執行將是非常棒的。


創建管道是實現序列碼塊統一集合的關鍵。Pandas是機器學習/數據科學團隊在此類數據預處理任務中最廣泛使用的Python庫,pdpipe提供了一種簡單而又強大的方法,可以使用Pandas類型的操作創建管道,這些操作可以直接應用於Pandas數據幀對象。

使用“pdpipe”,通過Pandas快速建立管道

圖源:Unsplash

快來試試吧,為特定數據科學任務創建更強大的管道~

使用“pdpipe”,通過Pandas快速建立管道

我們一起分享AI學習與發展的乾貨


分享到:


相關文章: