如何使用Deepnote的SingleStoreDB和MindsDB?(附教程)

428 阅读7分钟

使用SingleStoreDB、MindsDB和Deepnote进行数据科学的快速入门

摘要

本文将展示如何使用Deepnote的SingleStoreDB和MindsDB。我们将在Deepnote中创建集成,将鸢尾花数据集加载到SingleStoreDB中,然后使用MindsDB从SingleStoreDB中存储的鸢尾花数据中创建一个机器学习(ML)模型。我们还将使用ML模型做一些预测的例子。大部分代码将采用SQL语言,使具有扎实的SQL技能的开发人员能够立即投入工作并开始使用ML

简介

在以前的许多文章中,我们已经成功地使用Spark Dataframes和SingleStore Spark连接器来执行各种数据科学,数据分析,以及SingleStoreDB的ETL操作。通常我们的应用程序都是使用Python构建的。然而,我们也可以使用其他方法来用SingleStoreDB执行数据科学。一种使用SQL的方法是MindsDB,之前的文章展示了如何用MindsDB向SingleStore数据添加实时机器学习预测。

MindsDB允许将现有的SQL技能用于数据科学问题。此外,出现了许多提供基于云的笔记本环境的在线服务。Deepnote就是这样一个服务,它也提供了一系列的集成。我们将使用这些集成来结合SingleStoreDB和MindsDB与Deepnote。

创建一个SingleStore云账户

首先,我们将在SingleStore网站上创建一个免费的账户。在写这篇文章的时候,SingleStore的云账户带有500美元的信用额度。之前的一篇文章展示了如何创建SingleStoreDB云计算集群。我们将在这个用例中使用这些说明。我们将注意到我们的集群主机地址和密码,因为我们需要这些信息用于Deepnote。

创建一个MindsDB云账户

接下来,我们将在MindsDB网站上创建一个免费的账户。我们将记下我们的登录电子邮件地址和密码,因为我们将需要这个信息用于Deepnote。

创建一个Deepnote账户

最后,我们将在Deepnote网站上创建一个免费账户。一旦我们登录,我们将创建两个Deepnote集成。

  1. MySQL
  2. MindsDB

我们可以使用SingleStoreDB的MySQL集成。图1显示了这个集成所需信息的一个例子。

图1.SingleStoreDB。

  • **集成名称:**SingleStoreDB
  • 主机名:<TO DO
  • **端口:**3306
  • **用户名:**admin
  • 密码:
  • **数据库:**memsql

<TO DO> 主机名密码应该用创建集群时从SingleStoreDB Cloud获得的值替换。我们可以使用memsql 作为数据库名称。

图2显示了MindsDB集成所需信息的一个例子。

图2.MIndsDB。

  • 集成名称:MindsDB
  • 主机名:cloud.mindsdb.com
  • 端口:3306
  • 用户名:
  • 密码:
  • 数据库:mindsdb

<TO DO>用户名密码应该用MindsDB Cloud的登录值替换。我们将使用mindsdb 作为数据库名称。

填写笔记本

我们现在将创建一个新的Deepnote项目,它将给我们一个新的笔记本。我们将把SingleStoreDB和MindsDB的集成添加到笔记本中。为了正确使用每个集成,我们需要添加一个与特定集成相关的适当的代码单元。注意,你的代码执行结果可能与本文下面显示的输出不同。首先,让我们从SingleStoreDB开始。

SingleStoreDB集成

对于我们的快速入门,我们将使用鸢尾花数据集。我们将从放弃数据库开始。

SQL

DROP DATABASE IF EXISTS iris_db;

然后在SingleStoreDB中创建一个合适的数据库。

SQL

CREATE DATABASE iris_db;

现在我们需要一个表来存储数据。

SQL

CREATE TABLE iris_db.iris (
    sepal_length FLOAT,
    sepal_width FLOAT,
    petal_length FLOAT,
    petal_width FLOAT,
    species VARCHAR(20)
);

我们将直接加载数据,如下。

SQL

INSERT INTO iris_db.iris VALUES
(5.1,3.5,1.4,0.2,'Iris-setosa'),
(4.9,3,1.4,0.2,'Iris-setosa'),
(4.7,3.2,1.3,0.2,'Iris-setosa'),
(4.6,3.1,1.5,0.2,'Iris-setosa'),
(5,3.6,1.4,0.2,'Iris-setosa'),
...
(6.7,3,5.2,2.3,'Iris-virginica'),
(6.3,2.5,5,1.9,'Iris-virginica'),
(6.5,3,5.2,2,'Iris-virginica'),
(6.2,3.4,5.4,2.3,'Iris-virginica'),
(5.9,3,5.1,1.8,'Iris-virginica');

