Wrapper per l'analisi integrata

Le sezioni seguenti descrivono i wrapper supportati per le diverse funzioni di Netezza Analytics, i loro argomenti e parametri principali. Le sezioni forniscono anche semplici esempi di utilizzo di queste funzioni.

Per un elenco completo delle opzioni e dei parametri di ciascuna di queste funzioni, si può utilizzare il sistema di aiuto di R. Ad esempio, per richiamare la pagina di aiuto per 'nzGlm(), si può usare il seguente comando:
> help(nzGlm)

Poiché la maggior parte delle funzioni fornite dal pacchetto NZA sono wrapper delle funzioni di Netezza Analytics, è possibile consultare la guida per gli sviluppatori di Netezza Analytics in-database analytics e la guida di riferimento di Netezza Analytics in-database analytics per maggiori dettagli. Ad esempio, se siete interessati ai dettagli sul parametro di collegamento per la funzione 'nzGlm(), la sezione GLM nella guida per gli sviluppatori di Netezza Analytics in-database analytics fornisce una descrizione dettagliata delle singole funzioni di collegamento disponibili.

Alberi decisionali

Il pacchetto Netezza Analytics offre una serie di algoritmi sofisticati. Di seguito viene presentato un semplice esempio di algoritmo ad albero decisionale. Nelle sezioni successive vengono illustrati esempi di altri algoritmi statistici e di data mining.

Si supponga che l'insieme di dati relativi agli adulti sia memorizzato nel database MM nella tabella ADULTI. Nel frammento di codice seguente, viene creata una connessione al database, quindi viene creato un puntatore alla tabella con i dati. Successivamente, il modello ad albero decisionale viene adattato e infine il modello adattato viene scaricato in R. Tutti i passaggi sono trasparenti per l'utente R.

Il primo passo consiste nel creare una connessione al database.
# 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")
L'oggetto R 'nzadult è un puntatore alla tabella 'ADULT sul sistema Netezza. È un oggetto della classe 'nz.data.frame con funzioni sovraccaricate come print(), [,] e altre. Come descritto in La libreria Netezza R , corrisponde a un oggetto 'data.frame standard, ma è memorizzato in remoto nel database.

Le funzioni R che sono wrapper delle routine analitiche Netezza possono accettare questo puntatore come argomento. Questo esempio utilizza la funzione " nzDecTree() del pacchetto Netezza Analytics Library for R che costruisce l'albero di classificazione. La funzione 'nzDecTree() è un wrapper R che prepara una query SQL che richiama in remoto la stored procedure Netezza Analytics 'DECTREE. La procedura viene eseguita in remoto e il modello finale viene restituito a R. Successivamente, il modello viene convertito in un oggetto della classe albero che ha una struttura simile agli oggetti creati con la funzione R 'tree().

Consideriamo il seguente esempio di costruzione di un albero decisionale per la previsione della variabile reddito, sulla base delle variabili età, sesso e ore settimanali. La colonna 'ID del set di dati 'ADULT è specificata nel parametro id.
# build a tree using built-in analytics
adultTree = nzDecTree(INCOME~AGE+SEX+HOURS_PER_WEEK, nzadult, id="ID")
L'output della funzione viene memorizzato nel database, mentre la funzione 'nzDecTree() lo trasforma per impostazione predefinita in un oggetto R della classe tree , specificata dall'omonimo pacchetto. Pertanto, le funzioni sovraccaricate come 'print(), 'plot() o 'predict() funzionano con questo oggetto. È possibile stampare o visualizzare l'albero in R, anche se è stato adattato a un grande insieme di dati con milioni di righe.
# 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 ) *
Il modello adattato può essere applicato a un altro set di dati. Se il set di dati è memorizzato in una tabella del database, è possibile evitare un trasferimento massiccio di dati utilizzando la funzione sovraccaricata predict() per eseguire la classificazione all'interno di 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
In alternativa all'oggetto restituito di classe tree, 'nzDecTree potrebbe anche restituire un oggetto di classe 'rpart, come specificato nell'omonimo pacchetto. Questo oggetto supporta anche funzioni sovraccaricate di 'rpart, come 'print(), 'plot() o '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....) *

