首頁>技術>

使用最新版本的dask-sql,可以在SQL中使用龐大的Python ML生態系統

> Photo by Christopher Burns on Unsplash

有時很難相信ML之前的世界已經存在。如此多的現代資料分析都建立在ML技術的基礎之上,並且在可預見的將來將繼續這樣做。但是,並非所有人都能從這些巨大的進步中受益,因為使用ML技術主要涉及使用Python,開發程式碼和理解許多新技術。尤其是當大資料和分散式系統進入遊戲時,事情變得一團糟。

dask-sql的最新版本0.3.0具有對機器學習的實驗性支援,因此今天我們將瞭解如何使用它。當然,我們將為此使用著名的Iris資料集-資料科學的世界。即使這個特定的資料樣本很小,只需將更多的計算節點新增到群集中,本文中顯示的所有內容都可以輕鬆擴充套件到大量資料。

旁註:帶有dask-sql的ML仍處於試驗階段:-)可以隨意嘗試,但請謹慎使用。

先決條件和準備

在本文中,我將假設您(或您的資料工程師)已經設定並運行了dask-sql。有關更多資訊,請參考文件或此部落格文章。我還將假設您透過其SQL Server介面連線dask-sql,例如透過諸如Apache Hue之類的BI工具,該工具甚至提供了最新版本對dask-sql的本機支援。

如果您正在使用dask-sql的Python介面,則仍然可以繼續。只需使用以下單元格初始化Jupyter筆記本

from IPython.core.magic import register_line_cell_magicfrom dask_sql import Context# Create a context to store the tables and modelsc = Context()# Small helper function to make our life easier@register_line_cell_magicdef sql(line, cell=None):    if cell is None:        cell = line        line = None        if not line:        line = {}    return c.sql(cell, return_futures=False, **line)

在以下程式碼示例中,在每個SQL命令前加上%% sql,例如

%%sqlSELECT 1 + 1
載入和準備資料

在這些事情都解決了之後,讓我們開始匯入資料。由於dask-sql利用大型的Python和Dask生態系統,您可以從許多不同的位置讀取許多不同格式的資料樣本。在此示例中,我們將以相當標準的CSV格式從Internet提取資料:

CREATE OR REPLACE TABLE iris WITH (    location = 'https://datahub.io/machine-learning/iris/r/iris.csv',    persist = True)

資料集被載入並存儲為名為“ iris”的表。persist = True使dask-sql將資料快取在記憶體中。

現在,檢查資料是否正確載入

DESCRIBE iris

如您所見,資料型別是自動分配的。我們可以使用以下標準SQL命令顯示資料的前十行:

SELECT * FROM iris LIMIT 10

鳶尾花資料集的簡要介紹:如上面的輸出所示,資料集描述了鳶尾花及其種類的測量結果。它是機器學習中的標準資料集之一,可以用作許多型別的ML方法的示例。在此示例中,我們將應用無監督的聚類演算法。

在開始培訓之前,讓我們首先在每個ML管道中執行另一個重要步驟:特徵提取。由於我不是生物學家,因此在此僅以一個非常簡單且幼稚的新功能為例:將萼片長度乘以萼片寬度。還可以使用SQL語句和函式生成更復雜的功能。如果這還不夠,dask-sql允許註冊用Python編寫的使用者定義函式(UDF)。

SELECT     *,     sepallength * petallength AS new_feature FROM irisLIMIT 10

為了讓我們的生活更輕鬆,讓我們為該增強型表引入一個別名

CREATE OR REPLACE TABLE transformed_data AS (    SELECT         *,         sepallength * petallength AS new_feature    FROM iris)

我們現在準備應用機器學習!

訓練機器學習模型

機器學習模型的種類繁多,從簡單的模型(如線性迴歸)到強大的Boosted Decision Trees,再到最先進的研究模型(如Transformers)。其中許多是在著名的scikit-learn Python軟體包中實現的,因此(在許多其他庫中)可在dask-sql中使用。

在此示例中,我們應用了k-Means聚類演算法。簡而言之,它將資料集分組為具有相似特徵的行簇。如果一切順利,我們希望它可以將相同物種的花朵聚在一起-而無需我們告訴演算法。讓我們看看該演算法的效能如何(破壞者:不是很好)。如果您想了解有關與dask-sql相容的模型及其設定的更多資訊,建議您閱讀一下文件。

因此,讓我們將聚類演算法應用於資料!

CREATE OR REPLACE MODEL clustering WITH (    model_class = 'sklearn.cluster.KMeans',    wrap_predict = True,    n_clusters = 3) AS (    SELECT sepallength, sepalwidth, petallength, petalwidth, new_feature    FROM transformed_data)

如您所見,我們使用了一個新的SQL構造CREATE MODEL進行訓練,它獲得一些引數來指定要訓練的模型。在我們的例子中,我們從scikit-learn中選擇k-Means演算法,並將我們期望的組或簇數設定為三個(因為我們有三個種類)。scikit-learn軟體包中的演算法在中等大小的資料上可以很好地工作,如果您需要超出此範圍,請檢視dask-ml。

培訓應立即完成(因為總資料集很小),因此我們可以繼續檢查預測。

檢查效能
SELECT * FROM PREDICT (    MODEL clustering,    SELECT * FROM transformed_data    LIMIT 10)

該SQL語句將訓練有素的模型應用於給定的資料,並向其中新增帶有模型的預測目標的新列“目標”。從前十行來看,它看起來不錯(所有“ setosa”都有相同的預測目標)。因此,我們再次引入別名以進行更多計算

CREATE OR REPLACE TABLE iris_results AS (    SELECT class AS label, target AS predicted FROM PREDICT (        MODEL clustering,        SELECT * FROM transformed_data    ))

為了簡短起見,我們只快速瀏覽一下結果,並檢查物種和預測簇的分佈。

SELECT     label, predicted, COUNT(*) AS numbersFROM iris_resultsGROUP BY label, predicted

一點都不完美,但是幸運的是,這不是關於ML的文章,所以我將跳過最佳化步驟:-)。您的BI工具可能能夠自動繪製這些數字,並且作為python使用者,您可以使用

df = c.sql("""SELECT     label, predicted, COUNT(*) AS numbersFROM iris_resultsGROUP BY label, predicted""", return_futures=False)df = df.set_index(["label", "predicted"])df.numbers.unstack(0).plot.bar(ax=plt.gca())
概要

感謝您關注這篇文章直到最後!我們已經介紹了相當多的材料,所以這裡有個簡短的回顧:

21
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • GIT教程 3.1 Git 分支 - 分支簡介