Nichtnegative kleinste Quadrate Regression

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 uns mit der nichtnegativen kleinsten Quadrate Regression befassen, einer Art der linearen Regression, bei der die Regressionskoeffizienten auf nichtnegativ begrenzt sind. Wir werden die scikit-learn-Bibliothek von Python verwenden, um diesen Algorithmus zu implementieren und ihn mit der klassischen linearen Regression zu vergleichen.

VM-Tipps

Nachdem die VM gestartet ist, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu nutzen.

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 bei der Lernphase Probleme haben, können Sie Labby gerne fragen. Geben Sie nach der Sitzung Feedback, und wir werden das Problem für Sie prompt beheben.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/linear_model("Linear Models") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/metrics("Metrics") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/linear_model -.-> lab-49228{{"Nichtnegative kleinste Quadrate Regression"}} sklearn/model_selection -.-> lab-49228{{"Nichtnegative kleinste Quadrate Regression"}} sklearn/metrics -.-> lab-49228{{"Nichtnegative kleinste Quadrate Regression"}} ml/sklearn -.-> lab-49228{{"Nichtnegative kleinste Quadrate Regression"}} end

Zufällige Daten generieren

Wir werden einige zufällige Daten generieren, um unseren Algorithmus zu testen. Wir werden 200 Stichproben mit 50 Merkmalen erstellen und für jedes Merkmal einen wahren Koeffizienten von 3 verwenden. Anschließend werden wir die Koeffizienten auf nichtnegativ begrenzen. Schließlich werden wir der Stichprobe etwas Rauschen hinzufügen.

import numpy as np

np.random.seed(42)

n_samples, n_features = 200, 50
X = np.random.randn(n_samples, n_features)
true_coef = 3 * np.random.randn(n_features)
true_coef[true_coef < 0] = 0
y = np.dot(X, true_coef)
y += 5 * np.random.normal(size=(n_samples,))

Daten in Trainings- und Testsets unterteilen

Wir werden unsere Daten in ein Trainingsset und ein Testset unterteilen, wobei jeder Satz 50% der Daten enthält.

from sklearn.model_selection import train_test_split

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

Nichtnegative kleinste Quadrate Regression anpassen

Wir werden nun unsere Daten mit der nichtnegativen kleinsten Quadrate Regression anpassen. Dies wird mit der LinearRegression-Klasse von scikit-learn mit dem Parameter positive=True durchgeführt. Anschließend werden wir die Werte für unser Testset vorhersagen und den R2-Wert berechnen.

from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score

reg_nnls = LinearRegression(positive=True)
y_pred_nnls = reg_nnls.fit(X_train, y_train).predict(X_test)
r2_score_nnls = r2_score(y_test, y_pred_nnls)
print("NNLS R2 score", r2_score_nnls)

Klassische lineare Regression anpassen

Wir werden nun unsere Daten mit der klassischen linearen Regression anpassen. Dies wird mit der LinearRegression-Klasse von scikit-learn durchgeführt. Anschließend werden wir die Werte für unser Testset vorhersagen und den R2-Wert berechnen.

reg_ols = LinearRegression()
y_pred_ols = reg_ols.fit(X_train, y_train).predict(X_test)
r2_score_ols = r2_score(y_test, y_pred_ols)
print("OLS R2 score", r2_score_ols)

Regressionskoeffizienten vergleichen

Wir werden nun die Regressionskoeffizienten zwischen der nichtnegativen kleinsten Quadrate Regression und der klassischen linearen Regression vergleichen. Wir werden die Koeffizienten gegeneinander aufzeichnen und feststellen, dass sie stark korreliert sind. Allerdings schrumpft die nichtnegative Einschränkung einige Koeffizienten auf 0. Dies liegt daran, dass die nichtnegative kleinste Quadrate von Natur aus dünne Ergebnisse liefern.

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot(reg_ols.coef_, reg_nnls.coef_, linewidth=0, marker=".")

low_x, high_x = ax.get_xlim()
low_y, high_y = ax.get_ylim()
low = max(low_x, low_y)
high = min(high_x, high_y)
ax.plot([low, high], [low, high], ls="--", c=".3", alpha=0.5)
ax.set_xlabel("OLS regression coefficients", fontweight="bold")
ax.set_ylabel("NNLS regression coefficients", fontweight="bold")

Zusammenfassung

In diesem Lab haben wir uns mit der nichtnegativen kleinsten Quadrate Regression und ihrem Unterschied zur klassischen linearen Regression beschäftigt. Wir haben scikit-learn verwendet, um dieses Verfahren zu implementieren und es mit der klassischen linearen Regression verglichen, indem wir zufällige Daten generiert und in ein Trainingsset und ein Testset unterteilt haben. Anschließend haben wir beide Modelle an die Daten angepasst, die Werte für das Testset vorhergesagt und den R2-Wert berechnet. Schließlich haben wir die Regressionskoeffizienten zwischen den beiden Modellen verglichen und festgestellt, dass die nichtnegative kleinste Quadrate Regression dünne Ergebnisse liefert.