Korrekte Verwendung des StandardScaler bei GridSearchCV

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 muß die Hyperparameter einer LinearSVC mithilfe von GridSearchCV optimieren.
Erstaunlicherweise ist die Accuracy des besten gefundenen Modells aus GridSearchCV (clf.best_score_) mit 0.6991, wesentlich niedriger als die Accuracy welche beim Training der LinearSVC mit dem vollen Trainingsdatensatz und den optimierten Hyperparameter erzielt wird (0.7968).
Meine Vermutung ist, dass ich evtl. den StandardScaler falsch anwende.

Der Code wäre folgender:

Code: Alles auswählen

from sklearn.svm import LinearSVC
from sklearn.preprocessing import StandardScaler
import numpy as np
from sklearn.model_selection import GridSearchCV

def tuning_hyper_params(X, y, 
                    X_test=X_test, 
                    y_test=y_test, 
                    cv=10, 
                    scoring='accuracy', 
                    c_range=np.logspace(-16,10,14, base=2), 
                    seed=7):
    seed = seed
    np.random.seed(seed)               


    pipeline = Pipeline([
        ("scaler", StandardScaler()), 
        ("svm", LinearSVC(loss='hinge'))])                        

    param_grid=[{'svm__C': c_range}]      

    clf = GridSearchCV(pipeline, param_grid=param_grid, cv=cv, scoring=scoring, n_jobs=-1)
    clf.fit(X,y)          


    print('\n Best score: ',clf.best_score_)
    print('\n Best parameter: ', clf.best_params_)            


    scaler = StandardScaler()
    scaler.fit(X)
    X = scaler.transform(X)
    X_test = scaler.transform(X_test)
    y_pred = clf.predict(X_test)
    print(classification_report(y_test, y_pred))

    print("Best estimator score: ",clf.best_estimator_.score(X_test, y_test))

    test = LinearSVC(C= clf.best_params_['svm__C'], loss='hinge')
    test.fit(X,y)
    print("score   retrained with best parameter: ", test.score(X_test, y_test))  

Nach dem Ausführen dieses Codes erhalte ich folgende Ergebnisse:

Code: Alles auswählen

Best score: 0.784
Best parameter: {'svm__C' : 0.00390625}
Best estimator score: 0.6991
score retrained with best parameter: 0.7968

Vielleicht fällt jemanden der Grund für diese Diskrepanz ins Auge.

Vielen Dank im voraus
Antworten