GridSearchCV de notation paramètre: à l'aide de la notation= " f1 " ou de la notation=None (par défaut utilise l'exactitude) donne le même résultat

Je suis à l'aide d'un exemple extrait du livre "la maîtrise de l'Apprentissage de la Machine avec scikit learn".

Il utilise un arbre de décision permettant de prédire si chacune des images sur une page web est un
de la publicité ou du contenu de l'article. Les Images qui sont classés comme étant des publicités pourraient alors être masqués à l'aide de Feuilles de Style en Cascade. Les données sont accessibles à partir de l'Internet Annonces Jeu de Données: http://archive.ics.uci.edu/ml/datasets/Internet+Annonces, qui contient des données pour 3,279 images.

Voici le code complet pour remplir la tâche de classification:

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:])

Les RÉSULTATS de l'utilisation scoring= " f1 " dans GridSearchCV comme dans l'exemple est:

GridSearchCV de notation paramètre: à l'aide de la notation=

Les RÉSULTATS de l'utilisation score=None (par défaut Précision de la mesure) est la même que l'utilisation de F1 score:

GridSearchCV de notation paramètre: à l'aide de la notation=

Si je ne me trompe pas l'optimisation du paramètre de recherche par les différentes fonctions de scoring devrait donner des résultats différents. Le cas suivant montre que des résultats différents sont obtenus lorsque score='précision' est utilisé.

Les RÉSULTATS de l'utilisation score='précision' est DIFFÉRENT que dans les deux autres cas. Il en serait de même pour le "rappel", etc:

GridSearchCV de notation paramètre: à l'aide de la notation=

POURQUOI 'F1' ET en leur absence, PAR DÉFAUT d'EXACTITUDE, de DONNER LE MÊME RÉSULTAT??

ÉDITÉ

Je suis d'accord avec les deux réponses par Fabian & Sebastian. Le problème devrait être la petite param_grid. Mais je voulais juste préciser que le problème a augmenté lorsque je travaillais avec un de totalement différent (pas celui dans l'exemple ici), très déséquilibre dataset 100:1 (ce qui devrait affecter la précision) et à l'aide de la Régression Logistique. Dans ce cas également " F1 " et de la précision a donné le même résultat.

La param_grid que j'ai utilisé, dans ce cas, était la suivante:

parameters = {"penalty": ("l1", "l2"),
    "C": (0.001, 0.01, 0.1, 1, 10, 100),
    "solver": ("newton-cg", "lbfgs", "liblinear"),
    "class_weight":[{0:4}],
}

Je suppose que le paramètre de sélection est aussi trop petit.

Quelle est la version de sklearn utilisez-vous?
Salut @NBartley, le scikit-learn version que j'utilise est 0.16.1
le montage d'un solveur comme un hyper-paramètre est plutôt redondant

OriginalL'auteur Pablo Fleurquin | 2015-10-01