Fortsetzung vom letzten Mal Kurs für maschinelles Lernen an der Tsukuba University: Lernen Sie sklearn, während Sie das Python-Skript in die Aufgabe aufnehmen (1) https://github.com/legacyworld/sklearn-basic
Dies ist ein Problem beim Erstellen von Trainingsdaten mit einem Fehler von $ N (0,1) \ times0.1 $ auf $ y = \ sin (x) $ und beim Zurückziehen mit einem Polynom. Kommentar ist der 3. (1) pro 56 Minuten und 40 Sekunden
python:Homework_3.1.py
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import copy
from sklearn.preprocessing import PolynomialFeatures as PF
from sklearn import linear_model
from sklearn.metrics import mean_squared_error
#Anzahl der Trainingsdaten
NUM_TR = 6
np.random.seed(0)
rng = np.random.RandomState(0)
#X-Achsdaten zum Zeichnen
x_plot = np.linspace(0,10,100)
#Trainingsdaten
tmp = copy.deepcopy(x_plot)
rng.shuffle(tmp)
x_tr = np.sort(tmp[:NUM_TR])
y_tr = np.sin(x_tr) + 0.1*np.random.randn(NUM_TR)
#In Matrix konvertieren
X_tr = x_tr.reshape(-1,1)
X_plot = x_plot.reshape(-1,1)
#Daten für Polypolyse
#Bestellung bestimmen
degree = 1
pf = PF(degree=degree)
X_poly = pf.fit_transform(X_tr)
X_plot_poly = pf.fit_transform(X_plot)
model = linear_model.LinearRegression()
model.fit(X_poly,y_tr)
fig = plt.figure()
plt.scatter(x_tr,y_tr,label="training Samples")
plt.plot(x_plot,model.predict(X_plot_poly),label=f"degree = {degree}")
plt.legend()
plt.ylim(-2,2)
fig.savefig(f"{degree}.png ")
#Daten für Polypolyse
#Alle Bestellungen
fig = plt.figure()
plt.scatter(x_tr,y_tr,label="Training Samples")
for degree in range(1,NUM_TR):
pf = PF(degree=degree)
X_poly = pf.fit_transform(X_tr)
X_plot_poly = pf.fit_transform(X_plot)
model = linear_model.LinearRegression()
model.fit(X_poly,y_tr)
plt.plot(x_plot,model.predict(X_plot_poly),label=f"degree {degree}")
plt.legend()
mse = mean_squared_error(y_tr,model.predict(X_poly))
print(f"degree = {degree} mse = {mse}")
plt.xlim(0,10)
plt.ylim(-2,2)
fig.savefig('all_degree.png')
Wir haben zwei Daten (x_tr
) zur Berechnung der Regression und eine zum Zeichnen des Graphen ( x_plot
) vorbereitet.
Wenn Sie einfach "x_tr = x_plot" ausführen, werden die tatsächlichen Daten nicht kopiert.
Wenn Sie es so machen, wie es ist, wird die Anzahl der Zeichnungsdaten im Teil von "x_tr = np.sort (tmp [: NUM_TR])" auch "NUM_TR" sein, und die Diagrammzeichnung wird seltsam sein.
Also benutze ich Deepcopy.
Die Originaldaten werden durch Teilen von 0-10 in 100 gleiche Teile erstellt.
Nur NUM_TR
wird zufällig für Trainingsdaten ausgewählt (6 im Kurs)
Als Fehler wird die Zufallszahl zwischen 0-1 multipliziert mit 1/10 zu sin (x_tr) addiert.
Da der Startwert zu Beginn festgelegt ist, wird das gleiche Ergebnis erzielt, unabhängig davon, wie oft er in einer Umgebung ausgeführt wird.
Dies sind die vorbereiteten Daten
Was sich von der Vergangenheit unterscheidet, ist der Teil namens Polynomial Features. Dies ist der Teil, der Trainingsdaten wie $ x, x ^ 2, x ^ 3, x ^ 4 $ für die Reihenfolge des Polypolys vorbereitet. Wenn beispielsweise die Reihenfolge = 3 ist, ist dies der Fall.
degree = 3
pf = PF(degree=degree)
X_poly = pf.fit_transform(X_tr)
print(f"degree = {degree}\nX_Tr = {X_tr}\nX_poly = {X_poly}")
Das Ausführungsergebnis ist
degree = 3
X_Tr = [[0.2020202 ]
[2.62626263]
[5.55555556]
[7.57575758]
[8.68686869]
[9.39393939]]
X_poly = [[1.00000000e+00 2.02020202e-01 4.08121620e-02 8.24488122e-03]
[1.00000000e+00 2.62626263e+00 6.89725538e+00 1.81140040e+01]
[1.00000000e+00 5.55555556e+00 3.08641975e+01 1.71467764e+02]
[1.00000000e+00 7.57575758e+00 5.73921028e+01 4.34788658e+02]
[1.00000000e+00 8.68686869e+00 7.54616876e+01 6.55525771e+02]
[1.00000000e+00 9.39393939e+00 8.82460973e+01 8.28978490e+02]]
In den ersten Daten sind die ursprünglichen Trainingsdaten $ x = 2.020202 \ times10 ^ {-1} $ und $ x ^ 2 = 4.08 \ times10 ^ {-2} $. Der Punkt ist, dass $ x ^ 2 und x ^ 3 $ als unterschiedliche Merkmalsgrößen behandelt werden.
Als nächstes gehen wir in der ersten Reihenfolge zurück (gerade Linie). Das Ergebnis ist dies.
Ändern Sie abschließend die Reihenfolge um 1-5 und zeichnen Sie sie jeweils in die Grafik.
Dies ist der Fehler. Die Zahlen stimmten nicht mit Grad = 5 überein.
degree = 1 mse = 0.33075005001856256
degree = 2 mse = 0.3252271169458752
degree = 3 mse = 0.30290034474812344
degree = 4 mse = 0.010086018410257538
degree = 5 mse = 3.1604543144050787e-22
Recommended Posts