① 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 Fortsetzung
Erkennen Sie die geschriebenen Zahlen anhand des handgeschriebenen Zahlenbildes (8 x 8 Pixel).
from sklearn import datasets
from sklearn import svm
from sklearn import metrics
import matplotlib.pyplot as plt
#Numerische Daten lesen
digits = datasets.load_digits()
Die Ziffern enthalten die folgenden Daten.
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
ist eine Liste von 64x1797, die Werte der Elemente repräsentieren die Farben in der Graustufe und eine 64-Elemente-Liste repräsentiert ein Bild. Für die Bildanzeige enthält "digits.image" ähnliche Informationen, obwohl das Listenformat unterschiedlich ist.
digits.target
zeigt die richtige Antwort (= welche Zahl dargestellt wird) jedes Bildes.
#Unterstützung Vektormaschine
clf = svm.SVC(gamma=0.001, C=100.0) # gamma:Das Ausmaß der Auswirkung einer Trainingsdaten, C:Falsche Erkennungstoleranz
#Training mit Support Vector Machine(60% der Daten werden verwendet, die restlichen 40% dienen der Überprüfung)
clf.fit(digits.data[:int(n*6/10)], digits.target[:int(n*6/10)])
Das letzte Mal habe ich "LinearSVC ()" verwendet, aber dieses Mal verwende ich "SVC ()". Ist es nicht möglich, durch lineare Grenzen zu klassifizieren?
Lassen Sie das oben erstellte clf die restlichen 40% der Daten in digits.data lesen und klassifizieren Sie jede Zahl.
#Richtige Antwort
expected = digits.target[int(-n*4/10):]
#Prognose
predicted = clf.predict(digits.data[int(-n*4/10):])
#Richtige Antwortrate
print(metrics.classification_report(expected, predicted))
#Fehlerkennungsmatrix
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% der Antworten, die als 0 vorhergesagt wurden, sind korrekt, und 99% der richtigen Antworten wurden als 0 vorhergesagt. Referenz zum Lesen der Tabelle:
[[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]]
Von den 0 Bildern werden 69 als 0, 1 als 4 usw. erkannt.
#Entsprechung zwischen Vorhersage und Bild (Teil)
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()
Sie können sehen, dass die Nummern erkannt werden können.
Ich habe versucht, digits.data (Schwarzweiß-Binärbild) zu visualisieren.
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")
Ergebnis
■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■
■ ■ ■
■ ■ ■
■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■
...
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■
■ ■ ■
■ ■ ■ ■
Sie können sehen, dass es irgendwie handgeschrieben ist
Recommended Posts