Dies ist ein Memo für mich, während ich Einführung in Anwendungen zur Verarbeitung natürlicher Sprache in 15 Schritten lese. Notieren Sie sich diesmal in Kapitel 4, Schritt 14 Ihre eigenen Punkte.
In diesem Kapitel versuchen wir, die Werte geeigneter Parameter (nicht Lernparameter) zu finden, die dem maschinellen Lernsystem extern übergeben werden sollten.
--Grid-Suche
Ein-Schritt-Metaparameter, die von Designern und Programmierern vor dem Lernen festgelegt wurden, nicht Parameter, die durch Lernen angepasst und erfasst wurden.
--Feature Extractor --Identifier
Dies ist eine Methode, um die zu durchsuchenden Parameter und die Kandidaten für jeden Wert aufzulisten und alle Kombinationen zu versuchen, den besten zu finden.
Scikit-learn bietet sklearn.model_selection.GridSearchCV
.
--Verwenden Sie die Klassifikatorklasse mit der Scikit-Learn-API
<Gittersuchinstanz> .best_params_
erhalten werden.#Verwenden Sie keine Pipeline
## train
vectorizer = TfidfVectorizer(tokenizer=tokenize, ngram_range=(1, 2))
train_vectors = vectorizer.fit_transform(train_texts)
parameters = { # <1>
'n_estimators': [10, 20, 30, 40, 50, 100, 200, 300, 400, 500],
'max_features': ('sqrt', 'log2', None),
}
classifier = RandomForestClassifier()
gridsearch = GridSearchCV(classifier, parameters)
gridsearch.fit(train_vectors, train_labels)
## predict
test_vectors = vectorizer.transform(test_texts)
predictions = gridsearch.predict(test_vectors)
#Pipeline verwenden
## train
pipeline = Pipeline([
('vectorizer', TfidfVectorizer(tokenizer=tokenize, ngram_range=(1, 2))),
('classifier', RandomForestClassifier()),
])
parameters = {
'vectorizer__ngram_range':[(1, 1), (1, 2), (1, 3), (2, 2), (2, 3), (3, 3)],
'classifier__n_estimators':[10, 20, 30, 40, 50, 100, 200, 300, 400, 500],
'classifier__max_features':('sqrt', 'log2', None),
}
gridsearch = GridSearchCV(pipeline, parameters)
gridsearch.fit(texts, labels)
## predict
gridsearch.predict(texts)
GridSearchCV
#ausführlich: Wird angezeigt, weil ich den Ausführungsstatus der Rastersuche nicht kannte(1)
# n_Jobs: so viel wie möglich(-1)Parallel laufen
clf = GridSearchCV(pipeline, parameters, verbose=1, n_jobs=-1)
Ausführungsergebnis
from dialogue_agent import DialogueAgent # <1>
↓
from dialogue_agent_pipeline_gridsearch import DialogueAgent # <1>
$ docker run -it -v $(pwd):/usr/src/app/ 15step:latest python evaluate_dialogue_agent.py
#Es dauerte ungefähr 20 Minuten, um die Ausführung abzuschließen
Fitting 3 folds for each of 180 candidates, totalling 540 fits
[Parallel(n_jobs=-1)]: Done 46 tasks | elapsed: 5.4s
[Parallel(n_jobs=-1)]: Done 196 tasks | elapsed: 2.2min
[Parallel(n_jobs=-1)]: Done 446 tasks | elapsed: 5.5min
[Parallel(n_jobs=-1)]: Done 540 out of 540 | elapsed: 19.9min finished
0.7021276595744681
{'classifier__max_features': 'log2', 'classifier__n_estimators': 300, 'vectorizer__ngram_range': (1, 1)}
―― Mit zunehmender Anzahl der zu durchsuchenden Parameter wird die zum Durchsuchen der Rastersuche erforderliche Zeit exponentiell lang. --In GridSearchCV # fit wird die Leistungsbewertung jedes Mal durchgeführt, wenn Sie einen Parametersatz ausprobieren.
Ein Tool zum effizienteren Suchen von Hyperparametern als die Rastersuche. Gibt den Parameterraum und die Zielfunktion an und gibt die optimalen Hyperparameter zurück.
--Parameterraum: Zu durchsuchende Parameter und Kandidaten für jeden Wert
math.log (..)
#Parametersuche
vectorizer = TfidfVectorizer(tokenizer=tokenize, ngram_range=(1, 2))
train_vectors = vectorizer.fit_transform(train_texts)
##Zielfunktion
def objective(args):
classifier = RandomForestClassifier(n_estimators=int(args['n_estimators']),
max_features=args['max_features'])
classifier.fit(tr_vectors, tr_labels)
val_predictions = classifier.predict(val_vectors)
accuracy = accuracy_score(val_predictions, val_labels)
return -accuracy
##Parameterraum
max_features_choices = ('sqrt', 'log2', None)
space = {
'n_estimators': hp.quniform('n_estimators', 10, 500, 10),
'max_features': hp.choice('max_features', max_features_choices),
}
best = fmin(objective, space, algo=tpe.suggest, max_evals=30)
# train
best_classifier = RandomForestClassifier(
n_estimators=int(best['n_estimators']),
max_features=max_features_choices[best['max_features']])
best_classifier.fit(train_vectors, train_labels)
# predict
test_vectors = vectorizer.transform(test_texts)
predictions = best_classifier.predict(test_vectors)
Details werden weggelassen, da die Ausführung nicht einfach abgeschlossen werden kann.
if Keras.backend.backend() == 'tensorflow':
Keras.backend.clear_session()
Die Ausführung schreitet nicht gut voran (da es sich um eine CPU handelt, dauert es einige Zeit, kann sie nicht mit einer CPU ausgeführt werden?). Daher werde ich sie später aktualisieren, wenn ich es mir leisten kann.
Recommended Posts