Vous êtes sur la page 1sur 6

Universidad Nacional de Colombia Facultad de Ingeniera Departamento de Ingeniera de Sistemas e Industrial Maestra en Ingeniera - Ingeniera de Sistemas y Computacin Aprendizaje

de mquina
Bogot, agosto de 2013

Assignment 1: Linear Algebra and Probability

Javier Guaje , Alejandro Gallego

1. Tutorial Kaggle

Este tutorial presenta una breve introduccin a las librerias de procesamiento cientco y estadstico de Python. Adicionalmente presenta el modo de uso de la plataforma de competencias. Finalmente explica con el ejemplo seleccionado en la seccin anterior el modelo de evaluacin y Cross-Validation. Dentro de las librerias utilizadas se encuentra numpy, la cual permite trabajar con arreglos numricos de manera similar a como se hace en Matlab u Octave. Tambin encontramos scipy, que contiene funciones de gran interes para cientcos, matematicos o ingenieros. Finalmente la ltima libreria empleada en este tutorial es scikit-learn, la cual es una libreria para machine learning. Para ilustrar el funcionamiento de la plataforma de competencias se ha hecho mediante una competencia propuesta por el laboratorio "Boehringer Ingelheim". La competencia consiste en asociar las diferentes caracteristicas de un grupo de moleculas a una respuesta biolgica determinada. Para realizar esta clasicacin se ha usado el siguiente codigo modicado del expuesto en el tutorial, siguiendo los lineamientos de presentacin de la competencia.
from sklearn.ensemble import RandomForestClassifier from numpy import genfromtxt, savetxt def main(): # create the training and test sets, skipping the header row [1:] dataset = genfromtxt(open('Data/train.csv', mode = 'r'), delimiter = ',', dtype = 'f8')[1:] target = [x[0] for x in dataset] train = [x[1:] for x in dataset] test = genfromtxt(open('Data/test.csv', mode = 'r'), delimiter = ',', dtype = 'f8')[1:] # create and train the random forest # multicore CPUs can use: rf = RandomForestClassifier(n_estimators = 100, n_jobs = -1) rf.fit(train, target) predicted_probs = rf.predict_proba(test) file_items = [str(x + 1) + ',' + str(predicted_probs[x][1]) for x in range(len(predicted_probs))] file_items.insert(0, 'MoleculeId,PredictedProbability')
a Cdigo: 257766. E-mail: jrguajeg@unal.edu.co b Cdigo: 201213. E-mail: jagallegom@unal.edu.co

Assignment 1: Linear Algebra and Probability

savetxt('Data/submission.csv', file_items, delimiter = ',', fmt = '%s') if __name__ == "__main__": main()

Este cdigo toma los datos de entrenamiento y de prueba. Y los pasa a un random forest para su correspondiente clasicacin. Finalmente se realiza la evaluacin de nuestra solucin propuesta en el paso anterior, mediante una funcin de Cross-Validation. La cual se presenta en la siguiente porcin de cdigo.
from sklearn.ensemble import RandomForestClassifier from sklearn import cross_validation import logloss import numpy as np def main(): # read in data, parse into training and target sets dataset = np.genfromtxt(open('Data/train.csv', mode = 'r'), delimiter = ',', dtype = 'f8')[1:] target = np.array([x[0] for x in dataset]) train = np.array([x[1:] for x in dataset]) # In this case we'll use a random forest, but this could be any classifier cfr = RandomForestClassifier(n_estimators = 100, n_jobs = -1) # Simple K-Fold cross validation. 5 folds. cv = cross_validation.KFold(len(train), n_folds = 5, indices = False) results = [] for traincv, testcv in cv: probas = cfr.fit(train[traincv], target[traincv]).predict_proba(train[testcv]) results.append(logloss.llfunc(target[testcv], [x[1] for x in probas])) print "Results: " + str(np.array(results).mean()) if __name__ == "__main__": main()
2. Solucin

Sea D = {d1 , , dn } un conjunto de documentos y T = {t1 , , tm } un conjunto de trminos (palabras). Sea T D = (T Di,j )i=1m,j =1n una matriz tal que T Di,j corresponde al nmero de veces que el trmino ti aparece en el documento dj . Tambin, sea li el largo o nmero de caracteres del trmino ti , y sea L = {l1 , , lm } un vector columna. Finalmente, asuma un proceso donde un documento dj es elegido aleatoriamente con probabilidad uniforme y un trmino ti , presente en el documento dj , es elegido aleatoriamente con una probabilidad proporcional a la frecuencia de ti en dj .

