Data Mining mit der Oracle-Datenbank und APEX: Die Modelle prüfen

Data Mining beschäftigt sich bekanntlich mit dem Auffinden bislang unbekannter Zusammenhänge in Datenbeständen. Dazu werden statistische Methoden wie Naive Bayes, Support Vector Machines oder andere verwendet. Kaum bekannt ist, dass auch die Oracle-Datenbank mit Data Mining-Funktionalität ausgestattet ist - dieser Tipp stellt sie vor und zeigt auf, wie sie aus einer Application Express-Anwendung heraus genutzt werden kann. Hintergrundinformationen zum Thema finden Sie unter anderem im Wikipedia-Artikel "Data Mining".

Data Mining in der Oracle-Datenbank ist Teil der Data Mining Option; um die Funktion nutzen zu können, ist also die Lizensierung der Data Mining Option erforderlich.

Nachdem Sie im letzten Tipp erfahren haben, wie Sie mit einem Datenbestand eine Data Mining-Analyse durchführen können, erfahren Sie in diesem Tipp, wie Sie das gefundene Modell überpüfen und bewerten können.

Ausgangssitutation

Ergebnis des letzten Tipps: ein Data Mining-Modell wurde erzeugt

Abbildung 1: Ergebnis des letzten Tipps: ein Data Mining-Modell wurde erzeugt

Abbildung 1 zeigt das Ergebnis des letzten Tipps: Der Datenbestand wurde in eine Trainings- und eine Testmenge unterteilt; mit dem Trainingsbestand wurde das Data Mining-Modell DM_APEX erzeugt. Für die Trainingsmenge wurde die View DM_APEX_TRAIN erzeugt; die Testmenge wird von der View DM_APEX_TEST repräsentiert. Mit der Testmenge wurde im letzten Tipp noch nicht gearbeitet.

Erzeugen Sie sich eine neue Anwendungsseite: Auf dieser werden die Komponenten zum Test des Data Mining-Modells erzeugt. Fügen Sie zuerst einen Bericht zum Anzeigen der Data Mining-Modelle hinzu. Die SQL-Abfrage hierfür ist folgende.

select 
  model_name, 
  mining_function, 
  algorithm, 
  creation_date
from user_mining_models 

Zum Testen lässt man das Data Mining-Modell Fälle schätzen, deren Ergebnis man schon kennt. Anschließend werden Schätzung und Wirklichkeit verglichen. Zum Erstellen der Schätzungen dient die Prozedur DBMS_DATA_MINING.APPLY. Erstellen Sie also nun zur Auswahl des zu testenden Modells eine Auswahlliste namens P4_MINING_MODELLE (mit Weiterleitung) mit folgender Wertelistenabfrage:

select 
  model_name d, 
  model_name r 
from user_mining_models 

Fügen Sie dann eine weitere Auswahlliste (P4_PK_COLUMN) zum Festlegen der Primärschlüsselspalte (Case-Id Column) hinzu. Verwenden Sie hierfür folgende Wertelistenabfrage:

select column_name d, column_name r
from user_tab_columns
where table_name = :P4_MINING_MODELLE||'_TEST'

Knüpfen Sie das Element an die Bedingung, dass das Element P4_MINING_MODELLE nicht Null (NOT NULL) ist.

Bedingung für Element zur Auswahl des Primärschlüssels

Abbildung 2: Bedingung für Element zur Auswahl des Primärschlüssels

Erzeugen Sie zum Schluß eine Schaltfläche mit der Aufschift Modell testen und fügen Sie einen neuen PL/SQL-Prozeß namens Modell testen hinzu. Der Prozeß soll bei Klick auf die Schaltfläche ausgeführt werden. Hinterlegen Sie folgenden PL/SQL-Code für den Prozeß.

begin
  begin
    execute immediate 'drop table ' || v('P4_MINING_MODELLE') || '_APPL purge';
  exception 
    when others then null;
  end;

  dbms_data_mining.apply(
    model_name          => :P4_MINING_MODELLE,
    data_table_name     => :P4_MINING_MODELLE||'_TEST',
    case_id_column_name => :P4_PK_COLUMN,
    result_table_name   => :P4_MINING_MODELLE||'_APPL'
  );
end;

Wenn Sie nun die Seite starten und auf die Schaltfläche klicken, wird das System arbeiten und irgendwann fertig sein (Abbildung 3) - aber Sie sehen außer der Erfolgsnachricht noch nichts.

