機(jī)器學(xué)習(xí)選擇 Python 還是 R 語言?要不直接用 SQL 吧!

作者: 不剪發(fā)的Tony老師
畢業(yè)于北京航空航天大學(xué),十多年數(shù)據(jù)庫管理與開發(fā)經(jīng)驗,目前在一家全球性的金融公司從事數(shù)據(jù)庫架構(gòu)設(shè)計。CSDN學(xué)院簽約講師以及GitChat專欄作者。csdn上的博客收藏于以下地址:https://tonydong.blog.csdn.net


文章目錄

    MindsDB 簡介
    MindsDB 安裝
    使用案例
        配置 MySQL
        配置 MindsDB
        訓(xùn)練模型
        預(yù)測結(jié)果
        刪除模型
        多目標(biāo)預(yù)測
    總結(jié)

機(jī)器學(xué)習(xí)離不開數(shù)據(jù),機(jī)器學(xué)習(xí)框架(TensorFlow、scikit-learn、Pytorch 等)通常都需要從 CSV 文件或者其他數(shù)據(jù)源讀取數(shù)據(jù),其中主要的數(shù)據(jù)源就是數(shù)據(jù)庫。所以,無論你是使用 Python、R 還是其他編程語言,都需要編寫一些代碼獲取和準(zhǔn)備數(shù)據(jù);同時這種數(shù)據(jù)的格式轉(zhuǎn)換和傳輸都需要消耗一定的時間和資源。

如果能夠直接在數(shù)據(jù)庫中訓(xùn)練機(jī)器學(xué)習(xí)模型并且進(jìn)行預(yù)測,而且一切都使用 SQL 語句完成,是不是更加簡單高效呢??!今天我們給大家介紹一個基于數(shù)據(jù)庫的機(jī)器學(xué)習(xí)平臺:MindsDB,了解一下如何通過 SQL 語句實現(xiàn)機(jī)器學(xué)習(xí)預(yù)測模型。

如果覺得文章有用,歡迎評論??、點贊??、推薦??
MindsDB 簡介

在這里插入圖片描述





MindsDB 是一個基于數(shù)據(jù)庫的開源 AI 平臺,通過直接為數(shù)據(jù)庫引入機(jī)器學(xué)習(xí)功能,從而提高工作效率。MindsDB 可以直接通過 SQL 語句創(chuàng)建、訓(xùn)練、測試模型以及進(jìn)行預(yù)測,目前支持的數(shù)據(jù)庫系統(tǒng)包括 MySQL、MariaDB、SQL Server、PostgreSQL、ClickHouse、MongoDB 等。
在這里插入圖片描述

MindsDB 是一個基于 Python(Pytorch)的 AutoML 框架,也支持通過編碼進(jìn)行模型的訓(xùn)練和預(yù)測,除了數(shù)據(jù)庫之外還支持 CSV、Excel、JSON、文本文件、pandas DataFrame、URL、s3 文件等數(shù)據(jù)源。 MindsDB 使用 lightwood 代碼庫實現(xiàn)了簡化的自動機(jī)器學(xué)習(xí)。MindsDB 還提供了 JavaScript 和 Python 開發(fā)包,可以通過 HTTP 接口實現(xiàn)所有功能。

除此之外,MindsDB 還提供了一個圖形管理界面 MindsDB Scout,可以從數(shù)據(jù)庫、本地文件、或者外部數(shù)據(jù)源上傳、分析以及可視化數(shù)據(jù),訓(xùn)練模型以及查詢結(jié)果。

在這里插入圖片描述

MindsDB 安裝

MindsDB 需要 python 3.6 以上版本,推薦使用虛擬環(huán)境。首先創(chuàng)建并激活環(huán)境:

python -m venv venv

Windows

.\venv\Scripts\activate

Linux、macOS

source venv/bin/activate

然后使用 pip 安裝 MindsDB:

