Diesmal in linearer Regression, Ridge-Regression und Lasso-Regression
Ich werde die Artikel über jede Funktion und jeden Unterschied zusammenfassen.
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,)
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.
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()
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()
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()
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.
Ä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')
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.
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.
・ Maschinelles Lernen ab Python - O'Reilly Japan
Recommended Posts