Aprendizaje de mquina (2013)

Assignment 1: Linear Algebra and Probability

Evalue las siguientes expresiones, asumiendo:


2 0 5 TD = 3 0 6 3 5 0 1 0 9 0 5 7 0 7 4 3 0 3 9 1 6 5 7 2 3 3 3 L = 6 9 4 3 3 0

Haciendo uso de numpy denimos TD y L como sigue:


>>> import numpy as np >>> TD = np.array([[2.0, 3.0, 0.0, 3.0, 7.0], [0.0, 5.0, 5.0, 0.0, 3.0], [5.0, 0.0, 7.0, 3.0, 3.0], [3.0, 1.0, 0.0, 9.0, 9.0], [0.0, 0.0, 7.0, 1.0, 3.0], [6.0, 9.0, 4.0, 6.0, 0.0]]) >>> L = np.array([5.0, 2.0, 3.0, 6.0, 4.0, 3.0])
2.1. Punto a

Matriz P (T, D) (cada posicin de la matriz P (T, D)i,j , corresponde a la probabilidad conjunta del trmino ti y el documento dj , P (ti , dj ))
T D1,1
ST otal T D2,1 ST otal T D3,1 ST otal T D1,2 ST otal T D2,2 ST otal T D3,2 ST otal T D1,3 ST otal T D2,3 ST otal T D3,3 ST otal

P (T, D) =

T Dm,1 ST otal

. . .

T Dm,2 ST otal

. . .

T Dm,3 ST otal

. . .

..

T D1,n ST otal T D2,n ST otal T D3,n ST otal T Dm,n ST otal

. . .

Donde ST otal =

m i=1

n j =1

T Di,j

Para nuestro ejemplo


2 ST otal 0 ST otal 5 ST otal 3 ST otal 0 ST otal 6 ST otal

P (T, D) =

3 ST otal 5 ST otal 0 ST otal 1 ST otal 0 ST otal 9 ST otal

0 ST otal 5 ST otal 7 ST otal 0 ST otal 7 ST otal 4 ST otal

3 ST otal 0 ST otal 3 ST otal 9 ST otal 1 ST otal 6 ST otal

7 ST otal 3 ST otal 3 ST otal 9 ST otal 3 ST otal 0 ST otal

Donde ST otal =

m i=1

n j =1

T Di,j = 104

Expresion en python, con ayuda de numpy.


>>> PTD = np.array([x/np.sum(TD) for x in TD]) >>> PTD array([[ 0.01923077, 0.02884615, 0.

0.02884615,

0.06730769],
Aprendizaje de mquina (2013)

Assignment 1: Linear Algebra and Probability

[ [ [ [ [

0. , 0.04807692, 0.04807692, 0. , 0.02884615], 0.04807692, 0. , 0.06730769, 0.02884615, 0.02884615], 0.02884615, 0.00961538, 0. , 0.08653846, 0.08653846], 0. , 0. , 0.06730769, 0.00961538, 0.02884615], 0.05769231, 0.08653846, 0.03846154, 0.05769231, 0. ]])

2.2. Punto b

Matriz P (T |D) Para hallar la matriz se pueden calcular los vectores P (T |D = dj ), que representan los vectores de probabilidades de los trminos.
T D1,j N umT erminosT otal T D2,j N umT erminosT otal T D3,j N umT erminosT otal P ( T |D = dj ) =
T Dm,j N umT erminosT otal

. . .

Donde, N umT erminosT otal =

m i=1

T Di,j j

Expresin en python, con ayuda de numpy para calcular toda la matriz de P (T |D):
>>> ProbTdadoD = np.transpose(np.array([[x/np.sum(TD, axis=0)[d] for x in TD[:,d]] for d in range(TD.shape[1])])) >>> ProbTdadoD array([[ 0.125 , 0.16666667, 0. , 0.13636364, 0.28 ], [ 0. , 0.27777778, 0.2173913 , 0. , 0.12 ], [ 0.3125 , 0. , 0.30434783, 0.13636364, 0.12 ], [ 0.1875 , 0.05555556, 0. , 0.40909091, 0.36 ], [ 0. , 0. , 0.30434783, 0.04545455, 0.12 ], [ 0.375 , 0.5 , 0.17391304, 0.27272727, 0. ]])
2.3. Punto c

Matriz P (D|T ) Para calcular la matriz podemos calcular los vectores P (D|T = ti ), por Teorema de Bayes:
P (D = dj |T = ti ) =
n k=1

