内置分析封装器

以下章节介绍了不同Netezza Analytics函数的支持封装器、主要参数和参数。 这些章节还提供了如何使用这些功能的简单示例。

有关这些函数的选项和参数的完整列表,请使用 R 内置帮助系统。 例如,要调用 "nzGlm()的帮助页面,可以使用以下命令:
> help(nzGlm)

由于 NZA 软件包提供的大部分函数都是对 "Netezza Analytics函数的封装,因此您还可以查看 "Netezza Analytics数据库内分析开发人员指南和 "Netezza Analytics数据库内分析参考指南以了解详情。 例如,如果您对 "nzGlm()函数链接参数的详细信息感兴趣,Netezza Analytics数据库内分析开发人员指南中有关 GLM 的部分将为您详细介绍可用的各个链接功能。

决策树

Netezza Analytics软件包提供一套复杂的算法。 下面介绍一个决策树算法的简单示例。 下文将举例说明其他统计和数据挖掘算法。

假设成人数据集存储在数据库 MM 的表 ADULT 中。 在下面的代码片段中,先创建了一个数据库连接,然后创建了一个指向数据表的指针。 然后,拟合决策树模型,最后将拟合模型下载到 R 中。 所有步骤对 R 用户都是透明的。

第一步是与数据库建立连接。
# loads necessary
packages library(nza)
# connects to the mm database nzConnect("user",
"password", "TT4-R040", "mm")
# creates a pointer to the data set stored in the table
adult nzadult = nz.data.frame("adult")
nzadultR 对象是指向Netezza系统中 "ADULT表的指针。 它是 "nz.data.frame类的一个对象,具有 print()、[,]等重载函数。 如NetezzaR 库所述,它与标准的 "data.frame对象相对应,但远程存储在数据库中。

作为Netezza分析例程包装器的 R 函数可以将此指针作为参数。 本示例使用Netezza AnalyticsLibrary for R 软件包中的函数 "nzDecTree()构建分类树。 nzDecTree()函数是一个 R 封装器,用于准备 SQL 查询,远程调用Netezza Analytics的 "DECTREE存储过程。 程序远程运行后,最终模型将返回 R。 接下来,模型被转换为树形类对象,其结构与使用 R "tree()函数创建的对象类似。

请看下面的例子:根据年龄、性别和每周工作时间等变量,建立一棵预测收入变量的决策树。 id 参数指定了数据集 "ADULT中的 "ID列。
# build a tree using built-in analytics
adultTree = nzDecTree(INCOME~AGE+SEX+HOURS_PER_WEEK, nzadult, id="ID")
函数输出存储在数据库中,而函数 "nzDecTree()默认将其转换为同名软件包指定的树类 R 对象。 因此,诸如 "print()、"plot()或 "predict()等重载函数都可以在此对象上运行。 在 R 中打印或可视化树是可能的,即使它是为一个拥有数百万行的大型数据集而拟合的。
# plot and print the
tree plot(adultTree)
print(adultTree)
#node), split, n, deviance, yval, (yprob)
# * denotes terminal node
#
# 1) root 32561 0 small ( 0.24081 0.75919 )
# 2) AGE < 27 8031 0 small ( 0.03213 0.96787 ) *
# 3) AGE > 27 24530 0 small ( 0.30913 0.69087 )
# 6) SEX=Female 7366 0 small ( 0.15096 0.84904 ) *
# 7) SEX < >Female 17164 0 small ( 0.37701 0.62299 )
# 14) HOURS_PER_WEEK < 41 10334 0 small ( 0.29988 0.70012 ) *
# 15) HOURS_PER_WEEK > 41 6830 0 small ( 0.49370 0.50630 )
# 30) AGE < 35 1925 0 small ( 0.34649 0.65351 ) *
# 31) AGE > 35 4905 0 large ( 0.55148 0.44852 ) *
拟合模型可应用于另一个数据集。 如果数据集存储在数据库表中,则可以使用重载函数 predict() 在Netezza 内部进行分类,从而避免大量数据传输。
# use the previously created tree for prediction of the same
data adultPred = predict(adultTree, nzadult)
# download the prediction results into a data.frame
head(as.data.frame(adultPred))
# ID CLASS
#1 1 small
#2 2 small
#3 3 small
#4 4 small
#5 5 small
#6 6 small
除了返回树类对象外,"nzDecTree还可能返回同名软件包中指定的 "rpart类对象。 该对象还支持 rpart 的重载函数,如 print()plot()predict()
adultRpart = nzDecTree(INCOME~AGE+SEX+HOURS_PER_WEEK, nzadult,
id="ID", format="rpart")
plot(adultRpart)
print(adultRpart)
#n= 32561
#
#node), split, n, loss, yval, (yprob)
# * denotes terminal node
#
# 1) root 32561 NA small (0.240809.... 0.759190....)
# 2) AGE< 27 8031 NA small (0.032125.... 0.967874....) *
# 3) AGE>=27 24530 NA small (0.309131.... 0.690868....)
# 6) SEX=Female 7366 NA small (0.150963.... 0.849036....) *
# 7) SEX=<other> 17164 NA small (0.377010.... 0.622989....)
# 14) HOURS_PER_WEEK< 41 10334 NA small (0.299883.... 0.700116....) *
# 15) HOURS_PER_WEEK>=41 6830 NA small (0.493704.... 0.506295....)
# 30) AGE< 35 1925 NA small (0.346493.... 0.653506....) *
# 31) AGE>=35 4905 NA large (0.551478.... 0.448521....) *

