[PYTHON] Unterschied zwischen linearer Regression, Ridge-Regression und Lasso-Regression

■ Einführung

Diesmal in linearer Regression, Ridge-Regression und Lasso-Regression Ich werde die Artikel über jede Funktion und jeden Unterschied zusammenfassen.

■ Vorbereitung der Moduldaten


import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import mglearn

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Ridge, Lasso
from sklearn.linear_model import RidgeCV
from yellowbrick.regressor import AlphaSelection

mglearn ist ein Modul zur Visualisierung der Verwendung von Daten und Plots.

Dieses Mal werden wir den verbesserten Boston-Datensatz verwenden. Im Gegensatz zu den Originaldaten beträgt die Anzahl der Features 104.


X, y = mglearn.datasets.load_extended_boston()

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

print('X:', X.shape)
print('y:', y.shape)
print('X_train:', X_train.shape)
print('y_train:', y_train.shape)
print('X_test:', X_test.shape)
print('y_test:', y_test.shape)

# X: (506, 104)
# y: (506,)
# X_train: (379, 104)
# y_train: (379,)
# X_test: (127, 104)
# y_test: (127,)

1. Lineare Regression


lr = LinearRegression().fit(X_train, y_train)

#Entscheidungskoeffizient (ein Index, der die Genauigkeit der Vorhersage von Regressionsmodellen misst)
print('Train set score: {}'.format(lr.score(X_train, y_train)))
print('Test set score: {}'.format(lr.score(X_test, y_test)))

# Train set score: 0.9520519609032729
# Test set score: 0.6074721959665842

Die Punktzahl ist ein Entscheidungskoeffizient (ein Index, der die Genauigkeit der Vorhersage eines Regressionsmodells misst).

Bei der linearen Regression ist die Genauigkeit der Vorhersage der vorliegenden Trainingsdaten hoch. Bei Testdaten (unbekannte Daten) ist die Vorhersagegenauigkeit tendenziell gering.

Wenn Sie es mit Sport (Baseball) vergleichen, üben Sie normalerweise das Schlagen von geraden Bällen. Haben Sie das Gefühl, dass Sie im eigentlichen Spiel überhaupt nicht mit gebogenen Bällen umgehen können?

In der Praxis und bei Kaggle ist die Generalisierungsleistung (Fähigkeit, auf die Produktion zu reagieren) für unbekannte Daten wichtig. Für diese Daten können wir sehen, dass das lineare Regressionsmodell ungeeignet ist.

2. Ridge Regression

Zu viel Anpassung an Trainingsdaten wie zuvor Der Rückgang der Generalisierungsleistung beim Testen von Daten wird als "Überlernen" bezeichnet.

Um dies zu verhindern, wird die Ridge-Regression zur Regularisierung verwendet (Parameter: Alpha).

Overlearning tritt eher auf, wenn der Regressionskoeffizient (Wert jedes Features) groß ist oder variiert. Durch Erhöhen des Parameters Alpha nähert sich der Regressionskoeffizient 0.


ridge = Ridge(alpha=1).fit(X_train, y_train)

print('Training set score: {}'.format(ridge.score(X_train, y_train)))
print('Test set score: {}'.format(ridge.score(X_test, y_test)))

# Training set score: 0.885796658517094
# Test set score: 0.7527683481744752

Die Anpassung an Trainingsdaten wird reduziert, aber die Generalisierungsleistung für Testdaten wird verbessert. Das Alpha der Ridge-Regression ist standardmäßig 1, versuchen Sie es also auch mit anderen Werten.


ridge10 = Ridge(alpha=10).fit(X_train, y_train)

print('Training set score: {:.2f}'.format(ridge10.score(X_train, y_train)))
print('Test set score: {:.2f}'.format(ridge10.score(X_test, y_test)))

# Training set score: 0.79
# Test set score: 0.64

Die Vorhersagegenauigkeit für die Testdaten ist niedriger als bei Alpha = 1.


ridge01 = Ridge(alpha=0.1).fit(X_train, y_train)

print('Training set score: {}'.format(ridge.score(X_train, y_train)))
print('Test set score: {}'.format(ridge.score(X_test, y_test)))

# Training set score: 0.885796658517094
# Test set score: 0.7527683481744752

Dies ist ungefähr die gleiche Vorhersagegenauigkeit wie bei Alpha = 1.

Hier über die Größe und Variation jedes Regressionskoeffizienten Vergleichen wir 3 Muster mit Alpha = 0,1, 1, 10.


plt.plot(ridge10.coef_, 's', label='Ridge alpha=10')
plt.plot(ridge.coef_, 's', label='Ridge alpha=1')
plt.plot(ridge01.coef_, 's', label='Ridge alpah=0.1')

plt.plot(lr.coef_, 'o', label='LinearRegression')
plt.xlabel('Coefficient index')
plt.ylabel('Coefficient magnitude')

plt.hlines(0, 0, len(lr.coef_))
plt.ylim(-25, 25)

plt.legend()

