Im Folgenden finden Sie ein einfaches Data Mining Demo, das Modellbildung und Prognose in der Verbindung von R und Exasol zeigt. Falls Sie die Installation und Konfiguration der benötigten Komponenten noch nicht vollzogen haben, finden Sie die Anleitung dazu hier.
Außerdem finden Sie hier ein Webcast-Video, in dem das unten stehenden Demo gezeigt sowie die Grundzüge von R und Exsol erläutert werden.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
# Laden der benötigten Pakete
library(RODBC)
library(exasol)
library(rredis)
library(magrittr)
library(stringi)
library(rpart)
library(partykit)
# Verbindung zu Exasol und Redis herstellen
con < – odbcConnect(„exasol_vm“)
redisConnect(„172.20.248.13“)
# Erstellen eines Zufallszahlen-Vektors für die Stichprobenziehung
rnd <– rnorm(nrow(iris))
# Anfügen der Gruppenvariable (Training/Validierung)
iris$groups <– factor(NA, levels = c(„Train“, „Valid“))
# Nach Spezies geschichtete Zufallsziehung: 70% Training, 30% Validierung
for(i in unique(iris$Species)) {
logVec <– iris$Species == i
iris$groups[logVec] <– ifelse(test = rnd[logVec] > quantile(rnd[logVec],
probs = 0.3),
yes = „Train“,
no = „Valid“)
}
# Überprüfung der Stichprobenziehung
table(iris$groups, iris$Species)
# Workspace aufräumen
rm(rnd, logVec, i)
|
Die iris Daten werden jetzt in die Exasol geschoben. Bei der ersten Verwendung wird zunächst ein Datenbankschema erstellt und eine leere Tabelle. Anschließend werden die iris Daten in die Tabelle geschoben. Sind die Daten einmal hochgeladen, können Sie immer wieder verwendet werden.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# Datenbankschema mit dem Namen <em>my_schema</em> erstellen
odbcQuery(con, „create schema my_schema“)
# Erstellen der leeren Tabelle unter dem Namen <em>irisdb</em>
odbcQuery(con, „create or replace table my_schema.irisdb(
SepalLength DOUBLE,
SepalWidth DOUBLE,
PetalLength DOUBLE,
PetalWidth DOUBLE,
Species CHAR(20),
Groups CHAR(20));“)
# Hochladen der <em>iris</em> Daten in die Exasol
exa.writeData(con, data = iris, tableName = „my_schema.irisdb“)
|
Im ersten Analyseschritt wird lokal ein Entscheidungsbaum erstellt. Auf Basis dieses Baums wird anschließend eine Prognose erstellt.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# Erstellen eines Trainings- und eines Validierungsdatensatzes
train < – subset(iris, subset = groups == „Train“, select = –groups)
valid <– subset(iris, subset = groups == „Valid“, select = –groups)
# Erstellen des Entscheidungsbaums mit den Trainingsdaten
localTree <– rpart(Species ~ ., data = train)
# Visualisierung des Baums
plot(as.party(localTree))
# Prognose Validierungsdaten mit Hilfe des Baums
pred <– predict(localTree, type = „class“, newdata = valid) # Prognose überprüfen table(pred, valid$Species, dnn = c(„Vorhersage“, „Tatsächlich“)) %>%
addmargins()
|
Das selbe Vorgehen wie oben jetzt in der Exasol. Die exa.script Funktion erstellt ein R Skript auf dem Exasol Server. Der Aufruf dieser Funktion führt das Skript auf den Exasol Clustern aus. D.h. die Analyse findet nicht mehr auf dem lokalen R statt, sondern auf den R Instanzen im Exasol Cluster. Pakete, die auf den R Instanzen auf der Exasol verwendet werden, müssen dort installiert sein. Siehe dazu diesen Blogbeitrag.
Das im Exasol Cluster gebildete Modell wird in Redis, einer Key-Value Datenbank abgelegt. Mit Redis lassen sich sowohl Modelle als auch Funktionen oder andere R-Objekte im Cluster verteilen und aus dem Cluster laden.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
exa_rf < – exa.createScript(
con,
„my_schmea.exa_rf“, # Unter diesem Namen ist das R-Script über SQL verfügbar
function(data) {
# Laden der benötigten Pakete. Diese müssen ggf. in der Exasol installiert sein
require(rpart)
require(stringi)
require(rredis)
# Verbindung mit Redis
redisConnect(„172.20.248.13“, port = 6379)
# Laden aller Daten aus der Exasol Tabelle
# wird im Funktionsaufruf das <em>groupBy oder </em><em>where</em> Argument verwendet,
# wird nur der entsprechende Teil der Daten geladen.
data$next_row(NA)
# Wandeln des <em>data</em> Objekts in einen <em>data.frame</em>
df < – data.frame(v1 = data$SepalLength,
v2 = data$SepalWidth,
v3 = data$PetalLength,
v4 = data$PetalWidth,
species = data$Species)
# Aufbereiten des data.frames
df$species <– stri_replace_all_fixed(df$species, “ „, „“)
df$species <– as.factor(df$species)
# Erstellen des Baums
rf <– rpart(species ~ ., data = df)
# Speichern des Baums in Redis
redisSet(„exa_rf“, rf)
# Rückgabe der Zeilenanzahl (zur Kontrolle)
data$emit(nrow(df))
},
inArgs = c(„SepalLength DOUBLE“,
„SepalWidth DOUBLE“,
„PetalLength DOUBLE“,
„PetalWidth DOUBLE“,
„Species CHAR(20)“),
outArgs = „Feedback INT“)
# Aufrufen der oben gebildeten Funktion. Das where Argument legt fest, dass
# das Modell auf den Trainingsdaten gebildet wird.
exa_rf(„SepalLength“, „SepalWidth“, „PetalLength“, „PetalWidth“, „Species“,
table = „my_schema.irisdb“,
where = „groups = ‚Train'“)
|
Das Baum Modell kann in einem separaten Schritt auf der Exasol für die Prognose verwendet werden. Der erste Teil ist mit der obigen Funktion weitgehend identisch.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
exa_predict_rf < – exa.createScript(
con,
„my_schema.exa_pred“,
function(data) {
require(rpart)
require(rredis)
redisConnect(„172.20.248.13“, port = 6379)
data$next_row(NA)
df <– data.frame(v1 = data$SepalLength,
v2 = data$SepalWidth,
v3 = data$PetalLength,
v4 = data$PetalWidth,
species = data$Species)
# Laden des Baum Modells aus Redis
rf <– redisGet(„exa_rf“)
# Erstellen der Prognose
pred <– predict(rf, newdata = df, type = „class“)
# Rückgabe der Prognose sowie der echten Klassenzugehörigkeit
data$emit(pred, df$species)
},
inArgs = c( „SepalLength DOUBLE“,
„SepalWidth DOUBLE“,
„PetalLength DOUBLE“,
„PetalWidth DOUBLE“,
„Species CHAR(20)“),
outArgs = c(„Prognose CHAR(20)“,
„Realwerte CHAR(20)“))
# Aufruf der oben gebildeten Funktion. Die Rückgabe wird in ein Objekt gespeichert.
exa_pred <– exa_predict_rf(„SepalLength“, „SepalWidth“, „PetalLength“, „PetalWidth“, „Species“, table = „my_schema.irisdb“, where = „groups = ‚Valid'“) # Mit Hilfe der Table Funktion kann geprüft werden, wie gut die Prognose performt. table(exa_pred$PROGNOSE, exa_pred$REALWERTE, dnn = c(„Prognose“, „Realwerte“)) %>%
addmargins()
|
Im Folgenden finden Sie ein einfaches Data Mining Demo, das Modellbildung und Prognose in der Verbindung von R und Exasol zeigt. Falls Sie die Installation und Konfiguration der benötigten Komponenten noch nicht vollzogen haben, finden Sie die Anleitung dazu hier.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
# Laden der benötigten Pakete
library(RODBC)
library(exasol)
library(rredis)
library(magrittr)
library(stringi)
library(rpart)
library(partykit)
# Verbindung zu Exasol und Redis herstellen
con < – odbcConnect(„exasol_vm“)
redisConnect(„172.20.248.13“)
# Erstellen eines Zufallszahlen-Vektors für die Stichprobenziehung
rnd <– rnorm(nrow(iris))
# Anfügen der Gruppenvariable (Training/Validierung)
iris$groups <– factor(NA, levels = c(„Train“, „Valid“))
# Nach Spezies geschichtete Zufallsziehung: 70% Training, 30% Validierung
for(i in unique(iris$Species)) {
logVec <– iris$Species == i
iris$groups[logVec] <– ifelse(test = rnd[logVec] > quantile(rnd[logVec],
probs = 0.3),
yes = „Train“,
no = „Valid“)
}
# Überprüfung der Stichprobenziehung
table(iris$groups, iris$Species)
# Workspace aufräumen
rm(rnd, logVec, i)
|
Die iris Daten werden jetzt in die Exasol geschoben. Bei der ersten Verwendung wird zunächst ein Datenbankschema erstellt und eine leere Tabelle. Anschließend werden die iris Daten in die Tabelle geschoben. Sind die Daten einmal hochgeladen, können Sie immer wieder verwendet werden.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# Datenbankschema mit dem Namen <em>my_schema</em> erstellen
odbcQuery(con, „create schema my_schema“)
# Erstellen der leeren Tabelle unter dem Namen <em>irisdb</em>
odbcQuery(con, „create or replace table my_schema.irisdb(
SepalLength DOUBLE,
SepalWidth DOUBLE,
PetalLength DOUBLE,
PetalWidth DOUBLE,
Species CHAR(20),
Groups CHAR(20));“)
# Hochladen der <em>iris</em> Daten in die Exasol
exa.writeData(con, data = iris, tableName = „my_schema.irisdb“)
|
Im ersten Analyseschritt wird lokal ein Entscheidungsbaum erstellt. Auf Basis dieses Baums wird anschließend eine Prognose erstellt.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# Erstellen eines Trainings- und eines Validierungsdatensatzes
train < – subset(iris, subset = groups == „Train“, select = –groups)
valid <– subset(iris, subset = groups == „Valid“, select = –groups)
# Erstellen des Entscheidungsbaums mit den Trainingsdaten
localTree <– rpart(Species ~ ., data = train)
# Visualisierung des Baums
plot(as.party(localTree))
# Prognose Validierungsdaten mit Hilfe des Baums
pred <– predict(localTree, type = „class“, newdata = valid) # Prognose überprüfen table(pred, valid$Species, dnn = c(„Vorhersage“, „Tatsächlich“)) %>%
addmargins()
|
Das selbe Vorgehen wie oben jetzt in der Exasol. Die exa.script Funktion erstellt ein R Skript auf dem Exasol Server. Der Aufruf dieser Funktion führt das Skript auf den Exasol Clustern aus. D.h. die Analyse findet nicht mehr auf dem lokalen R statt, sondern auf den R Instanzen im Exasol Cluster. Pakete, die auf den R Instanzen auf der Exasol verwendet werden, müssen dort installiert sein. Siehe dazu diesen Blogbeitrag.
Das im Exasol Cluster gebildete Modell wird in Redis, einer Key-Value Datenbank abgelegt. Mit Redis lassen sich sowohl Modelle als auch Funktionen oder andere R-Objekte im Cluster verteilen und aus dem Cluster laden.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
exa_rf < – exa.createScript(
con,
„my_schmea.exa_rf“, # Unter diesem Namen ist das R-Script über SQL verfügbar
function(data) {
# Laden der benötigten Pakete. Diese müssen ggf. in der Exasol installiert sein
require(rpart)
require(stringi)
require(rredis)
# Verbindung mit Redis
redisConnect(„172.20.248.13“, port = 6379)
# Laden aller Daten aus der Exasol Tabelle
# wird im Funktionsaufruf das <em>groupBy oder </em><em>where</em> Argument verwendet,
# wird nur der entsprechende Teil der Daten geladen.
data$next_row(NA)
# Wandeln des <em>data</em> Objekts in einen <em>data.frame</em>
df < – data.frame(v1 = data$SepalLength,
v2 = data$SepalWidth,
v3 = data$PetalLength,
v4 = data$PetalWidth,
species = data$Species)
# Aufbereiten des data.frames
df$species <– stri_replace_all_fixed(df$species, “ „, „“)
df$species <– as.factor(df$species)
# Erstellen des Baums
rf <– rpart(species ~ ., data = df)
# Speichern des Baums in Redis
redisSet(„exa_rf“, rf)
# Rückgabe der Zeilenanzahl (zur Kontrolle)
data$emit(nrow(df))
},
inArgs = c(„SepalLength DOUBLE“,
„SepalWidth DOUBLE“,
„PetalLength DOUBLE“,
„PetalWidth DOUBLE“,
„Species CHAR(20)“),
outArgs = „Feedback INT“)
# Aufrufen der oben gebildeten Funktion. Das where Argument legt fest, dass
# das Modell auf den Trainingsdaten gebildet wird.
exa_rf(„SepalLength“, „SepalWidth“, „PetalLength“, „PetalWidth“, „Species“,
table = „my_schema.irisdb“,
where = „groups = ‚Train'“)
|
Das Baum Modell kann in einem separaten Schritt auf der Exasol für die Prognose verwendet werden. Der erste Teil ist mit der obigen Funktion weitgehend identisch.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
exa_predict_rf < – exa.createScript(
con,
„my_schema.exa_pred“,
function(data) {
require(rpart)
require(rredis)
redisConnect(„172.20.248.13“, port = 6379)
data$next_row(NA)
df <– data.frame(v1 = data$SepalLength,
v2 = data$SepalWidth,
v3 = data$PetalLength,
v4 = data$PetalWidth,
species = data$Species)
# Laden des Baum Modells aus Redis
rf <– redisGet(„exa_rf“)
# Erstellen der Prognose
pred <– predict(rf, newdata = df, type = „class“)
# Rückgabe der Prognose sowie der echten Klassenzugehörigkeit
data$emit(pred, df$species)
},
inArgs = c( „SepalLength DOUBLE“,
„SepalWidth DOUBLE“,
„PetalLength DOUBLE“,
„PetalWidth DOUBLE“,
„Species CHAR(20)“),
outArgs = c(„Prognose CHAR(20)“,
„Realwerte CHAR(20)“))
# Aufruf der oben gebildeten Funktion. Die Rückgabe wird in ein Objekt gespeichert.
exa_pred <– exa_predict_rf(„SepalLength“, „SepalWidth“, „PetalLength“, „PetalWidth“, „Species“, table = „my_schema.irisdb“, where = „groups = ‚Valid'“) # Mit Hilfe der Table Funktion kann geprüft werden, wie gut die Prognose performt. table(exa_pred$PROGNOSE, exa_pred$REALWERTE, dnn = c(„Prognose“, „Realwerte“)) %>%
addmargins()
|