strutture ad albero di regressione

L'esempio seguente mostra gli alberi di regressione. L'idea di base è la stessa degli alberi decisionali. In questo frammento di codice viene utilizzato il set di dati " WEATHERR. La variabile di interesse è il voto, una variabile continua. I valori medi della variabile grado sono memorizzati in ciascuna delle foglie corrispondenti dell'albero di regressione.

Innanzitutto, vengono creati una connessione al database e un puntatore alla tabella 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")
Per costruire un albero di regressione a distanza, si utilizza la funzione " nzRegTree(). Richiama la procedura memorizzata di Netezza Analytics 'REGTREE. Solo il modello finale, cioè i parametri dell'albero adattato, viene scaricato in R e trasformato in un oggetto di classe tree, come specificato dall'omonimo pacchetto. Questo esempio costruisce un albero di regressione per prevedere il voto della variabile in base a tutte le altre variabili del set di dati. La colonna 'ID del set di dati 'WEATHERR è specificata nel parametro id.
wTree = nzRegTree(GRADE~., data=weatherr, id="INSTANCE",
minimprove=0.1, minsplit=2, maxdepth=4)
Le funzioni sovraccaricate, come 'print() o 'plot(), possono essere utilizzate per visualizzare l'albero montato.
# 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 *
Questo modello precostituito può essere applicato a un altro set di dati. Se il set di dati è memorizzato nel database, la funzione sovraccaricata 'predict() può essere utilizzata per applicare l'albero di regressione all'interno del sistema Netezza. La funzione 'predict() richiama la stored procedure '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
In alternativa all'oggetto restituito di classe tree, 'nzRegTree potrebbe anche restituire un oggetto di classe 'rpart, come specificato nell'omonimo pacchetto. La funzionalità è uguale alle caratteristiche di 'rpart in 'nzDecTree():
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....) *

ANOVA a una e due vie

Le funzioni statistiche classiche, come l'ANOVA, sono disponibili in Netezza Analytics. Questa sezione tratta l'ANOVA a una via e a due vie.

In questo esempio, viene utilizzato il set di dati " WEATHERR. La prima istanza viene esclusa in modo da avere lo stesso numero di osservazioni per ogni valore del parametro nella variabile " HUMIDITY.

Per prima cosa, stabilire una connessione al database e creare un puntatore alla tabella Netezza 'WEATHERR. Inoltre, escludere la prima riga della tabella.
# 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, ]
Le colonne " HUMIDITY e " OUTLOOK di questa tabella corrispondono alle variabili di raggruppamento. La colonna " TEMPERATURE è una variabile continua. L'ANOVA viene utilizzata per verificare se il valore medio della variabile " TEMPERATURE varia per i diversi sottogruppi.

La funzione 'nzAnova() esegue in remoto l'algoritmo ANOVA. La funzione accetta un oggetto formula come primo argomento.

Se c'è una variabile sul lato destro delle formule, la funzione richiama l'algoritmo 'ANOVA_CRD_TEST di Netezza Analytics. Se ci sono due variabili sul lato destro, la funzione richiama l'algoritmo 'ANOVA_RBD_TEST di Netezza Analytics. La funzione trasforma quindi i risultati in un oggetto di classe 'summary.aov.

Questo esempio dimostra l'algoritmo dell'ANOVA a una via, dove " HUMIDITY è scelto come variabile di trattamento.
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
Questo esempio dimostra l'algoritmo dell'ANOVA a due vie, in cui 'HUMIDITY è scelto come variabile di trattamento e 'OUTLOOK come variabile di blocco.
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-medie

I metodi di clustering sono supportati dal pacchetto Netezza Analytics.

Il seguente esempio di clustering " k-means utilizza il set di dati " IRIS. Il set di dati contiene dati relativi a tre diverse specie di Iris, ovvero 'setosa, 'versicolor e 'virginica. Pertanto, nel set di dati " IRIS sono attesi tre cluster, ciascuno dei quali relativo a una specie diversa.

