Continuation depuis la dernière fois Cours d'apprentissage automatique à l'Université de Tsukuba: étudier sklearn tout en intégrant le script Python au devoir (1) https://github.com/legacyworld/sklearn-basic
Il s'agit d'un problème de création de données d'apprentissage avec une erreur de $ N (0,1) \ times0.1 $ sur $ y = \ sin (x) $ et de les retirer avec un polynôme. Le commentaire est le 3e (1) toutes les 56 minutes et 40 secondes
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
#Nombre de données d'entraînement
NUM_TR = 6
np.random.seed(0)
rng = np.random.RandomState(0)
#Données de l'axe X pour le dessin
x_plot = np.linspace(0,10,100)
#Données d'entraînement
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)
#Convertir en matrice
X_tr = x_tr.reshape(-1,1)
X_plot = x_plot.reshape(-1,1)
#Données pour le polypoly
#Déterminer la commande
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 ")
#Données pour le polypoly
#Tous les ordres
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')
Nous avons préparé deux données (x_tr
) pour calculer la régression et une pour dessiner le graphique ( x_plot
).
Si vous faites simplement x_tr = x_plot
, les données réelles ne seront pas copiées.
Si vous le faites tel quel, le nombre de données de dessin sera également NUM_TR
dans la partie de x_tr = np.sort (tmp [: NUM_TR])
, et le dessin du graphe sera étrange.
J'utilise donc deepcopy.
Les données originales sont préparées en divisant 0-10 en 100 parties égales.
Seul NUM_TR
est sélectionné au hasard pour les données d'entraînement (6 dans le cours)
Par erreur, le nombre aléatoire généré entre 0-1 multiplié par 1/10 est ajouté à sin (x_tr).
Puisque la graine est fixée au début, le même résultat est obtenu quel que soit le nombre de fois qu'il est exécuté dans n'importe quel environnement.
Ce sont les données préparées
Ce qui est différent du passé, c'est la partie appelée Caractéristiques polynomiales. C'est la partie qui prépare les données d'entraînement telles que $ x, x ^ 2, x ^ 3, x ^ 4 $ pour l'ordre du polypole. Par exemple, si la commande = 3, c'est le cas.
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}")
Le résultat de l'exécution est
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]]
Dans les premières données, les données d'entraînement d'origine sont $ x = 2.020202 \ times10 ^ {-1} $ et $ x ^ 2 = 4.08 \ times10 ^ {-2} $. Le fait est que $ x ^ 2 et x ^ 3 $ sont traités comme des quantités d'entités différentes.
Ensuite, revenons dans le premier ordre (ligne droite). Le résultat est le suivant.
Enfin, changez l'ordre de 1 à 5 et dessinez chacun sur le graphique.
Telle est l'erreur. Les nombres ne correspondaient pas par degré = 5.
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