本文的目標受眾:
本文將使用 .csv 格式的檔案來示範 python 的各種操作,其他格式如陣列、文字檔案等也是如此。
我們知道Pandas 使用電腦記憶體(RAM) 來載入您的機器學習資料集,但是,如果您的電腦有8 GB 的記憶體(RAM),那麼為什麼pandas 仍然無法載入2 GB 的資料集呢?原因是使用 Pandas 加載 2 GB 檔案不僅需要 2 GB RAM,還需要更多內存,因為總內存需求取決於資料集的大小以及您將在該資料集上執行的操作。
以下是載入到電腦記憶體中的不同大小的資料集的快速比較:
#此外,Pandas只使用作業系統的一個內核,這使得處理速度很慢。換句話說,我們可以說pandas不支持並行(將一個問題分解成更小的任務)。
假設電腦有4 個內核,下圖是載入CSV 檔案的時候pandas 使用的內核數:
普遍不使用pandas 處理大型機器學習資料集的主要原因有以下兩點,一是電腦記憶體使用量,二是缺乏並行性。在 NumPy 和 Scikit-learn中,對於大數據集也面臨相同的問題。
為了解決這兩個問題,可以使用名為Dask的python函式庫,它能夠使我們在大型資料集上執行pandas、NumPy和ML等各種操作。
Dask是在分區中載入你的資料集,而pandas通常是將整個機器學習資料集作為一個dataframe。在Dask中,資料集的每個分區都被認為是一個pandas dataframe。
Dask 一次載入一個分割區,因此您不必擔心出現記憶體分配錯誤問題。
以下是使用dask 在電腦記憶體中載入不同大小的機器學習資料集的比較:
Dask 解決了平行性問題,因為它將資料拆分為多個分區,每個分區使用一個單獨的內核,這使得資料集上的計算更快。
假設電腦有4 個內核,以下是dask 在載入5 GB csv 檔案時的方式:
要使用dask 函式庫,您可以使用下列指令進行安裝:
<span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">pip</span> <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">install</span> <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">dask</span>
Dask 有幾個模組,如dask.array、dask.dataframe 和dask.distributed,只有在您分別安裝了對應的函式庫(如NumPy、pandas 和Tornado)後才能運作。
dask.dataframe 用於處理大型 csv 文件,首先我嘗試使用 pandas 導入大小為 8 GB 的資料集。
<span style="color: rgb(215, 58, 73); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">import</span> <span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">pandas</span> <span style="color: rgb(215, 58, 73); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">as</span> <span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">pd</span><br><span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">df</span> <span style="color: rgb(215, 58, 73); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">=</span> <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">pd</span>.<span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">read_csv</span>(<span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">“data</span>.<span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">csv”</span>)
它在我的 16 GB 記憶體筆記型電腦中引發了記憶體分配錯誤。
現在,嘗試使用dask.dataframe 導入相同的8 GB 資料
#dask 只花了一秒鐘就將整個8 GB 檔案載入到ddf變數中。
讓我們看看 ddf 變數的輸出。
如您所見,執行時間為 0.5 秒,這裡顯示已分割為 119 個分割區。
您還可以使用以下方法檢查資料幀的分區數:
#預設情況下,dask 將我的8 GB CSV 檔案載入到119 個分區(每個分區大小為64MB),這是根據可用的實體記憶體和電腦的核心數來完成的。
也可以在載入 CSV 檔案時使用 blocksize 參數指定我自己的分割區數。
現在指定了字串值為400MB 的blocksize 參數,這使得每個分割區大小為400 MB,讓我們看看有多少個分割區
關鍵點:使用Dask DataFrames 時,一個好的經驗法則是將分割區保持在100MB 以下。
使用下列方法可呼叫dataframe的特定分割區:
也可透過使用負索引來呼叫最後一個分割區,就像我們在呼叫清單的最後一個元素時所做的那樣。
讓我們看看資料集的形狀:
您可以使用len() 檢查資料集的行數:
#Dask 已經包含了範例資料集。我將使用時間序列資料向您展示 dask 如何對資料集執行數學運算。
導入dask.datasets後,ddf_20y 載入了從 2000 年 1 月 1 日到 2021 年 12 月 31 日的時間序列資料。
讓我們看看我們的時間序列資料的分區數。
20 年的時間序列資料分佈在 8035 個分割區。
在 pandas 中,我們使用 head 列印資料集的前幾行,dask 也是這樣。
讓我們計算 id 列的平均值。
dask不會列印dataframe的總行數,因為它使用惰性計算(直到需要時才顯示輸出)。為了顯示輸出,我們可以使用compute方法。
假設我想將資料集的每一列進行歸一化(將值轉換為0到1之間),Python程式碼如下:
循環遍歷列,找到每列的最小值和最大值,並使用簡單的數學公式對這些列進行歸一化。
關鍵點:在我們的歸一化範例中,不要認為會發生實際的數值計算,它只是惰性求值(在需要之前永遠不會向您顯示輸出)。
Dask 將陣列分成小塊,其中每個區塊都是一個 NumPy 陣列。
dask.arrays 用於處理大數組,以下Python程式碼使用 dask 建立了一個 10000 x 10000 的數組並將其儲存在 x 變數中。
呼叫該 x 變數會產生有關陣列的各種資訊。
對dask 陣列進行數學運算的Python範例:
正如您所看到的,由于延迟执行,它不会向您显示输出。我们可以使用compute来显示输出:
dask 数组支持大多数 NumPy 接口,如下所示:
但是,Dask Array 并没有实现完整 NumPy 接口。
你可以从他们的官方文档中了解更多关于 dask.arrays 的信息。
假设您想对机器学习数据集执行一些耗时的操作,您可以将数据集持久化到内存中,从而使数学运算运行得更快。
从 dask.datasets 导入了时间序列数据
让我们取数据集的一个子集并计算该子集的总行数。
计算总行数需要 27 秒。
我们现在使用 persist 方法:
持久化我们的子集总共花了 2 分钟,现在让我们计算总行数。
同样,我们可以对持久化数据集执行其他操作以减少计算时间。
persist应用场景:
Dask ML有助于在大型数据集上使用流行的Python机器学习库(如Scikit learn等)来应用ML(机器学习)算法。
什么时候应该使用 dask ML?
正如你所看到的,随着模型大小的增加,例如,制作一个具有大量超参数的复杂模型,它会引起计算边界的问题,而如果数据大小增加,它会引起内存分配错误。因此,在这两种情况下(红色阴影区域)我们都使用 Dask 来解决这些问题。
如官方文档中所述,dask ml 库用例:
让我们看一下 Dask.distributed 的架构:
Dask 让您能够在计算机集群上运行任务。在 dask.distributed 中,只要您分配任务,它就会立即开始执行。
简单地说,client就是提交任务的你,执行任务的是Worker,调度器则执行两者之间通信。
python -m <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">pip</span> <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">install</span> <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">dask</span> distributed –upgrade
如果您使用的是单台机器,那么就可以通过以下方式创建一个具有4个worker的dask集群
如果需要dashboard,可以安装bokeh,安装bokeh的命令如下:
<span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">pip</span> <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">install</span> <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">bokeh</span>
就像我们从 dask.distributed 创建客户端一样,我们也可以从 dask.distributed 创建调度程序。
要使用 dask ML 库,您必须使用以下命令安装它:
<span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">pip</span> <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">install</span> <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">dask</span>-ml
我们将使用 Scikit-learn 库来演示 dask-ml 。
假設我們使用Grid_Search 方法,我們通常使用以下Python程式碼
#使用dask.distributed 建立一個叢集:
要使用群集來擬合scikit-learn 模型,我們只需要使用joblib。
以上是在 Python中處理大型機器學習資料集的簡單方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!