Per prima cosa, stabilire una connessione al database e creare un puntatore alla tabella 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")

La funzione 'nzKMeans() esegue il clustering in remoto chiamando la stored procedure 'KMEANS. Le statistiche dei cluster, le dimensioni e i valori medi sono gli unici dati che vengono scaricati in R e trasformati in un oggetto di classe 'kmeans, come descritto nel pacchetto stats.

L'algoritmo " k-means divide i dati in k cluster. L'esempio seguente si riferisce a k=3 e 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)
Per mostrare i cluster e i loro valori medi, è possibile utilizzare la funzione sovraccaricata '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"
L'oggetto restituito è implementato come una lista e quindi si possono usare le comuni operazioni di lista per recuperare i singoli componenti del risultato.
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
Il modello adattato può essere applicato a un altro set di dati. Se il set di dati è memorizzato nel database, è possibile utilizzare la funzione sovraccaricata 'predict() per eseguire la classificazione sul sistema Netezza. La funzione restituisce la distanza dal cluster più vicino e il suo identificatore.
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
Il modello adattato può essere tracciato richiamando la funzione sovraccaricata 'plot(). Questa funzione scaricherà un campione di punti in base al loro 'DISTANCE, oppure scaricherà tutti i punti per produrre una matrice di scatterplot come fa la funzione incorporata 'pairs() di R.
# plot KMeans' result as matrix of
scatterplots plot(t10)
La funzione 'nzKMeans() supporta anche un formato di uscita grezzo. Questo formato scarica solo tutte le tabelle create dall'algoritmo 'KMEANS di Netezza Analytics e le memorizza in un elenco di 'data.frames.
r = nzKMeans(nziris, k=3, id="ID", format="raw")
names(r)
#[1] "clusters" "columns" "column.statistics"
#[4] "model" "centroids" "modelname"

TwoStep

TwoStep è un algoritmo di clustering alternativo all'algoritmo 'k-means. I suoi principali vantaggi sono la capacità di determinare automaticamente il numero di cluster e di gestire una miscela di campi categoriali e continui in modo statisticamente corretto.

Nel seguente esempio di clustering, viene utilizzato il set di dati " IRIS.

Innanzitutto, viene stabilita una connessione al database e viene creato un puntatore a una tabella 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")
Ora la funzione 'nzTwoStep viene utilizzata per raggruppare i dati.
# TwoStep model for IRIS
t2 = nzTwoStep(nziris, id="id")
Per mostrare i cluster e i loro valori medi, è possibile utilizzare la funzione sovraccaricata '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"
L'oggetto risultato fornisce informazioni sui centri dei cluster, sulle dimensioni dei cluster e sulle somme dei quadrati all'interno di ciascun cluster. L'attributo distance memorizza le informazioni sulla metrica di distanza utilizzata.
Come in 'nzKMeans(), l'output di 'nzTwoStep() viene memorizzato in un elenco. Pertanto, sono disponibili tutte le operazioni di lista più comuni.
names(t2)
#[1] "cluster" "centers" "withinss" "size" "distance" "model"
t2$size
50 50
#[1] 50
t2$distance
#[1] "loglikelihood"
Il modello adattato può essere applicato a un altro set di dati. Se il set di dati è memorizzato nel database, è possibile utilizzare la funzione sovraccaricata 'predict() per eseguire la classificazione sul sistema Netezza. La funzione restituisce la distanza dal cluster più vicino e il suo identificatore.
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
Il modello adattato può essere tracciato richiamando la funzione sovraccaricata 'plot(). Questa funzione può scaricare un campione di punti in base al loro 'DISTANCE, oppure scaricare tutti i punti per produrre una matrice di diagrammi di dispersione come fa la funzione incorporata 'pairs() di R.
# plot TwoStep's result as matrix of
scatterplots plot(t2)
La funzione 'nzTwoStep() supporta anche un formato di uscita grezzo. Questo formato scarica solo tutte le tabelle create dall'algoritmo 'KMEANS di Netezza Analytics e le memorizza in un elenco di '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"

Naive Bayes