去年就偶遇MindsDB,当时docker部署体验,bug太多,直接放弃。近期闲逛github趋势,MindsDB再次出现(上了周榜)。想必是Bug修复了,能稳定运行,决定再深度使用它,看看能不能在生产环境中发挥些作用(拭目以待~)。
0、一般建模姿势
一般我们根据业务场景进行建模,按以下模块进行处理(这里只讨论机器学习建模):
- 数据预处理:获取所需数据(from数据库or数仓)、数据清洗并标签化、特征工程;
- 模型构建:模型选择、参数优化、集成算法、模型验证;
- 模型上线:模型部署、运行监控、模型改进;
想要完成以上模块,要求数据分析师对业务知识、数据处理、模型理论、工程代码均比较熟悉,也比较耗时、耗人力,甚至会得到最终效果不理想的结果~
模型效果不好,一般有以下几个原因(可能不全哈~):
- 数据质量本身就不高,比如说某强特征缺失比较严重;
- 数据量不大,几千条数据估计也很难构建健壮的模型;
- 特征不够多,与target相关性本身就很低;
- 特征工程做的不好, 模型没学好;
- 模型选择得不好,很多trick没用上;模型没优化好;
对于业务数据分析师来说,以上几点都需要通过对机器学习有深入的理解和不断实践总结经验才能解决。但很多情况下是,一顿操作下来,不如别人画个回归来的实在。
1、什么是MindsDB
MindsDB利用AI-table的概念将机器学习引入现有的SQL数据库。AI表将机器学习模型集成为数据库中的虚拟表,创建预测,并可以使用简单的SQL语句进行查询。几乎可以立即在数据库中直接进行时间序列、回归和分类预测。
MindsDB可直接在数据库中进行建模,省去了数据处理、搭建机器学习模型等头疼的步骤,可以说是一步到位。对于数据分析师、商业分析师无须了解过多数据工程、建模知识,即可开箱使用,非常舒服(一下子降低了建模门槛,人人都是数据分析师,人人都会应用算法了~)。其实这类工具不少,还有一些图形化界面的机器学习平台,这里不作讨论,咱们重点挖掘mindsdb的特点。
先来看看MindsDB架构图:
上图中,左边是数据库or数据仓库,右边是建模常用的python库,mindsdb在中间,相当于直接连接了数据与模型。
既然这么爽,就来体验下这个开源产品~
2、安装部署
我的部署环境:Centos7,Mysql8,Python3.6
MindsDB安装
根据官方文档的指引,我这边选择linux服务器进行部署(也可以用Docker部署哦~)。
特别提醒:最好在python3.6环境以上进行,版本太低了,估计各种依赖问题。
- 创建虚拟环境;
- 直接pip安装(有些耗时,要下载的包很多很多....如果网络问题,可以手动下载whl进行安装);
- pip freeze,看看如果不报错,说明安装成功了。
另外,我这边选用mysql作为数据库,这边支持的数据库有很多种,基本覆盖但没oracle的。
特别提醒:如果采用mysql,则需要mysql8,mysql5没用,就算部署成功也没法用(别问我怎么知道的~)
3、配置与运行
mindsdb提供mysql api,有个GUI界面可方便连接数据库、上传数据,需要修改一下json配置文件。
config.json配置:
现在可以启动MindsDB服务啦~
- 进入MindsDB虚拟环境;
- python3 -m mindsdb --api=http,mysql --config=config.json
看到这2部分,说明mindsdb数据库以及api接口也启动成功了。
访问api接口:
首次连接,需要配置一下需要连接的数据库,并测试连接:
服务器端登陆mindsdb数据库:
mysql -h 127.0.0.1 --port 47335 -u root-p (可以更改配置文件中的配置,我这里就把用户名改成了root)
4、使用MindsDB建模
下图中,第二个数据库就是MindsDB,第四个数据库就是外部连接的Mysql。
根据官方文档的介绍,重点关注的就是这张predictors表,暂且叫预测器。关于预测器,文档有详细的参数介绍,这里就不多介绍了。
学习一个产品,先了解基本的架构、概念、进行简单demo实现,再去做深挖,降低学习曲线,不然很容易放弃。
本着这个原则,我们也不搞花里花哨的,先把一个简单的模型跑起来看看,跑通这个产品先。
官方示例:客户流失预测 https://docs.mindsdb.com/sql/...
建立预测过程的标准代码:
- predictor_name (string) - 模型名称;
- integration_name (string) - 所连接的外部数据库的名称;
- column_name (string) - 我们想要预测的列;
CREATE PREDICTOR predictor_name
FROM integration_name
(SELECT column_name, column_name2 FROM table_name)
PREDICT column_name as column_alias;
根据介绍,我们换个数据实操一下,就拿万年helloworld数据集--泰坦尼克号作为例子。
- 下载数据集,导入数据至外部数据库中(mysql8),为了简化过程,删除了一些类别列;
切换到mindsdb数据库中,创建预测过程;
CREATE PREDICTOR taitan_model FROM MYSQL8 (SELECT * FROM taitan) PREDICT survived as cus_survived;
查看模型结果
status=‘complete’表示模型跑完了,acc=0.699,不是很高哈,可能是我删除了很多有效特征(这个不重要哈,主要是想快速跑通这个流程~)
SELECT * FROM predictors WHERE name='taitan_model';
看运行日志可以发现,自动建模的过程中,采用了神经网络和lightgbm,最后比较结果,选择了lightgbm。
根据训练好的模型,进行简单预测:
SELECT Survived, Survived_confidence, Survived_explain as Info
FROM mindsdb.taitan_model
WHERE when_data='{"Pclass": 1, "AAge": 25, "Parch": 0, "SibSp": 1, "Embarked": "S"}';
输入不同特征值,模型输出预测结果:
对于输入特征,预测结果为 Survived=1,并且还给出了置信度=99%。
5、官方示例
官方给出了比较多的示例,我们再看一个时序预测的示例:
数据集来自美国芝加哥交通管理局的公交乘车数据,该数据描述的是每条公交线路每天的乘车次数:
进入mindsdb数据库
use mindsdb; show tables
建立预测模型
CREATE PREDICTOR rides_forecaster_demo FROM snf ( SELECT ROUTE, RIDES, DATE FROM CHICAGO_TRANSIT_AUTHORITY.PUBLIC.CTA_BUS_RIDES_LATES T WHERE DATE > '2020-01-01') PREDICT RIDES ORDER BY DATE GROUP BY ROUTE WINDOW 10 HORIZON 7;
- rides_forecaster_demo:模型名称
- PREDICT RIDES :预测rides字段的值
- order by date : 根据date排序(时序预测,对时间进行排序)
- group by route :根据route分组(因为有多条route,不同route对应的数据分别进行预测);
- window:时间窗口,这里的10代表根据前面的10条数据进行预测;
- horizon:预测期数,代表预测未来多少天的数据;
预测结果
这里将历史数据连接预测模型表,输出结果:
SELECT tb.ROUTE, tb.RIDES AS PREDICTED_RIDES FROM snf.PUBLIC.CTA_BUS_RIDES_LATEST AS ta JOIN mindsdb.rides_forecaster_demo AS tb WHERE ta.ROUTE = "171" AND ta.DATE > LATEST LIMIT 7;
ta.ROUTE = 171":选取171线路;
ta.DATE > LATEST(这个由mindsdb提供):获取每条路线未来的乘车次数;
LIMIT 7:预测未来7天的数据;
6、体验感受
MindsDB确实是一款非常新颖的建模产品,能直接在数据库中进行建模,给人耳目一线的感觉。国内也有一个开源产品叫Byzer,写sql就能进行建模,可以去深度体验一下。
MindsDB的优势在于,直连数据库并通过简单的SQL关键字即可在数据库中完成建模。
劣势在于,很多SQL关键字还有一些bug(比如创建预测过程时,第一次运行会报错),并且部署也较麻烦,很多包无法一键安装,需要手动下载并写入环境变量里,不然建模失败(类别特征会用到nltk_data分词处理,盲猜是用类似于nlp处理词向量的方式对类别特征进行编码?)
当前这个产品,还不能很好的投入生产环境中使用,但有几个场景还是比较方便,可酌情选择:
- 快速建模,验证数据质量,比如说某业务场景下,数据清洗好了,需做预测,可以先通过MindsDB建模,看看基于当前数据,模型baseline能到多少,进一步检验当前数据质量;
- 对于一些时序稳定的场景,可直接上MindsDB进行时序预测;
- 对于分类、回归场景,如果当前数据及特征能得到很好的预测效果(基于之前的建模经验),也可以直接上MindsDB;
参考链接:
欢迎关注个人公众号:DS数说