Défis de Coursera Machine Learning en Python: ex5 (ajustement des paramètres de régularisation)

Une série qui implémente des tâches de programmation Matlab / Octave dans la classe d'apprentissage automatique de Coursera (professeur Andrew Ng) en Python. Le concept reste le même:

Cette semaine (semaine 6) est intitulée «Conseils pour l'application de l'apprentissage automatique» et au lieu d'apprendre un nouveau modèle d'apprentissage, vous apprendrez à régler les paramètres du modèle et à vérifier les performances du modèle. En consacrant une semaine à ce thème, je pense que la particularité de ce cours ** "pratique plutôt que théoriquement biaisé" ** apparaît.

Voici un aperçu rapide de la façon de régler votre modèle:

Les tâches de programmation suivront également cette procédure.

Tout d'abord, lisez les données

Vous pouvez charger des données au format matlab .mat avec scio.loadmat () de scipy.

import numpy as np
import matplotlib.pyplot as plt
import scipy.io as scio
from sklearn import linear_model, preprocessing

# scipy.io.loadmat()Lire les données Matlab en utilisant
data = scio.loadmat('ex5data1.mat')
X = data['X']
Xval = data['Xval']
Xtest = data['Xtest']
y = data['y']
yval = data['yval']
ytest = data['ytest']

Il semble que ces données utilisent le niveau d'eau de X = barrage pour prédire la quantité d'eau s'écoulant de y = barrage.

Essayez d'abord la régression linéaire

Pour le moment, je vais faire une régression linéaire et la tracer.

model = linear_model.Ridge(alpha=0.0)
model.fit(X,y)

px = np.array(np.linspace(np.min(X),np.max(X),100)).reshape(-1,1)
py = model.predict(px)
plt.plot(px, py)
plt.scatter(X,y)
plt.show()

Vous pouvez utiliser le modèle linear_model.LinearRegression () que vous utilisez toujours, mais j'utilise le modèle Ridge () car j'ajouterai un terme de régularisation plus tard. Dans ce modèle, vous pouvez spécifier la force de la régularisation avec le paramètre ʻalpha, mais si vous définissez ʻalpha = 0.0, il n'y a pas de régularisation, ce qui est identique au modèleLinearRegression ().

Cliquez ici pour les résultats.

スクリーンショット 2015-11-07 09.49.10.png

Comme vous pouvez le voir, les données ne correspondent pas bien aux lignes droites.

Essayez toujours de dessiner une courbe d'apprentissage avec régression linéaire

Tout en sachant qu'une ligne droite ne s'applique pas, essayez de dessiner une courbe d'apprentissage en modifiant le nombre de données d'entraînement. Effectuez une régression linéaire avec 1 à 12 données d'entraînement et tracez les erreurs pour les données d'entraînement et les erreurs pour les données de validation croisée. «Erreur» est l'erreur quadratique qui peut être calculée par la formule suivante. $ \frac{1}{2m} \sum (h_\theta(x^{(i)}) - y^{(i)})^2 $ Cliquez-ici pour le code.

#Essayez de dessiner une courbe d'apprentissage avec régression linéaire
error_train = np.zeros(11)
error_val = np.zeros(11)
model = linear_model.Ridge(alpha=0.0)
for i in range(1,12):
    #Effectuer une régression avec seulement i sous-ensembles de données d'entraînement
    model.fit( X[0:i], y[0:i] )
    #Calculer les erreurs dans i sous-ensembles de ces données d'entraînement
    error_train[i-1] = sum( (y[0:i] - model.predict(X[0:i]))**2 ) / (2*i)
    #Calculer l'erreur dans les données pour le test croisé
    error_val[i-1] = sum( (yval - model.predict(Xval) )**2 ) / (2*yval.size)
    
px = np.arange(1,12)
plt.plot(px, error_train, label="Train")
plt.plot(px, error_val, label="Cross Validation")
plt.xlabel("Number of training examples")
plt.ylabel("Error")
plt.legend()
plt.show()

Le résultat est comme ça. スクリーンショット 2015-11-07 17.56.21.png

Même si les données d'entraînement sont augmentées à 12 (toutes), l'erreur ne diminue pas pour les données de train et les données de validation croisée. Comme ce n'est pas le cas avec le modèle de régression linéaire, l'étape suivante consiste à essayer l'ajustement polymorphe.

Raccord polygonal

L'hypothèse de régression linéaire implémentée ci-dessus est $ h_\theta(x) = \theta_0 + \theta_1x$ Cependant, l'ajustement polynomial ajoute ici le terme d'échelle $ x . $ h_\theta(x) = \theta_0 + \theta_1x + \theta_2x^2 + \theta_3x^3 + ... + \theta_px^p$$ C'est une expression comme. Plus précisément, la valeur numérique du produit du montant de la fonction $ x $ est calculée à l'avance, et elle est utilisée comme un nouveau montant de fonction de $ x_1, x_2, x_3 ... , et ces données sont utilisées. $ h_\theta(x) = \theta_0 + \theta_1x_1 + \theta_2x_2 + \theta_3x_3 + ... + \theta_px_p$$ Apprenez avec le modèle de régression linéaire représenté par.