Das Modell wurde (noch nicht) getestet

Abbildung 3: Das Modell wurde (noch nicht) getestet

Das liegt daran, dass Sie bis hierhin nur Schätzungen durchgeführt haben. Diese Schätzungen sind nun in der Tabelle DM_TEST_APPL (siehe Prozeßcode) gespeichert. Die Güteprüfung des Modells kommt nun durch den Vergleich zwischen Schätzung und tatsächlichen Daten zustande. Und dazu bietet die Oracle-Datenbank drei Verfahren an:

  • Confusion Matrix
  • ROC (Receiver Operation Characteristic)
  • Lift

Die Confusion Matrix und die ROC-Kurve werden im Folgenden näher erläutert.

Confusion Matrix

In der Confusion Matrix werden den bekannten Werten die Schätzungen gegenübergestellt. Um die Confusion Matrix zu berechnen, wird noch die Tabellenspalte benötigt, die in der Testdatenmenge das tatsächliche Ergebnis enthält (also das, mit dem die Schätzung verglichen werden soll). Erzeugen Sie also eine weitere Auswahlliste mit Namen P4_TARGET_COLUMN und der folgenden Wertelistenabfrage:

select column_name d, column_name r
from user_tab_columns
where table_name = :P4_MINING_MODELLE||'_TEST'

Erzeugen Sie dann eine weitere Schaltfläche namens Confusion Matrix berechnen und nehmen Sie einen weiteren PL/SQL-Prozeß hinzu. Wie vorhin soll der Prozeß bei Klick auf die Schaltfläche ausgeführt werden.

 begin
  -- Evtl. vorhandene Confusion Matrix löschen
  begin
    execute immediate 'drop table '|| :P4_MINING_MODELLE||'_CONF purge';
  exception 
    when others then null;
  end;

  -- Confusion Matrix neu berechnen
  dbms_data_mining.compute_confusion_matrix(
    accuracy                    => :P4_ACCURACY,
    apply_result_table_name     => :P4_MINING_MODELLE||'_APPL',
    target_table_name           => :P4_MINING_MODELLE||'_TEST', 
    case_id_column_name         => :P4_PK_COLUMN,
    target_column_name          => :P4_TARGET_COLUMN,
    confusion_matrix_table_name => :P4_MINING_MODELLE||'_CONF'  
  );
end;

Bevor Sie die Seite nun starten, benötigen Sie noch ein APEX Element. Der erste Parameter der Prozedur CONPUTE_CONFUSION_MATRIX ist ein "OUT-Parameter" - die Prozedur gibt eine Kennzahl für die Gesamtgenauigkeit des Data Mining-Modells zurück. Obiger Code übernimmt diese Kennzahl in das Element P4_ACCURACY. Fügen Sie also ein weiteres Element P4_ACCURACY hinzu; die Darstellung kann Read Only erfolgen. Anschließend können Sie die Seite starten und die Schaltfläche Confusion Matrix berechnen ausprobieren ...

Die Confusion Matrix wurde berechnet

Abbildung 4: Die Confusion Matrix wurde berechnet

Sie sehen, dass im Element P4_ACCURACY nun ein Wert steht - die 0.27 sind ein Indikator für die Gesamtgenaugkeit des Modells: Etwa 27 Prozent der Fälle wurden korrekt geschätzt. Die Confusion Matrix selbst wurde wiederum in einer Tabelle gespeichert - deren Name ist (aus obigem Code ersichtlich) gleich {Name des Mining-Modells}||'_CONF'. Diese Tabelle hat normalerweise drei Spalten, in diesen werden alle Kombinationen zwischen geschätzten und tatsächlichen Werten nebst der Anzahl der Fälle aufgeführt. Selektiert man die Tabelle im SQL Workshop, so sieht das Ergebnis in etwa wie in Abbildung 5 aus.

Selektion der Confusion Matrix als Tabelle

Abbildung 5: Selektion der Confusion Matrix als Tabelle

Schöner wäre allerdings schon die Darstellung der Werte als "richtige" Matrix. Dazu müssen die Daten als Kreuztabelle dargestellt werden. Navigieren Sie dazu zum Community Tipp Daten als Kreuztabelle darstellen, navigieren Sie zum Abschnitt Kreuztabellen vor Oracle11g und spielen Sie (per SQL Workshop) die Funktion getPivotSql in Ihr Datenbankschema ein.

