圆点 快速的未来即将来到你所在的城市。

加入 Redis 发布活动

Redis-ML 简介(第二部分)

本帖是介绍 Redis-ML 模块系列文章的第二部分。

在本系列的前一帖中,我们使用 Python scikit-learn 包和 Redis 建立了一个预测波士顿地区房屋价格中值系统的步骤。 使用线性回归(统计学中的一项强大工具),我们构建了一个定价模型,通过某个房屋的平均房间数预测一个社区的房屋中值价格。

帖子的最后我们提到下一帖将介绍分类,这是一种根据之前类别中的项目示例来识别项目所属类别的机器学习过程。但与其过早地进入下一主题,本帖会先结束线性回归的一些未尽事宜。

本帖中的示例代码需要与前一帖代码相同的 Redis 模块和 Python 包。 如果您已设置好环境,您可以跳过技术要求部分。 示例代码一经推出,将满足任何其他要求。

Redis 要求

本帖中的示例代码需要 Redis 4.0 或更高版本,且Redis-ML模块已加载。 要运行本帖中的示例,请启动 Redis,并使用 loadmodule 指令加载 Redis-ML 模块。 

redis-server --loadmodule /path/to/redis-ml/module.so

您可以从 Redis 命令行界面(redis-cli)运行 MODULE LIST 命令,并确保 redis-ml 显示在已加载模块列表中,以验证 Redis-ML 模块是否已加载:

127.0.0.1:6379> MODULE list
1) "name"
2) "redis-ml"
3) "ver"
4) (integer) 1

相反,您可以运行Shay Nativ提供的 Redis-ML Docker 容器,其中已预先配置好您需要的依赖关系。 要在本地部署 redis-ml 容器,请使用以下命令启动它:

docker run -it -p 6379:6379 shaynativ/redis-ml 

Docker run 命令将在必要时自动下载容器,并启动侦听端口 6379 的 Redis 4.0 服务器。 -p 选项将主机机的端口 6379 映射到容器中的端口 6379,因此请针对您的环境采取适当的安全预防措施。

本帖示例代码的 Redis 要求与第一部分示例代码的 Redis 要求相同,因此如果您设置了一个环境来对该帖代码进行实验,您可以继续使用它来完成本帖和后续帖子的学习。

Python 要求

要运行本帖示例 Python 代码,您需要安装以下软件包

  • scikit-learn (0.18.2)
  • numpy (1.13.1)
  • scipy (0.19.1)
  • redis (2.10.5)

您可以使用 pip3 或您首选的软件包管理器安装所有软件包。

线性回归模型

线性回归用一条标准方程式为  y=b + ax的直线表示两个变量关系。  该直线的参数(斜率和截距)在各个数据集之间不同,但模型的结构相同。

任何能够对数据集执行线性回归以找出直线参数的工具包都可结合 Redis 使用。  为了说明该模型的独立性,我们将使用 R(一种用于分析数据和执行实验的统计语言和环境)重新构建我们的房价预测器。  R 提供了多种数据分析功能,包括用于执行线性回归的包。  R 通常用作交互式数据探索工具,而不是批处理系统。

以下代码经过在 mac OS 上的 R.app 版本 3.4.1 的测试。  如果您有兴趣运行代码,可以从 R Project 网站下载该环境。  该代码依赖于 MASS包;如果您的 R 版本不包含 MASS包,请使用 R 的内置包管理器下载它。

在上一篇博文中构建的房价预测器使用 Python 运行线性回归,对样本数据使用 scikit-learn 包。  在找到能够最好地表示房间数量和附近房屋中位价关系的直线后,我们在 Redis 中重新创建该直线,并使用 Redis 根据观察到的特征预测未知的房价。

在本文中,我们将通过使用 R 重新实现线性回归程序来演示如何将不同工具包与 Redis 结合使用。  以下 R 代码将复制我们在上一篇博文中用 Python 代码执行的线性回归

# load our data 
library(MASS)
boston.data <- MASS::Boston

# split the dataframe into train and test data sets
boston.train <- boston.data[1:400, ]
boston.test <- boston.data[401:506, ]

# fit a linear regression using the rm column to our data
boston.lm = lm(medv ~ rm, data=boston.train)

# display model parameters
summary(boston.lm)

即使您从未使用过 R,该代码也应易于理解。  该程序的第一部分会加载我们的数据。  波士顿住房数据集是机器学习教学中使用的一组经典数据集。  R 与许多统计工具包一样,包括一些经典数据集。  对于 R 而言,波士顿住房数据集包含在 MASS包中,因此我们必须在可以访问数据之前加载 MASS包。

代码的第二部分将住房数据划分为训练集和测试集。 我们遵循 Python 版本中使用的方法,从前 400 个数据点创建训练集并将剩余的 106 个数据点保留为测试集。 由于 R 将我们的数据存储为 数据框,而不是存储为数组(如 scikit 所做),我们可以跳过切片和列提取,我们在 Python 中执行了这些操作,使我们的房间数据列更容易访问。

我们使用内置线性回归函数 (lm) 在 R 中执行线性回归。 

