全文共3944字,預計學習時長
12分鐘今天,小芯給大家帶來的是如何使用一個名為pdpipe的小庫,通過Pandas 數據幀創建直觀且有用的管道。
這是一個很有意思的項目。
事不宜遲,我們開始吧~
基礎知識介紹:
Pandas是Python生態系統中一個十分強大的庫,它用於數據分析和機器學習領域。它們在Excel/CSV文件和SQL表所在的數據世界,和Sciki-learn或TensorFlow發揮其魔力的建模世界之間搭建起完美的橋樑。
數據科學流通常由一系列步驟構成——數據集必經過清理、縮放和驗證,以備強大的機器學習算法使用。
當然,這些任務可以通過Pandas等軟件包提供的許多單步函數/方法來完成,但更好的方法是使用管道。幾乎所有情況下,管道通過自動執行重複的任務,不僅減少了出錯的概率,還節省了時間。
在數據科學領域,R語言中的-dplyr和Python生態系統中的Scikit learn是兩個典型實例,用以說明具有管道特徵的軟件包。
數據科學流通常由一系列步驟構成——必須對數據集進行清理、縮放和驗證,以備使用。
此外,Pandas還提供了一個.pipe方法,可用於用戶定義函數的類似用途。不過,本文將討論另一個名為pdpipe的小庫,它利用Pandas 數據幀專門解決管道問題。
幾乎所有情況下,管道通過自動執行重複的任務,既減少了出錯的概率,還節省了時間。
用Pandas創建管道
Jupyter notebook的例子可在筆者的Github repo中找到(Jupyternotebook can be found here in my Github repo)。來看看如何用這個庫創建有用的管道。
數據集
出於演示目的,將使用美國房價數據集(從Kaggle下載)。可以在Pandas中加載數據集,其彙總的統計信息顯示如下:
但是,數據集還有一個包含文本數據的“Address”字段。
添加大小限定符列
為了方便演示,在數據集中添加一個列來限定房子的大小,代碼如下:
之後數據集如下所示,
最簡單的管道——一次操作
從最簡單的管道開始,由一個操作組成(不要擔心,很快就會增加難度)。
假設機器學習團隊和該領域專家認為大可忽略掉用於建模的Avg. Area HouseAge數據。那麼,就可以從數據集中刪除此列。
對於此任務,使用pdpipe中的ColDrop方法創建一個管道對象drop-age,並將數據幀傳遞至此管道。
import pdpipe as pdp
drop_age = pdp.ColDrop(‘Avg. Area House Age’)
df2 = drop_age(df)
果不其然,生成的數據幀如下所示,
只需添加多個管道鏈階
只有能夠進入到多個階段時,管道才有用、實用。有多種方法可以在 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是在獨熱編碼過程中創建而來。
根據行值刪除一些行
接下來,可能希望根據行值移除數據行。
具體來說,如果有些地區房價低於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列中的值標記行,
第二種方法是在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)
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所做的那樣。
瞧!得到縮放後的數據幀,
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)
生成的數據幀如下所示,
小結
總結一下這個演示中顯示的所有操作,如下所示,
所有這些操作都可以在類似的數據集上頻繁使用,在數據集準備好進行下一級建模之前,有一組簡單的順序代碼塊作為預處理操作執行將是非常棒的。
創建管道是實現序列碼塊統一集合的關鍵。Pandas是機器學習/數據科學團隊在此類數據預處理任務中最廣泛使用的Python庫,pdpipe提供了一種簡單而又強大的方法,可以使用Pandas類型的操作創建管道,這些操作可以直接應用於Pandas數據幀對象。
快來試試吧,為特定數據科學任務創建更強大的管道~
我們一起分享AI學習與發展的乾貨
閱讀更多 讀芯術 的文章