Cours d'apprentissage automatique à l'Université de Tsukuba: étudier sklearn tout en intégrant le script Python au devoir (1) Cours d'apprentissage automatique à l'Université de Tsukuba: étudier sklearn tout en intégrant le script Python au devoir (2) https://github.com/legacyworld/sklearn-basic
Le commentaire Youtube est 4 (1) toutes les 40 minutes Créez 30 données d'entraînement avec une erreur de $ N (0,1) \ times0.1 $ sur $ y = \ cos (1.5 \ pi x) $ et effectuez une régression polypoly. La vérification du croisement entre ici. Il revient dans l'ordre du 1er au 20ème ordre. Ce sont les données d'entraînement.
Code source
python:Homework_3.2.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 = 20
def true_f(x):
return np.cos(1.5 * x * np.pi)
np.random.seed(0)
n_samples = 30
#Données de l'axe X pour le dessin
x_plot = np.linspace(0,1,100)
#Données d'entraînement
x_tr = np.sort(np.random.rand(n_samples))
y_tr = true_f(x_tr) + np.random.randn(n_samples) * 0.1
#Convertir en matrice
X_tr = x_tr.reshape(-1,1)
X_plot = x_plot.reshape(-1,1)
for degree in range(1,DEGREE+1):
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"{degree}.png "
pf = PF(degree=degree,include_bias=False)
linear_reg = linear_model.LinearRegression()
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} TrainErr: {mse:.2e} TestErr: {-scores.mean():.2e}(+/- {scores.std():.2e})")
plt.legend()
plt.savefig(filename)
plt.clf()
Dans le précédent numéro 3.1, j'ai préparé $ x, x ^ 2, x ^ 3 $, etc. dans Polynomial Features, puis j'ai effectué une régression linéaire, mais j'ai appris que cela pouvait être fait en une seule fois en utilisant un pipeline.
Quand j'ai vu le code source dans la vidéo d'explication du problème 3.1, j'utilisais pipeline.
Il n'y a rien de difficile, listez simplement le contenu du traitement avec des étapes
.
steps = [("Polynomial_Features",pf),("Linear_Regression",linear_reg)]
pipeline = Pipeline(steps=steps)
pipeline.fit(X_tr,y_tr)
À part cette partie, la différence avec la tâche 3.1 est que la vérification croisée est incluse. Cette partie du programme.
scores = cross_val_score(pipeline,X_tr,y_tr,scoring="neg_mean_squared_error",cv=10)
Après avoir divisé les données en 10 avec «cv = 10», une partie est utilisée comme données de test pour évaluer l'erreur de test. En gros, celui avec une petite erreur de test est excellent. Lorsque le programme est exécuté, 20 fichiers graphiques jusqu'à 1.png-20.png sont créés.
À partir de là, nous pouvons voir à quel point le surapprentissage est mauvais.
Recommended Posts