train_class_svmT_train_class_svmTrainClassSvmTrainClassSvmtrain_class_svm (Operator)

Name

train_class_svmT_train_class_svmTrainClassSvmTrainClassSvmtrain_class_svm — Trainieren einer Support-Vektor-Maschine.

Signatur

train_class_svm( : : SVMHandle, Epsilon, TrainMode : )

Herror T_train_class_svm(const Htuple SVMHandle, const Htuple Epsilon, const Htuple TrainMode)

void TrainClassSvm(const HTuple& SVMHandle, const HTuple& Epsilon, const HTuple& TrainMode)

void HClassSvm::TrainClassSvm(double Epsilon, const HTuple& TrainMode) const

void HClassSvm::TrainClassSvm(double Epsilon, const HString& TrainMode) const

void HClassSvm::TrainClassSvm(double Epsilon, const char* TrainMode) const

void HClassSvm::TrainClassSvm(double Epsilon, const wchar_t* TrainMode) const   (Nur Windows)

static void HOperatorSet.TrainClassSvm(HTuple SVMHandle, HTuple epsilon, HTuple trainMode)

void HClassSvm.TrainClassSvm(double epsilon, HTuple trainMode)

void HClassSvm.TrainClassSvm(double epsilon, string trainMode)

def train_class_svm(svmhandle: HHandle, epsilon: float, train_mode: Union[str, int]) -> None

Beschreibung

train_class_svmtrain_class_svmTrainClassSvmTrainClassSvmTrainClassSvmtrain_class_svm trainiert die durch SVMHandleSVMHandleSVMHandleSVMHandleSVMHandlesvmhandle angegebene Support Vektor Maschine (SVM). Bevor die SVM trainiert werden kann, müssen mit add_sample_class_svmadd_sample_class_svmAddSampleClassSvmAddSampleClassSvmAddSampleClassSvmadd_sample_class_svm oder read_samples_class_svmread_samples_class_svmReadSamplesClassSvmReadSamplesClassSvmReadSamplesClassSvmread_samples_class_svm die zum Training zu verwendenden Trainingsmuster zu der SVM hinzugefügt werden.

Da es sich beim Training von SVMs um ein konvexes quadratisches Optimierungsproblem handelt, kann sichergestellt werden, dass das Training nach endlichen Schritten beim globalen Optimum terminiert. Mit dem Parameter EpsilonEpsilonEpsilonEpsilonepsilonepsilon wird die Schwelle gesetzt, den der Gradient der Funktion, die intern optimiert wird, unterschreiten muss, damit das Training als beendet angesehen werden kann. Normalerweise sollte EpsilonEpsilonEpsilonEpsilonepsilonepsilon auf 0.001 gesetzt werden, da dies in der Praxis zu den besten Ergebnissen führt. Ein zu großer Wert führt zu einem schnelleren Abbrechen des Trainings und dadurch zu einer sub-optimalen Lösung. Ein zu kleiner Wert führt dazu, dass der Optimierungsalgorithmus unverhältnissmäßig lange dauert, ohne dass sich die Erkennungsrate verändert. Erfahrungsgemäß gibt es zwei Gründe für das Verändern von EpsilonEpsilonEpsilonEpsilonepsilonepsilon: Bei extrem kleinen NuNuNuNununu, z.B. 0.001 (siehe create_class_svmcreate_class_svmCreateClassSvmCreateClassSvmCreateClassSvmcreate_class_svm), kann ein kleineres Epsilon die Erkennungsrate deutlich verbessern. Eine zweiter Fall ist die Bestimmung von optimalen Kernelfunktionen mit ihrer Parametrisierung (z.B. KernelParamKernelParamKernelParamKernelParamkernelParamkernel_param-NuNuNuNununu Paare beim RBF-Kernel) bei einem üblicherweise sehr lange dauernden n-fachen Vergleichsprüfungsverfahren (Cross Validation). Wählt man EpsilonEpsilonEpsilonEpsilonepsilonepsilon beispielsweise als 0.1 so terminiert das Training zwar vorschnell, aber der Bereich der optimalen Kernelfuntion unterscheidet sich nicht wesentlich von dem Bereich, den man bei der Cross Validation mit einem normalen EpsilonEpsilonEpsilonEpsilonepsilonepsilon erhalten hätte. Nachdem ein optimales KernelParamKernelParamKernelParamKernelParamkernelParamkernel_param-NuNuNuNununu Paar ermittelt wurde, kann das endgültige Training mit kleinem EpsilonEpsilonEpsilonEpsilonepsilonepsilon erfolgen.