回归树

下面的示例演示了回归树。 其基本思想与决策树相同。 本代码片段使用的是 "WEATHERR数据集。 所关注的变量是等级,这是一个连续变量。 变量等级的平均值存储在回归树的每个相应叶中。

首先,创建数据库连接和指向Netezza表的指针。
# loads necessary
packages library(nza)
# connect to the nza database
nzConnect("user", "password", "TT4-R040", "nza")
# a pointer to the WEATHERR table is created
weatherr = nz.data.frame("WEATHERR")
要远程构建回归树,需要使用 "nzRegTree()函数。 它调用Netezza Analytics存储过程 "REGTREE。 只有最终模型,即拟合树的参数,才会下载到 R 中,并按照同名软件包的规定转化为树类对象。 此示例根据数据集中的所有其他变量构建了一棵回归树,用于预测变量的成绩。 id 参数指定了数据集 "WEATHERR中的 "ID列。
wTree = nzRegTree(GRADE~., data=weatherr, id="INSTANCE",
minimprove=0.1, minsplit=2, maxdepth=4)
可以使用 "print()或 "plot()等重载函数来可视化拟合树。
# plot and print the
tree plot(wTree)
print(wTree)
#node), split, n, deviance, yval
# * denotes terminal node
#
# 1) root 22 NA 2.636
# 2) OUTLOOK=sun 8 NA 3.875
# 4) TEMPERATURE < 72 6 NA 4.500
# 8) TEMPERATURE < 52 3 NA 4.000 *
# 9) TEMPERATURE > 52 3 NA 5.000 *
# 5) TEMPERATURE > 72 2 NA 2.000 *
# 3) OUTLOOK < >sun 14 NA 1.929
# 6) OUTLOOK=cloudy 6 NA 2.833
# 12) TEMPERATURE < 12 1 NA 2.000 *
# 13) TEMPERATURE > 12 5 NA 3.000 *
# 7) OUTLOOK < >cloudy 8 NA 1.250
# 14) HUMIDITY=low 2 NA 2.000 *
# 15) HUMIDITY < >low 6 NA 1.000 *
这种预建模型可应用于另一个数据集。 如果数据集存储在数据库中,则可使用重载的 "predict()函数在Netezza系统内应用回归树。 predict()函数调用 "PREDICT_REGTREE存储过程。
# make prediction using the model wTree on table
weatherr wPred = predict(wTree, weatherr, id="INSTANCE")
# wPred is a nz.data.frame and can easily be
examined head(wPred)
# ID CLASS
#1 2 2
#2 6 1
#3 10 2
#4 14 1
#5 18 1
#6 22 1
除了返回树类对象外,"nzRegTree还可能返回同名软件包中指定的 "rpart类对象。 其功能等同于 nzDecTree() 中的 rpart 功能:
adultRpart = nzDecTree(INCOME~AGE+SEX+HOURS_PER_WEEK, nzadult,
id="ID", format="rpart")
plot(adultRpart)
print(adultRpart)
#n= 32561
#
#node), split, n, loss, yval, (yprob)
# * denotes terminal node
#
# 1) root 32561 NA small (0.240809.... 0.759190....)
# 2) AGE< 27 8031 NA small (0.032125.... 0.967874....) *
# 3) AGE>=27 24530 NA small (0.309131.... 0.690868....)
# 6) SEX=Female 7366 NA small (0.150963.... 0.849036....) *
# 7) SEX=<other> 17164 NA small (0.377010.... 0.622989....)
# 14) HOURS_PER_WEEK< 41 10334 NA small (0.299883.... 0.700116....) *
# 15) HOURS_PER_WEEK>=41 6830 NA small (0.493704.... 0.506295....)
# 30) AGE< 35 1925 NA small (0.346493.... 0.653506....) *
# 31) AGE>=35 4905 NA large (0.551478.... 0.448521....) *

单因子和双因子方差分析

