Python Dask(第 2 部分)

在上一個教程中,我們已經理解了分布式計算的概念和 Dask 簡介。除了 Dask 接口的介紹,我們還了解了什麼是 Dask 集群以及如何安裝 Dask。

桌面界面

正如我們已經討論過的,Dask 接口有多種用於分布式計算的並行算法集。數據科學從業者很少使用基本的用戶界面來擴展 NumPy、Pandas 和 scikit-learn:

  1. 陣列:並行 NumPy
  2. 數據幀:平行 Pandas
  3. 機器學習:並行 Scikit-Learn

我們已經在前面的教程中介紹了 Dask Array 讓我們直接進入 Dask 數據幀。

DAX 數據幀

我們已經觀察到,為了形成 Dask 陣列,需要對多個 NumPy 陣列進行分組。同樣,一個 Dask 數據幀包含許多較小的 Pandas 數據幀。Pandas 的大數據幀按行分開,以便形成多個較小的數據幀。這些較小的數據幀在單個系統或多個系統上可用(因此,允許我們存儲比內存更大的數據集)。Dask 數據幀的每一次計算都會並行化 Pandas 數據幀上的功能。

下圖顯示了 Dask 數據幀結構:

Dask 數據幀還提供了與 Pandas 數據幀完全相同的 API。

現在,讓我們考慮一些用 Dask 數據幀執行基本功能的例子。

例 1:讀取 CSV 文件

藉助 Pandas讀取文件


# reading the file using pandas
import pandas as pd

my_pdfile = pd.read_csv("covid_19_india.csv")
print(my_pdfile)

輸出:

       Sno      Date     Time State/UnionTerritory ConfirmedIndianNational ConfirmedForeignNational   Cured  Deaths  Confirmed
0        1  30/01/20  6:00 PM               Kerala                       1                        0       0       0          1
1        2  31/01/20  6:00 PM               Kerala                       1                        0       0       0          1
2        3  01/02/20  6:00 PM               Kerala                       2                        0       0       0          2
3        4  02/02/20  6:00 PM               Kerala                       3                        0       0       0          3
4        5  03/02/20  6:00 PM               Kerala                       3                        0       0       0          3
...    ...       ...      ...                  ...                     ...                      ...     ...     ...        ...
9286  9287  09/12/20  8:00 AM            Telengana                       -                        -  266120    1480     275261
9287  9288  09/12/20  8:00 AM              Tripura                       -                        -   32169     373      32945
9288  9289  09/12/20  8:00 AM          Uttarakhand                       -                        -   72435    1307      79141
9289  9290  09/12/20  8:00 AM        Uttar Pradesh                       -                        -  528832    7967     558173
9290  9291  09/12/20  8:00 AM          West Bengal                       -                        -  475425    8820     507995

[9291 rows x 9 columns]

藉助 Pandas讀取文件


# reading the file using dask
import dask.dataframe as ddf

my_ddfile = ddf.read_csv("covid_19_india.csv")
print(my_ddfile.compute())    

輸出:

Sno      Date     Time State/UnionTerritory ConfirmedIndianNational ConfirmedForeignNational   Cured  Deaths  Confirmed
0        1  30/01/20  6:00 PM               Kerala                       1                        0       0       0          1
1        2  31/01/20  6:00 PM               Kerala                       1                        0       0       0          1
2        3  01/02/20  6:00 PM               Kerala                       2                        0       0       0          2
3        4  02/02/20  6:00 PM               Kerala                       3                        0       0       0          3
4        5  03/02/20  6:00 PM               Kerala                       3                        0       0       0          3
...    ...       ...      ...                  ...                     ...                      ...     ...     ...        ...
9286  9287  09/12/20  8:00 AM            Telengana                       -                        -  266120    1480     275261
9287  9288  09/12/20  8:00 AM              Tripura                       -                        -   32169     373      32945
9288  9289  09/12/20  8:00 AM          Uttarakhand                       -                        -   72435    1307      79141
9289  9290  09/12/20  8:00 AM        Uttar Pradesh                       -                        -  528832    7967     558173
9290  9291  09/12/20  8:00 AM          West Bengal                       -                        -  475425    8820     507995

[9291 rows x 9 columns]

說明:

在上面的例子中,我們創建了兩個不同的程序。在第一個程序中,我們導入了Pandas庫,使用 read_csv() 函數讀取 csv 文件。相比之下,我們導入了 dask 庫的數據幀模塊,使用 read_csv() 函數讀取 csv 文件。

兩個程序的結果相同,但處理時間不同。與 Pandas 相比,Dask 數據幀執行功能的速度更快。一旦實際使用,同樣的效果會很明顯。

示例 2:查找特定列的值計數


import dask.dataframe as ddf

my_ddfile = ddf.read_csv("covid_19_india.csv")
print(my_ddfile.State.value_counts().compute())

輸出:

