2017-05-18 7 views
0

Ich möchte eine Funktion erstellen, die das Trainingsset und das Testset als Argumente akzeptiert, min-max skaliert/normalisiert und gibt den Trainingssatz zurück und verwendet diese same Werte von Minimum und Bereich auf Min-Max-Skala/normalisieren und das Testset zurückgeben.min max Skalierung/Normalisierung in r für Zug- und Testdaten

Bisher ist dies die Funktion Ich habe kommen mit:

min_max_scaling <- function(train, test){ 

    min_vals <- sapply(train, min) 
    range1 <- sapply(train, function(x) diff(range(x))) 

    # scale the training data 

    train_scaled <- data.frame(matrix(nrow = nrow(train), ncol = ncol(train))) 

    for(i in seq_len(ncol(train))){ 
    column <- (train[,i] - min_vals[i])/range1[i] 
    train_scaled[i] <- column 
    } 

    colnames(train_scaled) <- colnames(train) 

    # scale the testing data using the min and range of the train data 

    test_scaled <- data.frame(matrix(nrow = nrow(test), ncol = ncol(test))) 

    for(i in seq_len(ncol(test))){ 
    column <- (test[,i] - min_vals[i])/range1[i] 
    test_scaled[i] <- column 
    } 

    colnames(test_scaled) <- colnames(test) 

    return(list(train = train_scaled, test = test_scaled)) 
} 

Die Definition von min max Skalierung auf diese Frage ist ähnlich wie früher SO gefragt - Normalisation of a two column data using min and max values

Meine Fragen sind:
1. Gibt es eine Möglichkeit, die beiden for Schleifen in der Funktion zu vektorisieren? z.B. Verwenden sapply()
2. Gibt es Pakete, die uns erlauben zu tun, was wir hier tun wollen?

Antwort

3

In Bezug auf Ihre zweite Frage, können Sie das caret Paket verwenden: definiert Dieses Paket

library(caret) 

train = data.frame(a = 1:3, b = 10:12) 
test = data.frame(a = 1:6, b = 7:12) 

pp = preProcess(train, method = "range") 


predict(pp, train) 

#  a b 
# 1 0.0 0.0 
# 2 0.5 0.5 
# 3 1.0 1.0 

predict(pp, test) 

#  a b 
# 1 0.0 -1.5 
# 2 0.5 -1.0 
# 3 1.0 -0.5 
# 4 1.5 0.0 
# 5 2.0 0.5 
# 6 2.5 1.0 

auch andere Transformationsverfahren finden Sie unter: Sie für den Versuch http://machinelearningmastery.com/pre-process-your-dataset-in-r/

0
set.seed(1984) 

### simulating a data set 

df <- data.frame(var1 = rnorm(100,5,3), 
       var2 = rpois(100,15), 
       var3 = runif(50,90,100)) 

df_train <- df[1:60,] 
df_test <- df[61:100,] 



## the function 

normalize_data <- function(train_set, test_set) ## the args are the two sets 

{ 
    ranges <- sapply(train_set, function(x) max(x)-min(x)) ## range calculation 

    normalized_train <- train_set/ranges # the normalization 
    normalized_test <- test_set/ranges 

    return(list(ranges = ranges,     # returning a list 
       normalized_train= normalized_train, 
       normalized_test =normalized_test)) 
    } 


z <- normalize_data(df_train, df_test) ## applying the function 

    ## the results 
    z$ranges 
     var1  var2  var3 
    13.051448 22.000000 9.945934 
    > head(z$normalized_train) 
      var1  var2  var3 
    1 0.47715854 1.1492978 7.289028 
    2 0.18322387 0.4545455 4.280883 
    3 0.69451066 1.3070668 9.703761 
    4 -0.04125108 1.6090169 7.277882 
    5 0.35731555 0.7272727 4.133561 
    6 0.86120315 0.6032616 9.246209 
    > head(z$normalized_train) 
      var1  var2  var3 
    1 0.47715854 1.1492978 7.289028 
    2 0.18322387 0.4545455 4.280883 
    3 0.69451066 1.3070668 9.703761 
    4 -0.04125108 1.6090169 7.277882 
    5 0.35731555 0.7272727 4.133561 
    6 0.86120315 0.6032616 9.246209 
+0

Vielen zu antworten aber ich schaue mir eine Möglichkeit an, nach Daten zu skalieren, indem ich das Minimum dieser Spalte von jeder Zeile subtrahiere und dann durch den Bereich dividiere. Ihre Antwort berücksichtigt nicht die Subtraktion des Minimums. –

0
normalize <- function(x) 
{ 
    return(X- min(x) /(max(x)-min(x))) 
} 

as.data.frame(lapply(df$name, normalize)) 

min-max normalization try this may work