上面只显示了前五行和最后五行。完整的代码清单可以在GitHub上的笔记本文件中找到。

我们还可以用其他方式加载Iris的数据。例如,我们可以使用一个MySQL客户端。

Shell

mysql --local-infile -u admin -h <TO DO> -P 3306 --default-auth=mysql_native_password -p

<TO DO> 为主机(-h)被替换成从SingleStoreDB Cloud获得的值。然后我们可以从CSV 文件将数据加载到SingleStoreDB,如下所示。

SQL

USE iris_db;LOAD DATA LOCAL INFILE '/path/to/iris.csv'
INTO TABLE iris
IGNORE 1 LINES
COLUMNS TERMINATED BY ',';

Iris的数据集以CSV格式广泛提供。

  • /path/to/ 将需要用CSV文件所在的实际路径来代替。
  • 在上面的例子中,我们忽略了标题行(IGNORE 1 LINES)。如果没有标题行,我们将需要调整代码。

一旦数据被加载到SingleStoreDB,我们就可以检查该表了。

SQL

SELECT *
FROM iris_db.iris
LIMIT 5;

输出应该类似于下面的内容。

纯文本

+------------+------------+------------+------------+-------------+
| sepal_l... | sepal_w... | petal_l... | petal_w... | species     |
+------------+------------+------------+------------+-------------+
|        5.1 |        3.5 |        1.4 |        0.2 | Iris-setosa |
|        4.9 |          3 |        1.4 |        0.2 | Iris-setosa |
|        4.7 |        3.2 |        1.3 |        0.2 | Iris-setosa |
|        5.4 |        3.9 |        1.7 |        0.4 | Iris-setosa |
|        4.6 |        3.4 |        1.4 |        0.3 | Iris-setosa |
+------------+------------+------------+------------+-------------+

MIndsDB集成

接下来,我们将切换到MindsDB集成单元。如果之前创建了这个特定的DATASOURCE ,应该运行下面的单元格。

SQL

DROP DATASOURCE iris_db;

我们现在将创建DATASOURCE 到SingleStoreDB。

SQL

CREATE DATASOURCE iris_db
WITH ENGINE = "singlestore",
     PARAMETERS = {
         "user" : "admin",
         "password" : "<TO DO>",
         "host" : "<TO DO>",
         "port" : "3306",
         "database" : "iris_db"
     }

密码主机<TO DO> ,应该用创建集群时从SingleStoreDB Cloud获得的值替换。

我们现在可以从MindsDB检查表。

SQL

SELECT *
FROM iris_db.iris
LIMIT 5;

输出应该类似于以下内容。

纯文本

+------------+------------+------------+------------+-------------+
| sepal_l... | sepal_w... | petal_l... | petal_w... | species     |
+------------+------------+------------+------------+-------------+
| 4.6        | 3.1        | 1.5        | 0.2        | Iris-setosa |
| 5.0        | 3.6        | 1.4        | 0.2        | Iris-setosa |
| 5.0        | 3.4        | 1.5        | 0.2        | Iris-setosa |
| 4.8        | 3.4        | 1.6        | 0.2        | Iris-setosa |
| 5.8        | 4.0        | 1.2        | 0.2        | Iris-setosa |
+------------+------------+------------+------------+-------------+

如果之前创建了PREDICTOR ,应该运行下面的单元。

SQL

DROP PREDICTOR mindsdb.iris_model_v1;

而我们将创建一个新的PREDICTOR

SQL

CREATE PREDICTOR mindsdb.iris_model_v1
FROM iris_db (SELECT * FROM iris)
PREDICT species;

我们可以通过运行和重新运行以下命令来查看状态。

SQL

SHOW PREDICTORS;

状态字段将从生成-->训练-->完成改变。前五列的输出应该与下面类似。

纯文本

+---------------+----------+----------+---------+---------------+---
| name          | status   | accuracy | predict | update_status |
+---------------+----------+----------+---------+---------------+---
| iris_model_v1 | complete | 1.0      | species | up_to_date    |
+---------------+----------+----------+---------+---------------+---

