[PYTHON] Lassen Sie uns die Hyperparameter des Modells mit scikit-learn abstimmen!

Was ist Hyperparameter-Tuning?

Es gibt einige Parameter, die je nach Modell im Voraus festgelegt werden müssen. (Zum Beispiel die Anzahl der k-Mittel-Cluster, die Stärke des SVC-Regularisierungsterms, die Tiefe des Entscheidungsbaums usw.)

Es wird als "Hyperparameter" bezeichnet, aber das Problem ist, dass sich die Genauigkeit abhängig vom Wert des Hyperparameters ** erheblich ** ändern kann, selbst wenn es sich um dasselbe Modell handelt.

Hyper-Parameter-Tuning ist eine gute Entscheidung anhand von Trainingsdaten! !!

Rastersuche und Zufallssuche

Von den Abstimmungsmethoden werden wir uns mit zwei befassen, der Rastersuche und der Zufallssuche. Grob gesagt, wenn es einen Hyperparameter α gibt, wird er gemäß dem folgenden Fluss ausgeführt.

・ Geben Sie für die Rastersuche im Voraus den ** Bereich ** von α (z. B. 0,1,2,3,4,5 usw.) an und versuchen Sie tatsächlich, die Genauigkeit des Modells mit diesem Parameter zu ermitteln, der am besten ist. Mach ihn zu einem Parameter.

Screen Shot 2017-02-25 at 22.37.35.png

Wie oben erwähnt, sind beide nicht das Verfahren zum Entscheiden des Hyperparameters α, wie er ist. Zuvor können Sie sehen, dass das Verfahren darin besteht, den ** Bereich und die Verteilung ** zu bestimmen und die tatsächlichen Trainingsdaten zu verwenden. (Weitere Informationen finden Sie unter Ressourcen!)

Python-Code

Die beiden oben genannten sind Standardausrüstung in Scikit-Learn, also werden wir sie verwenden! Code für python3.5.1, scikit_learn-0.18.1.

Dieses Mal nehme ich Daten aus dem Machine Learning Repository von UCI und verwende zwei Klassifizierer aus RandomForestClassifier, um die Parameter zu optimieren. Der vollständige Code wurde auf [github] hochgeladen (https://github.com/ragAgar/qiita/blob/master/Grid_and_Random_Search.ipynb).

SCHRITT 1 Laden Sie Daten aus dem UCI-Repository herunter

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)

Setzen Sie der Übersichtlichkeit halber die Spalte, die Sie vorhersagen möchten, auf Target und die anderen auf ~.

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

SCHRITT 2 Daten teilen

Grid_and_Random_Search.ipynb


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

Unterteilt in Zugdaten und Testdaten

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)

SCHRITT 3 Überprüfen Sie die Genauigkeit des Modells im Standardzustand.

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()))

Ausgabeergebnis 1(Standard)


    [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

Es stellte sich heraus, dass die korrekte Antwortrate der Zugdaten 1,0 und die korrekte Antwortrate der Testdaten 0,91 beträgt. Von hier aus werden wir die Rastersuche und die Zufallssuche implementieren. Von nun an wird auf Referenz 3 verwiesen.

SCHRITT 4 Rastersuche

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_)

Ausgabeergebnis 2(Rastersuche)


    [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

Alle Genauigkeit wie die gesamte korrekte Antwortrate und der F1-Score wurden erhöht! !!

SCHRITT 5 Zufällige Suche

Die zufällige Suche verwendet scipy, um die Verteilung darzustellen, der die Parameter folgen. Diesmal entspricht die Anzahl der Iterationen der Rastersuche.

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_)