pip install mindsdb

最后運行 MindsDB 服務(wù):

python -m mindsdb

運行成功返回以下類似信息:


mysql API: started on 47335

  • GUI available at http://127.0.0.1:47334/index.html
    http API: started on 47334

通過地址 http://127.0.0.1:47334 可以訪問 MindsDB API;通過地址 http://127.0.0.1:47334/index.html 可以訪問圖形界面 MindsDB Scout。
在這里插入圖片描述

??其他的安裝方式(包括 Docker)和相關(guān)問題,可以參考官方文檔。

使用案例

接下來我們使用 MindsDB 和 MySQL 數(shù)據(jù)庫訓(xùn)練一個預(yù)測消費的機(jī)器學(xué)習(xí)模型,并且對數(shù)據(jù)進(jìn)行預(yù)測。
在這里插入圖片描述

配置 MySQL

首先,MySQL 需要啟動 FEDERATED 存儲引擎支持;可以在啟動服務(wù)時使用 --federated 命令行參數(shù)或者在配置文件中的 [mysqld] 部分增加一行內(nèi)容:

federated

啟動 MySQL 服務(wù)后使用 SHOW engines 語句確認(rèn)支持 FEDERATED 存儲引擎:

mysql> SHOW engines\G
*************************** 1. row ***************************
Engine: FEDERATED
Support: YES
Comment: Federated MySQL storage engine
Transactions: NO
XA: NO
Savepoints: NO

接下來我們需要準(zhǔn)備一些訓(xùn)練模型的數(shù)據(jù),本文使用的示例數(shù)據(jù)來源于首爾的空氣污染測量數(shù)據(jù),可以點此下載。其中 train.csv 是訓(xùn)練數(shù)據(jù),test.csv 是測試數(shù)據(jù)。在 MySQL 中執(zhí)行以下命令創(chuàng)建一個新的數(shù)據(jù)庫 data 和數(shù)據(jù)表 pollution_measurement 并加載訓(xùn)練數(shù)據(jù):

CREATE DATABASE IF NOT EXISTS data;

CREATE TABLE data.pollution_measurement(
measurement_date datetime,
station_code varchar(10),
address varchar(100),
latitude double,
longitude double,
so2 decimal(10, 5),
no2 decimal(10, 5),
o3 decimal(10, 5),
co decimal(10, 5),
pm10 decimal(5, 1),
pm25 decimal(5, 1)
);

LOAD DATA INFILE ‘train.csv’
INTO TABLE data.pollution_measurement columns terminated by ‘,’;

查看一下導(dǎo)入的訓(xùn)練數(shù)據(jù):

SELECT count(*) FROM data.pollution_measurement;

count(*)
518617

SELECT * FROM data.pollution_measurement LIMIT 5;

measurement_datestation_codeaddresslatitudelongitudeso2no2o3copm10pm25
2017-01-01 00:00:0010119, Jong-ro 35ga-gil, Jongno-gu, Seoul, Republic of Korea37.572016399999995127.005007499999990.004000.059000.002001.2000073.057.0
2017-01-01 01:00:0010119, Jong-ro 35ga-gil, Jongno-gu, Seoul, Republic of Korea37.572016399999995127.005007499999990.004000.058000.002001.2000071.059.0
2017-01-01 03:00:0010119, Jong-ro 35ga-gil, Jongno-gu, Seoul, Republic of Korea37.572016399999995127.005007499999990.004000.056000.002001.2000070.058.0

配置 MindsDB

首先為 MindsDB 創(chuàng)建一個新的配置文件 config.json,內(nèi)容如下:

{
“api”: {
“http”: {
“host”: “0.0.0.0”,
“port”: “47334”
},
“mysql”: {
“host”: “127.0.0.1”,
“password”: “Qwer!1234”,
“port”: “47335”,
“user”: “root”
}
},
“config_version”: “1.3”,
“debug”: true,
“integrations”: {
“default_mysql”: {
“enabled”: true,
“host”: “192.168.56.104”,
“password”: “pass1234!”,
“port”: 3306,
“type”: “mysql”,
“user”: “root”
}
},
“l(fā)og”: {
“l(fā)evel”: {
“console”: “DEBUG”,
“file”: “INFO”
}
},
“storage_dir”: “/storage”
}

其中的選項如下:

api[‘http’] ,用于配置 MindsDB http 服務(wù)器的啟動信息:
    host(默認(rèn) 127.0.0.1), mindsdb 服務(wù)器地址。
    port(默認(rèn) 47334),mindsdb 服務(wù)器端口。
api[‘mysql’] ,用于配置通過 MySQL 協(xié)議進(jìn)行數(shù)據(jù)庫集成的信息:
    user(默認(rèn) root)。
    password(默認(rèn)為空)。
    host(默認(rèn)為 127.0.0.1)。
    port(默認(rèn)為 47335)。
integrations[‘default_mysql’],指定集成類型,這里是 default_mysql。相關(guān)的配置項如下:
    user(默認(rèn) root)。MySQL 用戶名。
    host(默認(rèn) 127.0.0.1)。MySQL 服務(wù)器地址。
    password,MySQL 用戶密碼。
    type,集成類型。包括 mariadb、postgresql、mysql、clickhouse、mongodb 等。
    port(默認(rèn) 3306)。MySQL 服務(wù)的 TCP/IP 端口。
    enabled(true | false)。是否啟用該集成。
log[‘level’],日志配置(可選項):
    console,日志級別,包括 INFO、DEBUG、ERROR。
    file,日志文件位置。
storage_dir,mindsdb 默認(rèn)和配置的存儲目錄。

然后重新啟動 MindsDB 服務(wù):

python -m mindsdb --api=mysql --config=“C:\Users\dongx\venv\Scripts\config.json”

其中,–api 參數(shù)指定 API 的類型為 mysql.; --config 參數(shù)指定了配置文件的位置。

啟動服務(wù)之后會連接 MySQL 數(shù)據(jù)庫,創(chuàng)建一個新的數(shù)據(jù)庫 mindsdb,并且創(chuàng)建兩個 FEDERATED 存儲引擎表:

mysql> use mindsdb;
mysql> show tables;
±------------------+
| Tables_in_mindsdb |
±------------------+
| commands |
| predictors |
±------------------+
2 rows in set (0.01 sec)

其中,predictors 是用于存儲預(yù)測模型、訓(xùn)練狀態(tài)、準(zhǔn)確率、目標(biāo)變量以及訓(xùn)練選項的表:

mysql> show create table predictors\G
*************************** 1. row ***************************
Table: predictors
Create Table: CREATE TABLE predictors (
name varchar(500) DEFAULT NULL,
status varchar(500) DEFAULT NULL,
accuracy varchar(500) DEFAULT NULL,
predict varchar(500) DEFAULT NULL,
select_data_query varchar(500) DEFAULT NULL,
external_datasource varchar(500) DEFAULT NULL,
training_options varchar(500) DEFAULT NULL,
KEY name_key (name)
) ENGINE=FEDERATED DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci CONNECTION=‘mysql://root_default_mysql:Qwer!1234@192.168.56.1:47335/mindsdb/predictors’
1 row in set (0.00 sec)

訓(xùn)練模型

接下來我們就可以通過 SQL 語句訓(xùn)練一個新的機(jī)器學(xué)習(xí)模型,只需要往 mindsdb.predictors 表中插入一條數(shù)據(jù)即可,例如:

INSERT INTO mindsdb.predictors(name, predict, select_data_query)
VALUES (‘a(chǎn)irq_predictor’, ‘so2’, ‘SELECT * FROM data.pollution_measurement’);

其中,

