Start · Sprachen · PHP · Referenz · SVM

SVM

Klasse

Bietet Methoden zum Trainieren und Klassifizieren von Daten mit Support Vector Machines (SVM) über die LIBSVM-Bibliothek.

seit PHP 0.1.0 Kategorie: misc

Signatur

class SVM

Beschreibung

Die Klasse SVM ist Teil der PHP-Erweiterung php-svm und stellt eine objektorientierte Schnittstelle zur populären LIBSVM-Bibliothek bereit. Mit ihr lassen sich Support Vector Machines trainieren und anschließend zur Klassifikation oder Regression einsetzen.

Support Vector Machines sind überwachte Lernalgorithmen, die besonders gut für binäre und Mehrklassen-Klassifikation, aber auch für Regression geeignet sind. Die Klasse erlaubt die Konfiguration aller wichtigen SVM-Parameter wie Kernel-Typ, Kostenfaktor (C) und Gamma über entsprechende Setter-Methoden.

Der typische Arbeitsablauf umfasst drei Schritte: Zuerst wird eine SVM-Instanz konfiguriert, dann mit Trainingsdaten über die Methode train() trainiert (liefert ein SVMModel-Objekt), und schließlich werden Vorhersagen auf neuen Daten über das zurückgegebene Modell getroffen. Das trainierte Modell kann mit SVMModel::save() persistiert und später mit SVMModel::load() wieder geladen werden.

Die Erweiterung ist nicht standardmäßig in PHP enthalten und muss über PECL (pecl install svm) installiert werden. Für den Einsatz in der Produktion empfiehlt sich die Validierung der Modellgüte mittels Kreuzvalidierung über SVM::crossValidate().

Parameter

Name Typ Default Beschreibung
$kernel_type int SVM::KERNEL_RBF Kernel-Typ, der für die SVM verwendet wird. Mögliche Werte sind Klassenkonstanten wie SVM::KERNEL_LINEAR, SVM::KERNEL_POLY, SVM::KERNEL_RBF (Standard) oder SVM::KERNEL_SIGMOID.

Beispiele

SVM für binäre Klassifikation trainieren und Vorhersage treffen

<?php
// Trainingsdaten: Jedes Element beginnt mit dem Label (1 oder -1),
// gefolgt von Feature-Index => Feature-Wert Paaren
$trainingData = [
    [1,  [1 => 0.1, 2 => 0.2, 3 => 0.9]],
    [1,  [1 => 0.2, 2 => 0.3, 3 => 0.8]],
    [-1, [1 => 0.9, 2 => 0.8, 3 => 0.1]],
    [-1, [1 => 0.8, 2 => 0.7, 3 => 0.2]],
];

$svm = new SVM();

// Parameter konfigurieren
$svm->setOptions([
    SVM::OPT_KERNEL_TYPE => SVM::KERNEL_RBF,
    SVM::OPT_C           => 1.0,
    SVM::OPT_GAMMA       => 0.5,
]);

// Modell trainieren
$model = $svm->train($trainingData);

// Neuen Datenpunkt klassifizieren
$testPoint = [1 => 0.15, 2 => 0.25, 3 => 0.85];
$label = $model->predict($testPoint);

echo "Vorhergesagtes Label: " . $label . PHP_EOL;
// Ergebnis: Vorhergesagtes Label: 1
Vorhergesagtes Label: 1

Modell trainieren, speichern und wieder laden

<?php
$trainingData = [
    [1,  [1 => 1.0, 2 => 0.0]],
    [1,  [1 => 0.9, 2 => 0.1]],
    [-1, [1 => 0.0, 2 => 1.0]],
    [-1, [1 => 0.1, 2 => 0.9]],
];

$svm = new SVM();
$svm->setOptions([
    SVM::OPT_KERNEL_TYPE => SVM::KERNEL_LINEAR,
    SVM::OPT_C           => 2.0,
]);

// Trainieren und Modell speichern
$model = $svm->train($trainingData);
$model->save('/tmp/mein_svm_modell.dat');
echo "Modell gespeichert." . PHP_EOL;

// Modell später laden
$geladenesModell = new SVMModel('/tmp/mein_svm_modell.dat');
$vorhersage = $geladenesModell->predict([1 => 0.95, 2 => 0.05]);
echo "Vorhersage mit geladenem Modell: " . $vorhersage . PHP_EOL;
Modell gespeichert. Vorhersage mit geladenem Modell: 1

Kreuzvalidierung zur Modellgüteprüfung

<?php
$trainingData = [
    [1,  [1 => 0.1, 2 => 0.9]],
    [1,  [1 => 0.2, 2 => 0.8]],
    [1,  [1 => 0.15, 2 => 0.85]],
    [-1, [1 => 0.9, 2 => 0.1]],
    [-1, [1 => 0.8, 2 => 0.2]],
    [-1, [1 => 0.85, 2 => 0.15]],
];

$svm = new SVM();
$svm->setOptions([
    SVM::OPT_KERNEL_TYPE => SVM::KERNEL_RBF,
    SVM::OPT_C           => 1.0,
    SVM::OPT_GAMMA       => 0.5,
]);

// 3-fache Kreuzvalidierung
$genauigkeit = $svm->crossValidate($trainingData, 3);
echo "Kreuzvalidierungs-Genauigkeit: " . ($genauigkeit * 100) . "%" . PHP_EOL;
Kreuzvalidierungs-Genauigkeit: 100%

// Wichtig · Fallstricke

Installation: Die SVM-Klasse ist nicht Teil des PHP-Kerns. Sie muss über PECL installiert werden: pecl install svm. Außerdem muss die LIBSVM-Bibliothek auf dem System vorhanden sein.

  • Datenformat: Trainingsdaten müssen als numerisch indizierte Arrays übergeben werden, wobei jedes Element ein Array aus [Label, [Feature-Index => Wert, ...]] ist. Feature-Indizes müssen positive Ganzzahlen sein und sollten bei 1 beginnen.
  • Skalierung: SVM-Algorithmen sind sehr sensibel gegenüber der Skalierung der Eingabedaten. Es wird dringend empfohlen, alle Features vor dem Training auf einen gemeinsamen Wertebereich (z. B. [0, 1] oder [-1, 1]) zu normalisieren.
  • Parameterauswahl: Die Wahl von Kernel-Typ, C und Gamma hat großen Einfluss auf die Modellqualität. Nutze SVM::crossValidate() in Kombination mit einem Grid-Search-Ansatz, um optimale Parameter zu finden.
  • Mehrklassen-Klassifikation: LIBSVM unterstützt Mehrklassen-Klassifikation nativ über den One-vs-One-Ansatz. Die Labels können beliebige Ganzzahlen sein.