Dans scikit-learn, il existe une classe appelée sklearn.preprocessing.PolynomialFeatures qui calcule et crée les caractéristiques de ce polynôme, nous allons donc l'utiliser. Cliquez-ici pour le code.

#Calculez le multiplicateur de X et de la nouvelle fonctionnalité X_Que ce soit poly
#X est une matrice m x 1, X_poly est une matrice m x 8
poly = preprocessing.PolynomialFeatures(degree=8, include_bias=False)
X_poly = poly.fit_transform(X)

# X_Régression linéaire utilisant poly
model = linear_model.Ridge(alpha=0.0)
model.fit(X_poly,y)

#terrain
px = np.array(np.linspace(np.min(X)-10,np.max(X)+10,100)).reshape(-1,1)
#Ce modèle est x_Puisque poly est accepté comme entrée, x pour le traçage est également développé sous forme d'échelle.
px_poly = poly.fit_transform(px)
py = model.predict(px_poly)
plt.plot(px, py)
plt.scatter(X, y)
plt.show()

Cliquez ici pour les résultats de l'ajustement.

スクリーンショット 2015-11-07 21.25.37.png

L'ajustement avec un polypole d'ordre 8 s'applique à toutes les données d'entraînement. Cependant, il s'agit d'un surentraînement et peut être un modèle peu prévisible pour les nouvelles données. Cette fois, tout en vérifiant ce modèle avec les données de test croisé, nous ajusterons les paramètres de régularisation en insérant le terme de régularisation.

Réglage des paramètres de régularisation

En incluant le terme de régularisation, la fonction de coût de la régression linéaire $ J = \ frac {1} {2m} \ sum_ {i = 1} ^ m (h_ \ theta (x ^ {(i)}) --y ^ {(i)}) ^ 2 + \ frac {\ Cela ressemble à lambda} {2m} \ sum_ {j = 1} ^ n \ theta_j ^ 2 $. Le deuxième terme est le terme de régularisation, qui peut éviter le surapprentissage en pénalisant les valeurs des paramètres qui s'écartent de 0. Cette forme de régularisation est appelée régularisation L2, régression Ridge, etc.

$ \ Lambda $ dans la molécule du deuxième terme est un paramètre qui ajuste la force de la régularisation. Comme nous l'avons vu ci-dessus, cela correspond au paramètre ʻalpha dans linear_model.Ridge () `. Comme avec Coursera, changez ce paramètre en 0,001, 0,003, 0,01, 0,03, 0,1, 0,3, 1, 3, 10 et tracez la courbe d'apprentissage pour voir quel $ \ lambda $ vous convient.

Cliquez-ici pour le code.

#Calculez le multiplicateur de X et de la nouvelle fonctionnalité X_Que ce soit poly
#X est une matrice m x 1, X_poly est une matrice m x 8
poly = preprocessing.PolynomialFeatures(degree=8, include_bias=False)
X_poly = poly.fit_transform(X) #Données d'entraînement
Xval_poly = poly.fit_transform(Xval) #Données de validation croisée

#Essayez de dessiner une courbe d'apprentissage en modifiant λ
error_train = np.zeros(9)
error_val = np.zeros(9)
lambda_values = np.array([0.001, 0.003, 0.01, 0.03, 0.1, 0.3, 1.0, 3.0, 10.0])
for i in range(0,9):
    # X_Régression linéaire utilisant poly
    model = linear_model.Ridge(alpha=lambda_values[i]/10, normalize=True ) #Changer le paramètre de régularisation alpha
    model.fit(X_poly,y)
    #Calculer les erreurs dans les données d'entraînement (avec terme de régularisation)
    error_train[i] = sum( (y - model.predict(X_poly))**2 ) / (2*y.size) + sum(sum( model.coef_**2 )) * lambda_values[i]/(2*y.size)
    #Calculer l'erreur dans les données pour le test croisé (avec terme de régularisation)
    error_val[i] = sum( (yval - model.predict(Xval_poly) )**2 ) / (2*yval.size) + sum(sum( model.coef_**2 ))* lambda_values[i]/(2*yval.size)

px = lambda_values
plt.plot(px, error_train, label="Train")
plt.plot(px, error_val, label="Cross Validation")
plt.xlabel("Lambda")
plt.ylabel("Error")
plt.legend()
plt.show()

Le tracé ressemble à ceci, et le résultat est que $ \ lambda = 3 $, qui a la plus petite valeur d'erreur dans le test croisé, est bon.

