dinsdag 2 juni 2015

Alleen nullen, enen en tweeën (1)

Ik wil eens kijken of er met een andere input ook leuke resultaten te behalen zijn. Maar waar haal je een interessante dataset vandaan? De sklearn biedt verschillende oefendatasets. Ik wil echter nog even bij de mnist dataset blijven. (De 60.000 geschreven getallen set). Ik wil alleen de werking wat op zijn kop gooien. Wat als deze nou 2 cijfers tegelijk leest en daar een uitkomst bij bepaald?

Uit de dataset neem ik alleen 0,1 en 2. Ik combineer deze en de uitkomst is bijvoorbeeld hun som. 
Dus de uitdaging is om dit te leren:
  • 00 = 0
  • 01 = 1
  • 02 = 2
  • 10 = 1
  • 11 = 2
  • 12 = 3
  • 20 = 2
  • 21 = 3
  • 22 = 4
Oke, maar hoe selecteer je alleen al deze getallen? In de mnist dataset zijn het gescheiden numpy arrays. (data: trX en targets: trY). De selectie kan alleen op trY. Er moet een makkelijke manier zijn om dat op te lossen. Ik probeer ze eerst samen te voegen met het 'zip' commando. Dan is selectie heel goed mogelijk. Het lukt mij alleen niet om ze weer netjes in een 'data' en 'target' array op te splitsen. Hij blijft fouten geven op de array-vorm. Dezelfde soort fout ontstaat als ik ze beide in een for-loop opnieuw probeer op te bouwen. Met de targets-set zit ik waarschijnlijk goed maar de data-set (trX) is 2 dimensionaal (60.000x784) maar blijkbaar niet meer na deze bewerking. Ergo: nog te weinig verstand van numpy.array bewerkingen. 

Na veel experimenteren vind ik een redelijk elegante oplossing. De 'numpy take functie'. Na eerst een array van alle indexes van trY te bouwen waar een 0, 1 of 2 staat (Even 'index' genoemd - waarom ook niet? :-)  kan ik eenvoudig de volgende selectie maken:

XX = np.take(trX, index, axis=0)    

Wel moet ik hierbij dus voor trX de axis aangeven. 
Even laten leren ... en ... 100% betrouwbaarheid! Als het alleen op deze waarden (0,1 en 2) uitkomt weet het algoritme foutloos te scoren! 

Een andere keer verder om bovenstaande te combineren. Voorlopig ben ik al bij dat dit gelukt is! 

import matplotlib.pyplot as plt
import numpy as np
import time
from sklearn import svm
from load import mnist
trX, teX, trY, teY = mnist(onehot=True)

t0 = time.time()

ga = 0.028          # Hiermee (gamma = 0.028) wordt bij 10.000 oefeningen 97.07% betrouwbaarheid gehaald
size = 10000

clf = svm.SVC(gamma=ga, C=100)

# Eerst nullen, eenen en tweeen voor de oefendataset selecteren.
Y = np.argmax(trY,axis=1)
index=[]
for x in range(0,size):
    if Y[x] in range(0,3):
        index += [x]
#print Y[x]
XX = np.take(trX, index, axis=0)
YY = np.take(Y,index)

# Nu nullen, eenen en tweeen voor de testdataset selecteren.
Y = np.argmax(teY,axis=1)
index=[]
for x in range(0,size):
    if Y[x] in range(0,3):
        index += [x]
#print Y[x]
XXt = np.take(teX, index, axis=0)
YYt = np.take(Y,index)

clf.fit(XX,YY)

print ""
print "reliability: ", np.mean(YY == clf.predict(XX)), time.time() - t0, "seconds, gamma: ", ga, " size :", size
print ""

t = 0
i = 0
while (t < 10 and i < 100):
    if (YYt[i] != clf.predict(XXt[i])):
        t += 1
        print "Prediction:", clf.predict(XX[i]), YY[i], "i = " , i
        im=XX[i]
        im.shape=28,28
        plt.imshow(im, cmap=plt.cm.gray_r, interpolation="nearest")
        plt.show()
    i += 1

Geen opmerkingen:

Een reactie posten