Modellkomplexität und durch Kreuzvalidierung ermittelter Score im Gleichgewicht bringen

Machine LearningMachine LearningBeginner
Jetzt üben

This tutorial is from open-source community. Access the source code

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab werden wir lernen, wie wir die Modellkomplexität und die durch Kreuzvalidierung ermittelte Punktzahl im Verhältnis zueinander abstimmen, indem wir eine annehmbare Genauigkeit innerhalb von 1 Standardabweichung von der besten Genauigkeitspunkzahl finden und dabei die Anzahl der PCA-Komponenten minimieren. Wir werden den digits-Datensatz aus scikit-learn und eine Pipeline verwenden, die aus PCA und LinearSVC besteht.

Tipps für die VM

Nachdem der VM-Start abgeschlossen ist, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu öffnen.

Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund der Einschränkungen von Jupyter Notebook nicht automatisiert werden.

Wenn Sie während des Lernens Probleme haben, können Sie Labby gerne fragen. Geben Sie nach der Sitzung Feedback ab, und wir werden das Problem für Sie prompt beheben.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/AdvancedDataAnalysisandDimensionalityReductionGroup(["Advanced Data Analysis and Dimensionality Reduction"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/DataPreprocessingandFeatureEngineeringGroup(["Data Preprocessing and Feature Engineering"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/svm("Support Vector Machines") sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/pipeline("Pipeline") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/AdvancedDataAnalysisandDimensionalityReductionGroup -.-> sklearn/decomposition("Matrix Decomposition") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/svm -.-> lab-49156{{"Modellkomplexität und durch Kreuzvalidierung ermittelter Score im Gleichgewicht bringen"}} sklearn/pipeline -.-> lab-49156{{"Modellkomplexität und durch Kreuzvalidierung ermittelter Score im Gleichgewicht bringen"}} sklearn/model_selection -.-> lab-49156{{"Modellkomplexität und durch Kreuzvalidierung ermittelter Score im Gleichgewicht bringen"}} sklearn/decomposition -.-> lab-49156{{"Modellkomplexität und durch Kreuzvalidierung ermittelter Score im Gleichgewicht bringen"}} sklearn/datasets -.-> lab-49156{{"Modellkomplexität und durch Kreuzvalidierung ermittelter Score im Gleichgewicht bringen"}} ml/sklearn -.-> lab-49156{{"Modellkomplexität und durch Kreuzvalidierung ermittelter Score im Gleichgewicht bringen"}} end

Bibliotheken importieren

Wir beginnen mit dem Import der erforderlichen Bibliotheken für dieses Lab.

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline
from sklearn.svm import LinearSVC

Funktionen definieren

Wir werden zwei Funktionen definieren, die später im Lab verwendet werden.

def lower_bound(cv_results):
    """
    Berechnet die untere Grenze innerhalb von 1 Standardabweichung
    der besten `mean_test_scores`.

    Parameter
    ----------
    cv_results : dict von numpy(masked) ndarrays
        Siehe Attribut cv_results_ von `GridSearchCV`

    Rückgabe
    -------
    float
        Untere Grenze innerhalb von 1 Standardabweichung der
        besten `mean_test_score`.
    """
    best_score_idx = np.argmax(cv_results["mean_test_score"])

    return (
        cv_results["mean_test_score"][best_score_idx]
        - cv_results["std_test_score"][best_score_idx]
    )


def best_low_complexity(cv_results):
    """
    Stellt ein Gleichgewicht zwischen Modellkomplexität und
    durch Kreuzvalidierung ermittelter Punktzahl her.

    Parameter
    ----------
    cv_results : dict von numpy(masked) ndarrays
        Siehe Attribut cv_results_ von `GridSearchCV`.

    Rückgabe
    ------
    int
        Index eines Modells, das die wenigsten PCA-Komponenten hat,
        während dessen Testscore innerhalb von 1 Standardabweichung der besten
        `mean_test_score` liegt.
    """
    threshold = lower_bound(cv_results)
    candidate_idx = np.flatnonzero(cv_results["mean_test_score"] >= threshold)
    best_idx = candidate_idx[
        cv_results["param_reduce_dim__n_components"][candidate_idx].argmin()
    ]
    return best_idx

Daten laden und Pipeline definieren

Wir werden den digits-Datensatz aus scikit-learn laden und eine Pipeline definieren, die aus PCA und LinearSVC besteht.

pipe = Pipeline(
    [
        ("reduce_dim", PCA(random_state=42)),
        ("classify", LinearSVC(random_state=42, C=0.01, dual="auto")),
    ]
)

X, y = load_digits(return_X_y=True)

Parameter für GridSearchCV definieren

Wir werden die Parameter für GridSearchCV definieren.

param_grid = {"reduce_dim__n_components": [6, 8, 10, 12, 14]}

GridSearchCV-Objekt definieren

Wir werden das GridSearchCV-Objekt definieren und das Modell anpassen.

grid = GridSearchCV(
    pipe,
    cv=10,
    n_jobs=1,
    param_grid=param_grid,
    scoring="accuracy",
    refit=best_low_complexity,
)

grid.fit(X, y)

Ergebnisse visualisieren

Wir werden die Ergebnisse visualisieren, indem wir die Genauigkeit gegen die Anzahl der PCA-Komponenten aufzeichnen.

n_components = grid.cv_results_["param_reduce_dim__n_components"]
test_scores = grid.cv_results_["mean_test_score"]

plt.figure()
plt.bar(n_components, test_scores, width=1.3, color="b")

lower = lower_bound(grid.cv_results_)
plt.axhline(np.max(test_scores), linestyle="--", color="y", label="Best score")
plt.axhline(lower, linestyle="--", color=".5", label="Best score - 1 std")

plt.title("Balance model complexity and cross-validated score")
plt.xlabel("Number of PCA components used")
plt.ylabel("Digit classification accuracy")
plt.xticks(n_components.tolist())
plt.ylim((0, 1.0))
plt.legend(loc="upper left")

best_index_ = grid.best_index_

print("The best_index_ is %d" % best_index_)
print("The n_components selected is %d" % n_components[best_index_])
print(
    "The corresponding accuracy score is %.2f"
    % grid.cv_results_["mean_test_score"][best_index_]
)
plt.show()

Zusammenfassung

In diesem Lab haben wir gelernt, wie man die Modellkomplexität und die durch Kreuzvalidierung ermittelte Score mit Hilfe von PCA und LinearSVC in einem ausgewogenen Verhältnis halten kann. Wir haben GridSearchCV verwendet, um die optimale Anzahl von PCA-Komponenten zu finden, während wir den Genauigkeitsscore innerhalb eines Standardabweichungsbereichs um den besten Score maximierten. Wir haben die Ergebnisse auch visualisiert, um den Kompromiss zwischen Modellkomplexität und Genauigkeit besser zu verstehen.