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.
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)
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]}
]
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)
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