name 是預(yù)測模型(predictor)的名稱,類型為字符串;
predict 是想要預(yù)測的目標(biāo)特征,類型為字符串。示例中為二氧化硫(SO2)含量;
select_data_query,為模型提供訓(xùn)練數(shù)據(jù)的查詢語句,類型為字符串。

該語句需要等待一段時間,訓(xùn)練完成后 predictors 表中會生成一條記錄:

mysql> select * from mindsdb.predictors;
±---------------±---------±---------±--------±--------------------±--------------------±-----------------+
| name | status | accuracy | predict | select_data_query | external_datasource | training_options |
±---------------±---------±---------±--------±--------------------±--------------------±-----------------+
| airq_predictor | complete | 0.987 | so2 | MySqlDS: mysql/None | | |
±---------------±---------±---------±--------±--------------------±--------------------±-----------------+
1 row in set (0.61 sec)

其中 status 字段為 complete 表示模型訓(xùn)練完成。
預(yù)測結(jié)果

預(yù)測模型訓(xùn)練完成之后,還會創(chuàng)建一個模型表 airq_predictor。直接查詢模型表就可以獲取預(yù)測的目標(biāo)變量、置信度以及解釋信息,例如:

SELECT
so2 AS predicted,
so2_confidence AS confidence,
so2_explain AS info
FROM airq_predictor
WHERE (no2 = 0.005)
AND (co = 1.2)
AND (pm10 = 5)\G

*************************** 1. row ***************************
predicted: 0.001156540079952395
confidence: 0.9869
info: {
“predicted_value”: 0.001156540079952395,
“confidence”: 0.9869,
“prediction_quality”: “very confident”,
“confidence_interval”: [0.003184904620383531, 0.013975553923630717],
“important_missing_information”: [“Station code”, “Latitude”, “O3”],
“confidence_composition”: {
“co”: 0.006
},
“extra_insights”: {
“if_missing”: [{
“no2”: 0.007549311956155897
}, {
“co”: 0.005459383721227349
}, {
“pm10”: 0.003870252306568623
}]
}
}
1 row in set (0.00 sec)

從結(jié)果可以看出,MindsDB 預(yù)測的二氧化硫數(shù)值為 0.0011565,置信度為 98.69 %。
刪除模型

如果想要刪除之前創(chuàng)建的預(yù)測模型,可以執(zhí)行以下 SQL 語句:

INSERT INTO mindsdb.commands values (‘DELETE predictor airq_predictor’);

多目標(biāo)預(yù)測

另外,MindsDB 也可以訓(xùn)練預(yù)測多個目標(biāo)特征的模型,只需要為 predict 字段指定一個逗號分隔的預(yù)測目標(biāo)。例如,使用以下語句創(chuàng)建一個預(yù)測 so2 和 pm25 的模型:

INSERT INTO mindsdb.predictors(name, predict, select_data_query)
VALUES (‘a(chǎn)irq_predictor’, ‘so2, pm25’, ‘SELECT * FROM data.pollution_measurement’);

然后使用以下語句進(jìn)行預(yù)測:

SELECT
so2 AS predicted,
so2_confidence AS confidence,
so2_explain AS info
FROM
mindsdb.airq_predictor
WHERE
select_data_query=‘SELECT pm25 FROM mindsdb.airq_predictor limit 10’;

總結(jié)

本文介紹了如何利用 MindsDB 機(jī)器學(xué)習(xí)平臺編寫 SQL 語句實現(xiàn)預(yù)測模型,可以看出這種方式非常簡單易用。當(dāng)然,MindsDB 還提供了一個更簡單的圖形用戶界面 Scout,意味著直接在頁面點擊即可完成模型的訓(xùn)練和預(yù)測。

除了使用 SQL 語句之外,MindsDB 同樣支持編寫 Python 或者 Javascript 代碼創(chuàng)建預(yù)測模型,更多的功能和示例可以參考官方文檔 和 GitHub 示例。