Bonjour. Je voudrais garder le contenu appris dans la classe universitaire à qiita comme mémorandum. J'ai posté l'exemple de code sur github, donc je ne suis pas sûr qu'il sera utile, mais si vous êtes intéressé, jetez un œil. https://github.com/tkshim/MNIST/blob/master/BayesMNIST.py
Contenu: -PCA (analyse des composants principaux) est utilisé pour réduire les dimensions du vecteur de caractéristiques, et un simple classificateur bayésien est utilisé pour reconnaître les images numériques.
Objectif: -Partagez des exemples de code (Python) en utilisant l'apprentissage automatique.
Public cible: ・ Je comprends la théorie de base de l'apprentissage automatique, mais j'aimerais voir un exemple de la façon dont d'autres personnes l'implémentent dans le code.
Environnement: · Macbook Air ・ OSX 10.11.6 · Python 3.x ・ Numpy ・ Pandas ・ Sklearn
Résumé: ・ J'ai utilisé le NB gaussien intégré de sklearn, mais j'ai pu obtenir une précision dans la seconde moitié de 80%.
■step1 L'ensemble de données à analyser est téléchargé à partir de la page d'accueil du professeur Lucan de l'Université de New York. http://yann.lecun.com/exdb/mnist/index.html Définissez les variables de stockage de données en fonction de votre environnement.
DATA_PATH = '/Users/takeshi/MNIST_data'
TRAIN_IMG_NAME = 'train-images.idx3-ubyte'
TRAIN_LBL_NAME = 'train-labels.idx1-ubyte'
TEST_IMG_NAME = 't10k-images.idx'
TEST_LBL_NAME = 't10k-labels.idx'
■step2, step3 Lisez les ensembles de données d'entraînement et de test sous la forme d'un tableau de numpy. Vous pouvez utiliser imshow pour voir quel nombre chaque donnée représente, comme indiqué ci-dessous.
print("The shape of matrix is : ", Xtr.shape)
print("Label is : ", Ttr.shape)
plt.imshow(Xte[0].reshape(28, 28),interpolation='None', cmap=cm.gray)
show()
■step4 C'est le cœur de PCA. Les données d'image sont représentées par 28x28 = 784 données, et les vecteurs propres de ces 784 vecteurs de caractéristiques sont calculés inversement en utilisant la fonction huit.
X = np.vstack((Xtr,Xte))
T = np.vstack((Ttr,Tte))
print (X.shape)
print (T.shape)
import numpy as np;
import numpy.linalg as LA;
μ=np.mean(X,axis=0);#print(μ);
Z=X-μ;#print(Z);
C=np.cov(Z,rowvar=False);#print(C);
[λ,V]=LA.eigh(C);#print(λ,'\n\n',V);
row=V[0,:];col=V[:,0];
np.dot(C,row)/(λ[0]*row) ;
np.dot(C,col)/(λ[0]*col);
λ=np.flipud(λ);V=np.flipud(V.T);
row=V[0,:];
np.dot(C,row)/(λ[0]*row);
P=np.dot(Z,V.T);#print(P);
■step5 Il y a 784 vecteurs propres = composantes principales, mais au lieu d'utiliser tous, par exemple, en n'utilisant que deux (= réduction de dimension) et en appliquant ces deux vecteurs propres à GaussianNB, le modèle de reconnaissance est complété en premier.
from sklearn.naive_bayes import GaussianNB
model = GaussianNB()
# Apply traing dataset to this model
# A: the number of training set
# B: the number of dimension
A = 60000
B = 2
model.fit(P[0:A,0:B],T[0:A])
■step6 S'il y a deux vecteurs propres, la précision des données de test sera de 44,7%, ce qui est un très mauvais nombre. ..
from sklearn import metrics
predicted = model.predict(P[A:70001,0:B])
expected = T[A:70001,]
print ('The accuracy is : ', metrics.accuracy_score(expected, predicted)*100, '%')
■step7 Ici, le rapport de classification et la matrice de confusion sont affichés afin que vous puissiez vérifier l'état de reconnaissance de chaque numéro.
import matplotlib.pyplot as plt
import seaborn as sns
print (' === Classification Report ===')
print (metrics.classification_report(expected, predicted))
cm = metrics.confusion_matrix(expected, predicted)
plt.figure(figsize=(9, 6))
sns.heatmap(cm, linewidths=.9,annot=True,fmt='g')
plt.suptitle('MNIST Confusion Matrix (GaussianNativeBayesian)')
plt.show()
Lorsque le vecteur propre est 2, vous pouvez voir que le nombre "1" n'est pas mauvais à 83%, alors que "2" et "5" sont à peine reconnus correctement.
Pourquoi? C'est-à-dire que s'il n'y a que deux vecteurs propres, certains nombres se chevaucheront et il peut être difficile de déterminer quel nombre.
Jetons un coup d'œil à un exemple facile à comprendre. Dans la matrice ci-dessus, le nombre 4 est reconnu comme le nombre 1 0 fois, mais le nombre 9 est reconnu par erreur comme le nombre 9 374 fois. Ci-dessous, un graphique en trois dimensions des vecteurs propres des nombres 1 et 4. Si c'est 1 et 4, vous pouvez voir que les ensembles de vecteurs propres sont nettement séparés. Mais qu'en est-il de 4 et 9? Il est presque usé et superposé.
■ Numéros 1 et 4 ■ Numéros 4 et 9
Par conséquent, si vous augmentez progressivement le vecteur propre utilisé, la précision s'améliorera également. Dans cet environnement, régler le vecteur propre à environ 70 semble maximiser la précision (fin 80%).
from sklearn.naive_bayes import GaussianNB
model = GaussianNB()
# Apply traing dataset to this model
# A: the number of training set
# B: the number of dimension
A = 60000
B = 70 # <-Augmente graduellement.
model.fit(P[0:A,0:B],T[0:A])
■ Comparaison entre les vecteurs propres 2 et 70 Voici la différence lorsque le nombre 0 est reproduit avec les vecteurs propres 2 et 70. Après tout, si vous l'augmentez à 70, vous pouvez voir que le contour devient beaucoup plus clair.
Xrec2=(np.dot(P[:,0:2],V[0:2,:]))+μ; #Reconstruction using 2 components
Xrec3=(np.dot(P[:,0:70],V[0:70,:]))+μ; #Reconstruction using 3 components
plt.imshow(Xrec2[1].reshape(28, 28),interpolation='None', cmap=cm.gray);
show()
plt.imshow(Xrec3[1].reshape(28, 28),interpolation='None', cmap=cm.gray);
show()
■ Résumé ・ La méthode d'apprentissage automatique a pu atteindre une précision dans la seconde moitié de 80%. ・ Cette fois, j'utilise le simple classificateur Bayes de sklearn, mais la prochaine fois, j'aimerais implémenter ce classificateur à partir de zéro en Python et viser la plage de 90%.
Recommended Posts