ex5.PNG

en conclusion

sklearn.linear_model.Ridge () a aussi un modèle appelésklearn.linear_model.RidgeCV ()pour le test croisé, et il semble qu'il calculera le nombre optimal de ʻalpha` ensemble une fois entraîné.

Les références

Recommended Posts

Défis de Coursera Machine Learning en Python: ex5 (ajustement des paramètres de régularisation)
Défis d'apprentissage automatique de Coursera en Python: ex2 (retour logistique)
Coursera Machine Learning Challenge en Python: ex1 (régression linéaire)
Coursera Machine Learning Challenge en Python: ex6 (Comment ajuster les paramètres SVM)
Défis d'apprentissage automatique de Coursera en Python: ex7-2 (analyse principale)
Coursera Machine Learning Challenge en Python: ex7-1 (Compression d'image avec clustering K-means)
Touchons une partie de l'apprentissage automatique avec Python
Le résultat de l'apprentissage automatique des ingénieurs Java avec Python www
Échappement automatique des paramètres MySQL en python
Python: prétraitement dans l'apprentissage automatique: présentation
[python] Techniques souvent utilisées dans l'apprentissage automatique
Python: prétraitement en machine learning: acquisition de données
[Python] Enregistrement des résultats d'apprentissage (modèles) dans l'apprentissage automatique
Python: prétraitement dans l'apprentissage automatique: conversion de données
Python: prétraitement en machine learning: gestion des données manquantes / aberrantes / déséquilibrées
Mémo d'étude Python & Machine Learning ⑤: Classification d'Ayame
Mémo d'étude Python & Machine Learning ②: Introduction de la bibliothèque
Divulgation complète des méthodes utilisées dans l'apprentissage automatique
Résumé des fonctions d'évaluation utilisées dans l'apprentissage automatique
Liste des principales distributions de probabilité utilisées en apprentissage automatique et statistiques et code en python
Outil MALSS (application) qui prend en charge l'apprentissage automatique en Python
Comptez le nombre de paramètres dans le modèle d'apprentissage en profondeur
Outil MALSS (basique) qui prend en charge l'apprentissage automatique en Python
À propos des tests dans la mise en œuvre de modèles d'apprentissage automatique
[Apprentissage automatique] "Détection d'anomalies et détection de changement" Dessinons la figure du chapitre 1 en Python.
Résumé du flux de base de l'apprentissage automatique avec Python
Tentative d'inclusion du modèle d'apprentissage automatique dans le package python
Entropie croisée à revoir dans les devoirs de la semaine 2 de Coursera Machine Learning
MALSS (introduction), un outil qui prend en charge l'apprentissage automatique en Python
Enquête sur l'utilisation du machine learning dans les services réels
Un résumé de l'apprentissage automatique Python pour débutant est très concis.
Apprentissage automatique dans Delemas (s'entraîner)
Bases de l'apprentissage automatique (mémoire)
Apprentissage automatique avec Python! Préparation
Jugement d'équivalence d'objet en Python
Programmation Python Machine Learning> Mots-clés
Utilisé en EDA pour l'apprentissage automatique
Importance des ensembles de données d'apprentissage automatique
Commencer avec l'apprentissage automatique Python
Implémentation du tri rapide en Python
[Apprentissage automatique Python] Recommandation d'utilisation de Spyder pour les débutants (à partir d'août 2020)
Que diriez-vous d'Anaconda pour créer un environnement d'apprentissage automatique avec Python?
Introduction aux bases de Python de l'apprentissage automatique (apprentissage non supervisé / analyse principale)
Mémorandum of scraping & machine learning [technique de développement] par Python (chapitre 4)
Mémorandum of scraping & machine learning [technique de développement] par Python (chapitre 5)
Notez que je comprends l'algorithme du classificateur Naive Bayes. Et je l'ai écrit en Python.
Devenez bientôt un ingénieur IA! Apprenez complètement Python / AI / Machine learning / Deep learning / Analyse statistique en quelques jours!
Mettre en œuvre l'apprentissage de l'empilement en Python [Kaggle]
Manipulation des pixels d'image en Python
Importance de l'apprentissage automatique et de l'apprentissage par mini-lots
Python: Application de l'apprentissage supervisé (retour)
Apprentissage automatique par python (1) Classification générale
Diviser timedelta dans la série Python 2.7
Résumé de l'apprentissage automatique par les débutants de Python
Automatisez les tâches de routine dans l'apprentissage automatique
Gestion des fichiers JSON en Python
Implémentation du jeu de vie en Python
Règles d'apprentissage Widrow-Hoff implémentées en Python
Affichage de la forme d'onde audio en Python
Apprentissage automatique ③ Résumé de l'arbre de décision
Classification et régression dans l'apprentissage automatique