Erzeugen Sie dann den SQL-Bericht (keinen interaktiven Bericht) zur Darstellung der Confusion Matrix; hinterlegen Sie folgenden PL/SQL-Code als Berichtsquelle .

return getPivotSql(
  p_sql => 'select actual_target_value, predicted_target_value, value from '||v('P4_MINING_MODELLE')||'_CONF order by actual_target_value',
  p_x_col => 'ACTUAL_TARGET_VALUE',
  p_x_col_type => 'VARCHAR2',
  p_x_col_start => null,
  p_x_col_interval => null,
  p_x_col_int_unit => null,
  p_x_col_count => 12,
  p_y_col  => 'PREDICTED_TARGET_VALUE',
  p_cell_col => 'VALUE',
  p_cell_col_aggr => 'SUM'
);

Stellen Sie sicher, dass Sie unterhalb des PL/SQL Code Generic Columns als Spaltenüberschriften eingestellt haben. Klicken Sie dann auf Region erstellen, starten Sie die Seite aber noch nicht.

Navigieren Sie dann wiederum zu den Berichtsattributen (Abbildung 6).

Berichtsattribute der Confusion Matrix

Abbildung 6: Berichtsattribute der Confusion Matrix

Stellen Sie den Überschriftstyp auf PL/SQL um und hinterlegen Sie im Feld für die PL/SQL-Funktion, die die Spaltenüberschriften zurückliefert, folgenden Code:

declare
  v_sql varchar2(32767);
  type t_c is ref cursor;
  v_c t_c;
  v_head varchar2(32767);
  v_col varchar2(50);
begin
  v_sql := 'select distinct actual_target_value from '||v('P4_MINING_MODELLE')||'_CONF order by 1';
  open v_c for v_sql;
  loop
    fetch v_c into v_col;
    exit when v_c%NOTFOUND;
    v_head := v_head ||replace(v_col,':',')') ||':';
  end loop;
  return v_head;
end;

Speichern Sie die Angaben und starten Sie die Seite - Sie sollten in etwa folgende Ausgabe sehen ...

Darstellung der Confusion Matrix

Abbildung 7: Darstellung der Confusion Matrix

Abbildung 7 zeigt die Confusion Matrix: Auf der waagerechten sehen Sie die tatsächlichen Werte aus der Testdatenmenge (Income Level). Auf der Senkrechten sind die Schätzungen zugeordnet - die gelb markierten Felder geben die korrekt durchgeführten Schätzungen wieder - alle anderen Schätzungen waren fehlerhaft. Eine Erweiterung der Confusion Matrix wäre die Berücksichtigung von Kosten: Jeder Fehlschätzung können (unterschiedliche) Kosten zugeordnet werden, so dass man neben dem Prozentwert auch ein Kostenwert entstehen kann.

Receiver Operation Characteristics (ROC)

Der nächste Indikator für die Güte des Data Mining-Modells ist die ROC-Kurve - wie die Confusion Matrix muss Sie zunächst berechnet werden. Die ROC-Kurve bezieht sich allerding stets auf einen "bevorzugten" Wert; Sie benötigen also eine weitere Auswahlliste, aus welcher der bevorzugte Wert (also hier das bevorzugte "Income Level") ausgewählt werden kann. Erzeugen Sie also eine weitere Auswahlliste namens P4_PREFERRED_VALUE mit folgendem SQL als Wertelistenabfrage:

select distinct cust_income_level d, cust_income_level r
from customers_mining order by 1

Anschließend benötigen Sie wieder eine Schaltfläche ROC-Kurve berechnen und einen PL/SQL-Prozeß. Und wiederum soll der Prozeß nur bei Klick auf die Schaltfläche ausgeführt werden

begin
  -- Evtl. vorhandene ROC-Tabelle löschen
  begin
    execute immediate 'drop table '|| :P4_MINING_MODELLE||'_ROC' ||' purge';
  exception 
    when others then null;
  end;

  -- ROC berechnen
  dbms_data_mining.compute_ROC(
    roc_area_under_curve        => :P4_ACCURACY,
    apply_result_table_name     => :P4_MINING_MODELLE||'_APPL',
    target_table_name           => :P4_MINING_MODELLE||'_TEST', 
    case_id_column_name         => :P4_PK_COLUMN,
    target_column_name          => :P4_TARGET_COLUMN,
    roc_table_name              => :P4_MINING_MODELLE||'_ROC',  
    positive_target_value       => :P4_PREFERRED_VALUE
  );
end;

