在 Python中處理大型機器學習資料集的簡單方法

王林
發布: 2023-04-09 19:51:01
轉載
1703 人瀏覽過

本文的目標受眾:

  1. 想要對大量資料集執行 Pandas/NumPy 操作的人。
  2. 希望使用Python在大數據上執行機器學習任務的人。

在 Python中處理大型機器學習資料集的簡單方法

本文將使用 .csv 格式的檔案來示範 python 的各種操作,其他格式如陣列、文字檔案等也是如此。

為什麼我們不能將 pandas 用於大型機器學習資料集呢?

我們知道Pandas 使用電腦記憶體(RAM) 來載入您的機器學習資料集,但是,如果您的電腦有8 GB 的記憶體(RAM),那麼為什麼pandas 仍然無法載入2 GB 的資料集呢?原因是使用 Pandas 加載 2 GB 檔案不僅需要 2 GB RAM,還需要更多內存,因為總內存需求取決於資料集的大小以及您將在該資料集上執行的操作。

以下是載入到電腦記憶體中的不同大小的資料集的快速比較:

在 Python中處理大型機器學習資料集的簡單方法

#此外,Pandas只使用作業系統的一個內核,這使得處理速度很慢。換句話說,我們可以說pandas不支持並行(將一個問題分解成更小的任務)。

假設電腦有4 個內核,下圖是載入CSV 檔案的時候pandas 使用的內核數:

在 Python中處理大型機器學習資料集的簡單方法

普遍不使用pandas 處理大型機器學習資料集的主要原因有以下兩點,一是電腦記憶體使用量,二是缺乏並行性。在 NumPy 和 Scikit-learn中,對於大數據集也面臨相同的問題。

為了解決這兩個問題,可以使用名為Dask的python函式庫,它能夠使我們在大型資料集上執行pandas、NumPy和ML等各種操作。

Dask是如何運作的?

Dask是在分區中載入你的資料集,而pandas通常是將整個機器學習資料集作為一個dataframe。在Dask中,資料集的每個分區都被認為是一個pandas dataframe。

在 Python中處理大型機器學習資料集的簡單方法

Dask 一次載入一個分割區,因此您不必擔心出現記憶體分配錯誤問題。

以下是使用dask 在電腦記憶體中載入不同大小的機器學習資料集的比較:

在 Python中處理大型機器學習資料集的簡單方法

Dask 解決了平行性問題,因為它將資料拆分為多個分區,每個分區使用一個單獨的內核,這使得資料集上的計算更快。

假設電腦有4 個內核,以下是dask 在載入5 GB csv 檔案時的方式:

在 Python中處理大型機器學習資料集的簡單方法

要使用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 處理大型 CSV 檔案?

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 資料

在 Python中處理大型機器學習資料集的簡單方法

#dask 只花了一秒鐘就將整個8 GB 檔案載入到ddf變數中。

讓我們看看 ddf 變數的輸出。

在 Python中處理大型機器學習資料集的簡單方法

如您所見,執行時間為 0.5 秒,這裡顯示已分割為 119 個分割區。

您還可以使用以下方法檢查資料幀的分區數:

在 Python中處理大型機器學習資料集的簡單方法

#預設情況下,dask 將我的8 GB CSV 檔案載入到119 個分區(每個分區大小為64MB),這是根據可用的實體記憶體和電腦的核心數來完成的。

也可以在載入 CSV 檔案時使用 blocksize 參數指定我自己的分割區數。

在 Python中處理大型機器學習資料集的簡單方法

現在指定了字串值為400MB 的blocksize 參數,這使得每個分割區大小為400 MB,讓我們看看有多少個分割區

在 Python中處理大型機器學習資料集的簡單方法

關鍵點:使用Dask DataFrames 時,一個好的經驗法則是將分割區保持在100MB 以下。

使用下列方法可呼叫dataframe的特定分割區:

在 Python中處理大型機器學習資料集的簡單方法

也可透過使用負索引來呼叫最後一個分割區,就像我們在呼叫清單的最後一個元素時所做的那樣。

讓我們看看資料集的形狀:

在 Python中處理大型機器學習資料集的簡單方法

您可以使用len() 檢查資料集的行數:

在 Python中處理大型機器學習資料集的簡單方法

#Dask 已經包含了範例資料集。我將使用時間序列資料向您展示 dask 如何對資料集執行數學運算。

在 Python中處理大型機器學習資料集的簡單方法

導入dask.datasets後,ddf_20y 載入了從 2000 年 1 月 1 日到 2021 年 12 月 31 日的時間序列資料。

讓我們看看我們的時間序列資料的分區數。

在 Python中處理大型機器學習資料集的簡單方法

20 年的時間序列資料分佈在 8035 個分割區。