Die Dauer des Trainings hängt von der Trainingsdatenmenge, der Anzahl der beim Training entstehenden SV sowie EpsilonEpsilonEpsilonEpsilonepsilonepsilon ab (und kann zwischen unter einer Sekunde bis mehrere Stunden betragen).

Es empfiehlt sich daher, NuNuNuNununu in create_class_svmcreate_class_svmCreateClassSvmCreateClassSvmCreateClassSvmcreate_class_svm so zu wählen, dass möglichst wenige SV beim Training entstehen, ohne dass die Erkennungsrate sich verschlechtert. Insbesondere ist zu beachten, dass für NuNuNuNununu ein nicht zu großer Wert gewählt wird, damit die Optimierung von einem zulässigen Punkt startet. Falls zu viele Trainingsfehler mit einem zu großem NuNuNuNununu gewählt wurde, erfolgt eine Fehlerbehandlung. In diesem Fall muss eine SVM mit dem gleichen Trainingsdatensatz, aber kleinerem NuNuNuNununu trainiert werden.

Mit dem Parameter TrainModeTrainModeTrainModeTrainModetrainModetrain_mode kann zwischen verschiedenen Trainingsmodi unterschieden werden. Normalerweise wird eine SVM ohne weiteres Vorwissen trainiert, und TrainModeTrainModeTrainModeTrainModetrainModetrain_mode wird auf 'default'"default""default""default""default""default" gesetzt. Werden für den gleichen Trainingsdatensatz SVM mit verschiedenen Kernels trainiert (siehe oben), ist es mit TrainModeTrainModeTrainModeTrainModetrainModetrain_mode möglich, eine bereits trainierte SVM als Anfangspunkt für das Optimierungsverfahren zu verwenden und somit das Training insbesondere bei sehr großen Trainingsdatensätzen zu beschleunigen. Hierbei muss aber der Trainingsdatensatz, die Anzahl der Klassen sowie der Modus (siehe create_class_svmcreate_class_svmCreateClassSvmCreateClassSvmCreateClassSvmcreate_class_svm) übereinstimmen. Hierfür wird der SVMHandleSVMHandleSVMHandleSVMHandleSVMHandlesvmhandle der bereits trainierten Maschine in TrainModeTrainModeTrainModeTrainModetrainModetrain_mode übergeben.

Mit TrainModeTrainModeTrainModeTrainModetrainModetrain_mode = 'add_sv_to_train_set'"add_sv_to_train_set""add_sv_to_train_set""add_sv_to_train_set""add_sv_to_train_set""add_sv_to_train_set" ist es möglich, dass beim Training Support-Vektoren, die aus einem früheren Aufruf von train_class_svmtrain_class_svmTrainClassSvmTrainClassSvmTrainClassSvmtrain_class_svm entstanden sind, dem Trainingsdatensatz hinzugefügt werden. Dieser TrainModeTrainModeTrainModeTrainModetrainModetrain_mode hat zwei typische Anwendungsgebiete: Erstens ist es möglich, SVM sukzessive zu trainieren. Dabei wird der Trainingsdatensatz zuerst in verschiedene Teile aufgeteilt. Danach wird ein erster Teil normal mit TrainModeTrainModeTrainModeTrainModetrainModetrain_mode = 'default'"default""default""default""default""default" trainiert. Anschließend wird mit clear_samples_class_svmclear_samples_class_svmClearSamplesClassSvmClearSamplesClassSvmClearSamplesClassSvmclear_samples_class_svm der vorherige Trainingsdatensatz verworfen, ein nächster Teil mit add_sample_class_svmadd_sample_class_svmAddSampleClassSvmAddSampleClassSvmAddSampleClassSvmadd_sample_class_svm übergeben und mit train_class_svmtrain_class_svmTrainClassSvmTrainClassSvmTrainClassSvmtrain_class_svm bei TrainModeTrainModeTrainModeTrainModetrainModetrain_mode = 'add_sv_to_train_set'"add_sv_to_train_set""add_sv_to_train_set""add_sv_to_train_set""add_sv_to_train_set""add_sv_to_train_set" nachtrainiert. Dies wird solange wiederholt, bis alle Teile des Trainingsdatensatzes trainiert wurden. Dieses Vorgehen hat den Vorteil, dass so sehr große Trainingsdatensätze effizient hinsichtlich des Speicherbedarfs trainiert werden können. Ein weiteres Anwendungsgebiet für TrainModeTrainModeTrainModeTrainModetrainModetrain_mode = 'add_sv_to_train_set'"add_sv_to_train_set""add_sv_to_train_set""add_sv_to_train_set""add_sv_to_train_set""add_sv_to_train_set" ist, dass ein genereller Klassifikator durch Hinzufügen von charakteristischen Trainingsmustern und Nachtrainieren spezialisiert werden kann. Beim Nachtrainieren von SVMs mit TrainModeTrainModeTrainModeTrainModetrainModetrain_mode='add_sv_to_train_set'"add_sv_to_train_set""add_sv_to_train_set""add_sv_to_train_set""add_sv_to_train_set""add_sv_to_train_set" muss beachtet werden, dass die Vorverarbeitung (wie in create_class_svmcreate_class_svmCreateClassSvmCreateClassSvmCreateClassSvmcreate_class_svm beschrieben) nicht verändert wird.