Netezza Analytics 提供方差分析等经典统计功能。 本节包括单因子方差分析和双因子方差分析。

本示例使用的是 "WEATHERR数据集。 排除第一个实例后,变量 "HUMIDITY中每个参数值的观测值数量相同。

首先,建立与数据库的连接,并创建指向Netezza"WEATHERR表的指针。 此外,请排除表格的第一行。
# loads necessary
packages library(nza)
# connect to the nza database
nzConnect("user", "password", "TT4-R040", "nza")
# a pointer to weatherr table is created
weatherr = nz.data.frame("weatherr")
# select all rows form the table whose INSTANCE is bigger than
one weatherr = weatherr[weatherr$INSTANCE>1, ]
表中的 "HUMIDITY和 "OUTLOOK列对应分组变量。 TEMPERATURE列是一个连续变量。 方差分析用于验证 "TEMPERATURE变量的平均值在不同分组中是否存在差异。

nzAnova()函数远程执行方差分析算法。 该函数将公式对象作为第一个参数。

如果公式右侧有一个变量,函数就会调用Netezza Analytics 的 "ANOVA_CRD_TEST算法。 如果右侧有两个变量,函数就会调用Netezza Analytics 的 "ANOVA_RBD_TEST算法。 然后,函数会将结果转换为 "summary.aov类对象。

本例演示了单因子方差分析算法,其中选择 "HUMIDITY作为处理变量。
nzAnova(TEMPERATURE~HUMIDITY, weatherr)
# Df Sum Sq Mean Sq F value Pr(>F)
#HUMIDITY 2 275 137.3 0.265 0.77
#Residuals 18 9309 517.1
本例演示了双因子方差分析算法,其中 "HUMIDITY被选为处理变量,"OUTLOOK被选为区组变量。
nzAnova(TEMPERATURE~HUMIDITY+OUTLOOK, weatherr)
HUMIDITY 2 275 137.3 0.337 0.7189
OUTLOOK 3 3206 1068.7 2.627 0.0884 .
Residuals 15 6102 406.8
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

K-Means

Netezza Analytics软件包支持集群方法。

下面的 "k-means聚类示例使用的是 "IRIS数据集。 数据集包含三个不同鸢尾品种的数据,即 "setosa"、"versicolor"和 "virginica"。 因此,"IRIS数据集预计有三个群集,每个群集都与不同的物种有关。

首先,建立与数据库的连接,并创建指向Netezza"IRIS表的指针。
# loads necessary
packages library(nza)
# connect to nza database
nzConnect("user", "password", "TT4-R040", "nza")
# a pointer to IRIS table is created
nziris = nz.data.frame("iris")

nzKMeans()函数通过调用存储过程 "KMEANS进行远程聚类。 聚类统计量、大小和平均值是唯一下载到 R 中的数据,并按照 stats 软件包中的说明转化为 "kmeans类对象。

k-means算法将数据分成 k 个群组。 下面的示例涉及k=3和k=10。
# K-Means for 2 clusters and euclidean
distance t3 = nzKMeans(nziris, k=3, id="ID")
# K-Means for 10 clusters and L1 distance
# also download item-cluster assignments for every item after computation t10
= nzKMeans(nziris, k=10, distance="manhattan", id="id", getLabels=T)
要显示聚类及其平均值,可以使用重载的 "print()函数。
print(t3)
#KMeans clustering with 3 clusters of sizes 50, 51, 49
#
#Cluster means:
# CLASS PETALLENGTH PETALWIDTH SEPALLENGTH SEPALWIDTH
#1 setosa 1.464000 0.244000 5.006000 3.418000
#2 versicolor 4.264706 1.333333 5.915686 2.764706
#3 virginica 5.573469 2.032653 6.622449 2.983673
#
#Clustering vector:
#SELECT "ID","CLUSTER_ID","DISTANCE" FROM ADMIN.IRIS_MODEL59040
#
#Within cluster sum of squares by cluster:
#[1] 15.24040 32.93373 39.15551
#
#Available components:
#[1] "cluster" "centers" "withinss" "size" "distance" "model"
# get used distance
metric t10$distance
#[1] "manhattan"
返回的对象是以列表形式实现的,因此可以使用普通的列表操作来检索结果中的单个组件。
names(t3)
#[1] "cluster" "centers" "withinss" "size" "distance" "model"
t3$centers
# CLASS PETALLENGTH PETALWIDTH SEPALLENGTH SEPALWIDTH
#1 setosa 1.464000 0.244000 5.006000 3.418000
#2 versicolor 4.264706 1.333333 5.915686 2.764706
#3 virginica 5.573469 2.032653 6.622449 2.983673
# nzKMeans' parameter getLabels was unset when computing t3
# hence t3$cluster is of class nz.data.frame
head(t3$cluster)
# ID CLUSTER_ID DISTANCE
#1 4 1 0.5188372
#2 8 1 0.0599333
#3 12 1 0.2513802
#4 16 1 1.2130919
#5 20 1 0.3989887
#6 24 1 0.3794628
# nzKMeans' parameter getLabels was TRUE when computing t10
# hence t3$cluster is of class data.frame
head(t10$cluster)
#123456
#146615
拟合模型可应用于另一个数据集。 如果数据集存储在数据库中,则可以使用重载的 "predict()函数在Netezza系统上进行分类。 该函数返回与最近集群的距离及其标识符。
res = predict(t3, nziris, id="ID")
head(res)
# ID CLUSTER_ID DISTANCE
#1 2 1 0.4381689
#2 6 1 0.6838070
#3 10 1 0.3665951
#4 14 1 0.9090611
#5 18 1 0.1509702
#6 22 1 0.3376270
可以通过调用重载的 "plot()函数绘制拟合模型。 该函数将按 "DISTANCE下载点的样本,或下载所有点,生成散点图矩阵,就像 R 的内置函数 "pairs()所做的那样。
# plot KMeans' result as matrix of
scatterplots plot(t10)
函数 "nzKMeans()还支持原始输出格式。 该格式只下载Netezza Analytics的 "KMEANS算法创建的所有表,并将其存储在 "data.frames列表中。
r = nzKMeans(nziris, k=3, id="ID", format="raw")
names(r)
#[1] "clusters" "columns" "column.statistics"
#[4] "model" "centroids" "modelname"

