[PYTHON] Affinons les hyper paramètres du modèle avec scikit-learn!

Qu'est-ce que le réglage des hyper paramètres?

Certains paramètres doivent être décidés à l'avance en fonction du modèle. (Par exemple, le nombre de clusters k-means, la force du terme de régularisation SVC, la profondeur de l'arbre de décision, etc.)

On l'appelle "hyperparamètre", mais le problème est que même s'il s'agit du même modèle, la précision peut changer ** significativement ** en fonction de la valeur de l'hyperparamètre.

Le réglage des hyper paramètres consiste à bien le décider en utilisant les données d'entraînement! !!

Recherche de grille et recherche aléatoire

Parmi les méthodes de réglage, nous en traiterons deux, la recherche de grille et la recherche aléatoire. En gros, s'il existe un hyper paramètre α, il sera exécuté selon le flux suivant.

・ Pour la recherche de grille, spécifiez la ** plage ** de α (ex. 0,1,2,3,4,5, etc.) à l'avance, et essayez réellement d'obtenir la précision du modèle avec ce paramètre, qui est le meilleur. Faites-lui un paramètre.

-Pour une recherche aléatoire, spécifiez la ** distribution ** (ex. Distribution normale avec moyenne 0, écart-type 1 etc.) que α suit à l'avance, extrayez-la au hasard et utilisez réellement ce paramètre pour déterminer la précision du modèle. Regardez, définissez le meilleur comme paramètre.

Screen Shot 2017-02-25 at 22.37.35.png

Comme mentionné ci-dessus, les deux ne sont pas la procédure de décision de l'hyper paramètre α tel quel. Avant cela, vous pouvez voir que la procédure consiste à déterminer la ** plage et la distribution ** et à utiliser les données d'entraînement réelles. (Voir les ressources pour plus de détails!)

Code Python

Les deux ci-dessus sont des équipements standard dans scikit-learn, nous allons donc les utiliser! Code pour python3.5.1, scikit_learn-0.18.1.

Cette fois, je prends les données du référentiel d'apprentissage machine de l'UCI et j'utilise deux classificateurs de RandomForestClassifier pour régler les paramètres. Le code complet a été téléchargé sur github.

ÉTAPE1 Télécharger les données du référentiel UCI

Grid_and_Random_Search.ipynb


 df = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases'
                  '/breast-cancer-wisconsin/wdbc.data', header=None)

Dans un souci de clarté, définissez la colonne que vous souhaitez prédire sur Target et les autres sur un ~.

Grid_and_Random_Search.ipynb


 columns_list = [] 
 for i in range(df.shape[1]):
     columns_list.append("a%d"%i) 
 columns_list[1] = "Target" 
 df.columns = columns_list

STEP2 Fractionner les données

Grid_and_Random_Search.ipynb


 y = df["Target"].values
 X = df.drop(["a0","Target"],axis=1)

Divisé en données de train et données de test

Grid_and_Random_Search.ipynb


 #split X,y to train,test(0.5:0.5)
 from sklearn.cross_validation import train_test_split

 X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.5,random_state=2017)

ÉTAPE 3 Vérifiez la précision du modèle dans l'état par défaut.

Grid_and_Random_Search.ipynb


 from sklearn.metrics import classification_report

 def model_check(model):
     model.fit(X_train,y_train)
     y_train_pred = classification_report(y_train,model.predict(X_train))
     y_test_pred  = classification_report(y_test,model.predict(X_test))
        
     print("""【{model_name}】\n Train Accuracy: \n{train}
           \n Test Accuracy:  \n{test}""".format(model_name=model.__class__.__name__, train=y_train_pred, test=y_test_pred))

print(model_check(RandomForestClassifier()))

Résultat de sortie 1(Défaut)


    [RandomForestClassifier]
     Train Accuracy: 
                 precision    recall  f1-score   support

              B       1.00      1.00      1.00        67
              M       1.00      1.00      1.00        75

    avg / total       1.00      1.00      1.00       142


     Test Accuracy:  
                 precision    recall  f1-score   support

              B       0.89      0.93      0.91        72
              M       0.93      0.89      0.91        70

    avg / total       0.91      0.91      0.91       142

Il s'est avéré que le taux de réponse correct des données de train est de 1,0 et le taux de réponse correct des données de test est de 0,91. À partir de là, nous implémenterons la recherche de grille et la recherche aléatoire. Désormais, il est fait référence à la référence 3.

Recherche de grille STEP4

Grid_and_Random_Search.ipynb


 #Grid search

 from sklearn.grid_search import GridSearchCV

 # use a full grid over all parameters
 param_grid = {"max_depth": [2,3, None],
              "n_estimators":[50,100,200,300,400,500],
              "max_features": [1, 3, 10],
              "min_samples_split": [2, 3, 10],
              "min_samples_leaf": [1, 3, 10],
              "bootstrap": [True, False],
              "criterion": ["gini", "entropy"]}

 forest_grid = GridSearchCV(estimator=RandomForestClassifier(random_state=0),
                 param_grid = param_grid,   
                 scoring="accuracy",  #metrics
                 cv = 3,              #cross-validation
                 n_jobs = 1)          #number of core

 forest_grid.fit(X_train,y_train) #fit

 forest_grid_best = forest_grid.best_estimator_ #best estimator
 print("Best Model Parameter: ",forest_grid.best_params_)

Résultat de sortie 2(Recherche de grille)


    [RandomForestClassifier]
     Train Accuracy: 
                 precision    recall  f1-score   support

              B       0.99      0.99      0.99        67
              M       0.99      0.99      0.99        75

    avg / total       0.99      0.99      0.99       142


     Test Accuracy:  
                 precision    recall  f1-score   support

              B       0.96      0.89      0.92        72
              M       0.89      0.96      0.92        70

    avg / total       0.92      0.92      0.92       142

