- Die aus der multiplen Regression abgeleitete Ridge-Regression / Lasso-Regression hat einen Mechanismus, um das Überlernen der multiplen Regression zu unterdrücken **. Insbesondere ist dies wie folgt.
- Die Ridge-Regression behandelt das ** Gewicht im Quadrat **, während die Lasso-Regression das ** absolute Gewicht ** ist.
- Bei Wiederholung des vorherigen Abschnitts wird bei der herkömmlichen multiplen Regressionsanalyse der Koeffizient ermittelt, der die Summe der Fehlerquadrate zwischen dem vorhergesagten Wert und dem beobachteten Wert minimiert. Durch Hinzufügen einer Strafe in Abhängigkeit von der Anzahl und dem Gewicht der Variablen können Sie verhindern, dass der Koeffizient groß wird.
** Hier möchte ich drei multiple Regressionsmodelle vergleichen, einschließlich der Lasso-Regression. ** ** **
⑴ Bibliothek importieren
#Datenverarbeitungs- / Berechnungs- / Analysebibliothek
import numpy as np
import pandas as pd
#Grafikzeichnungsbibliothek
import matplotlib.pyplot as plt
%matplotlib inline
#Bibliothek für maschinelles Lernen
import sklearn
⑵ Datenerfassung und Lesen
#Daten bekommen
url = 'https://raw.githubusercontent.com/yumi-ito/datasets/master/datasets_auto_4variables_pre-processed.csv'
#Lesen Sie die erfassten Daten als DataFrame-Objekt
df = pd.read_csv(url, header=None)
#Spaltenbezeichnung festlegen
df.columns = ['width', 'height', 'horsepower', 'price']
print(df)
- Dies sind Daten zur Vorhersage des Preises der Zielvariablen unter Verwendung von drei der verschiedenen Spezifikationen für Kraftfahrzeuge als erklärende Variablen: Breite (Breite), Höhe (Höhe) und Leistung (Pferdestärke).
- Klicken Sie hier für Details wie Datenquelle und Übersicht. https://qiita.com/y_itoh/items/9befbf47869d66337dad
- Unbekannter Wert "?" Und fehlender Wert wurden gelöscht und der Datentyp wurde in Float-Typ und Int-Typ konvertiert.
#Bestätigung der Datenform
print('Datenform:', df.shape)
#Bestätigung fehlender Werte
print('Anzahl fehlender Werte:{}\n'.format(df.isnull().sum().sum()))
#Datentypbestätigung
print(df.dtypes)
(3) Aufteilung der Trainingsdaten und Testdaten
#Import für Modellbau
from sklearn.linear_model import Ridge, Lasso, LinearRegression
#Import für Datenaufteilung
from sklearn.model_selection import train_test_split
- Verwenden Sie die Pandas-Funktion
drop ()
, um die Spalte price
zu entfernen und setzen Sie nur die erklärenden Variablen auf x und nur den price
auf y.
- Bei der Methode "train_test_split" von sklearn werden die erklärende Variable x und die Zielvariable y in Trainingsdaten (Zug) bzw. Testdaten (Test) unterteilt.
#Legen Sie erklärende Variablen und objektive Variablen fest
x = df.drop('price', axis=1)
y = df['price']
#Unterteilt in Trainingsdaten und Testdaten
X_train, X_test, Y_train, Y_test = train_test_split(x, y, test_size=0.5, random_state=0)
⑷ Modellgenerierung und -bewertung
- Initialisieren Sie die multiple Regression, die Ridge-Regression und die Lasso-Regression gleichzeitig und verwenden Sie die Anweisung "for", um ein Modell zu generieren, die richtige Antwortrate für Trainingsdaten zu berechnen und die richtige Antwortrate für Testdaten gleichzeitig zu berechnen.
#Initialisieren Sie jede Klasse und speichern Sie sie in Modellen mit Variablen vom Typ dict
models = {
'linear': LinearRegression(),
'ridge': Ridge(random_state=0),
'lasso': Lasso(random_state=0)}
#Initialisieren Sie die Variable vom Typ dict, in der die richtige Antwortrate gespeichert ist
scores = {}
#Generieren Sie jedes Modell nacheinander, berechnen und speichern Sie die richtige Antwortrate
for model_name, model in models.items():
#Modellgenerierung
model.fit(X_train, Y_train)
#Richtige Antwortrate der Trainingsdaten
scores[(model_name, 'train')] = model.score(X_train, Y_train)
#Richtige Antwortrate der Testdaten
scores[(model_name, 'test')] = model.score(X_test, Y_test)
#Konvertieren Sie den Diktattyp in eine eindimensionale Pandas-Liste
print(pd.Series(scores))
- Wenn Sie das dict-Objekt so drehen, wie es mit der for-Anweisung ist, wird der Schlüssel jedes Elements erhalten. Wenn Sie jedoch
items ():
verwenden, können Sie sowohl den Schlüssel als auch den Wert jedes Elements abrufen.
- Berechnen Sie die richtige Antwortrate mit der Funktion "score ()" von sklearn und speichern Sie "model_name" und entweder "train" oder "test" als Satz als Schlüssel.
|
Multiple Regression |
Ridge kehrt zurück |
Lasso kehrt zurück |
Richtige Antwortrate der Trainingsdaten |
0.733358 |
0.733355 |
0.733358 |
Richtige Antwortrate der Testdaten |
0.737069 |
0.737768 |
0.737084 |
- Die korrekte Antwortrate der Trainingsdaten ist ** Ridge-Regression <Lasso-Regression = multiple Regression **, und die korrekte Antwortrate der Testdaten ist ** Ridge-Regression> Lasso-Regression> multiple Regression **.
- Wenn Sie sich auf die Lasso-Regression konzentrieren, ist die Genauigkeitsrate in den Trainingsdaten dieselbe wie in der multiplen Regression, und in den Testdaten ist sie geringfügig höher als die multiple Regression, jedoch nicht so hoch wie die Ridge-Regression.
- Der Parameter $ λ $ **, der die Stärke der Regularisierung angibt, bleibt jedoch unberührt, und der Standardwert für beide Scicit-Learns ist $ λ = 1,0 $.
** Also möchte ich die Regularisierungsparameter ändern und vergleichen. ** ** **
Regularisierungsparameter
- Wenn der Parameter $ λ $, der die Stärke der Regularisierung angibt, erhöht wird, wird der Effekt der Strafe stärker, sodass der Absolutwert des Regressionskoeffizienten klein gehalten werden kann.
- Parametereinstellungen werden im Argument mit "alpha =" angegeben, wenn die Klasse initialisiert und ein Modellmodell erstellt wird. Versuchen Sie es mit $ alpha = 10.0 $.
#Parametereinstellungen
alpha = 10.0
#Initialisieren Sie jede Klasse und speichern Sie sie in Modellen
models = {
'ridge': Ridge(alpha=alpha, random_state=0),
'lasso': Lasso(alpha=alpha, random_state=0)}
#Initialisieren Sie die Variable vom Typ dict, in der die richtige Antwortrate gespeichert ist
scores = {}
#Führen Sie jedes Modell nacheinander aus und speichern Sie die richtige Antwortrate
for model_name, model in models.items():
model.fit(X_train, Y_train)
scores[(model_name, 'train')] = model.score(X_train, Y_train)
scores[(model_name, 'test')] = model.score(X_test, Y_test)
print(pd.Series(scores))
- Nachfolgend finden Sie das Ergebnis der schrittweisen Änderung des Regularisierungsparameters $ λ $.
λ |
Ridge(train) |
Ridge(test) |
Lasso(train) |
Lasso(test) |
1 |
0.733355 |
0.737768 |
0.733358 |
0.737084 |
10 |
0.733100 |
0.743506 |
0.733357 |
0.737372 |
100 |
0.721015 |
0.771022 |
0.733289 |
0.740192 |
200 |
0.705228 |
0.778607 |
0.733083 |
0.743195 |
400 |
0.680726 |
0.779004 |
0.732259 |
0.748795 |
500 |
0.671349 |
0.777338 |
0.731640 |
0.751391 |
1000 |
0.640017 |
0.767504 |
0.726479 |
0.762336 |
- In diesem Beispiel kehrt sich die Gratregression in den Trainingsdaten zunächst um, wenn sie nach unten zeigt, und in den Testdaten, und die Tendenz wird bemerkenswerter, wenn $ λ $ zunimmt. Andererseits verhält sich die Lasso-Regression im Allgemeinen langsam, und selbst wenn $ λ $ zunimmt, ist die Ausbeute in den Trainingsdaten gut und die Genauigkeitsrate der Testdaten steigt nach und nach an, wenn $ λ $ zunimmt.
- Der Unterschied besteht einfach darin, ob der Koeffizient quadriert oder der Absolutwert genommen wird, aber die Größe der Strafe ist für die Lasso-Regression abhängig vom Koeffizienten größer, und kurz gesagt, die Art des Einflusses ist unterschiedlich.
- In Bezug auf den Effekt jeder Regularisierung möchte ich einen Schritt weiter gehen, indem ich die Beziehung zum Koeffizienten betrachte.