TwoStep

TwoStep是 "k-means算法的另一种聚类算法。 它的主要优点是可以自动确定聚类的数量,并能以合理的统计方式处理分类和连续字段的混合。

在下面的聚类示例中,使用的是 "IRIS数据集。

首先,建立与数据库的连接,并创建指向Netezza表的指针。
# loads necessary
packages library(nza)
# connect to nza database
nzConnect("user", "password", "TT4-R040", "nza")
# a pointer to IRIS table is created
nziris = nz.data.frame("iris")
现在使用 "nzTwoStep函数对数据进行聚类。
# TwoStep model for IRIS
t2 = nzTwoStep(nziris, id="id")
要显示聚类及其平均值,可以使用重载的 "print()函数。
print(t2)
#TwoStep clustering with 3 clusters of sizes 50, 50, 50
#
#Cluster means:
# CLASS PETALLENGTH PETALWIDTH SEPALLENGTH SEPALWIDTH
#1 setosa 1.464 0.244 5.006 3.418
#2 virginica 5.552 2.026 6.588 2.974
#3 versicolor 4.260 1.326 5.936 2.770
#
#Clustering vector:
#SELECT " ID "," CLUSTER_ID "," DISTANCE " FROM ADMIN.IRIS_MODEL74356
#
#Within cluster sum of squares by cluster:
#[1] 0.3713140 0.5413910 0.4277027
#
#Available components:
#[1] "cluster" "centers" "withinss" "size" "distance" "model"
结果对象提供有关聚类中心、聚类大小和每个聚类内平方和的信息。 距离属性存储了使用哪种距离度量的信息。
与 "nzKMeans()一样,"nzTwoStep()的输出也存储在一个列表中。 因此,所有常见的列表操作都可用。
names(t2)
#[1] "cluster" "centers" "withinss" "size" "distance" "model"
t2$size
50 50
#[1] 50
t2$distance
#[1] "loglikelihood"
拟合模型可应用于另一个数据集。 如果数据集存储在数据库中,则可以使用重载的 "predict()函数在Netezza系统上进行分类。 该函数返回与最近集群的距离及其标识符。
res = predict(t2, data, "ID")
head(res)
# ID CLUSTER_ID DISTANCE
#1 2 1 0.34278577
#2 6 1 0.54303152
#3 10 1 0.24827305
#4 14 1 0.67509943
#5 18 1 0.09122145
#6 22 1 0.21751088
可以通过调用重载的 "plot()函数绘制拟合模型。 该函数可以通过 "DISTANCE下载点的样本,也可以像 R 的内置函数 "pairs()那样下载所有点以生成散点图矩阵。
# plot TwoStep's result as matrix of
scatterplots plot(t2)
函数 "nzTwoStep()还支持原始输出格式。 该格式只下载Netezza Analytics的 "KMEANS算法创建的所有表,并将其存储在 "data.frames列表中。
r = nzKMeans(nziris, k=3, id="ID", format="raw")
names(r)
#[1] "clusters" "columns" "column.statistics"
#[4] "discrete.statistics" "model" "numeric.statistics"
#[7] "modelname" "cluster"

朴素贝叶斯