当状态字段被标记为完成时,我们可以通过使用以下命令获得更多关于模型的信息。

SQL

DESCRIBE iris_model_v1;

并获得关于特征的详细信息,如下所示。

SQL

DESCRIBE iris_model_v1.features;

我们还可以使用一些虚构的数据值来进行预测。

SQL

SELECT species, species_confidence, species_explain
FROM mindsdb.iris_model_v1
WHERE sepal_length = 5.2 AND
      sepal_width = 3.6 AND
      petal_length = 1.5 AND
      petal_width = 0.3;

输出结果应该与下面类似。

纯文本

+-------------+--------------------+--------------------------------
| species     | species_confidence | species_explain
+-------------+--------------------+--------------------------------
| Iris-setosa | 0.9999             | {"predicted_value": "Iris-
|             |                    | setosa",
|             |                    | "confidence": 0.9999,
|             |                    | "anomaly": null,
|             |                    | "truth": null}
+-------------+--------------------+--------------------------------

我们还可以比较所有数据的实际值和预测值,如下所示。

SQL

SELECT orig_table.species AS actual,
       pred_table.species AS predicted
FROM iris_db.iris AS orig_table
JOIN mindsdb.iris_model_v1 AS pred_table;

这应该产生类似于以下的输出。

普通文本

+-----------------+-----------------+
| actual          | predicted       |
+-----------------+-----------------+
| Iris-setosa     | Iris-setosa     |
| Iris-setosa     | Iris-setosa     |
| Iris-setosa     | Iris-setosa     |
| Iris-setosa     | Iris-setosa     |
| Iris-setosa     | Iris-setosa     |
...
| Iris-virginica  | Iris-virginica  |
| Iris-virginica  | Iris-virginica  |
| Iris-virginica  | Iris-virginica  |
| Iris-virginica  | Iris-virginica  |
| Iris-virginica  | Iris-virginica  |
+-----------------+-----------------+

上面只显示了前五行和最后五行。

Python集成

使用一个标准的Deepnote单元格,可以使用一些快速的Python代码来显示任何错误分类。

Python

print(df[df["actual"] != df["predicted"]])

例如,我们可以看到下面的输出。

纯文本

              actual       predicted
115  Iris-versicolor  Iris-virginica

我们还可以创建一个快速混淆矩阵,如下所示。

Python

import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix

classes = ["Iris-setosa", "Iris-versicolor", "Iris-virginica"]

sns.heatmap(
    confusion_matrix(df["actual"], df["predicted"]),
    cmap = "Reds",
    xticklabels = classes,
    yticklabels = classes,
    annot = True
)

plt.title("Confusion Matrix")
plt.xlabel("Predicted")
plt.ylabel("Actual")

例如,我们可能会看到图3中所示的图表。

图3.混淆矩阵。

从图3中,我们可以看到有一个Iris-versicolor的实例被误归类为Iris-virginica

如果我们多次重新运行代码来重建我们的ML模型,我们会经常看到一些Iris-versicolorIris-virginica的实例被错误分类。为了了解原因,我们可以使用Plotly的一个例子来创建一个图。

Python

import plotly.express as px

df = px.data.iris()

fig = px.scatter_matrix(
    df,
    dimensions = ["sepal_width", "sepal_length", "petal_width", "petal_length"],
    color = "species",
    symbol = "species",
    title = "Scatter matrix of Iris data set",
    labels = {col:col.replace('_', ' ') for col in df.columns}
)

fig.update_traces(diagonal_visible = False)

fig.show()

这就产生了图4所示的图表。

图4.虹膜散点矩阵。

从图4中,我们可以看到Iris-setosa是相当明显的。然而,Iris-versicolorIris-virginica之间经常有重叠。

总结

本文展示了如何快速结合几种现代技术来建立一个数据科学栈。虽然我们可以在不同的平台上运行命令以获得相同的结果,但使用Deepnote使我们能够在一个单一的环境中工作,获得所有必要的工具,节省了时间和精力。

使用SingleStoreDB进行数据存储为我们提供了一个坚实的平台,可以进行分析并大规模地处理数据。

MindsDB提供的SQL接口使具有良好SQL技能的开发人员能够立即产生效益;开发人员可以快速建立ML模型并进行预测。

在未来的文章中,我们将进一步探索SingleStoreDB和MindsDB的整合,并测试MindsDB在其他领域的能力,如时间序列数据