Ausführungsinformationen

Dieser Operator modifiziert den Zustand des folgenden Eingabeparameters:

Während der Ausführung dieses Operators muss der Zugriff auf den Wert dieses Parameters synchronisiert werden, wenn er über mehrere Threads hinweg verwendet wird.

Parameter

SVMHandleSVMHandleSVMHandleSVMHandleSVMHandlesvmhandle (input_control, Zustand wird modifiziert)  class_svm HClassSvm, HTupleHHandleHTupleHtuple (handle) (IntPtr) (HHandle) (handle)

Handle der SVM.

EpsilonEpsilonEpsilonEpsilonepsilonepsilon (input_control)  real HTuplefloatHTupleHtuple (real) (double) (double) (double)

Abbruchparameter für das Training.

Defaultwert: 0.001

Wertevorschläge: 0.00001, 0.0001, 0.001, 0.01, 0.1

TrainModeTrainModeTrainModeTrainModetrainModetrain_mode (input_control)  number HTupleUnion[str, int]HTupleHtuple (string / integer) (string / int / long) (HString / Hlong) (char* / Hlong)

Modus des Trainings. Im Normalfall: 'default'. Falls die bereits enthaltenen SV als Trainingsdaten verwendet werden sollen: 'add_sv_to_train_set'. Im Falle von Alpha seeding das zu verwendende SVM Handle

Defaultwert: 'default' "default" "default" "default" "default" "default"

Werteliste: 'add_sv_to_train_set'"add_sv_to_train_set""add_sv_to_train_set""add_sv_to_train_set""add_sv_to_train_set""add_sv_to_train_set", 'default'"default""default""default""default""default"

Beispiel (HDevelop)

* Train an SVM
create_class_svm (NumFeatures, 'rbf', 0.01, 0.01, NumClasses,\
                  'one-versus-all', 'normalization', NumFeatures,\
                  SVMHandle)
read_samples_class_svm (SVMHandle, 'samples.mtf')
train_class_svm (SVMHandle, 0.001, 'default')
write_class_svm (SVMHandle, 'classifier.svm')

Ergebnis

Sind die Parameterwerte korrekt, dann liefert train_class_svmtrain_class_svmTrainClassSvmTrainClassSvmTrainClassSvmtrain_class_svm den Wert 2 (H_MSG_TRUE). Gegebenenfalls wird eine Fehlerbehandlung durchgeführt.

Vorgänger

add_sample_class_svmadd_sample_class_svmAddSampleClassSvmAddSampleClassSvmAddSampleClassSvmadd_sample_class_svm, read_samples_class_svmread_samples_class_svmReadSamplesClassSvmReadSamplesClassSvmReadSamplesClassSvmread_samples_class_svm

Nachfolger

classify_class_svmclassify_class_svmClassifyClassSvmClassifyClassSvmClassifyClassSvmclassify_class_svm, write_class_svmwrite_class_svmWriteClassSvmWriteClassSvmWriteClassSvmwrite_class_svm, create_class_lut_svmcreate_class_lut_svmCreateClassLutSvmCreateClassLutSvmCreateClassLutSvmcreate_class_lut_svm

Alternativen

train_dl_classifier_batchtrain_dl_classifier_batchTrainDlClassifierBatchTrainDlClassifierBatchTrainDlClassifierBatchtrain_dl_classifier_batch, read_class_svmread_class_svmReadClassSvmReadClassSvmReadClassSvmread_class_svm

Siehe auch

create_class_svmcreate_class_svmCreateClassSvmCreateClassSvmCreateClassSvmcreate_class_svm

Literatur

John Shawe-Taylor, Nello Cristianini: „Kernel Methods for Pattern Analysis“; Cambridge University Press, Cambridge; 2004.
Bernhard Schölkopf, Alexander J.Smola: „Learning with Kernels“; MIT Press, London; 1999.

Modul

Foundation