Ausgabeergebnis 3(Zufällige Suche)


    [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

Wir haben festgestellt, dass alle Artikel im Vergleich zum Standardfall um 2% gestiegen sind!

Zusammenfassung

Die Genauigkeit sowohl der Rastersuche als auch der Zufallssuche hat sich verbessert! Ich denke jedoch, dass der Effekt schwer zu erkennen ist, da ich diesmal ursprünglich Daten mit hoher Genauigkeit ausgewählt habe. Es ist möglicherweise einfacher, den Effekt der Optimierung zu erkennen, wenn Sie Daten anprobieren, die nicht korrekt sind.

Der vollständige Code wurde auf [github] hochgeladen (https://github.com/ragAgar/qiita/blob/master/Grid_and_Random_Search.ipynb).

Verweise

  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

Lassen Sie uns die Hyperparameter des Modells mit scikit-learn abstimmen!
Kalibrieren Sie das Modell mit PyCaret
Rastersuche von Hyperparametern mit Scikit-learn
Validieren Sie das Trainingsmodell mit Pylearn2
Die grundlegendste Clusteranalyse mit Scikit-Learn
Lösen wir das Portfolio mit kontinuierlicher Optimierung
[Scikit-learn] Ich habe mit der ROC-Kurve gespielt
Achtung Seq2 Führen Sie das Dialogmodell mit Seq aus
Lesen wir die RINEX-Datei mit Python ①
[Übersetzung] scicit-learn 0.18 Tutorial Auswahl des richtigen Modells
Ein Modell, das die Gitarre mit fast.ai identifiziert
Isomap mit Scikit-lernen
Lassen Sie uns die Asset-Allokation durch das Black Ritterman-Modell erklären (mit einem Ausführungsbeispiel von Python).
Belichtung des DCGAN-Modells für Cifar 10 mit Keras
Simulieren wir das Izhikevich-Neuronenmodell im Web!
DBSCAN mit Scikit-Learn
Clustering mit Scikit-Learn (1)
Prognostizieren Sie die zweite Runde des Sommers 2016 mit scikit-learn
Lösen des Lorenz 96-Modells mit Julia und Python
Clustering mit Scikit-Learn (2)
PCA mit Scikit-Learn
Laden Sie die TensorFlow-Modelldatei .pb mit readNetFromTensorflow ().
Multivariables Regressionsmodell mit Scikit-Learn - Ich habe versucht, SVR zu vergleichen und zu verifizieren
kmeans ++ mit scikit-learn
Lassen Sie uns die Matrix transponieren und die Matrizen mit numpy multiplizieren.
[Übersetzung] scikit-learn 0.18 Benutzerhandbuch 3.2. Optimieren der Hyperparameter des Schätzers
Die Entscheidung von scikit-learn Wie man ein Holzmodell visualisiert
Überwachen Sie das Trainingsmodell mit TensorBord auf Jupyter Notebook
Lösen des Irisproblems mit scikit-learn ver1.0 (logistische Regression)
Kreuzvalidierung mit Scikit-Learn
Mehrklassen-SVM mit Scikit-Learn
Clustering mit scikit-learn + DBSCAN
Scikit-Lernen mit Chemoinfomatik
Modellbefestigung mit lmfit
Regression mit einem linearen Modell
DBSCAN (Clustering) mit Scikit-Learn
Installieren Sie scikit.learn mit pip
Berechnen Sie tf-idf mit scikit-learn
Lassen Sie uns twittern, indem wir das Terminal treffen und mit Selen schreien! !!
Implementieren Sie mit Open Modelica das mathematische Modell "SIR-Modell" von Infektionskrankheiten
Lassen Sie uns den Befehl pünktlich mit dem Bot der Zwietracht ausführen
Genießen Sie das Gray-Scott-Modell mit Kurzcode mithilfe der Matrixberechnung
Berühren wir die API der Netatmo Weather Station mit Python. #Python #Netatmo
Stellen wir uns die Anzahl der mit Matplotlib mit dem Coronavirus infizierten Personen vor
Verwenden wir den verteilten Ausdruck von Wörtern schnell mit fastText!
Analysieren Sie das Themenmodell, mit GensimPy3 Romanautor zu werden
Lassen Sie uns word2vec mit Chainer verschieben und den Lernfortschritt sehen
Reduzieren wir den Arbeitsaufwand für die Servereinrichtung mit Ansible