Kerala                                      315
Delhi                                       283
Rajasthan                                   282
Haryana                                     281
Uttar Pradesh                               281
Tamil Nadu                                  278
Ladakh                                      278
Jammu and Kashmir                           276
Karnataka                                   276
Punjab                                      275
Maharashtra                                 275
Andhra Pradesh                              273
Uttarakhand                                 270
Odisha                                      269
West Bengal                                 267
Puducherry                                  267
Chhattisgarh                                266
Gujarat                                     265
Chandigarh                                  265
Madhya Pradesh                              264
Himachal Pradesh                            264
Bihar                                       263
Manipur                                     261
Mizoram                                     260
Andaman and Nicobar Islands                 259
Goa                                         259
Assam                                       253
Jharkhand                                   253
Arunachal Pradesh                           251
Tripura                                     247
Meghalaya                                   240
Telengana                                   236
Nagaland                                    207
Sikkim                                      200
Dadra and Nagar Haveli and Daman and Diu    181
Cases being reassigned to states             60
Telangana                                    45
Dadar Nagar Haveli                           37
Unassigned                                    3
Telangana***                                  1
Maharashtra***                                1
Telengana***                                  1
Chandigarh***                                 1
Daman & Diu                                   1
Punjab***                                     1
Name: State, dtype: int64

說明:

在上例中,我們導入了 dask 庫的數據幀模塊,並使用 read_csv() 函數從 csv 文件中讀取內容。然後,我們使用列名“States”後跟 value_counts() 方法來計算該特定列中每個值的總數。因此,我們得到了該列中出現的所有州名及其出現的總數。

示例 3:在 Dask 數據幀上使用 groupby 函數


import dask.dataframe as ddf

my_ddfile = ddf.read_csv("covid_19_india.csv")
print(my_ddfile.groupby(my_ddfile.State).Cured.max().compute())

輸出:

State
Andaman and Nicobar Islands                    4647
Andhra Pradesh                               860368
Arunachal Pradesh                             15690
Assam                                        209447
Bihar                                        232563
Cases being reassigned to states                  0
Chandigarh                                    16981
Chandigarh***                                 14381
Chhattisgarh                                 227158
Dadar Nagar Haveli                                2
Dadra and Nagar Haveli and Daman and Diu       3330
Daman & Diu                                       0
Delhi                                        565039
Goa                                           46924
Gujarat                                      203111
Haryana                                      232108
Himachal Pradesh                              37871
Jammu and Kashmir                            107282
Jharkhand                                    107898
Karnataka                                    858370
Kerala                                       582351
Ladakh                                         8056
Madhya Pradesh                               200664
Maharashtra                                 1737080
Maharashtra***                              1581373
Manipur                                       23166
Meghalaya                                     11686
Mizoram                                        3772
Nagaland                                      10781
Odisha                                       316970
Puducherry                                    36308
Punjab                                       145093
Punjab***                                    130406
Rajasthan                                    260773
Sikkim                                         4735
Tamil Nadu                                   770378
Telangana                                     41332
Telangana***                                  40334
Telengana                                    266120
Telengana***                                  42909
Tripura                                       32169
Unassigned                                        0
Uttar Pradesh                                528832
Uttarakhand                                   72435
West Bengal                                  475425
Name: Cured, dtype: int64

說明:

在上面的程序中,我們再次導入了 dask 庫的數據幀模塊,並使用了 read_csv 來讀取指定的 csv 文件。然後,我們使用 dask 數據幀的 groupby 功能和 max() 功能來查找每個狀態下的最大治癒人數。

現在,讓我們了解另一個 Dask 接口,那就是 Dask 機器學習。

Dask 機器學習

Dask 機器學習提供了可擴展的 Python 機器學習算法,與 scikit-learn 兼容。讓我們從理解使用 scikit-learn 處理計算的方式開始,然後仔細研究 Dask 如何以不同的方式執行這些功能。

用戶可以通過放置參數 njobs = -1,在 scikit-learn 的幫助下(在單獨的系統上)執行並行計算。Scikit-learn 利用 Joblib 來執行這些並行計算。 Joblib 是一個支持並行化的 Python 庫。當我們調用 fit() 函數時,基於要執行的任務(無論是超參數搜索還是擬合模型),Joblib 將任務分布在可用的內核中。

然而,我們可以在 scikit-learn 庫的幫助下將並行計算擴展到多台機器。然而,Dask 在一個單獨的系統上表現良好,並且可以很容易地擴展到一個集群系統。

Dask 提供了一個中央任務調度器和一組工作人員。調度程序將任務分配給每個工作人員。然後,這些工作人員被分配了一些可以執行計算的內核。工人提供兩種功能:

  1. 計算分配的任務
  2. 根據要求將結果提供給其他員工。

讓我們考慮一個演示調度程序和工作人員之間對話方式的例子(這個例子是由 Dask 的一個開發人員提供的,即 Matthew Rocklin ):

中央任務調度器將工作以 python 函數的形式發送給工作人員,以便在同一系統或集群系統上執行。

  1. 工人 A 請計算 x = f(1),工人 B 請計算 y = g(2)
  2. 工人 A,一旦 g(2)功能完成,請從工人 B 獲取 y,並執行 z = h(x,y)

