[PYTHON] Parameteroptimierung durch Rastersuche von Scikit lernen

Was ist Grid-Suche?

scikit learn hat eine Funktion namens Rastersuche. Eine nette Funktion, die die Hyperparameter des maschinellen Lernmodells automatisch optimiert. Zum Beispiel für SVM, C, Kernel, Gamma usw. In Scikit-learn User Guide finden Sie diesmal die Referenz.

Was ich getan habe

Datenaufbereitung

Importieren Sie handgeschriebene Ziffern.

from sklearn import datasets
from sklearn.cross_validation import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import classification_report
from sklearn.svm import SVC

digits = datasets.load_digits()
n_samples = len(digits.images) #Anzahl der Proben 1797
X = digits.images.reshape((n_samples, -1)) #Konvertieren Sie von einem 8x8-Array in einen 64-dimensionalen Vektor
y = digits.target #Richtiges Antwortetikett

train_test_split teilt den Datensatz in zwei Teile, einen zum Training und einen zum Testen.

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0)
print(X.shape)
>>> (1797, 64)
print(X_train.shape)
>>> (898, 64)
print(X_test.shape)
>>> (899, 64)

Einstellen der Parameter, die Sie optimieren möchten

Definieren Sie als Nächstes die Parameter, die Sie optimieren möchten, in einer Liste. Zusätzlich zu den Beispielkernen wurden Poly- und Sigmoid-Kernel hinzugefügt.

tuned_parameters = [
    {'C': [1, 10, 100, 1000], 'kernel': ['linear']},
    {'C': [1, 10, 100, 1000], 'kernel': ['rbf'], 'gamma': [0.001, 0.0001]},
    {'C': [1, 10, 100, 1000], 'kernel': ['poly'], 'degree': [2, 3, 4], 'gamma': [0.001, 0.0001]},
    {'C': [1, 10, 100, 1000], 'kernel': ['sigmoid'], 'gamma': [0.001, 0.0001]}
    ]

Führen Sie eine Optimierung durch

Optimieren Sie die oben definierten Parameter mit GridSearchCV. Es gibt vier angegebene Variablen: das zu verwendende Modell, den zu optimierenden Parametersatz, die Anzahl der Kreuztests und den Bewertungswert des Modells. Der Bewertungswert war "f1". Sie können auch "Präzision" oder "Rückruf" verwenden. Weitere Informationen finden Sie hier (http://scikit-learn.org/stable/modules/model_evaluation.html#scoring-parameter).

score = 'f1'
clf = GridSearchCV(
    SVC(), #Identifikator
    tuned_parameters, #Parametersatz, den Sie optimieren möchten
    cv=5, #Anzahl der Kreuztests
    scoring='%s_weighted' % score ) #Angabe der Bewertungsfunktion des Modells

Führen Sie Optimierungen nur mit Trainingsdatensätzen durch. Der Parametersatz usw. wird angezeigt.

clf.fit(X_train, y_train) 
>>> GridSearchCV(cv=5, error_score='raise',
>>>       estimator=SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
>>>  decision_function_shape=None, degree=3, gamma='auto', kernel='rbf',
>>>  max_iter=-1, probability=False, random_state=None, shrinking=True,
>>>  tol=0.001, verbose=False),
>>>       fit_params={}, iid=True, n_jobs=1,
>>>       param_grid=[{'kernel': ['linear'], 'C': [1, 10, 100, 1000]}, {'kernel': ['rbf'], 'C': [1, 10, 100, 1000], 'gamma': [0.001, 0.0001]}, {'kernel': ['poly'], 'C': [1, 10, 100, 1000], 'gamma': [0.001, 0.0001], 'degree': [2, 3, 4]}, {'kernel': ['sigmoid'], 'C': [1, 10, 100, 1000], 'gamma': [0.001, 0.0001]}],
       pre_dispatch='2*n_jobs', refit=True, scoring='f1_weighted',
       verbose=0)

Ergebnisse anzeigen

Sie können die Punktzahl in jedem Versuch mit clf.grid_scores_ überprüfen.

clf.grid_scores_
>>> [mean: 0.97311, std: 0.00741, params: {'kernel': 'linear', 'C': 1},
>>> mean: 0.97311, std: 0.00741, params: {'kernel': 'linear', 'C': 10},
>>> mean: 0.97311, std: 0.00741, params: {'kernel': 'linear', 'C': 100}, 
>>> ...
>>>  mean: 0.96741, std: 0.00457, params: {'kernel': 'sigmoid', 'C': 1000, 'gamma': 0.0001}]

Sie können die optimierten Parameter mit clf.best_params_ überprüfen.

clf.best_params_
{'C': 10, 'gamma': 0.001, 'kernel': 'rbf'}

Die Punktzahl jedes Versuchs wird im Text angezeigt, und die Genauigkeit der optimierten Parameter wird in einer Tabelle angezeigt.

print("# Tuning hyper-parameters for %s" % score)
print()
print("Best parameters set found on development set: %s" % clf.best_params_)
print()

#Anzeige der Versuchsergebnisse für jeden Parameter
print("Grid scores on development set:")
print()
for params, mean_score, scores in clf.grid_scores_:
    print("%0.3f (+/-%0.03f) for %r"
          % (mean_score, scores.std() * 2, params))
print()

#Klassifizierungsgenauigkeit im Testdatensatz anzeigen
print("The scores are computed on the full evaluation set.")
print()
y_true, y_pred = y_test, clf.predict(X_test)
print(classification_report(y_true, y_pred))

Es wird so ausgegeben.

# Tuning hyper-parameters for f1

Best parameters set found on development set: {'kernel': 'rbf', 'C': 10, 'gamma': 0.001}

Grid scores on development set:

0.973 (+/-0.015) for {'kernel': 'linear', 'C': 1}
0.973 (+/-0.015) for {'kernel': 'linear', 'C': 10}
0.973 (+/-0.015) for {'kernel': 'linear', 'C': 100}

 [Weggelassen, weil es lang ist]

0.967 (+/-0.009) for {'kernel': 'sigmoid', 'C': 1000, 'gamma': 0.0001}

The scores are computed on the full evaluation set.

             precision    recall  f1-score   support

          0       1.00      1.00      1.00        89
          1       0.97      1.00      0.98        90
          2       0.99      0.98      0.98        92
          3       1.00      0.99      0.99        93
          4       1.00      1.00      1.00        76
          5       0.99      0.98      0.99       108
          6       0.99      1.00      0.99        89
          7       0.99      1.00      0.99        78
          8       1.00      0.98      0.99        92
          9       0.99      0.99      0.99        92

avg / total       0.99      0.99      0.99       899

Recommended Posts

Parameteroptimierung durch Rastersuche von Scikit lernen
Bewerten Sie die Genauigkeit des Lernmodells durch einen Kreuztest von scikit learn
Holen Sie sich Bilder per Stichwortsuche von Twitter
Implementierte k-Neighborhood-Methode in Python von Scikit Learn