image.png Horizontale Achse: 104 Merkmale Vertikale Achse: Größe jedes Regressionskoeffizienten im Modell

Es ist ersichtlich, dass die Punktzahl höher ist, wenn es Abweichungen in den Daten gibt, wie z. B. Alpha = 0,1, 1. Wenn die Variation jedoch wie die lineare Regression zu groß ist (Überlernen) oder wenn die Regularisierung wie Alpha = 10 zu stark ist. Die Punktzahl des Entscheidungskoeffizienten ist niedrig.

Zuvor habe ich einige Alphas ersetzt und die Ergebnisse verglichen. Es gibt auch eine Möglichkeit, sich im Voraus über das optimale Alpha zu informieren.

Stellen Sie zunächst für den Parameter Alpha den Bereich ein, in dem nach dem Wert gesucht werden soll. Führen Sie mit RidgeCV eine Kreuzvalidierung der Trainingsdaten durch und zeichnen Sie die optimalen Werte mit Alpha Selection auf.


alphas = np.logspace(-10, 1, 500)

ridgeCV = RidgeCV(alphas = alphas)

alpha_selection = AlphaSelection(ridgeCV)
alpha_selection.fit(X_train, y_train)

alpha_selection.show()
plt.show()

image.png Daraus haben wir den optimalen Parameterwert (Alpha) für diese Ridge-Regression gefunden.


ridge0069 = Ridge(alpha=0.069).fit(X_train, y_train)

print('Training set score: {}'.format(ridge.score(X_train, y_train)))
print('Test set score: {}'.format(ridge.score(X_test, y_test)))

# Training set score: 0.885796658517094
# Test set score: 0.7527683481744752

Als ich es tatsächlich ausprobierte, war die Punktzahl so hoch wie bei Alpha = 0,1, 1.

Als nächstes zeichnen wir die Lernkurve als Vergleich zwischen der linearen Regression und der Ridge-Regression (Alpha = 1).


mglearn.plots.plot_ridge_n_samples()

image.png Horizontale Achse: Datengröße (gesamt) Vertikale Achse: Entscheidungskoeffizient

Die Punktzahl der Trainingsdaten ist hoch, da die lineare Regression zu Übertraining neigt. In den Testdaten ist die Generalisierungsleistung nahezu Null.

Wenn jedoch die Datengröße ausreicht Es ist ersichtlich, dass es die gleiche Generalisierungsleistung wie die Ridge-Regression aufweist.

3. Lasso-Regression

Ähnlich wie bei der Ridge-Regression wird der Koeffizient auf 0 beschränkt. Die Multiplikationsmethode unterscheidet sich geringfügig, und die Lasso-Regression weist einige Koeffizienten auf, die vollständig Null sind.

Anzahl der verwendeten Funktionen: Anzahl der verwendeten Funktionen


lasso = Lasso().fit(X_train, y_train)

print('Training set score: {:.2f}'.format(lasso.score(X_train, y_train)))
print('Test set score: {:.2f}'.format(lasso.score(X_test, y_test)))
print('Number of features used: {}'.format(np.sum(lasso.coef_ != 0)))

# Training set score: 0.29
# Test set score: 0.21
# Number of features used: 4

lasso001 = Lasso(alpha=0.01, max_iter=100000).fit(X_train, y_train)

print('Traing set score: {:.2f}'.format(lasso001.score(X_train, y_train)))
print('Test set score: {:.2f}'.format(lasso001.score(X_test, y_test)))
print('Number of features used: {}'.format(np.sum(lasso001.coef_ != 0)))

# Traing set score: 0.90
# Test set score: 0.77
# Number of features used: 33

lasso00001 = Lasso(alpha=0.0001, max_iter=100000).fit(X_train, y_train)

print('Training set score: {:.2f}'.format(lasso00001.score(X_train, y_train)))
print('Test set score: {:.2f}'.format(lasso00001.score(X_test, y_test)))
print('Number of features used: {}'.format(np.sum(lasso00001.coef_ != 0)))

# Training set score: 0.95
# Test set score: 0.64
# Number of features used: 96

Basierend auf einer Fehlerfunktion, die so konzipiert ist, dass weniger wichtige Merkmale in der Regel 0 sind Wir trainieren und bestimmen die Funktionen, die tatsächlich verwendet werden sollen.

In diesem Fall, wenn die Anzahl der Features 96 oder 4 beträgt Sie können sehen, dass die Generalisierungsleistung niedrig ist.

Über Lasso (Alpha = 0,0001) und Ridge (Alpha = 1) Vergleichen wir die Größe und Variation des Regressionskoeffizienten.


plt.plot(lasso.coef_, 's', label='Lasso alpha=1')
plt.plot(lasso001.coef_, '^', label='Lasso alpha=0.01')
plt.plot(lasso00001.coef_, 'v', label='Lasso alpha=0.0001')

plt.plot(ridge01.coef_, 'o', label='Ridge alpha=0.1')
plt.legend(ncol=2, loc=(0, 1.05))
plt.ylim(-25, 25)
plt.xlabel('Coefficient index')
plt.ylabel('Coefficient magnitude')

