GridSearchCV scoring-parameter: die Verwendung von scoring='f1' oder Punkte=keine ("None" standardmäßig verwendet Genauigkeit) gibt das gleiche Ergebnis
Bin ich mit einem Beispiel extrahiert aus dem Buch "Mastering Machine Learning mit scikit lernen".
Verwendet es eine Entscheidung Baum, um vorherzusagen, ob die einzelnen Bilder auf einer web-Seite ist ein
Werbung oder Artikel-Inhalte. Bilder, die eingestuft sind als Werbung könnte dann ausgeblendet werden mithilfe von Cascading Style Sheets. Die Daten werden öffentlich verfügbar von der Internet-Werbung, Daten-Set: http://archive.ics.uci.edu/ml/datasets/Internet+Werbung, das Daten enthält, die für 3,279 Bilder.
Im folgenden ist der vollständige code für das ausfüllen der Klassifikation Aufgabe:
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.cross_validation import train_test_split
from sklearn.metrics import classification_report
from sklearn.pipeline import Pipeline
from sklearn.grid_search import GridSearchCV
import sys,random
def main(argv):
df = pd.read_csv('ad-dataset/ad.data', header=None)
explanatory_variable_columns = set(df.columns.values)
response_variable_column = df[len(df.columns.values)-1]
explanatory_variable_columns.remove(len(df.columns.values)-1)
y = [1 if e == 'ad.' else 0 for e in response_variable_column]
X = df[list(explanatory_variable_columns)]
X.replace(to_replace=' *\?', value=-1, regex=True, inplace=True)
X_train, X_test, y_train, y_test = train_test_split(X, y,random_state=100000)
pipeline = Pipeline([('clf',DecisionTreeClassifier(criterion='entropy',random_state=20000))])
parameters = {
'clf__max_depth': (150, 155, 160),
'clf__min_samples_split': (1, 2, 3),
'clf__min_samples_leaf': (1, 2, 3)
}
grid_search = GridSearchCV(pipeline, parameters, n_jobs=-1,verbose=1, scoring='f1')
grid_search.fit(X_train, y_train)
print 'Best score: %0.3f' % grid_search.best_score_
print 'Best parameters set:'
best_parameters = grid_search.best_estimator_.get_params()
for param_name in sorted(parameters.keys()):
print '\t%s: %r' % (param_name, best_parameters[param_name])
predictions = grid_search.predict(X_test)
print classification_report(y_test, predictions)
if __name__ == '__main__':
main(sys.argv[1:])
Die ERGEBNISSE der Verwendung scoring='f1' in GridSearchCV wie in dem Beispiel:
Die ERGEBNISSE der Verwendung scoring=None (standardmäßig Genauigkeit Messen) ist das gleiche wie mit F1-score:
Wenn ich mich nicht falsch Optimierung der parameter Suche nach verschiedenen scoring Funktionen sollten zu unterschiedlichen Ergebnissen führen. Der folgende Fall zeigt, dass unterschiedliche Ergebnisse erzielt werden, wenn scoring='Präzision' verwendet wird.
Die ERGEBNISSE der Verwendung scoring='Präzision' ist ANDERS als in den beiden anderen Fällen. Das gleiche gilt auch für "Rückruf", etc:
WARUM 'F1' UND Keine, die VON STANDARD-GENAUIGKEIT, DAS GLEICHE ERGEBNIS??
BEARBEITET
Stimme ich mit beiden Antworten von Fabian & Sebastian. Sollte das problem der kleinen param_grid. Aber ich wollte nur klarstellen, dass das problem stoben, wenn ich arbeiten war, mit einer völlig anderen (nicht das hier im Beispiel) hoch Ungleichgewicht Datensatz 100:1 (das sollte Einfluss auf die Genauigkeit) und mittels Logistischer Regression. In diesem Fall auch 'F1' und die Genauigkeit gab das gleiche Ergebnis.
Den param_grid, die ich verwendet, in diesem Fall war der folgende:
parameters = {"penalty": ("l1", "l2"),
"C": (0.001, 0.01, 0.1, 1, 10, 100),
"solver": ("newton-cg", "lbfgs", "liblinear"),
"class_weight":[{0:4}],
}
Ich denke, dass die Auswahl der parameter ist auch zu klein.
Hi @NBartley, die scikit-learn version, die ich verwende, ist 0.16.1
Einbau einer solver als hyperparameter ist eher überflüssig
InformationsquelleAutor Pablo Fleurquin | 2015-10-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, dass der Autor nicht wählen Sie dieses Beispiel sehr gut. Ich kann hier etwas fehlt, aber
min_samples_split=1
macht keinen Sinn für mich: Ist es nicht das gleiche wie die Einstellungmin_samples_split=2
da kann man nicht teilen 1 Probe -- im wesentlichen ist es eine Verschwendung von Rechenzeit.Btw. dies ist ein sehr kleines Netz und es gibt nicht viel Wahl sowieso, was erklären mag, warum
accuracy
undf1
geben Sie die gleichen parameter-Kombinationen und daher werden die gleichen scoring-Tabellen.Wie oben bereits angesprochen, wird das dataset kann gut ausgeglichen werden, das ist, warum Sie F1 und Genauigkeit erzielt bevorzugen die gleichen parameter-Kombinationen. So, Suche weiter bei Ihrem GridSearch Ergebnisse mit (a) F1-score und (b) die Genauigkeit, schließe ich, dass in beiden Fällen eine Tiefe von 150 am besten funktioniert. Da dies die untere Grenze, es gibt Ihnen eine leicht in den hinteren, unteren "depth" - Werte können sogar noch besser funktionieren. Ich vermute aber, dass der Baum gar nicht gehen, die tiefen auf diesem Datensatz (können Sie am Ende mit "pure" lässt sogar weit vor dem erreichen der max Tiefe).
So, wiederholen wir das experiment mit ein bisschen mehr sinnvolle Werte mithilfe der folgenden parameter grid
Die optimale "Tiefe" für den besten F1-score zu sein scheint, um 15.
Als Nächstes versuchen wir es mit "Genauigkeit" (oder
None
) als unsere scoring-Metrik:Wie Sie sehen können, erhalten Sie unterschiedliche Ergebnisse, und die "optimale" Tiefe ist unterschiedlich, wenn Sie verwenden die "Genauigkeit" ist.
InformationsquelleAutor
Ich nicht damit einverstanden, dass die Optimierung der parameter Suche nach verschiedenen scoring Funktionen erbringen sollen unbedingt unterschiedliche Ergebnisse unbedingt. Wenn Ihr dataset ist ausgeglichen (ungefähr gleiche Anzahl von Proben in jeder Klasse), würde ich erwarten, dass die Modell-Selektion durch Genauigkeit und F1 würde liefern sehr ähnliche Ergebnisse.
Auch im Hinterkopf haben, dass GridSearchCV optimiert über einem diskreten raster. Vielleicht mit einem dünneren Gitter von Parametern ergeben würde, die Ergebnisse, die Sie suchen.
InformationsquelleAutor Fabian Pedregosa
Auf eine unausgewogene dataset verwenden Sie den "labels" - parameter der f1_score Torschütze nur noch die f1-score der Klasse, die Sie interessiert sind in. Oder verwenden Sie "sample_weight".
InformationsquelleAutor Diego