当前位置: 首页 > 科技观察

在SQL中解释机器学习

时间:2023-03-15 14:57:58 科技观察

有时很难相信存在一个前ML世界。许多现代数据分析都建立在ML技术之上,并将在可预见的未来继续这样做。然而,并不是每个人都能从这些巨大的进步中受益,因为使用ML技术主要涉及使用Python、开发代码和理解许多新技术。特别是当大数据和分布式系统进入游戏时,事情变得一团糟。这就是SQL查询引擎试图解决的问题。它们使使用简单而强大的SQL命令处理分布式系统的复杂世界成为可能。dask-sql是一个新的SQL查询引擎(免责声明:我是作者)构建在仅限python的Dask分布式库之上。这个新库可让您将Python与SQL和分布式可扩展计算结合起来!(在我的另一篇文章中阅读更多相关信息)。dask-sql最新的0.3.0版本对机器学习有实验性的支持,那么今天我们就来看看如何使用它。当然,我们将为此使用著名的Iris数据集——数据科学的世界。即使这个特定的数据样本很小,本文中显示的所有内容都可以轻松扩展到大量数据,只需向集群添加更多计算节点即可。旁注:使用dask-sql的ML仍处于实验阶段:-)请随意进行实验,但请谨慎使用。先决条件和准备在本文中,我假设您(或您的数据工程师)已经设置并运行了dask-sql。有关详细信息,请参阅文档或此博客文章。我还将假设您通过其SQLServer接口连接dask-sql,例如通过BI工具,例如ApacheHue,它甚至在最近的版本中提供了对dask-sql的原生支持。如果您使用的是dask-sql的Python接口,您仍然可以继续。只需使用IPython.core.magicimportregister_line_cell_magicfromdask_sqlimportContext#Createacontexttostorethetablesandmodelsc=Context()#Smallhelperfunctiontomakeourlifeeasier@register_line_cell_magicdefsql(line,cell=None):ifcellisNone:cell=linelinet=N,cellisNone:celliflinelinet=N,return_futures=中的以下单元初始化JupyternotebookFalse,**line)在下面的代码示例中,在每条SQL命令前加上%%sql,比如%%sqlSELECT1+1加载和准备数据这些事情搞定之后,我们就开始导入数据吧。由于dask-sql利用了大型Python和Dask生态系统,您可以从许多不同的位置读取许多不同格式的数据样本。在这个例子中,我们将从互联网上以相当标准的CSV格式提取数据:CREATEORREPLACETABLEirisWITH(location='https://datahub.io/machine-learning/iris/r/iris.csv',persist=True)dataset加载并存储为名为“iris”的表。persist=True使dask-sql将数据缓存在内存中。现在,检查数据是否正确加载DESCRIBEiris如您所见,数据类型是自动分配的。我们可以使用以下标准SQL命令显示数据的前十行:SELECT*FROMMirisLIMIT10鸢尾花数据集的简要说明:如上面的输出所示,数据集描述了鸢尾花及其种类的测量值。它是机器学习中的标准数据集之一,可以用作多种ML方法的示例。在此示例中,我们将应用无监督聚类算法。在开始训练之前,让我们首先在每个ML流水线中执行另一个重要步骤:特征提取。由于我不是生物学家,我将在这里以一个非常简单和幼稚的新函数为例:将萼片长度乘以萼片宽度。还可以使用SQL语句和函数生成更复杂的功能。如果这还不够,dask-sql允许注册用Python编写的用户定义函数(UDF)。SELECT*,sepallength*petallengthASnew_featureFROMirisLIMIT10为了让我们的生活更轻松,让我们为这个扩充表引入一个别名,从线性回归等简单模型到强大的提升决策树,再到Transformers等最先进的研究模型。其中许多是在著名的scikit-learnPython包中实现的,因此(在许多其他库中)在dask-sql中可用。在此示例中,我们应用了k-Means聚类算法。简而言之,它将数据集分组为具有相似特征的行簇。如果一切顺利,我们希望它可以将相同种类的花分组在一起——而无需我们告诉算法。让我们看看这个算法是如何执行的(剧透:不是很好)。如果您想了解有关dask-sql兼容模型及其设置的更多信息,我建议您查看文档。因此,让我们将聚类算法应用于数据!CREATEORREPLACEMODELclusteringWITH(model_class='sklearn.cluster.KMeans',wrap_predict=True,n_clusters=3)AS(SELECTsepallength,sepalwidth,petallength,petalwidth,new_featureFROMtransformed_data)如您所见,我们使用新的SQL构造执行训练,CREATEMODEL,它获取参数以指定要训练的模型。在我们的例子中,我们选择了scikit-learn中的k-Means算法,并将我们想要的组或集群数量设置为三个(因为我们有三个类别)。scikit-learn包中的算法适用于中等大小的数据,如果您需要超出此范围,请查看dask-ml。训练应该立即完成(因为总数据集很小),所以我们可以继续检查预测。检查性能SELECT*FROMPREDICT(MODELclustering,SELECT*FROMtransformed_dataLIMIT10)此SQL语句将经过训练的模型应用于给定数据,并向其添加一个包含模型预测目标的新列“target”。从前十行来看,它看起来不错(所有“setosa”都有相同的预测目标)。因此我们再次引入别名以进行更多计算CREATEORREPLACETABLEiris_resultsAS(SELECTclassASlabel,targetASpredictedFROMPREDICT(MODELclustering,SELECT*FROMtransformed_data))为了简洁起见,我们只是快速查看结果并检查物种和预测簇的分布。SELECTlabel,predicted,COUNT(*)ASnumbersFROMiris_resultsGROUPBYlabel,predicted一点也不完美,但幸运的是,这不是一篇关于ML的文章,所以我将跳过优化步骤:-)。您的BI工具可能能够自动绘制这些数字,作为python用户,您可以使用df=c。.set_index(["label","predicted"])df.numbers.unstack(0).plot.bar(ax=plt.gca())总结感谢关注这篇文章直到最后!我们已经涵盖了相当多的材料,所以这里快速回顾一下:SQL查询引擎很酷,因为您可以使用它们通过简单的SQL语法(和很多魔法)使用复杂的分布式系统来查询复杂的数据。dask-sql就是其中之一,它特别容易与Python生态系统交互(因为它建立在Dask之上,Dask是一个用于可扩展Python应用程序的库)。好处之一是可以轻松集成各种PythonML库,例如scikit-learn包中的k-Means算法,如本博文所示。另一个好处是,一切都可以使用SQL来完成!如果您想了解更多信息,请转到文档,然后对您的数据执行SQL。原文链接:https://towardsdatascience.com/machine-learning-in-sql-it-actually-works-56e8d91fc273