lm 的第一个参数用于描述数据框中的预测值和预测值。 对于此问题,我们使用 medv ~ rm ,因为我们正在根据平均房间数据预测中位数房价数据。

在脚本的最后一步,我们使用 summary 方法向用户显示拟合线的系数。

绘制我们的结果并将其与前一个代码中的结果进行比较

Plot of average rooms versus Housing Price
Linear regression using scikit

summary 方法显示了线性回归流程确定的系数:

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -35.2609     2.6289  -13.41   <2e-16 ***
rm            9.4055     0.4121   22.82   <2e-16 ***

与 scikit-learn 包一样,R 将我们线的斜率确定为 9.4055,截距确定为 -35.2609。 我们的 R 代码提供的结果与 scikit 相同,精确到小数点后第四位。

从这一点开始,设置 Redis 以预测房价的过程与之前相同。首先,使用 ML.LINREG.SET 命令创建一个线性回归键:

127.0.0.1:6379> ML.LINREG.SET boston_house_price:rm-only -35.2609 9.4055
OK

创建密钥后,使用 ML.LINREG.PREDICT 命令预测住房价值:

127.0.0.1:6379>  ML.LINREG.PREDICT boston_house_price:rm-only 6.2
"23.053200000000004”

将结果四舍五入到小数点后四位后,我们仍然会得到 23,053 美元的估计中位房价(请记住,我们的房价以千计)对于这个特定街区来说。

这可能是你第一次也是唯一一次运行 R,但使用 Redis 为你的模型提供服务时,重要的是要明白模型(而不是工具包)才是重要的。

线性回归中我们上次文章中没有涉及到的另一个重要主题是多元线性回归。

多元线性回归

在迄今为止我们展示的所有示例中,我们都使用单个变量来预测一个值。我们的住房预测仅使用平均房间大小来预测中等住房价值,但数据集有多个数据值(称为“特性”)与特定的中等房屋价格相关联。

线性回归通常使用多个变量来预测单个值。这给了我们一个看起来像y=0+1x1+ … + nxn的模型。在多元线性回归中,我们需要求解截距和每个变量的系数。

以下代码实现了多元线性回归,尝试使用波士顿住房数据中所有可用的数据列拟合一条预测线

import redis

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

# load out data
boston = load_boston()

# slice the data into train and test sets
x_train = boston.data[:400]
x_test =  boston.data[400:]
y_train = boston.target[:400,]
y_test = boston.target[400:,]

# fit the regression line
lm = LinearRegression()
lm.fit(x_train, y_train)

y_predict = lm.predict(x_test)

coef = lm.coef_
inter = lm.intercept_

for col, c in zip(boston.feature_names, coef):
    print('{colname:7}:t{coef:0.6f}'.format(colname=col,coef=c))
print("Intercept: {inter}".format(inter=inter))

    

# set the linear regression in Redis
cmd = ["ML.LINREG.SET", "boston_house_price:full"]
cmd.append(str(inter))
cmd.extend([str(c) for c in coef])

r = redis.StrictRedis('localhost', 6379)
r.execute_command(*cmd)

下表显示了 scikit 确定的最佳预测线的系数。每个系数都对应于一个特定的变量(特征)。例如,在我们的多元线性回归中,平均房间的常数现在是 4.887730,而不是仅考虑房间数据时产生的 9.4055。   

CRIM   : -0.191246
ZN     : 0.044229
INDUS  : 0.055221
CHAS   : 1.716314
NOX    : -14.995722
RM     : 4.887730
AGE    : 0.002609
DIS    : -1.294808
RAD    : 0.484787
TAX    : -0.015401
PTRATIO: -0.808795
B      : -0.001292
LSTAT  : -0.517954

Intercept: 28.672599590856002

从那里,我们创建一个 Redis 密钥boston_house_price:full 来存储我们表示的多元线性回归。请记住,Redis 对ML.LINREG命令的参数不使用命名参数。的系数的顺序ML.LINREG.SET 必须与变量值的顺序相匹配ML.LINREG.PREDICT调用。例如,使用上述线性回归代码,我们需要对ML.LINREG.PREDICT 调用使用以下参数顺序:

127.0.0.1:6379>  ML.LINREG.PREDICT boston_house_price:all <CRIM> <ZN> <INDUS> <CHAS> <NOX> <RM> <AGE> <DIS> <RAD> <TAX> <PTRATIO> <B> <LSTAT>

这篇文章展示了工具包的独立性,并解释了多元线性回归,以完善我们关于线性回归的第一篇文章。我们重新审视了我们的住房价格预测器,并使用 R 而不是 Python“重建”了它,以实现线性回归阶段。

R 对住房问题应用了与 scikit 相同的数学模型,并为该线学习了相同​​的参数。从那里开始,这是一个几乎相同的过程,在 Redis 中设置密钥并将 Redis 部署为预测系统。


在下一篇文章中,我们将研究逻辑回归以及如何使用 Redis 构建一个强大的分类引擎。我们保证。与此同时,如果您对本篇文章或之前的文章有任何疑问,请在推特上 (@tague) 与作者联系。