Coursera Machine Learning est devenu la première introduction mondiale à l'apprentissage automatique. Il s'agit de la troisième d'une série d'essais d'implémentation en Python après avoir étudié les tâches de programmation Matlab / Octave.
Cette fois, dans la première moitié de l'ex3, la tâche de reconnaître les nombres manuscrits à l'aide de la régression logistique. L'ensemble de données est un sous-ensemble de MNIST, qui reçoit 5000 images en niveaux de gris 20x20 pixels au format de données Matlab / Octave .mat.
En fait, scikit-learn a une fonction appelée fetch_mldata ()
, qui vous permet également de télécharger des données MNIST (28x28 pixels, 70 000 feuilles) (voir cet article: [Handwritten by MNIST with Multi-layer Perceptron] Reconnaissance des numéros](http://aidiary.hatenablog.com/entry/20140205/1391601418), mais cette fois, j'utiliserai les données .mat ci-dessus à des fins de comparaison.
La seconde moitié de ex3 est un petit contenu à moitié fini dans lequel seule la partie de propagation directe du réseau neuronal est créée, je vais donc l'omettre.
Les données sont également bien formées et leur code est simple car il utilise simplement la classe LogisticRegression
de scicit-learn. Les données au format .mat de Matlab peuvent être lues à l'aide de la fonction scipy.io.loadmat ()
de Scipy.
ex3.py
import numpy as np
import matplotlib.pyplot as plt
import scipy.io as scio
from sklearn import linear_model
# scipy.io.loadmat()Lire les données Matlab en utilisant
data = scio.loadmat('ex3data1.mat')
X = data['X'] #X est une matrice 5000x400
y = data['y'].ravel() #y est une matrice de 5000 x 1, ravel()Convertir en vecteur de 5000 dimensions en utilisant
model = linear_model.LogisticRegression(penalty='l2', C=10.0) #Définition du modèle
model.fit(X,y) #Apprendre avec les données d'entraînement
model.score(X,y) #Taux de réponse correct dans les données d'entraînement
Lors de l'exécution, le taux de réponse correct pour la reconnaissance de caractères dans les données d'apprentissage était affiché sous la forme 0,96499999999999997.
Le paramètre $ \ lambda $, qui indique la force de la régularisation, était $ \ lambda = 0,1 $ dans Coursera. Comme présenté dans l'article précédent, dans la classe sklearn.linear_model.LogisticRegression
, le paramètre de régularisation est spécifié par $ C $ (correspondant à l'inverse de $ \ lambda $), donc cette fois le modèle est défini comme C = 10.0
. Défini.
En conséquence, le taux de réponse correcte dans les données de formation était de 96,5% comme mentionné ci-dessus. Le résultat avec Matlab / Octave était de 94,9%, est-ce donc un peu overfit? Je ne sais pas pourquoi.
C'est trop simple, j'ai donc écrit un code pour afficher les données mal reconnues. Lors de l'entraînement avec le modèle ci-dessus, 175 des 5000 données d'entraînement seront incorrectement déterminées. J'afficherai les étiquettes (comment j'ai fait une erreur) avec les images de 25 éléments sélectionnés au hasard.
ex3-wrong.py
wrong_index = np.array(np.nonzero(np.array([model.predict(X) != y]).ravel())).ravel()
wrong_sample_index = np.random.randint(0,len(wrong_index),25)
fig = plt.figure()
plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.5, hspace=0.5)
for i in range(0,25):
ax = fig.add_subplot(5,5,i+1)
ax.axis('off')
ax.imshow(X[wrong_index[wrong_sample_index[i]]].reshape(20,20).T, cmap = plt.get_cmap('gray'))
ax.set_title(str(model.predict(X[wrong_index[wrong_sample_index[i]]])[0]))
plt.show()
np.array ([model.predict (X)! = Y])
, si vous faites une erreur de reconnaissance, True, et si vous répondez correctement, sortez une matrice (5000x1) contenant False. Mettez-le dans la fonction np.nonzero ()
et vous obtiendrez une matrice avec des index de données True. J'utilise .ravel ()
deux fois parce que je veux enfin le récupérer en tant que vecteur.false_sample_index
est un index créé pour extraire aléatoirement 25 du vecteur (175 dans ce cas) contenant le mauvais index extrait dans la 1ère ligne.set_title
, affichez la (mauvaise) étiquette que le modèle a donnée comme titre de l'image. L'étiquette est obtenue par model.predict (X [false_index [false_sample_index [1]]])
, mais comme elle est retournée comme une matrice 1x1, elle est extraite comme un scalaire avec [0]
.Le résultat est le suivant.
Il y a des erreurs convaincantes, comme confondre 4 pour 9 et vice versa, mais il y en a aussi d'autres qui ne le sont pas. Eh bien, c'est peut-être quelque chose comme ça parce que je viens de faire une régression logistique des données de pixels sans extraire de fonctionnalités. Cela peut être un peu surajustement que cela, il semble donc que Coursera devrait sélectionner le paramètre de régularisation approprié $ C $ en utilisant la validation croisée, etc. qui apparaîtra dans un module ultérieur.
Recommended Posts