在 pandas 中,我們使用 head 列印資料集的前幾行,dask 也是這樣。

在 Python中處理大型機器學習資料集的簡單方法

讓我們計算 id 列的平均值。

在 Python中處理大型機器學習資料集的簡單方法

dask不會列印dataframe的總行數,因為它使用惰性計算(直到需要時才顯示輸出)。為了顯示輸出,我們可以使用compute方法。

在 Python中處理大型機器學習資料集的簡單方法

假設我想將資料集的每一列進行歸一化(將值轉換為0到1之間),Python程式碼如下:

在 Python中處理大型機器學習資料集的簡單方法

循環遍歷列,找到每列的最小值和最大值,並使用簡單的數學公式對這些列進行歸一化。

關鍵點:在我們的歸一化範例中,不要認為會發生實際的數值計算,它只是惰性求值(在需要之前永遠不會向您顯示輸出)。

為什麼要使用 Dask 陣列?

Dask 將陣列分成小塊,其中每個區塊都是一個 NumPy 陣列。

在 Python中處理大型機器學習資料集的簡單方法

dask.arrays 用於處理大數組,以下Python程式碼使用 dask 建立了一個 10000 x 10000 的數組並將其儲存在 x 變數中。

在 Python中處理大型機器學習資料集的簡單方法

呼叫該 x 變數會產生有關陣列的各種資訊。

查看陣列的特定元素

在 Python中處理大型機器學習資料集的簡單方法

對dask 陣列進行數學運算的Python範例:

在 Python中處理大型機器學習資料集的簡單方法

正如您所看到的,由于延迟执行,它不会向您显示输出。我们可以使用compute来显示输出:

在 Python中處理大型機器學習資料集的簡單方法

dask 数组支持大多数 NumPy 接口,如下所示:

  • 数学运算:+, *, exp, log, ...
  • sum(), mean(), std(), sum(axis=0), ...
  • 张量/点积/矩阵乘法:tensordot
  • 重新排序/转置:transpose
  • 切片:x[:100, 500:100:-2]
  • 使用列表或 NumPy 数组进行索引:x[:, [10, 1, 5]]
  • 线性代数:svd、qr、solve、solve_triangular、lstsq

但是,Dask Array 并没有实现完整 NumPy 接口。

你可以从他们的官方文档中了解更多关于 dask.arrays 的信息。

什么是Dask Persist?

假设您想对机器学习数据集执行一些耗时的操作,您可以将数据集持久化到内存中,从而使数学运算运行得更快。

从 dask.datasets 导入了时间序列数据

在 Python中處理大型機器學習資料集的簡單方法

让我们取数据集的一个子集并计算该子集的总行数。

在 Python中處理大型機器學習資料集的簡單方法

计算总行数需要 27 秒。

我们现在使用 persist 方法:

在 Python中處理大型機器學習資料集的簡單方法

持久化我们的子集总共花了 2 分钟,现在让我们计算总行数。

在 Python中處理大型機器學習資料集的簡單方法

同样,我们可以对持久化数据集执行其他操作以减少计算时间。

在 Python中處理大型機器學習資料集的簡單方法

persist应用场景:

  • 数据量大
  • 获取数据的一个子集
  • 对子集应用不同的操作

为什么选择 Dask ML?

Dask ML有助于在大型数据集上使用流行的Python机器学习库(如Scikit learn等)来应用ML(机器学习)算法。

什么时候应该使用 dask ML?

  • 数据不大(或适合 RAM),但训练的机器学习模型需要大量超参数,并且调优或集成技术需要大量时间。
  • 数据量很大。

在 Python中處理大型機器學習資料集的簡單方法

正如你所看到的,随着模型大小的增加,例如,制作一个具有大量超参数的复杂模型,它会引起计算边界的问题,而如果数据大小增加,它会引起内存分配错误。因此,在这两种情况下(红色阴影区域)我们都使用 Dask 来解决这些问题。

如官方文档中所述,dask ml 库用例:

  • 对于内存问题,只需使用 scikit-learn(或其他ML 库)。
  • 对于大型模型,使用 dask_ml.joblib 和scikit-learn estimators。
  • 对于大型数据集,使用 dask_ml estimators。

让我们看一下 Dask.distributed 的架构:

在 Python中處理大型機器學習資料集的簡單方法

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集群

在 Python中處理大型機器學習資料集的簡單方法

如果需要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程式碼

在 Python中處理大型機器學習資料集的簡單方法

#使用dask.distributed 建立一個叢集:

在 Python中處理大型機器學習資料集的簡單方法

要使用群集來擬合scikit-learn 模型,我們只需要使用joblib。

在 Python中處理大型機器學習資料集的簡單方法

以上是在 Python中處理大型機器學習資料集的簡單方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:51cto.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!