Toute précision telle que le taux total de réponses correctes et le score f1 a augmenté! !!

ÉTAPE5 Recherche aléatoire

La recherche aléatoire utilise scipy pour représenter la distribution que les paramètres suivent. Cette fois, le nombre d'itérations est le même que celui de la recherche de grille.

Grid_and_Random_Search.ipynb


#Random search
from sklearn.grid_search import RandomizedSearchCV
from scipy.stats import randint as sp_randint

param_dist = {"max_depth": [3, None],                  #distribution
              "n_estimators":[50,100,200,300,400,500],
              "max_features": sp_randint(1, 11),
              "min_samples_split": sp_randint(2, 11),
              "min_samples_leaf": sp_randint(1, 11),
              "bootstrap": [True, False],
              "criterion": ["gini", "entropy"]}

forest_random = RandomizedSearchCV( estimator=RandomForestClassifier( random_state=0 ),
                                    param_distributions=param_dist,
                                    cv=3,              #CV
                                    n_iter=1944,          #interation num
                                    scoring="accuracy", #metrics
                                    n_jobs=1,           #num of core
                                    verbose=0,          
                                    random_state=1)

forest_random.fit(X,y)
forest_random_best = forest_random.best_estimator_ #best estimator
print("Best Model Parameter: ",forest_random.best_params_)

Résultat de sortie 3(Recherche aléatoire)


    [RandomForestClassifier]
     Train Accuracy: 
                 precision    recall  f1-score   support

              B       1.00      1.00      1.00        67
              M       1.00      1.00      1.00        75

    avg / total       1.00      1.00      1.00       142


     Test Accuracy:  
                 precision    recall  f1-score   support

              B       0.94      0.92      0.93        72
              M       0.92      0.94      0.93        70

    avg / total       0.93      0.93      0.93       142

Nous avons constaté que tous les articles ont augmenté de 2% par rapport au cas par défaut!

Résumé

La précision de la recherche de grille et de la recherche aléatoire s'est améliorée! Cependant, je pense que l'effet est devenu difficile à voir car j'ai sélectionné à l'origine des données avec une grande précision cette fois-ci. Il peut être plus facile de voir l'effet du réglage si vous essayez des données qui ne sont pas exactes.

Le code complet a été téléchargé sur github.

Les références

  1. Bergstra, J., & Bengio, Y. (2012)
  2. http://qiita.com/SE96UoC5AfUt7uY/items/c81f7cea72a44a7bfd3a
  3. http://scikit-learn.org/stable/auto_examples/model_selection/randomized_search.html

Recommended Posts

Affinons les hyper paramètres du modèle avec scikit-learn!
Calibrer le modèle avec PyCaret
Recherche en grille d'hyper paramètres avec Scikit-learn
Validez le modèle d'entraînement avec Pylearn2
L'analyse de clustering la plus basique avec scikit-learn
Résolvons le portefeuille avec une optimisation continue
[Scikit-learn] J'ai joué avec la courbe ROC
Attention Seq2 Exécutez le modèle de dialogue avec Seq
Lisons le fichier RINEX avec Python ①
[Français] Tutoriel scikit-learn 0.18 Choisir le bon modèle
Un modèle qui identifie la guitare avec fast.ai
Isomap avec Scikit-learn
Expliquons l'allocation d'actifs par le modèle Black Ritterman (avec un exemple d'exécution par Python)
Présentation du modèle DCGAN pour Cifar 10 avec keras
Simulons le modèle neuronal d'Izhikevich sur le Web!
DBSCAN avec scikit-learn
Clustering avec scikit-learn (1)
Prédisez le deuxième tour de l'été 2016 avec scikit-learn
Résolution du modèle Lorenz 96 avec Julia et Python
Clustering avec scikit-learn (2)
PCA avec Scikit-learn
Chargez le fichier de modèle TensorFlow .pb avec readNetFromTensorflow ().
Modèle de régression multivariée avec scikit-learn - J'ai essayé de comparer et de vérifier SVR
kmeans ++ avec scikit-learn
Transposons la matrice et multiplions les matrices par numpy.
[Français] scikit-learn 0.18 Guide de l'utilisateur 3.2. Réglage des hyper paramètres de l'estimateur
La décision de scikit-learn Comment visualiser un modèle en bois
Surveiller le modèle d'entraînement avec TensorBord sur Jupyter Notebook
Résolution du problème de l'iris avec scikit-learn ver1.0 (régression logistique)
Validation croisée avec scikit-learn
SVM multi-classes avec scikit-learn
Clustering avec scikit-learn + DBSCAN
Apprentissage Scikit-Learn avec la chimioinfomatique
Montage du modèle avec lmfit
Régression avec un modèle linéaire
DBSCAN (clustering) avec scikit-learn
Installez scikit.learn avec pip
Calculer tf-idf avec scikit-learn
Tweettons en frappant le terminal tout en criant avec Selenium! !!
Implémenter le modèle mathématique «modèle SIR» des maladies infectieuses avec Open Modelica
Exécutons la commande à temps avec le bot discord
Profitez du modèle Gray-Scott avec un code court utilisant le calcul matriciel
Touchons l'API de Netatmo Weather Station avec Python. #Python #Netatmo
Visualisons le nombre de personnes infectées par le virus corona avec matplotlib
Utilisons rapidement l'expression distribuée des mots avec fastText!
Analysez le modèle thématique pour devenir romancier avec GensimPy3
Déplaçons word2vec avec Chainer et voyons la progression de l'apprentissage
Réduisons le travail requis pour la configuration du serveur avec Ansible