Precisión del Modelo - Gráficas, estadística y minería de datos con

Anuncio
Precisión del Modelo
Gráficas, estadı́stica y minerı́a de datos con python
Miguel Cárdenas Montes
Centro de Investigaciones Energéticas Medioambientales y Tecnológicas,
Madrid, Spain
[email protected]
6-10 de Octubre de 2014
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
1 / 63
Tabla de Contenidos
1
Objetivos
2
Introducción
3
Precisión en Clasificadores
4
Precisión en Regresión
5
Holdout Method
6
Cross-validation
7
Bootstrap
8
Bagging
9
ROC
10
No Free Lunch Theorem
11
Sobreajuste
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
2 / 63
Objetivos
Conocer las herramientas para medir la calidad de los modelos en
aprendizaje supervisado.
Aspectos Técnicos
scikit-learn API
Matriz de Confusión.
Método de Retención
Validación Cruzada
Bootstrap
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
3 / 63
Introducción
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
4 / 63
Introducción
Las técnicas de validación tienen dos motivaciones fundamentales:
Casi todas las técnicas tienen parámetros libres, por ejemplo el número
de vecinos en KNN, lo cuales se desean ajustar de forma que
maximicen la precisión.
Se desea conocer la precisión del modelo de cara a la clasificación de
datos en el futuro. Además, cuando se dispone de un conjunto de
datos y varios métodos para clasificarlos es lógico querer saber la
precisión que ofrece cada método.
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
5 / 63
Introducción
Si se dispusiera de un conjunto ilimitado de datos, muchas de las
cuestiones que se tratarán en esta presentación no tendrı́an sentido.
Sin embargo, el caso suele ser justo el opuesto: un número finito y
normalmente más pequeño de lo deseado.
Un problema a tener en cuenta es, que para un número finito de
datos, el modelo suele sobreajustarse a éstos.
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
6 / 63
Propuesta 60-20-20
60% de los datos para el conjunto de entrenamiento.
20% de los datos para el conjunto de validación, para el ajuste de los
parámetros del algoritmo.
20% de los datos para el conjunto de test. ¡Este es el valor del error
generalizado!
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
7 / 63
Propuesta 60-20-20
60% de los datos para el conjunto de entrenamiento. Con esto
entrenaremos el algoritmo: kmeans, knn, svm, etc, con diferentes
configuraciones. Por ejemplo, knn con 3, 5, 7, ... vecinos.
20% de los datos para el conjunto de validación, para el ajuste de los
parámetros del algoritmo. Se evalúa este conjunto de datos con los
datos anteriormente entrenados: knn con 3, 5, 7, etc. El mı́nimo
obtenido marca la mejor configuración del algoritmo.
20% de los datos para el conjunto de test. ¡Este es el valor del error
generalizado! Sobre el algoritmo anterior, con la mejor configuración
obtenida anteriormente (por ejemplo knn con 5 vecinos), se evalúa
este conjunto de datos, lo cual marcará el error generalizado del
modelo.
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
8 / 63
Precisión en Clasificadores
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
9 / 63
Medida de Precisión de Clasificador I
El uso de los datos de entrenamiento para simultáneamante derivar un
clasificador y a la vez estimar la precisión del modelo de aprendizaje
conduce a la obtención de valores muy optimistas de este valor.
La precisión del modelo puede ser definida como el porcentaje de
tuplas clasificadas correctamente.
También se puede hablar del ratio de error o de malas clasificaciones.
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
10 / 63
Medida de Precisión de Clasificador II
Gran parte de las técnicas de este capı́tulo pueden ser también
aplicadas a la medida de la calidad de ajustes mediante algoritmos
evolutivos. Esto las dota de una alcance más allá de la minerı́a de
datos.
Otro factor a tener encuenta en las medidas de error es el tiempo que
requieren para su cálculo.
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
11 / 63
Matriz de Confusión I
La matriz de confusión resume cuatro casos:
Verdadero positivo: caso positivo etiquetados como positivo.
Verdadero negativo: caso negativo etiquetados como negativo.
Falso positivo: caso negativo etiquetado como positivo.
Falso negativo: caso positivo etiquetado como negativo.
Partiendo de estos casos, se puede hacer una estadı́stica más
elaborada.
Verdadero
Falso
M. Cárdenas (CIEMAT)
Clas. Verdadero
verdaderos positivos
falsos positivos
Errores
Clas. Falso
falsos negativos
verdaderos negativos
6-10 de Octubre de 2014
12 / 63
Matriz de Confusión II
Se denomina sensitivity o recall al cociente entre los verdaderos
positivos y el total de positivos.
También se denomina recognition.
Clas. Verdadero
Verdadero
Falso
verdaderos positivos
falsos positivos
M. Cárdenas (CIEMAT)
Clas. Falso
falsos negativos
verdaderos negativos
Errores
sensitivity
truepositive
= totalpositive
6-10 de Octubre de 2014
13 / 63
Matriz de Confusión III
Se denomina specificity al cociente entre los verdaderos negativos y el
total de negativos.
Verdadero
Clas. Verdadero
verdaderos positivos
Falso
M. Cárdenas (CIEMAT)
falsos positivos
Clas. Falso
falsos negativos
verdaderos negativos
Errores
specificity
truenegative
= totalnegative
6-10 de Octubre de 2014
14 / 63
Matriz de Confusión IV
Se denomina precision al cociente entre los verdaderos positivos y la
suma de los verdaderos positivos y los falsos positivos.
Clas. Verdadero
verdaderos positivo
falsos positivo
precision
Verdadero
Falso
=
M. Cárdenas (CIEMAT)
Clas. Falso
falsos negativo
verdaderos negativo
verdadero positivo
verdadero positivo+falso positivo
Errores
6-10 de Octubre de 2014
15 / 63
Matriz de Confusión V
La matriz de confusión ideal para M positivos y N negativos es:
Verdadero
Falso
M. Cárdenas (CIEMAT)
Clas. Verdadero
M
0
Errores
Clas. Falso
0
N
6-10 de Octubre de 2014
16 / 63
Matriz de Confusión VI
1000 positivos en la muestra.
100 negativos en la muestra.
V
F
Clas. Verdadero
995
20
995
995+20
Clas. Falso
5
80
995
995+5
80
80+20
= 99.50%
= 80.00%
sensitivity
specificity
= 98.03%
precision
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
17 / 63
Accuracy I
Una medida adicional de la precisión es el concepto de accuracy :
accuracy = sensitivity ·
pos
neg
+ specificity ·
pos + neg
pos + neg
Aplicado al caso anterior:
accuracy = 0.995 ·
M. Cárdenas (CIEMAT)
100
1000
+ 0.800 ·
= 0.977
1100
1100
Errores
6-10 de Octubre de 2014
18 / 63
Matriz de Confusión VII
Debilidades
No existen sugerencias sobre la división de un conjunto único de
datos: una parte se asigna al conjunto de entrenamiento y el resto al
conjunto de test.
La medida es única y tiene tratamiento estadı́stico.
Pierde utilidad con datos desbalanceados.
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
19 / 63
Matriz de Confusión VIII
Para M clases, la matriz de confusión tendrı́a M×M dimensiones.
La diagonal serı́an los verdaderos, y el resto las clasificaciones
erróneas.
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
20 / 63
Matriz de Confusión: Ejemplo
import random
import numpy as np
from sklearn import svm
from sklearn.metrics import confusion_matrix
# training set
X = np.r_[’1,2,0’, \
[25, 35, 45, 20, 35, 52, 23, 40, 60, 48, 33], \
[10, 60, 80, 20, 120, 18, 95, 62, 100, 220, 150] ]
Y = np.array( [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1])
p = range(len(X))
random.seed(0)
random.shuffle(p)
X, Y = X[p], Y[p]
half = int(len(X) / 2)
classifier = svm.SVC(kernel=’linear’)
y_ = classifier.fit(X[:half], Y[:half]).predict(X[half:])
# Compute confusion matrix
cm = confusion_matrix(Y[half:], y_)
print cm
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
21 / 63
Matthews Correlation Coefficient
El coeficiente de correlación de Matthews es aplicable a la matriz de
confusión incluso con datos desbalanceados.
MCC es aplicable a clasificaciones binarias.
Devuelve un valor entre -1 y 1, siendo 1 el caso de predicción
perfecta, -1 el totalmente incorrecta y 0 predicción aleatoria.
TP · TN − FP · FN
MCC = p
(TP + FP)(TP + FN)(TN + FP)(TN + FN)
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
22 / 63
Precisión en Regresión
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
23 / 63
Medida de Errores en Regresión I
La función de pérdida mide el error entre el valor real, yi , y el valor
predicho, yi′ .
Error absoluto: |yi − yi′ |
Error cuadrático: (yi − yi′ )2
Error absoluto medio:
PN
Error cuadrático medio:
M. Cárdenas (CIEMAT)
|yi −yi′ |
PN
N
(yi −yi′ )2
N
Errores
6-10 de Octubre de 2014
24 / 63
Holdout Method
Método de Retención
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
25 / 63
Holdout Method
En este método, un conjunto de datos son divididos aleatoriamente en
dos subconjuntos: el de entrenamiento y el de test.
La proporción suele ser dos tercios (entrenamiento) a un tercio (test).
El subconjunto de entrenamiento es usado para la realización del
modelo, mientras que el de test es utilizado para medir su precisión.
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
26 / 63
Random Subsampling
Random subsampling es una variación de Holdout Method en el cual
este método es repetido K veces.
La precisión global se estima como la media de los valores obtenidos.
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
27 / 63
Estratificación
La estratificación es una técnica que trata de asegurar que todas las
clases aparezan representadas en la muestra de test y además con
proporción similar a la que tienen en los datos.
Esta variación es deseable si los datos están desbalanceados: hay
muchos más datos de una clase que de otra.
Se puede aplicar a Holdout Method, Random subsampling, pero
también a Cross-validation.
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
28 / 63
Cross-validation
Validación Cruzada
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
29 / 63
K-fold cross-validation I
En este método el conjunto de
datos es particionado en k
muestras excluyentes y de
tamaño similar.
La creación del modelo y su
medida de error se realiza
repetidamente (k veces) con k-1
muestras para la creación del
modelo, y 1 muestra para la
medida del error.
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
30 / 63
K-fold cross-validation II
A diferencia de Holdout Method y Random
subsampling, aquı́ cada muestra es utilizada
el mismo número de veces para
entrenamiento y una vez para test.
La precisión estimada es el número total de
clasificaciones correctas (tras las k
iteraciones), dividida por el número total de
tuplas.
El error estimado es el número total de
clasificaciones incorrectas (tras las k
iteraciones), dividida por el número total de
tuplas.
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
31 / 63
K-fold cross-validation III
Habitualmente se usa k=10 porque los
experimentos han mostrado que es una
buena opción para obtener una
estimación de la precisión.
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
32 / 63
Random cross-validation
Este método divide
aleatoriamente el conjunto de
datos en subconjuntos de
entrenamiento y test.
Cada subconjunto es usado
como en k-fold.
La desventaja de este método es
que algunas observaciones
nunca serán seleccionadas,
mientras que otras lo serán
mútiples veces.
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
33 / 63
Leave-one-out cross-validation I
Leave-one-out es una variación
de k-fold donde k es igual al
número de tuplas.
Leave-one-out es
computacionalmente caro.
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
34 / 63
Leave-one-out cross-validation II
import numpy as np
from sklearn import neighbors, datasets
from sklearn.cross_validation import LeaveOneOut
X = np.array([[ 25, 10], [ 35, 60], [ 45, 80], [ 20, 20], [ 35, 120], [ 52, 18], [ 23, 95],
[ 40, 62], [ 60, 100], [ 48, 220], [ 33, 150] ])
Y = np.array( [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1])
scores = list()
n_neighbors = 1
loo = LeaveOneOut(len(Y))
clf = neighbors.KNeighborsClassifier(n_neighbors, weights=’uniform’)
for train, test in loo:
X_train, X_test = X[train], X[test]
Y_train, Y_test = Y[train], Y[test]
clf.fit(X_train, Y_train)
scores.append(clf.score(X_test, Y_test))
Z= clf.predict(X_test)
print Z, Y[test]
print scores
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
35 / 63
Leave-one-out cross-validation III
Salida:
[0] [0]
[1] [0]
[1] [0]
[0] [0]
[1] [0]
[0] [0]
[0] [1]
[0] [1]
[0] [1]
[1] [1]
[0] [1]
[1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0]
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
36 / 63
Bootstrap
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
37 / 63
Bootstrap I
A diferencia de los anteriores métodos, en bootstrap una tupla puede
ser seleccionada más de una vez para el subconjunto de
entrenamiento.
Bootstrap tiene diversas variantes. La más comunmente utilizada es
la denominada .632 bootstrap.
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
38 / 63
Bootstrap II
Si el conjunto de datos tiene d tuplas, el conjunto es muestreado d
veces, pudiéndose elegirse varias veces la misma tupla. Existen ciertas
tuplas que no será elegidas. Las tuplas no elegidas forman el
subconjunto de test.
Cada tupla tiene una probabilidad de ser elegida
probabilidad de no ser elegida, (1 − d1 ).
1
d,
y una
Para bootstrap hay que realizar d selecciones, por lo tanto, la
probabilidad de no ser elegida es (1 − d1 )d .
Si d es grande, entonce la probabilidad de que una tupla no sea
elegida para el subconjunto de entrenamiento es: e −1 = 0.368,
36.8%. Y de ser elegida es 63.2%.
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
39 / 63
Bootstrap III
Intuitivamente, la muestra original se considera como la ”población
verdadera”.
Cada muestra simula el proceso de muestreo desde la ”población
verdadera”.
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
40 / 63
Bootstrap III
Si el proceso se repite k veces, entonces la precisión global puede ser
estimada como:
Acc(M) =
k
X
(0.632 · Acc(Mi )test set + 0.368 · Acc(Mi )training set )
i=1
Acc(Mi )test set es la predicción del model obtenido con la muestra
bootstrap i cuando se aplica al subconjunto de test i.
Acc(Mi )training set es la predicción del model obtenido con la muestra
bootstrap i cuando se aplica al conjunto original de datos.
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
41 / 63
Bootstrap IV
1
Muestrear (con repetición) un subconjunto m de instancias de
conjunto D, D > m.
2
Usar el subconjunto m para entrenar un modelo M.
3
Calcular el error sobre el training set, etraining set .
4
Usar las tuplas restantes de D para evaluar el modelo M, y ası́
calcular el error sobre el test set, etest set .
5
Estimar el error con la combinación lineal
0.632 · Acc(Mi )test set + 0.368 · Acc(Mi )training set .
PN
Promediar el error repitiendo el proceso N veces.
i errori /N.
6
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
42 / 63
Bootstrap V
El uso de la combinación lineal
0.632 · Acc(Mi )test set + 0.368 · Acc(Mi )training set intenta balancear la
influencia de la estimación optimista al usar el tranning set y la estimación
pesimista test set.
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
43 / 63
Bootstrap VI
Debilidades
Bootstrap tiene una baja varianza pero requiere muchas iteraciones
para obtener una buena estimación del error.
A medida que el volumen de datos crece el algoritmo se vuelve muy
lento.
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
44 / 63
Bagging y Boosting
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
45 / 63
Bagging I
Existen estrategias para mejorar la precisión de los modelos, tanto en
clasificación como en regresión.
Estos métodos se denominan ensemble methods ya que combinan los
resultados de más de un modelo.
Bagging (bootstrap agregation) es uno de los más populares.
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
46 / 63
Bagging II
Dado un conjunto de datos D, compuesto de d tuplas, en cada
iteración, i, un subconjunto de entrenamiento, Di de d tuplas es
creado a partir de D usando bootstrap.
Por cada subconjunto de entrenamiento, Di , se crea un modelo, Mi .
Para clasificar una tupla desconocida, cada modelo Mi emite una
predicción sobre dicha tupla, la cual cuenta como un voto.
Finalmente, el clasificador bagging cuenta los votos y asigna la clase
más votada a e la tupla desconocida.
Para regresión, bagging puede aplicarse igualmente tomado el valor
promedio de cada predicción para la tupla desconocida.
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
47 / 63
Bagging III
Bagging ofrece un incremento sobre la precisión de cualquiera de los
clasificadores individuales utilizados.
Además es más robusto porque el modelo compuesto reduce la
varianza de los clasificadores individuales.
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
48 / 63
Boosting I
En la técnica denominada boosting se asignan pesos a cada tupla del
conjunto de entrenamiento.
A continuación se usa una serie de k clasificadores. Después de cada
clasificador se incrementa el peso de las tuplas mal clasificadas. Esto
permite concentrar la atención del clasificador en estas tuplas
”difı́ciles de clasificar”.
Boosting generará una secuencia de clasificadores, donde en cada
nuevo ciclo el clasificador es un ”experto” en clasificar algunas de la
tuplas mal clasificadas de la iteración anterior.
El clasificador final combina los votos de cada clasificador individual,
donde el peso del voto de cada clasificador es una función de su
exactitud.
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
49 / 63
AdaBoost I
De todas las variantes de boosting, AdaBoost es una de las más
populares.
Adaboost tiene dos variantes:
Seleccionar las tupas de acuerdo con las clasificaciones erróneas del
clasificador anterior. Más representantes de las tuplas mal clasificadas
son elegidas.
Las tuplas mal clasificadas tienen un peso superior. Los pesos se
incrementan o se disminuyen en función de que las tuplas se clasifiquen
correctamente o erróneamente.
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
50 / 63
Boosting y Bagging I
Boosting
Se utiliza un único algoritmo para crear hipótesis alternativas sobre el
mismo conjunto de dato. Para ello se aumenta el peso en cada iteración
sobre los ejemplos que han sido clasificados erróneamente. Finalmente se
combinan las distintas hipótesis.
Bagging
Se utiliza un único algoritmo para crear hipótesis alternativas sobre N
muestras del conjunto original de datos (M tuplas). Finalmente se
combinan las distintas hipótesis.
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
51 / 63
ROC
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
52 / 63
ROC I
El nombre ROC deriva de Receiver Operating Characteristic.
Su construcción está relacionada con la Matriz de Confusión a través
del true-positive rate que se dibuja en el eje Y , y del false- positive
rate que se dibuja en el eje X .
true-positive rate proporción de tuplas positivas que son
correctamente indentificadas.
false-positive rate proporción de tuplas negativas que son
incorrectamente identificadas como positivas.
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
53 / 63
ROC II
El nombre ROC deriva de Receiver Operating Characteristic.
Su construcción está relacionada con la Matriz de Confusión a través
del true-positive rate que se dibuja en el eje Y , y del false-positive
rate que se dibuja en el eje X .
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
54 / 63
ROC Ejemplo I
Clasificador no excelente.
1.0
F
300
700
0.8
0.6
TPR
V
F
V
300
200
0.4
300
TPR = 300+200
= 0.6
300
FPR = 700+300 = 0.3
0.2
0.0
0.0
0.2
0.4
0.6
0.8
1.0
FPR
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
55 / 63
ROC Ejemplo II
Clasificador mejorado.
1.0
F
200
800
0.8
0.6
TPR
V
F
V
400
100
0.4
400
= 0.8
TPR = 400+100
200
FPR = 800+200 = 0.2
0.2
0.0
0.0
0.2
0.4
0.6
0.8
1.0
FPR
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
56 / 63
No Free Lunch Theorem
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
57 / 63
No Free Lunch Theorem I
Entre varios algoritmos de Minerı́a de datos, ¿cuál es el que produce
el modelo más preciso?
¿Podemos esperar que un algoritmo en particular tenga un redimiento
superior a la media de un conjunto amplio de algoritmos para un
grupo importante de problemas?
Es decir, ¿existe un algoritmo superior o mejor de todos los demás?
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
58 / 63
No Free Lunch Theorem II
Forma 1
Todos los algoritmos que buscan el extremo de una función objetivo tienen
el mismo rendimiento cuando si se promedian sobre todas las funciones de
coste posibles.
Forma 2
El rendimiento medio de cualquier par de algoritmos sobre todos los
posibles problemas es idéntico.
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
59 / 63
Sobreajuste - Overfitting
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
60 / 63
Sobreajuste I
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
61 / 63
Sobreajuste II
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
62 / 63
Gracias
Gracias
¿Preguntas?
¿Más preguntas?
M. Cárdenas (CIEMAT)
Errores
6-10 de Octubre de 2014
63 / 63
Descargar