Kurs für maschinelles Lernen an der Tsukuba University: Lernen Sie sklearn, während Sie das Python-Skript in die Aufgabe aufnehmen (1) Kurs für maschinelles Lernen an der Tsukuba University: Lernen Sie sklearn, während Sie das Python-Skript in die Aufgabe aufnehmen (2) Kurs für maschinelles Lernen an der Tsukuba University: Lernen Sie sklearn, während Sie das Python-Skript in die Aufgabe aufnehmen (3) https://github.com/legacyworld/sklearn-basic
Übrigens ist diesmal Gratrückkehr. Es scheint keine Erklärung für Youtube zu geben, aber einige Ergebnisse liegen im 4. (1) bei 9 Minuten und 45 Sekunden. Der Quellcode ist fast der gleiche wie in Aufgabe 3.2. In dieser Aufgabe ist die Reihenfolge auf 30 festgelegt. Verschieben Sie stattdessen den Regularisierungsparameter mit "[1e-30,1e-20,1e-10,1e-5, 1e-3,1e-2,1e-1, 1,10,100]". Im Quellcode lautet der Regularisierungsparameter "alpha". Weil Pythons "Lambda" reserviert ist.
python:Homework_3.4.py
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures as PF
from sklearn import linear_model
from sklearn.pipeline import Pipeline
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import cross_val_score
DEGREE = 30
def true_f(x):
return np.cos(1.5 * x * np.pi)
np.random.seed(0)
n_samples = 30
#X-Achsdaten zum Zeichnen
x_plot = np.linspace(0,1,100)
#Trainingsdaten
x_tr = np.sort(np.random.rand(n_samples))
y_tr = true_f(x_tr) + np.random.randn(n_samples) * 0.1
#In Matrix konvertieren
X_tr = x_tr.reshape(-1,1)
X_plot = x_plot.reshape(-1,1)
degree = DEGREE
alpha_list = [1e-30,1e-20,1e-10,1e-5, 1e-3,1e-2,1e-1, 1,10,100]
for alpha in alpha_list:
plt.scatter(x_tr,y_tr,label="Training Samples")
plt.plot(x_plot,true_f(x_plot),label="True")
plt.xlim(0,1)
plt.ylim(-2,2)
filename = f"{alpha}.png "
pf = PF(degree=degree,include_bias=False)
linear_reg = linear_model.Ridge(alpha=alpha)
steps = [("Polynomial_Features",pf),("Linear_Regression",linear_reg)]
pipeline = Pipeline(steps=steps)
pipeline.fit(X_tr,y_tr)
plt.plot(x_plot,pipeline.predict(X_plot),label="Model")
y_predict = pipeline.predict(X_tr)
mse = mean_squared_error(y_tr,y_predict)
scores = cross_val_score(pipeline,X_tr,y_tr,scoring="neg_mean_squared_error",cv=10)
plt.title(f"Degree: {degree}, Lambda: {alpha}\nTrainErr: {mse:.2e} TestErr: {-scores.mean():.2e}(+/- {scores.std():.2e})")
plt.legend()
plt.savefig(filename)
plt.clf()
print(f"Regularisierungsparameter= {alpha},Trainingsfehler= {mse},Testfehler= {-scores.mean():.2e}")
Was ändert sich?
linear_reg = linear_model.Ridge(alpha=alpha)
Nur. Wenn ich dieses Programm starte, erhalte ich die folgende Warnung.
/usr/local/lib64/python3.6/site-packages/sklearn/linear_model/_ridge.py:190: UserWarning: Singular matrix in solving dual problem. Using least-squares solution instead.
warnings.warn("Singular matrix in solving dual problem. Using "
Dies scheint anstelle der Kolesky-Demontage herauszukommen, aber ich war mir nicht sicher.
linear_model/ridge.py
try:
# Note: we must use overwrite_a=False in order to be able to
# use the fall-back solution below in case a LinAlgError
# is raised
dual_coef = linalg.solve(K, y, sym_pos=True,overwrite_a=False)
except np.linalg.LinAlgError:
warnings.warn("Singular matrix in solving dual problem. Using "
"least-squares solution instead.")
dual_coef = linalg.lstsq(K, y)[0]
Es scheint, dass die simultanen Gleichungen nicht gelöst werden können, daher wird die Methode der minimalen Quadrate verwendet ... Ich habe den Grund nicht verstanden, warum es nur mit "1e-30,1e-20" herauskam.
Ausführungsergebnis
Regularisierungsparameter= 1e-30,Trainingsfehler= 0.002139325105436034,Testfehler= 5.11e+02
Regularisierungsparameter= 1e-20,Trainingsfehler= 0.004936191193133389,Testfehler= 5.11e+02
Regularisierungsparameter= 1e-10,Trainingsfehler= 0.009762751388489265,Testfehler= 1.44e+02
Regularisierungsparameter= 1e-05,Trainingsfehler= 0.01059565315043209,Testfehler= 2.79e-01
Regularisierungsparameter= 0.001,Trainingsfehler= 0.010856091742299396,Testfehler= 6.89e-02
Regularisierungsparameter= 0.01,Trainingsfehler= 0.012046102850453813,Testfehler= 7.79e-02
Regularisierungsparameter= 0.1,Trainingsfehler= 0.02351033489834412,Testfehler= 4.94e-02
Regularisierungsparameter= 1,Trainingsfehler= 0.11886509938269865,Testfehler= 2.26e-01
Regularisierungsparameter= 10,Trainingsfehler= 0.31077333649742883,Testfehler= 4.71e-01
Regularisierungsparameter= 100,Trainingsfehler= 0.41104732329314453,Testfehler= 5.20e-01
Minimaler Trainingsfehler
Regularisierungsparameter = 1e-30
Minimaler Testfehler
Regularisierungsparameter = 0,1
In der Erklärung ist 0,01 das Beste, aber in diesem Programm hatte 0,1 einen kleineren Testfehler.
Wenn die Regularisierung zu effektiv ist, wird nur der Durchschnitt genommen, und wenn sie nicht effektiv ist, wird sie überlernt. Daher ist selbst bei der Gratregression eine Kreuzverifizierung erforderlich, um die Regularisierungsparameter abzustimmen.
Recommended Posts