上面的例子應該給我們提供了一個關於 Dask 工作的清晰演示。現在讓我們了解機器學習和 Dask-search CV 的模型。

機器學習模型

Dask 機器學習(也稱為 Dask-ML)提供了 Python 中可擴展的機器學習。但是在開始之前,讓我們遵循下面給出的 Dask-ML 安裝步驟:

安裝使用 conda


conda install -c conda-forge dask-ml

使用管道安裝


$ pip install dask-ml

讓我們繼續了解並行化 Scikit-直接學習並使用 Dask 數組重新實現算法。

1。並行化 Scikit-直接學習

正如我們已經討論過的,Scikit-Learn(也稱為 sklearn )在 Joblib 的幫助下提供並行計算(在單個 CPU 上)。我們可以直接利用 Dask,通過插入幾行代碼(甚至不需要對當前代碼進行任何修改)來並行化一個以上的 sklearn 估計器。

主要步驟是從 dask 庫的分布式模塊導入客戶端。此命令將在系統上生成本地計劃和工作人員。


from dask.distributed import Client 
# starting a local Dask client
my_client = Client()

下一步是在後端實例化 dask 的 joblib。我們必須從 sklearn 庫的 joblib 導入parallel _ 後端,如下語法所示:


import dask_ml.joblib
from sklearn.externals.joblib import parallel_backend
with parallel_backend('dask'):
    # Normal scikit-learn code goes here
     from sklearn.ensemble import RandomForestClassifier 
     my_model = RandomForestClassifier()

2。使用 Dask 陣列重新實現算法

為了使用 NumPy 數組,Dask-ML 重新實現了簡單的機器學習算法。為了實現可擴展算法,使用 Dask 陣列將 NumPy 陣列替換為 Dask 陣列。這種替換有助於實現:

  1. 線性模型(例如,線性回歸、泊松回歸、邏輯回歸等。)
  2. 預處理(例如,縮放器、變換等。)
  3. 聚類(例如,K 均值、譜聚類等。)

A .線性模型示例


from dask_ml.linear_model import LogisticRegression

mymodel = LogisticRegression()
mymodel.fit(data, labels)

B .預處理示例


from dask_ml.preprocessing import OneHotEncoder

myencoder = OneHotEncoder(sparse=True)
myresult = myencoder.fit(data)

C .聚類示例


from dask_ml.cluster import KMeans

mymodel = KMeans()
mymodel.fit(data)

搜索簡歷

【超參數調整】 被認為是建立模型的重要一步,可以極大地改變模型的實現。機器學習模型有各種各樣的超參數,很難理解哪個參數在特定情況下表現更好。手動執行這項任務是相當令人厭煩的工作。然而,Scikit-Learn 庫提供了網格搜索,以簡化超參數調整的任務。用戶必須提供參數, Gridsearch 將提供這些參數的最佳組合。

讓我們考慮一個例子,在這個例子中,我們需要選擇一種隨機森林技術來適應數據集。該模型有三個重要的可調參數——第一參數、第二參數和第三參數。

現在,讓我們在下面設置這些參數的值:

第一個參數-自舉=真

第二參數-最大深度- [8,9]

第三參數-n _ 估計量:[50,100,200]

1。sklearn Gridsearch: 對於每一個參數組合,Scikit-learn Gridsearch 都會執行任務,有時最終會多次迭代單個任務。下圖表明,這並不是最有效的方法:

2。Dask-Search CV: 與 sklearn 的grid Search CV不同,Dask 提供了一個名為 Dask-Search CV 的庫。為了減少重複,Dask-Search CV 合併了這些步驟。我們可以通過以下步驟安裝 Dask-search :

使用 conda 安裝 Dask-搜索 CV


conda install dask-searchcv -c conda-forge

使用 pip 安裝 Dask-搜索 CV


$ pip install dask-searchcv

下圖展示了 Dask-Search CV 的工作原理:

Spark 和 Dask 的區別

以下是 Spark 和 Dask 的一個關鍵區別:

| 南號碼 | 火花 | 達斯克 |
| one | Spark 是用 Scala 編程語言編寫的。 | Dask 是用 Python 編程語言編寫的。 |
| Two | Spark 提供對 R 和 Python 的支持。 | Dask 只支持 Python。 |
| three | Spark 提供了自己的生態系統。 | Dask 是 Python 生態系統的組成部分之一。 |
| four | Spark 提供了自己的 API。 | Dask 重新利用 Pandas 的 API |
| five | 對於 Scala 和 SQL 用戶來說,Spark 很容易理解和實現。 | Python 從業者通常更喜歡 Dask。 |
| six | Spark 本身不支持多維數組。 | Dask 為可擴展多維陣列的 NumPy 模型提供全面支持。 |


原創文章,作者:AIBWO,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/130808.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
AIBWO的頭像AIBWO
上一篇 2024-10-03 23:27
下一篇 2024-10-03 23:27

相關推薦

  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29

發表回復

登錄後才能評論