詳解SQL中的機(jī)器學(xué)習(xí)
有時很難相信ML之前的世界已經(jīng)存在。如此多的現(xiàn)代數(shù)據(jù)分析都建立在ML技術(shù)的基礎(chǔ)之上,并且在可預(yù)見的將來將繼續(xù)這樣做。但是,并非所有人都能從這些巨大的進(jìn)步中受益,因?yàn)槭褂肕L技術(shù)主要涉及使用Python,開發(fā)代碼和理解許多新技術(shù)。尤其是當(dāng)大數(shù)據(jù)和分布式系統(tǒng)進(jìn)入游戲時,事情變得一團(tuán)糟。
這是SQL查詢引擎試圖解決的問題。它們使使用簡單但功能強(qiáng)大的SQL命令來使用復(fù)雜的分布式系統(tǒng)世界成為可能。dask-sql是一個新的SQL查詢引擎(免責(zé)聲明:我是作者),建立在僅python的Dask分布式庫之上。這個新庫可讓您將Python與SQL和分布式可擴(kuò)展計(jì)算結(jié)合起來!(在我的其他一篇文章中了解更多有關(guān)它的信息)。
dask-sql的最新版本0.3.0具有對機(jī)器學(xué)習(xí)的實(shí)驗(yàn)性支持,因此今天我們將了解如何使用它。當(dāng)然,我們將為此使用著名的Iris數(shù)據(jù)集-數(shù)據(jù)科學(xué)的世界。即使這個特定的數(shù)據(jù)樣本很小,只需將更多的計(jì)算節(jié)點(diǎn)添加到群集中,本文中顯示的所有內(nèi)容都可以輕松擴(kuò)展到大量數(shù)據(jù)。
旁注:帶有dask-sql的ML仍處于試驗(yàn)階段:-)可以隨意嘗試,但請謹(jǐn)慎使用。
先決條件和準(zhǔn)備
在本文中,我將假設(shè)您(或您的數(shù)據(jù)工程師)已經(jīng)設(shè)置并運(yùn)行了dask-sql。有關(guān)更多信息,請參考文檔或此博客文章。我還將假設(shè)您通過其SQL Server接口連接dask-sql,例如通過諸如Apache Hue之類的BI工具,該工具甚至提供了最新版本對dask-sql的本機(jī)支持。
如果您正在使用dask-sql的Python接口,則仍然可以繼續(xù)。只需使用以下單元格初始化Jupyter筆記本
- from IPython.core.magic import register_line_cell_magic
- from dask_sql import Context
- # Create a context to store the tables and models
- c = Context()
- # Small helper function to make our life easier
- @register_line_cell_magic
- def 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,例如
- %%sql
- SELECT 1 + 1
加載和準(zhǔn)備數(shù)據(jù)
在這些事情都解決了之后,讓我們開始導(dǎo)入數(shù)據(jù)。由于dask-sql利用大型的Python和Dask生態(tài)系統(tǒng),您可以從許多不同的位置讀取許多不同格式的數(shù)據(jù)樣本。在此示例中,我們將以相當(dāng)標(biāo)準(zhǔn)的CSV格式從Internet提取數(shù)據(jù):
- CREATE OR REPLACE TABLE iris WITH (
- location = 'https://datahub.io/machine-learning/iris/r/iris.csv',
- persist = True
- )
數(shù)據(jù)集被加載并存儲為名為“ iris”的表。persist = True使dask-sql將數(shù)據(jù)緩存在內(nèi)存中。
現(xiàn)在,檢查數(shù)據(jù)是否正確加載
DESCRIBE iris
如您所見,數(shù)據(jù)類型是自動分配的。我們可以使用以下標(biāo)準(zhǔn)SQL命令顯示數(shù)據(jù)的前十行:
- SELECT * FROM iris LIMIT 10
鳶尾花數(shù)據(jù)集的簡要介紹:如上面的輸出所示,數(shù)據(jù)集描述了鳶尾花及其種類的測量結(jié)果。它是機(jī)器學(xué)習(xí)中的標(biāo)準(zhǔn)數(shù)據(jù)集之一,可以用作許多類型的ML方法的示例。在此示例中,我們將應(yīng)用無監(jiān)督的聚類算法。
在開始培訓(xùn)之前,讓我們首先在每個ML管道中執(zhí)行另一個重要步驟:特征提取。由于我不是生物學(xué)家,因此在此僅以一個非常簡單且幼稚的新功能為例:將萼片長度乘以萼片寬度。還可以使用SQL語句和函數(shù)生成更復(fù)雜的功能。如果這還不夠,dask-sql允許注冊用Python編寫的用戶定義函數(shù)(UDF)。
- SELECT
- *,
- sepallength * petallength AS new_feature
- FROM iris
- LIMIT 10
為了讓我們的生活更輕松,讓我們?yōu)樵撛鰪?qiáng)型表引入一個別名
- CREATE OR REPLACE TABLE transformed_data AS (
- SELECT
- *,
- sepallength * petallength AS new_feature
- FROM iris
- )
我們現(xiàn)在準(zhǔn)備應(yīng)用機(jī)器學(xué)習(xí)!
訓(xùn)練機(jī)器學(xué)習(xí)模型
機(jī)器學(xué)習(xí)模型的種類繁多,從簡單的模型(如線性回歸)到強(qiáng)大的Boosted Decision Trees,再到最先進(jìn)的研究模型(如Transformers)。其中許多是在著名的scikit-learn Python軟件包中實(shí)現(xiàn)的,因此(在許多其他庫中)可在dask-sql中使用。
在此示例中,我們應(yīng)用了k-Means聚類算法。簡而言之,它將數(shù)據(jù)集分組為具有相似特征的行簇。如果一切順利,我們希望它可以將相同物種的花朵聚在一起-而無需我們告訴算法。讓我們看看該算法的性能如何(破壞者:不是很好)。如果您想了解有關(guān)與dask-sql兼容的模型及其設(shè)置的更多信息,建議您閱讀一下文檔。
因此,讓我們將聚類算法應(yīng)用于數(shù)據(jù)!
- 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構(gòu)造CREATE MODEL進(jìn)行訓(xùn)練,它獲得一些參數(shù)來指定要訓(xùn)練的模型。在我們的例子中,我們從scikit-learn中選擇k-Means算法,并將我們期望的組或簇?cái)?shù)設(shè)置為三個(因?yàn)槲覀冇腥齻€種類)。scikit-learn軟件包中的算法在中等大小的數(shù)據(jù)上可以很好地工作,如果您需要超出此范圍,請查看dask-ml。
培訓(xùn)應(yīng)立即完成(因?yàn)榭倲?shù)據(jù)集很小),因此我們可以繼續(xù)檢查預(yù)測。
檢查性能
- SELECT * FROM PREDICT (
- MODEL clustering,
- SELECT * FROM transformed_data
- LIMIT 10
- )
該SQL語句將訓(xùn)練有素的模型應(yīng)用于給定的數(shù)據(jù),并向其中添加帶有模型的預(yù)測目標(biāo)的新列“目標(biāo)”。從前十行來看,它看起來不錯(所有“ setosa”都有相同的預(yù)測目標(biāo))。因此,我們再次引入別名以進(jìn)行更多計(jì)算
- CREATE OR REPLACE TABLE iris_results AS (
- SELECT class AS label, target AS predicted FROM PREDICT (
- MODEL clustering,
- SELECT * FROM transformed_data
- )
- )
為了簡短起見,我們只快速瀏覽一下結(jié)果,并檢查物種和預(yù)測簇的分布。
- SELECT
- label, predicted, COUNT(*) AS numbers
- FROM iris_results
- GROUP BY label, predicted
一點(diǎn)都不完美,但是幸運(yùn)的是,這不是關(guān)于ML的文章,所以我將跳過優(yōu)化步驟:-)。您的BI工具可能能夠自動繪制這些數(shù)字,并且作為python用戶,您可以使用
- df = c.sql("""
- SELECT
- label, predicted, COUNT(*) AS numbers
- FROM iris_results
- GROUP BY label, predicted
- """, return_futures=False)
- dfdf = df.set_index(["label", "predicted"])
- df.numbers.unstack(0).plot.bar(ax=plt.gca())
概要
感謝您關(guān)注這篇文章直到最后!我們已經(jīng)介紹了相當(dāng)多的材料,所以這里有個簡短的回顧:
- SQL查詢引擎很酷,因?yàn)槟梢允褂盟鼈兪褂镁哂泻唵蜸QL語法(以及很多魔術(shù))的復(fù)雜分布式系統(tǒng)來查詢復(fù)雜數(shù)據(jù)。
- dask-sql就是其中之一,它與Python生態(tài)系統(tǒng)的交互特別簡單(因?yàn)樗⒃贒ask之上,Dask是可擴(kuò)展Python應(yīng)用程序的庫)。
- 好處之一是可以輕松集成各種Python ML庫,例如scikit-learn包中的k-Means算法,如本博文所示。另一個好處是,一切都可以通過使用SQL來完成!
如果您想了解更多信息,請轉(zhuǎn)至文檔,然后對數(shù)據(jù)進(jìn)行SQL處理。
原文鏈接:https://towardsdatascience.com/machine-learning-in-sql-it-actually-works-56e8d91fc273