使用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集成。
- MySQL
- 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-versicolor和Iris-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-versicolor和Iris-virginica之间经常有重叠。
总结
本文展示了如何快速结合几种现代技术来建立一个数据科学栈。虽然我们可以在不同的平台上运行命令以获得相同的结果,但使用Deepnote使我们能够在一个单一的环境中工作,获得所有必要的工具,节省了时间和精力。
使用SingleStoreDB进行数据存储为我们提供了一个坚实的平台,可以进行分析并大规模地处理数据。
MindsDB提供的SQL接口使具有良好SQL技能的开发人员能够立即产生效益;开发人员可以快速建立ML模型并进行预测。
在未来的文章中,我们将进一步探索SingleStoreDB和MindsDB的整合,并测试MindsDB在其他领域的能力,如时间序列数据。