在上一個教程中,我們已經理解了分散式計算的概念和 Dask 簡介。除了 Dask 介面的介紹,我們還了解了什麼是 Dask 集群以及如何安裝 Dask。
桌面界面
正如我們已經討論過的,Dask 介面有多種用於分散式計算的並行演算法集。數據科學從業者很少使用基本的用戶界面來擴展 NumPy、Pandas 和 scikit-learn:
- 陣列:並行 NumPy
- 數據幀:平行 Pandas
- 機器學習:並行 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 提供了一個中央任務調度器和一組工作人員。調度程序將任務分配給每個工作人員。然後,這些工作人員被分配了一些可以執行計算的內核。工人提供兩種功能:
- 計算分配的任務
- 根據要求將結果提供給其他員工。
讓我們考慮一個演示調度程序和工作人員之間對話方式的例子(這個例子是由 Dask 的一個開發人員提供的,即 Matthew Rocklin ):
中央任務調度器將工作以 python 函數的形式發送給工作人員,以便在同一系統或集群系統上執行。
- 工人 A 請計算 x = f(1),工人 B 請計算 y = g(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 陣列。這種替換有助於實現:
- 線性模型(例如,線性回歸、泊松回歸、邏輯回歸等。)
- 預處理(例如,縮放器、變換等。)
- 聚類(例如,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-tw/n/130808.html