2017-02-15 2 views
1

Ich möchte PCA und SVM zu einer Pipeline kombinieren, um die beste Kombination von Hyperparametern in einer GridSearch zu finden.Kombinieren von Hauptkomponentenanalyse und Support Vector Machine in einer Pipeline

Der folgende Code

from sklearn.svm import SVC 
from sklearn import decomposition, datasets 
from sklearn.pipeline import Pipeline 
from sklearn.model_selection import GridSearchCV 

digits = datasets.load_digits() 
X_train = digits.data 
y_train = digits.target 

#Use Principal Component Analysis to reduce dimensionality 
# and improve generalization 
pca = decomposition.PCA() 
# Use a linear SVC 
svm = SVC() 
# Combine PCA and SVC to a pipeline 
pipe = Pipeline(steps=[('pca', pca), ('svm', svm)]) 
# Check the training time for the SVC 
n_components = [20, 40, 64] 
svm_grid = [ 
    {'C': [1, 10, 100, 1000], 'kernel': ['linear']}, 
    {'C': [1, 10, 100, 1000], 'gamma': [0.001, 0.0001], 'kernel': ['rbf']}, 
] 
estimator = GridSearchCV(pipe, 
         dict(pca__n_components=n_components, 
           svm=svm_grid)) 
estimator.fit(X_train, y_train) 

Ergebnisse in einem

AttributeError: 'dict' object has no attribute 'get_params' 

Es gibt wohl svm_grid etwas falsch mit der Art, wie ich zu definieren und verwenden. Wie kann ich diese Parameterkombination korrekt an GridSearchCV übergeben?

Antwort

2

Das Problem war, dass, wenn der GridSearchCV versuchte dem Schätzer, die Parameter zu geben:

if parameters is not None: 
    estimator.set_params(**parameters) 

der Schätzer hier ein Pipeline-Objekt war, nicht die tatsächliche SVM wegen der Namensgebung in Ihrem Parameter Raster.

Ich glaube, es so sein sollte:

from sklearn.svm import SVC 
from sklearn import decomposition, datasets 
from sklearn.pipeline import Pipeline 
from sklearn.model_selection import GridSearchCV 

digits = datasets.load_digits() 
X_train = digits.data 
y_train = digits.target 

# Use Principal Component Analysis to reduce dimensionality 
# and improve generalization 
pca = decomposition.PCA() 
# Use a linear SVC 
svm = SVC() 
# Combine PCA and SVC to a pipeline 
pipe = Pipeline(steps=[('pca', pca), ('svm', svm)]) 
# Check the training time for the SVC 
n_components = [20, 40, 64] 

params_grid = { 
    'svm__C': [1, 10, 100, 1000], 
    'svm__kernel': ['linear', 'rbf'], 
    'svm__gamma': [0.001, 0.0001], 
    'pca__n_components': n_components, 
} 

estimator = GridSearchCV(pipe, params_grid) 
estimator.fit(X_train, y_train) 

print estimator.best_params_, estimator.best_score_ 

Ausgang:

{'pca__n_components': 64, 'svm__C': 10, 'svm__kernel': 'rbf', 'svm__gamma': 0.001} 0.976071229827 

alle Ihre Parameter in params_grid Einbindung und Namens sie entsprechend den genannten Schritten.

Hoffe, das hilft! Viel Glück!

Verwandte Themen