2015-08-15 8 views
6

Ich möchte drei Parameter (Gamma, Kosten und Epsilon) in Eps-Regression (SVR) mit GA in R optimieren. Hier ist, was ich getan habe.Wie Parameter mit genetischen Algorithmen zu optimieren

library(e1071) 
data(Ozone, package="mlbench") 
a<-na.omit(Ozone) 
index<-sample(1:nrow(a), trunc(nrow(a)/3)) 
trainset<-a[index,] 
testset<-a[-index,] 
model<-svm(V4 ~ .,data=trainset, cost=0.1, gamma=0.1, epsilon=0.1, type="eps-regression", kernel="radial") 
error<-model$residuals 
rmse <- function(error) #root mean sqaured error 
{ 
    sqrt(mean(error^2)) 
} 
rmse(error) 

hier, habe ich Kosten, gamma und epsilon 0,1 bzw. zu sein, aber ich glaube nicht, dass der beste Wert sind. Also würde ich gerne Genetic Algorithm verwenden, um diese Parameter zu optimieren.

GA <- ga(type = "real-valued", fitness = rmse, 
     min = c(0.1,3), max = c(0.1,3), 
     popSize = 50, maxiter = 100) 

Hier habe ich RMSE als Fitness-Funktion verwendet. aber ich denke, Fitness-Funktion muss die Parameter enthalten, die optimiert werden sollen. Aber in SVR ist die Zielfunktion zu kompliziert, um mit dem R-Code zu schreiben, den ich lange Zeit zu finden versuchte, aber ohne Erfolg. Jemand, der SVR und GA zur gleichen Zeit kennt, jemand, der Erfahrung in der Optimierung von SVR-Parametern mit GA hat, bitte helfen Sie mir. Bitte.

Antwort

12

In einer solchen Anwendung gelangt man die Parameter sind, deren Werte optimiert werden (im Fall cost, gamma und epsilon) als Parameter der Fitnessfunktion, die dann die Anpassungsfunktion + Bewertungsmodell läuft und verwendet eine Maßnahme der Modellleistung als Maß für die Fitness. Daher ist die explizite Form der Zielfunktion nicht direkt relevant.

In der folgenden Implementierung verwendete ich eine 5-fache Kreuzvalidierung, um den RMSE für einen gegebenen Satz von Parametern zu schätzen. Insbesondere, da das Paket GA die Fitness-Funktion maximiert, habe ich den Fitness-Wert für einen gegebenen Wert der Parameter als minus den Durchschnittswert gegenüber den Kreuzvalidierungs-Datensätzen geschrieben. Daher ist die maximale erreichbare Fitness Null.

Hier ist sie:

library(e1071) 
library(GA) 

data(Ozone, package="mlbench") 
Data <- na.omit(Ozone) 

# Setup the data for cross-validation 
K = 5 # 5-fold cross-validation 
fold_inds <- sample(1:K, nrow(Data), replace = TRUE) 
lst_CV_data <- lapply(1:K, function(i) list(
    train_data = Data[fold_inds != i, , drop = FALSE], 
    test_data = Data[fold_inds == i, , drop = FALSE])) 

# Given the values of parameters 'cost', 'gamma' and 'epsilon', return the rmse of the model over the test data 
evalParams <- function(train_data, test_data, cost, gamma, epsilon) { 
    # Train 
    model <- svm(V4 ~ ., data = train_data, cost = cost, gamma = gamma, epsilon = epsilon, type = "eps-regression", kernel = "radial") 
    # Test 
    rmse <- mean((predict(model, newdata = test_data) - test_data$V4)^2) 
    return (rmse) 
} 

# Fitness function (to be maximized) 
# Parameter vector x is: (cost, gamma, epsilon) 
fitnessFunc <- function(x, Lst_CV_Data) { 
    # Retrieve the SVM parameters 
    cost_val <- x[1] 
    gamma_val <- x[2] 
    epsilon_val <- x[3] 

    # Use cross-validation to estimate the RMSE for each split of the dataset 
    rmse_vals <- sapply(Lst_CV_Data, function(in_data) with(in_data, 
     evalParams(train_data, test_data, cost_val, gamma_val, epsilon_val))) 

    # As fitness measure, return minus the average rmse (over the cross-validation folds), 
    # so that by maximizing fitness we are minimizing the rmse 
    return (-mean(rmse_vals)) 
} 

# Range of the parameter values to be tested 
# Parameters are: (cost, gamma, epsilon) 
theta_min <- c(cost = 1e-4, gamma = 1e-3, epsilon = 1e-2) 
theta_max <- c(cost = 10, gamma = 2, epsilon = 2) 

# Run the genetic algorithm 
results <- ga(type = "real-valued", fitness = fitnessFunc, lst_CV_data, 
    names = names(theta_min), 
    min = theta_min, max = theta_max, 
    popSize = 50, maxiter = 10) 

summary(results) 

, die die Ergebnisse (für den Bereich von Parameterwerten, die ich festgelegt, die auf der Grundlage der Daten Feinabstimmung erfordern kann) erzeugt:

GA results: 
Iterations    = 100 
Fitness function value = -14.66315 
Solution    = 
     cost  gamma epsilon 
[1,] 2.643109 0.07910103 0.09864132 
+0

ich kann Ich sage dir nicht, wie viel es mir bedeutet ... Vielen Dank ~! – jihoon

+0

Vielen Dank! Der Code funktioniert für Ozone-Daten. Wenn ich jedoch einige Zeilen aus Ozone-Daten lösche oder wenn ich die Zahlen in einer bestimmten Spalte ändere, funktioniert das nicht und es gibt "Error in predict.svm (ret, xhold, decision.values ​​= TRUE): Das Modell ist leer ! " Error. Wie kann ich dieses Problem lösen? –

Verwandte Themen