Praxiseinstieg Machine Learning mit Scikit-Learn, Keras und TensorFlow. Aurélien Géron

Praxiseinstieg Machine Learning mit Scikit-Learn, Keras und TensorFlow - Aurélien Géron


Скачать книгу
probiert die Gittersuche Kombinationen von 12 + 6 = 18 der Hyperparameter mit dem RandomForestRegressor aus. Jedes Modell wird fünf Mal trainiert (weil wir eine fünffache Kreuzvalidierung verwenden). Anders gesagt, es gibt Trainingsrunden der Art 18 × 5 = 90! Es kann eine ganze Weile dauern, aber schließlich können Sie die beste Parameterkombination wie folgt abfragen:

      >>> grid_search.best_params_

      {'max_features': 8, 'n_estimators': 30}

image Da 8 und 30 die maximalen ausprobierten Werte sind, sollten wir noch einmal mit höheren Werten suchen, da der Score vielleicht noch besser wird.

      Sie können auch direkt auf den besten Estimator zugreifen:

      >>> grid_search.best_estimator_

      RandomForestRegressor(bootstrap=True, criterion='mse', max_depth=None,

      max_features=8, max_leaf_nodes=None, min_impurity_decrease=0.0,

      min_impurity_split=None, min_samples_leaf=1,

      min_samples_split=2, min_weight_fraction_leaf=0.0,

      n_estimators=30, n_jobs=None, oob_score=False, random_state=None,

      verbose=0, warm_start=False)

image Falls GridSearchCV mit refit=True initialisiert wird (der Standardeinstellung), wird der beste über Kreuzvalidierung gefundene Estimator noch einmal mit dem gesamten Trainingsdatensatz trainiert. Dies ist grundsätzlich eine gute Idee, da mehr Daten voraussichtlich die Genauigkeit erhöhen.

      Natürlich sind auch die Scores der Evaluation verfügbar:

      >>> cvres = grid_search.cv_results_

      >>> for mean_score, params in zip(cvres["mean_test_score"], cvres["params"]):

      ... print(np.sqrt(-mean_score), params)

      ...

      63669.05791727153 {'max_features': 2, 'n_estimators': 3}

      55627.16171305252 {'max_features': 2, 'n_estimators': 10}

      53384.57867637289 {'max_features': 2, 'n_estimators': 30}

      60965.99185930139 {'max_features': 4, 'n_estimators': 3}

      52740.98248528835 {'max_features': 4, 'n_estimators': 10}

      50377.344409590376 {'max_features': 4, 'n_estimators': 30}

      58663.84733372485 {'max_features': 6, 'n_estimators': 3}

      52006.15355973719 {'max_features': 6, 'n_estimators': 10}

      50146.465964159885 {'max_features': 6, 'n_estimators': 30}

      57869.25504027614 {'max_features': 8, 'n_estimators': 3}

      51711.09443660957 {'max_features': 8, 'n_estimators': 10}

      49682.25345942335 {'max_features': 8, 'n_estimators': 30}

      62895.088889905004 {'bootstrap': False, 'max_features': 2, 'n_estimators': 3}

      54658.14484390074 {'bootstrap': False, 'max_features': 2, 'n_estimators': 10}

      59470.399594730654 {'bootstrap': False, 'max_features': 3, 'n_estimators': 3}

      52725.01091081235 {'bootstrap': False, 'max_features': 3, 'n_estimators': 10}

      57490.612956065226 {'bootstrap': False, 'max_features': 4, 'n_estimators': 3}

      51009.51445842374 {'bootstrap': False, 'max_features': 4, 'n_estimators': 10}

      In diesem Beispiel erhalten wir die beste Lösung, indem wir den Hyperparameter max_features auf 8 setzen und den Hyperparameter n_estimators auf 30. Der RMSE beträgt bei dieser Kombination 49682, was etwas besser als der zuvor mit den voreingestellten Hyperparametern berechnete Wert ist (dieser betrug 50182). Herzlichen Glückwunsch, Sie haben Ihr bestes Modell erfolgreich optimiert!

image Vergessen Sie nicht, dass Sie auch einige der Vorverarbeitungsschritte als Hyperparameter ansehen können. Die Gittersuche kann automatisch herausfinden, ob Sie ein Merkmal hinzufügen sollten, dessen Sie sich nicht sicher sind (z.B. den Hyperparameter add_bedrooms_per_room Ihres Transformers CombinedAttributes Adder). In ähnlicher Weise kann die Gittersuche die beste Möglichkeit finden, mit Ausreißern und fehlenden Werten umzugehen, Merkmale auszuwählen und mehr.

       Zufällige Suche

      Die Gittersuche ist als Ansatz gut geeignet, wenn Sie wie im Beispiel oben relativ wenige Kombinationen durchsuchen möchten. Ist der Suchraum für die Hyperparameter jedoch groß, ist stattdessen RandomizedSearchCV vorzuziehen. Diese Klasse lässt sich genauso wie GridSearchCV verwenden, aber anstatt alle möglichen Kombinationen durchzuprobieren, wird eine gegebene Anzahl zufälliger Kombinationen evaluiert, indem in jedem Durchlauf ein zufälliger Wert für jeden Hyperparameter gebildet wird. Dieser Ansatz hat zwei Vorteile:

       Wenn Sie die zufällige Suche für 1.000 Iterationen laufen lassen, werden für jeden Hyperparameter 1.000 unterschiedliche Werte ausprobiert (anstatt nur einige Werte pro Hyperparameter wie bei der Gittersuche).

       Sie haben eine stärkere Kontrolle über die Rechenzeit, die Sie der Suche nach Hyperparametern zuteilen möchten, indem Sie einfach die Anzahl Iterationen festlegen.

       Ensemble-Methoden

      Eine weitere Möglichkeit zur Optimierung Ihres Systems ist, die Modelle mit der besten Leistung miteinander zu kombinieren. Die Gruppe (oder das »Ensemble«) schneidet oft besser ab als das beste Modell für sich allein (genauso wie ein Random Forest mehr leistet als ein einzelner Entscheidungsbaum), insbesondere wenn die einzelnen Modelle unterschiedliche Arten von Fehlern machen. Mit diesem Thema werden wir uns in Kapitel 7 beschäftigen.

       Analysiere die besten Modelle und ihre Fehler

      Oft lassen sich Erkenntnisse über die Aufgabe durch Inspizieren der besten Modelle gewinnen. Beispielsweise zeigt der RandomForestRegressor die relative Wichtigkeit jedes Merkmals für genaue Vorhersagen:

      >>> feature_importances = grid_search.best_estimator_.feature_importances_

      >>> feature_importances

      array([7.33442355e-02, 6.29090705e-02, 4.11437985e-02, 1.46726854e-02,

      1.41064835e-02, 1.48742809e-02, 1.42575993e-02, 3.66158981e-01,

      5.64191792e-02, 1.08792957e-01, 5.33510773e-02, 1.03114883e-02,

      1.64780994e-01, 6.02803867e-05, 1.96041560e-03, 2.85647464e-03])

      Stellen wir die Scores für die Wichtigkeit der Merkmale gemeinsam mit ihren Namen dar:

      >>> extra_attribs = ["rooms_per_hhold", "pop_per_hhold", "bedrooms_per_room"]

      >>> cat_encoder = full_pipeline.named_transformers_["cat"]

      >>> cat_one_hot_attribs = list(cat_encoder.categories_[0])

      >>> attributes = num_attribs


Скачать книгу