① https://qiita.com/yohiro/items/04984927d0b455700cd1 ② https://qiita.com/yohiro/items/5aab5d28aef57ccbb19c ③ https://qiita.com/yohiro/items/cc9bc2631c0306f813b5 ④ https://qiita.com/yohiro/items/d376f44fe66831599d0b ⑤ https://qiita.com/yohiro/items/3abaf7b610fbcaa01b9c A continué
Reconnaissez les nombres écrits à partir de l'image des nombres manuscrits (8 x 8 px).
from sklearn import datasets
from sklearn import svm
from sklearn import metrics
import matplotlib.pyplot as plt
#Lecture de données numériques
digits = datasets.load_digits()
Les chiffres contiennent les données suivantes.
digits.data
[[ 0. 0. 5. ... 0. 0. 0.]
[ 0. 0. 0. ... 10. 0. 0.]
[ 0. 0. 0. ... 16. 9. 0.]
...
[ 0. 0. 1. ... 6. 0. 0.]
[ 0. 0. 2. ... 12. 0. 0.]
[ 0. 0. 10. ... 12. 1. 0.]]
digits.target
[0 1 2 ... 8 9 8]
digits.data
est une liste de 64x1797, les valeurs des éléments représentent les couleurs dans l'échelle de gris et une liste de 64 éléments représente une image. Pour l'affichage de l'image, «digits.image» contient également des informations similaires bien que le format de la liste soit différent.
digits.target
montre la bonne réponse (= quel numéro est représenté) de chaque image.
#Machine de vecteur de soutien
clf = svm.SVC(gamma=0.001, C=100.0) # gamma:L'ampleur de l'impact d'une donnée d'entraînement, C:Tolérance de fausse reconnaissance
#Formation avec machine à vecteur de support(60% des données sont utilisées, les 40% restants sont destinés à la vérification)
clf.fit(digits.data[:int(n*6/10)], digits.target[:int(n*6/10)])
La dernière fois que je l'ai utilisé, c'était LinearSVC ()
, mais cette fois j'utilise SVC ()
.
N'est-il pas possible de classer par frontières linéaires?
Demandez au clf créé ci-dessus de lire les 40% restants des données en chiffres et de classer chaque nombre.
#Bonne réponse
expected = digits.target[int(-n*4/10):]
#Prévoir
predicted = clf.predict(digits.data[int(-n*4/10):])
#Taux de réponse correct
print(metrics.classification_report(expected, predicted))
#Matrice de méconnaissance
print(metrics.confusion_matrix(expected, predicted))
precision recall f1-score support
0 0.99 0.99 0.99 70
1 0.99 0.96 0.97 73
2 0.99 0.97 0.98 71
3 0.97 0.86 0.91 74
4 0.99 0.96 0.97 74
5 0.95 0.99 0.97 71
6 0.99 0.99 0.99 74
7 0.96 1.00 0.98 72
8 0.92 1.00 0.96 68
9 0.96 0.97 0.97 71
accuracy 0.97 718
macro avg 0.97 0.97 0.97 718
weighted avg 0.97 0.97 0.97 718
99% des réponses prédites à 0 sont correctes et 99% des réponses correctes prédites à 0. Référence de lecture du tableau:
[[69 0 0 0 1 0 0 0 0 0]
[ 0 70 1 0 0 0 0 0 2 0]
[ 1 0 69 1 0 0 0 0 0 0]
[ 0 0 0 64 0 3 0 3 4 0]
[ 0 0 0 0 71 0 0 0 0 3]
[ 0 0 0 0 0 70 1 0 0 0]
[ 0 1 0 0 0 0 73 0 0 0]
[ 0 0 0 0 0 0 0 72 0 0]
[ 0 0 0 0 0 0 0 0 68 0]
[ 0 0 0 1 0 1 0 0 0 69]]
Sur les 0 images, 69 sont reconnues comme 0, 1 est reconnue comme 4, et ainsi de suite.
#Correspondance entre prédiction et image (partie)
images = digits.images[int(-n*4/10):]
for i in range(12):
plt.subplot(3, 4, i + 1)
plt.axis("off")
plt.imshow(images[i], cmap=plt.cm.gray_r, interpolation="nearest")
plt.title("Guess: " + str(predicted[i]))
plt.show()
Vous pouvez voir que les nombres peuvent être reconnus.
J'ai essayé de visualiser digits.data (image binaire en noir et blanc)
for i in range(10):
my_s = ""
for k, j in enumerate(digits.data[i]):
if (j > 0):
my_s += " ■ "
else:
my_s += " "
if k % 8 == 7:
print(my_s)
my_s = ""
print("\n")
résultat
■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■
■ ■ ■
■ ■ ■
■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■
...
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■
■ ■ ■
■ ■ ■ ■
Vous pouvez voir que c'est en quelque sorte manuscrit
Recommended Posts