P (T = ti |D = dj ) P (D = dj ) P (T = ti |D = dk ) P (D = dk )

(1)

Ya que para este ejemplo particular los elementos son elegidos a partir de una distribucin uniforme, 1 tenemos que P (D = dj ) = n j . Por lo que 1 se reduce a:
P ( D = dj |T = ti ) =
n k=1

P (T = ti |D = dj ) P (T = ti |D = dk )

De esta manera tenemos el vector


P (D|T = ti ) =
P (T =ti |D =d1 ) SumP (T =ti |D )) P (T =ti |D =d2 ) SumP (T =ti |D )

P (T =ti |D =dn ) SumP (T =ti |D )

Aprendizaje de mquina (2013)

Assignment 1: Linear Algebra and Probability

Donde SumP (T = ti |D) =

n k=1

P (T = ti |D = dk )

Para calcular la matriz P (D|T ) usamos numpy como sigue:


>>> ProbDdadoT = np.array([[x/np.sum(ProbTdadoD, axis=1)[t] for t in range(TD.shape[0])]) >>> ProbDdadoT array([[ 0.17654612, 0.23539482, 0. , 0.19259576, [ 0. , 0.45154704, 0.35338464, 0. , [ 0.35787437, 0. , 0.34853851, 0.15616336, [ 0.18524987, 0.05488885, 0. , 0.40418153, [ 0. , 0. , 0.64782097, 0.09675248, [ 0.28373832, 0.37831776, 0.13158879, 0.20635514,
2.4. Punto d

for x in ProbTdadoD[t,:]] 0.3954633 ], 0.19506832], 0.13742376], 0.35567975], 0.25542655], 0. ]])

Vector P (D) Dado que se elige un documento segn una distribucin uniforme se obtiene:
P (D) =
1 5 1 5 1 5 1 5 1 5

En numpy denimos el vector P (D):


>>> ProbD = np.array([1.0/5.0 for i in range(5)])
2.5. Punto e

Vector P (T ) Por el Teorema de Probabilidad Total, se obtiene que:


n

P (T = ti ) =
k=1

P (T = ti |D = dk )P (D = dk ) P (T P (T P (T P (T P (T P (T = t1 |D = t2 |D = t3 |D = t4 |D = t5 |D = t6 |D = dk )P (D = dk )P (D = dk )P (D = dk )P (D = dk )P (D = dk )P (D = dk ) = dk ) = dk ) = dk ) = dk ) = dk )

(2)

P (T ) =

n k=1 n k=1 n k=1 n k=1 n k=1 n k=1

Con ayuda de numpy podemos calcular este como:


>>> ProbT = np.array([np.sum(ProbTdadoD, axis=1)[t]*1.0/5.0 for t in range(ProbTdadoD.shape[0])]) >>> ProbT array([ 0.14160606, 0.12303382, 0.17464229, 0.20242929, 0.09396047, 0.26432806])

Aprendizaje de mquina (2013)

Assignment 1: Linear Algebra and Probability


2.6. Punto f

E [L] (el valor esperado de una variable aleatoria l correspondiente a la longitud de un termino aleatoriamente elegido)
m

E [L] =
i=1

liP (L = li )

Gracias a 2 podemos calcular P (L = li ) y posteriormente P (T = tj )


m m

E [L] =
i=1 m

li
j =1 m

P (L = li |T = tj )P (T = tj )
n

=
i=1

li
j =1

P (L = li |T = tj )
k=1

P (T = tj |D = dk )P (D = dk )

Donde P (L = li |T = tj ) = 1 para i = j . Usando numpy tenemos:


>>> ExpectedL = np.dot(L, ProbT) >>> ExpectedL 3.8614266578831797
2.7. Punto g

Para hallar V (L) se debe hallar primero E [L] tal como se hizo en el numeral anterior, luego se puede calcular la varianza de la siguiente manera V (L) = E [(l E [l])2 ]. Dado esto se puede ver que:
m

E [(L E [L])2 ] =
i=1 m

(li E [L])2 P (L = li )
m n

=
i=1

(li E [L])2
j =1

P (L = li |T = tj )
k=1

P (T = tj |D = dk )P (D = dk )

Donde P (L = li |T = tj ) = 1 para i = j . Usando numpy tenemos:


>>> SquareExpectedL = (L - ExpectedL) ** 2 >>> VarianceL = np.dot(SquareExpectedL, ProbT) >>> VarianceL 1.8632262826095154

Aprendizaje de mquina (2013)