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:

GridSearchCV scoring-parameter: die Verwendung von scoring='f1' oder Punkte=keine (

Die ERGEBNISSE der Verwendung scoring=None (standardmäßig Genauigkeit Messen) ist das gleiche wie mit F1-score:

GridSearchCV scoring-parameter: die Verwendung von scoring='f1' oder Punkte=keine (

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:

GridSearchCV scoring-parameter: die Verwendung von scoring='f1' oder Punkte=keine (

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.

Welche version von sklearn verwenden Sie?
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

Schreibe einen Kommentar