2016-04-12 11 views
3

Ich habe ein Dataset, das ich das Modell SVC von Sklearn SVM ausführen möchte. Die Größen einiger Werte der Merkmale liegen im Bereich von [0, 1e + 7]. Ich habe versucht, SVC w/o Preprocessing zu verwenden, und ich bekomme entweder unakzeptabel lange Rechenzeiten oder 0 richtig positive Vorhersagen. Daher versuche ich einen Vorverarbeitungsschritt zu implementieren, insbesondere die MinMaxScaler.Python, sklearn: Reihenfolge der Pipeline-Betrieb mit MinMaxScaler und SVC

Mein Code so weit:

selection_KBest = SelectKBest() 
selection_PCA = PCA() 
combined_features = FeatureUnion([("pca", selection_PCA), 
            ("univ_select", selection_KBest)]) 
param_grid = dict(features__pca__n_components = range(feature_min,feature_max), 
        features__univ_select__k = range(feature_min,feature_max)) 
svm = SVC()    
pipeline = Pipeline([("features", combined_features), 
        ("scale", MinMaxScaler(feature_range=(0, 1))), 
        ("svm", svm)]) 
param_grid["svm__C"] = [0.1, 1, 10] 
cv = StratifiedShuffleSplit(y = labels_train, 
          n_iter = 10, 
          test_size = 0.1, 
          random_state = 42) 
grid_search = GridSearchCV(pipeline, 
          param_grid = param_grid, 
          verbose = 1, 
          cv = cv) 
grid_search.fit(features_train, labels_train) 
"(grid_search.best_estimator_): ", (grid_search.best_estimator_) 

Meine Frage ist spezifisch für Zeile:

pipeline = Pipeline([("features", combined_features), 
        ("scale", MinMaxScaler(feature_range=(0, 1))), 
        ("svm", svm)]) 

Ich möchte wissen, was die beste Logik für mein Programm ist, und damit die Reihenfolge der features , scale, svm in pipeline. Konkret kann ich nicht entscheiden, ob und scale von dem geschaltet werden sollen, was es jetzt ist.

Hinweis 1: Ich möchte grid_search.best_estimator_ als mein Klassifikatormodell verwenden, das für Voraussagen vorwärts geht.

Anmerkung 2: Meine Sorge ist der richtige Weg pipeline, so dass bei Vorhersage Schritt zu formulieren, die Eigenschaften von der Art und Weise ausgewählt werden, in dem Trainingsschritt und skaliert durchgeführt wurde.

Hinweis 3: Ich merke, dass svm nicht in meinem grid_search.best_estimator_ Ergebnis erscheint. Bedeutet dies, dass es nicht korrekt aufgerufen wird?

Im Folgenden sind einige Ergebnisse, die zeigen, dass, um Materie kann:

pipeline = Pipeline([("scale", MinMaxScaler(feature_range=(0, 1))), 
        ("features", combined_features), 
        ("svm", svm)]): 

Pipeline(steps=[('scale', MinMaxScaler(copy=True, feature_range=(0, 1))) 
('features', FeatureUnion(n_jobs=1, transformer_list=[('pca', PCA(copy=True, 
n_components=11, whiten=False)), ('univ_select', SelectKBest(k=2, 
score_func=<function f_classif at 0x000000001ED61208>))], 
transformer_weights=...f', max_iter=-1, probability=False, 
random_state=None, shrinking=True, tol=0.001, verbose=False))]) 

Accuracy: 0.86247 Precision: 0.38947 Recall: 0.05550 
F1: 0.09716 F2: 0.06699 Total predictions: 15000  
True positives: 111 False positives: 174 
False negatives: 1889 True negatives: 12826 


pipeline = Pipeline([("features", combined_features), 
        ("scale", MinMaxScaler(feature_range=(0, 1))), 
        ("svm", svm)]): 

Pipeline(steps=[('features', FeatureUnion(n_jobs=1, 
transformer_list=[('pca', PCA(copy=True, n_components=1, whiten=False)), 
('univ_select', SelectKBest(k=1, score_func=<function f_classif at 
0x000000001ED61208>))], 
transformer_weights=None)), ('scale', MinMaxScaler(copy=True, feature_range= 
(0,...f', max_iter=-1, probability=False, random_state=None, 
shrinking=True, tol=0.001, verbose=False))]) 

Accuracy: 0.86680 Precision: 0.50463 Recall: 0.05450 
F1: 0.09838 F2: 0.06633 Total predictions: 15000  
True positives: 109 False positives: 107 
False negatives: 1891 True negatives: 12893 

EDIT 1 16041310: Anmerkung 3 behoben. Verwenden Sie grid_search.best_estimator_.steps, um vollständige Schritte zu erhalten.


+1

Der SVM drin ist, scheint aber von was auch immer versteckt werden gestellt, dass '... 'in der Ausgabe. 'max_iter = 1, Wahrscheinlichkeit = Falsch' sind Parameter für' SVC'. – joeln

+0

Danke für den Tipp, @joeln. Wissen Sie, wie Sie den vollständigen, nicht aufgetrennten Ausdruck erhalten? – ximiki

+0

Es gibt derzeit keine Möglichkeit, den vollständigen, nicht abgeschnittenen Ausdruck zu erhalten. Ich habe festgestellt: Er ist in 'BaseEstimator .__ repr__' fest programmiert: https://github.com/scikit-learn/scikit-learn/blob/master/ sklearn/base.py # L148. Natürlich können Sie jeden Schritt allein repr ... – joeln

Antwort

1

Es ist ein Parameter refit in GridsearchCV (der standardmäßig auf True), was bedeutet, daß die beste Schätzfunktion wieder einsetzt gegen den vollständigen Datensatz sein wird; Sie werden dann mit best_estimator_ oder nur mit der fit Methode auf Ihrem GridsearchCV Objekt auf diesen Schätzer zugreifen.

Die best_estimator_ wird die vollständige Pipeline sein, wenn Sie predict darauf aufrufen, erhalten Sie die gleichen Vorverarbeitungsschritte wie in Ihrer Trainingsphase.

Wenn Sie alle Schritte drucken möchten, können Sie tun

print(grid_search.best_estimator_.steps) 

oder

for step in grid_search.best_estimator_.steps: 
    print(type(step)) 
    print(step.get_params()) 
+0

Danke @maxymoo. Ich bin jedoch immer noch unsicher über mein Hauptdilemma: Was ist die beste Logik für die Reihenfolge von 'features',' scale', 'svm' in' pipeline'? – ximiki

+0

Nun, ich würde sagen, Sie haben das Richtige getan, indem Sie beides ausprobieren und die Genauigkeit vergleichen ... Von Ihren Ergebnissen sieht es so aus, als ob es nicht wirklich wichtig ist ... Genauigkeit von 0,4% ist nicht von großer Bedeutung. Aber Sie können auch mit dem gehen, der bessere Genauigkeit erhält? – maxymoo

+0

Ich stimme zu, dass der kleine Unterschied in der Genauigkeit in diesem Fall besser als die Alternative ist und beruhigend ist. Wenn es jedoch einen großen Unterschied gäbe, wäre die Reihenfolge der Pipeline von Bedeutung, und daher wäre die korrekte Implementierung und das Verständnis der Pipeline-Reihenfolge von größter Bedeutung! Das war ein wichtiger Punkt, um diese Frage zu stellen. – ximiki

Verwandte Themen