GridSearchCV: Wann StandardScaler notwendig?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
CodeIt
User
Beiträge: 36
Registriert: Mittwoch 13. September 2017, 06:10

Hallo,
ich versuche die optimalen Hyperparameter für eine SVM per GridSearch zu finden.
Der Datensätz wäre FashionMNIST.
Wenn ich einfach nur eine SVM trainiere, dann normalisiere ich die Daten zuvor wie z.B. in folgendem Code:

Code: Alles auswählen

from keras.datasets import fashion_mnist
import numpy as np
from sklearn.svm import LinearSVC
from sklearn.model_selection import GridSearchCV

(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()

#normalisieren der Daten
x_train = x_train/255
x_test = x_test/255

#trainieren eines Modells mithilfe Default-Parameter
svm = LinearSVC().fit(x_train.reshape(-1,784),y_train)
print(svm.score(x_test.reshape(-1,784), y_test))
print(svm.score(x_train.reshape(-1,784), y_train))
Wenn ich jedoch die optimalen Hyperparameter per GridsearchCV bestimmten möchte, sollte ich dann trotzdem noch den
StandardScaler verwenden, sowie im folgenden Code? Oder sollte ich diesem Fall das obige Normalisieren (x_train /255....) nicht durchführen?

Code: Alles auswählen

#suchen der optimalen Hyperparameter per GridSearchCV
pipeline = Pipeline([
    ("scaler", StandardScaler()),
    ("svm", LinearSVC())])
param_grid = {"svm__C":np.arange(0.00001,100,1)}
clf = GridSearchCV(pipeline, param_grid, cv=5, return_train_score=True)
clf.fit(x_train.reshape(-1,784), y_train)

print('Beste Parameter: ', clf.best_params_)
print('Test_Score: ', clf.score(x_test.reshape(-1,784), y_test))
print('Train_Score: ', clf.score(x_train.reshape(-1,784), y_train))
Vielen Dank im voraus
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der standard scaler macht ja was anderes. Wenn du selbst normalisierst, würde ich den weglassen.
CodeIt
User
Beiträge: 36
Registriert: Mittwoch 13. September 2017, 06:10

Das würde dann bedeutet, nur wenn die Daten nicht schon bereits normalisiert wurden (sowie in meinen 1. Code), dann sollte man bei GridSearch einen StandardScaler verwenden.
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe mal gelernt SVMs sind am besten mit werten zwischen 0..1. Der Standard scaler stellt die NICHT her. Sondern normalisiert (wenn ich das recht verstehe) auf eine standardabweichung von 1. das ist was anderes. Ich würde das darum nicht machen. Aber wie oft beim ML - Versuch macht kluch.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Die MNIST Daten bewegen sich zwischen 0 und 255.
Wenn du die durch 255 teilst bekommst du Werte zwischen 0.0 und 1.0.

Der Standartscaler macht by default etwas anderes:
class sklearn.preprocessing.StandardScaler(copy=True, with_mean=True, with_std=True)
Standardize features by removing the mean and scaling to unit variance
The standard score of a sample x is calculated as:
z = (x - u) / s
where u is the mean of the training samples or zero if with_mean=False, and s is the standard deviation of the training samples or one if with_std=False.
Du kannst die gleiche Funktionalität durch die Parameter with_mean=False, with_std=False erreichen.
Dann aber vorher nicht extra durch 255 teilen.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Antworten