Starten Sie Sie die Seite, treffen Sie in der Auswahlliste für das "bevorzugte" Income Level eine Auswahl und klicken Sie die Schaltfläche ROC-Kurve berechnen. Daraufhin vergehen wiederum einige Sekunden und Sie sehen die Ausgangsseite nochmals (Abbildung 8).

Die ROC-Kurve wurde berechnet

Abbildung 8: Die ROC-Kurve wurde berechnet

Die Daten der ROC-Kurve wurden wie bereits vorhin die der Confusion Matrix in einer Tabelle abgelegt: Der Name ist (aus obigem Code ersichtlich) gleich {Name des Mining-Modells}||'_ROC' . Schauen Sie sich die Tabelle zunächst im SQL Workshop an (Abbildung 9).

Daten der ROC-Kurve

Abbildung 9: Daten der ROC-Kurve

Die ROC-Daten geben, vereinfacht ausgedrückt, Aufschluß darüber, wieviele Fehler man akzeptieren muss, wenn man eine bestimmte Anzahl Schätzungen annehmen möchte. Man sieht das in Abbildung 9 sehr schön an der ersten Zeile. Da jede Data Mining-Schätzungen auch fehlerhaft sein kann, muss man Fehler akzeptieren: Setzt man eine Wahrscheinlichkeit von 1 (100%) voraus, so kann man keine der Schätzungen akzeptieren, denn deren Wahrscheinlichkeit liegt stets unter 1. Setzt man nun mindestens 0,8 (80%) voraus, so kann man in diesem Beispiel 49 True Positives akzeptieren, denn deren Wahrscheinlichkeit liegt über 0,8. Alle anderen müsste man verwerfen. Dies ließe sich nun bis zu einer Mindest-Wahrscheinlichkeit von Null fortführen; dann könnte man alle Schätzungen akzeptieren.

Am besten visualisiert man die ROC-Kurve als Diagramm. Erstellen Sie ein zweidimensionales Liniendiagramm und hinterlegen Sie folgende Diagrammabfrage:

select 
  null as link, 
  to_char(false_positive_fraction * 100, '990') as label, 
  true_positive_fraction as value
from dm_apex_roc 
order by false_positive_fraction

Stellen Sie das Aussehen des Diagramms nach Belieben ein; das Ergebnis sollte wie in Abbildung 10 aussehen:

ROC-Kurve als Diagramm

Abbildung 10: ROC-Kurve als Diagramm

Ein Data Mining-Modell ist umso besser, je mehr Schätzungen es für eine bestimmte akzeptierte Fehlerrate liefert, also je mehr die Kurve sich in die obere linke Ecke bewegt. Die Fläche unterhalb der Kurve ist somit eine Kennzahl für die Güte des Modells; diese wird ja von der Prozedur DBMS_DATA_MINING.COMPUTE_ROC als OUT-Parameter zurückgegeben. Die ROC-Kurve wird gerne mit der (hier blau eingezeichneten) Linie verglichen; diese würde die zufällige Schätzung repräsentieren.

Berechnet man nun ROC-Kurven auch für die anderen Einkommensstufen, so lässt sich feststellen, ob das Modell bei bestimmten Einkommensstufen besonders gut oder besonders schlecht arbeitet.

Fazit

Allein mit Hilfe der Werkzeuge Confusion Matrix und ROC bekommt man schon einen recht guten Eindruck vom Data Mining-Modell. Noch besser wird es, wenn man mehrere Modelle hat; diese lassen sich dann vergleichen. Für den konkreten Fall lässt sich feststellen, dass es zwar schon besser als der Zufall arbeitet, aber noch lange nicht als optimal zu bezeichnen ist. Allein aus der Confusion Matrix lässt sich ablesen, dass viele Schätzungen "nur knapp" daneben liegen, also die Einkommensklasse jeweils direkt über oder unter der richtigen getroffen haben. In der Statistik gilt das natürlich als Fehlschätzung, denn etwas wie "in etwa richtig" gibt es nicht.

Man könnte sich also nun die Frage stellen, ob der Datenbestand die Klassifizierung in 12 Einkommensklassen überhaupt erlaubt oder ob es vielleicht besser wäre, sich auf weniger Klassen zu beschränken. Auch könnte ein anderer Algorithmus zu besseren Ergebnissen führen. Diese Themen werden allerdings in einem der nächsten Community Tipps behandelt.

Weitere Informationen zum Thema:

Zurück zur Community-Seite