image.png Horizontale Achse: 104 Merkmale Vertikale Achse: Größe jedes Regressionskoeffizienten im Modell

In der obigen Abbildung ist es immer noch notwendig, die Koeffizienten zu variieren. Lasso (Alpha = 0,0001) ist so verstreut wie Ridge (Alpha = 1) Sie können sehen, dass die Punktzahl des Entscheidungskoeffizienten ebenfalls nahe ist.

■ Fazit

Wenn Sie an lineare Regression denken, modellieren Sie zuerst die Ridge-Regression Wenn Sie feststellen, dass unnötige Funktionen vorhanden sind, sollten Sie die Lasso-Regression versuchen.

ElasticNet (das sowohl Ridge- als auch Lasso-Parameter enthält) ist genau, aber mühsam anzupassen.

■ Referenzen

Maschinelles Lernen ab Python - O'Reilly Japan

Recommended Posts

Unterschied zwischen linearer Regression, Ridge-Regression und Lasso-Regression
Unterschied zwischen Regression und Klassifikation
Ridge und Lasso
Unterschied zwischen "categoryical_crossentropy" und "sparse_categorical_crossentropy"
Unterschied zwischen np.array und np.arange
Unterschied zwischen MicroPython und CPython
Unterschied zwischen ps a und ps -a
Unterschied zwischen Return und Print-Python
Unterschied zwischen Java und Python (Memo)
Unterschied zwischen list () und [] in Python
Unterschied zwischen SQLAlchemy filter () und filter_by ()
Unterschied zwischen == und ist in Python
Memorandum (Unterschied zwischen csv.reader und csv.dictreader)
(Hinweis) Unterschied zwischen Gateway und Standard-Gateway
Unterschied zwischen Numpys Randint und Randoms Randint
Unterschied zwischen sortiert und sortiert (Denkmal)
Unterschied zwischen der Python2-Serie und der Python3-Serie dict.keys ()
[Python] Unterschied zwischen Funktion und Methode
Unterschied zwischen SQLAlchemy flush () und commit ()
Python - Unterschied zwischen exec und eval
[Python] Unterschied zwischen randrange () und randint ()
[Python] Unterschied zwischen sortiert und sortiert (Colaboratory)
Lineare Regression
Schätzung / Vorhersage des verallgemeinerten linearen Modells bei Lasso und Ridge
Erster TensorFlow (überarbeitete Ausgabe) - Lineare und logistische Regression
[Xg Boost] Unterschied zwischen Softmax und Softprob
Unterschied zwischen Anweisungen (Anweisungen) und Ausdrücken (Ausdrücken) in Python
Unterschiede in der Beziehung zwischen PHP und Python schließlich und beenden
Unterschied zwischen @classmethod und @staticmethod in Python
Unterschied zwischen Anhängen und + = in der Python-Liste
Unterschied zwischen nicht lokal und global in Python
[Python] Unterschied zwischen Klassenmethode und statischer Methode
Unterschied zwischen Docker-Compose-Datei env_file und .env-Datei
[Python Iroha] Unterschied zwischen Liste und Tupel
Verständnis der Datentypen und des Beginns der linearen Regression
[Python] Unterschied zwischen Rand- und Randn-Ausgabe
Geschwindigkeitsunterschied zwischen wsgi, Flasche und Flasche
Kammregression verstehen und implementieren (L2-Regularisierung)
Unterschied zwischen numpy.ndarray und list (Dimension, Größe)
Unterschied zwischen ls -l und cat Befehl
Differenz- und Kompatibilitätsprüfung zwischen Keras und tf.keras # 1
Unterschied zwischen Verwendung und Import in der Schildsprache
Über den Unterschied zwischen "==" und "is" in Python
Über den Unterschied zwischen PostgreSQL su und sudo
Was ist der Unterschied zwischen Unix und Linux?
Berücksichtigung des Unterschieds zwischen ROC-Kurve und PR-Kurve
"Lineare Regression" und "Probabilistische Version der linearen Regression" in Python "Bayes lineare Regression"
Grober Unterschied zwischen Unicode und UTF-8 (und seinen Begleitern)
Unterschied zwischen Ruby und Python in Bezug auf Variablen
Was ist der Unterschied zwischen usleep, nanosleep und clock_nanosleep?
Unterschied zwischen Numpy (n,) und (n, 1) Notation [Unterschied zwischen horizontalem Vektor und vertikalem Vektor]
Einführung in die Tensorflow-About-Hypothese und die Kosten der linearen Regression
Unterschied zwischen return, return None und no return description in Python
Wie man Argparse benutzt und den Unterschied zwischen Optparse
Mittendifferenz und Vorwärtsdifferenz
Lineare Regression mit Statistikmodellen
Zwischen parametrisch und nicht parametrisch
Lineare Regression des maschinellen Lernens
Regression mit einem linearen Modell
Was ist der Unterschied zwischen symbolischen und harten Links?
Python-Modul num2words Verhaltensunterschied zwischen Englisch und Russisch