PRÁCTICA 1 - FUNDAMENTOS DE APRENDIZAJE AUTOMÁTICO

Realizada la práctica por:

    -Pablo Díez del Pozo

    -Alejandro Alcalá Álvarez

Grupo: 1461

Pareja: 01

```python
#!/usr/bin/python3
# -*- coding: utf-8 -*-
```

Importaciones necesarias para la ejecucion del código

Podemos observar todos los import necesarios que tenemos que realizar para que la ejecución de nuestro codigo funcione a la perfección, a continuación, explicaremos cada uno de los imports y para que son necesarios:

Random: se utiliza para hacer las secuencias de índices aleatorios para las particiones de entrenamiento y de clasificación.

Math: se utiliza para hacer la distribución normal para los atributos que sean continuos y asi poder calcular su probabilidad.

Numpy: Es la libreria mas utilizada en esta práctica, debido a que almacenamos los datos en una matriz numpy y guardamos las probabilidades posterioris de los atributos en un array de matrices de numpy.

ABC: se utiliza para haces clases y métodos abstractos.

Datos: se utiliza para importar toda la funcionalidad de nuestro modulo Datos.

Collections: se utiliza para contabilizar las probabilidades condicionadas y para ver cuantas clases hay en el fichero

 SortedDict: se utiliza para ordenar el diccionario que creamos con las probabilidades a priori de cada clase

Sklearn: se utiliza para hacer el tercer apartado de esta práctica, donde nos da una implementación del algoritmo de Naive-Bayes

Pyplot: se utiliza en el último apartado de la práctica, donde nos da una implementación para pintar la curva ROC.

```python
import random
import math
import numpy as np
from abc import ABCMeta, abstractmethod
from Datos import Datos
from collections import Counter
from sortedcontainers import SortedDict
from sklearn.metrics import confusion_matrix, auc
from matplotlib import pyplot as plt
from sklearn.model_selection import train_test_split, cross_val_score, KFold, cross_val_predict
from sklearn.naive_bayes import MultinomialNB
from sklearn.naive_bayes import GaussianNB
from EstrategiaParticionado import Particion
```

Obtener los datos de los Distintos Dataset

Aqui vamos a poder observar como vamos a codificar los datos que nos dan en un fichero a una matriz Numpy para poder tratar los datos para poder entrenarlos y clasificarlos con Naive-Bayes

Vamos a ver como llamando a la clase Datos y que en su constructor le ponemos la ruta del fichero se crea la matriz numpy de los datos, pero a demás de esa matriz también guardamos información necesaria para poder entrenarlos y clasificarlos correctamente. Por ejemplo, guardamos si los atributos son continuos o discretos.

A continuación, vamos a mostrar una ejecución para cada uno de los conjuntos de datos que nos dan para hacer Naive-Bayes. En la celda de abajo vereis la ejecución.

 No se incluye el código de "Datos.py", ya que es el mismo que se utiliza en la P0.

```python
dataset1 = Datos('../Datasets/lenses.data')
print("==============MATRIZ NUMPY DEL CONJUNTO DE DATOS LENSES=====================")
print(dataset.datos)
print("============================================================================")
```

    ==============MATRIZ NUMPY DEL CONJUNTO DE DATOS LENSES=====================
    [[0. 0. 0. 0. 2.]
     [0. 0. 0. 1. 1.]
     [0. 0. 1. 0. 2.]
     [0. 0. 1. 1. 0.]
     [0. 1. 0. 0. 2.]
     [0. 1. 0. 1. 1.]
     [0. 1. 1. 0. 2.]
     [0. 1. 1. 1. 0.]
     [1. 0. 0. 0. 2.]
     [1. 0. 0. 1. 1.]
     [1. 0. 1. 0. 2.]
     [1. 0. 1. 1. 0.]
     [1. 1. 0. 0. 2.]
     [1. 1. 0. 1. 1.]
     [1. 1. 1. 0. 2.]
     [1. 1. 1. 1. 2.]
     [2. 0. 0. 0. 2.]
     [2. 0. 0. 1. 2.]
     [2. 0. 1. 0. 2.]
     [2. 0. 1. 1. 0.]
     [2. 1. 0. 0. 2.]
     [2. 1. 0. 1. 1.]
     [2. 1. 1. 0. 2.]
     [2. 1. 1. 1. 2.]]
    ============================================================================

```python
dataset2 = Datos('../Datasets/tic-tac-toe.data')
print("==============MATRIZ NUMPY DEL CONJUNTO DE DATOS TIC-TAC-TOE================")
print(dataset2.datos)
print("============================================================================")
```

    ==============MATRIZ NUMPY DEL CONJUNTO DE DATOS TIC-TAC-TOE================
    [[2. 2. 2. ... 1. 1. 1.]
     [2. 2. 2. ... 2. 1. 1.]
     [2. 2. 2. ... 1. 2. 1.]
     ...
     [1. 2. 1. ... 1. 2. 0.]
     [1. 2. 1. ... 1. 2. 0.]
     [1. 1. 2. ... 2. 2. 0.]]
    ============================================================================

```python
dataset3 = Datos('../Datasets/german.data')
print("==============MATRIZ NUMPY DEL CONJUNTO DE DATOS GERMAN=====================")
print(dataset3.datos)
print("============================================================================")
```

    ==============MATRIZ NUMPY DEL CONJUNTO DE DATOS GERMAN=====================
    [[ 0.  6.  4. ...  1.  0.  0.]
     [ 1. 48.  2. ...  0.  0.  1.]
     [ 3. 12.  4. ...  0.  0.  0.]
     ...
     [ 3. 12.  2. ...  0.  0.  0.]
     [ 0. 45.  2. ...  1.  0.  1.]
     [ 1. 45.  4. ...  0.  0.  0.]]
    ============================================================================

Apartado 1: Estrategia de Particionado

En este apartado vamos a probar las dos estrategias de particionado de los datos que hemos tenido que implementar en esta práctica, las cuales son:

- Validación Simple.

- Validación Cruzada.

Nuestra estrategia de validación simple consiste en meterle un porcentaje por el cual queremos dividir el conjunto de datos en dos subconjuntos de datos, donde uno lo vamos a utilizar para entrenar y el otro lo vamos a utilizar para hacer la predicción con nuestro clasificador. En la celda de abajo mostraremos el código necesario para poder realizar correctamente la validacion simple.

Como podemos observar en el código de abajo de validación simple, lo que hacemos es que ponemos una semilla a random y decimos que el numero de particiones va a ser uno. A continuación, haremos un permutacion de numeros aleatorios entre el 0  y el número de datos que hay en el fichero. Por ultimo, lo que hacemos es que le creamos la partición que va a tener en su interior los dos subconjuntos de Train y Test. En esa permutación lo multiplicamos por el porcentaje que le hemos dado nosotros para crear los dos suboconjuntos.

Debajo de esta celda vamos a comprobar en como funciona  la validación simple con diferentes porcentajes para obtener el subconjunto de datos de Train y Test, en los diferentes conjuntos de datos

```python
class Particion():

  # Esta clase mantiene la lista de �ndices de Train y Test para cada partici�n del conjunto de particiones
  def __init__(self, train=[], test=[]):
    self.indicesTrain = train
    self.indicesTest = test

  def __str__(self):
    return "Train: {}\nTest:  {}".format(str(self.indicesTrain), str(self.indicesTest))

class EstrategiaParticionado:
  # Clase abstracta
  __metaclass__ = ABCMeta

  # Lista de las particiones
  def __init__(self, nombre=""):
    self.nombreEstrategia = nombre
    self.numeroParticiones = 0
    self.particiones = []

  # Atributos: deben rellenarse adecuadamente para cada estrategia concreta: nombreEstrategia, numeroParticiones, listaParticiones. Se pasan en el constructor

  @abstractmethod
  # TODO: esta funcion deben ser implementadas en cada estrategia concreta
  def creaParticiones(self, datos, seed=None):
    pass

class ValidacionSimple(EstrategiaParticionado):

  def __init__(self, porcentaje):
    self.porcentaje = porcentaje
    super().__init__("Validacion simple")

  # Crea particiones segun el metodo tradicional de division de los datos segun el porcentaje deseado.
  # Devuelve una lista de particiones (clase Particion)
  # TODO: implementar
  def creaParticiones(self, datos, seed=None):

    np.random.seed(seed)
    self.numeroParticiones = 1

    # Generamos una lista con todos los números de datos aleatorios
    indicesAleatorios = np.random.permutation(int(datos.numDatos))

    # Creamos la particion, en funcion del porcentaje especificado
    self.particiones = [Particion(indicesAleatorios[:int(datos.numDatos * self.porcentaje)],
                                  indicesAleatorios[int(datos.numDatos * self.porcentaje):])]

    return self.particiones
```

```python
print(" -- VALIDACIÓN SIMPLE CON LENSES DATA 70% -- ")
estrategia = ValidacionSimple(0.7)
estrategia.creaParticiones(dataset1)
print(estrategia.particiones[0])

```

     -- VALIDACIÓN SIMPLE CON LENSES DATA 70% --
    Train: [23  9  8  0 15 18 10 21 16 19 14  3  5  7  4 22]
    Test:  [12 20  2 11 13 17  6  1]

```python
print(" -- VALIDACIÓN SIMPLE CON TIC-TAC-TOE DATA 80% -- ")
estrategia = ValidacionSimple(0.75)
estrategia.creaParticiones(dataset2)
print(estrategia.particiones[0])
```

     -- VALIDACIÓN SIMPLE CON TIC-TAC-TOE DATA 80% --
    Train: [173 142 907 512 752 956 133 565 312 808 313 529 584 381 395 815 477 685
     178 602 116 203 299 479 912 932 919 370 235  53 389 519  11 575 526 820
      76 205 305 334 285 244 884 295 470 923 652 593 260 623 627 483  28 913
     933 268 698 204  27 613 761  25 842 166 356 922 499  73 650 362 524 603
     405 682 174 355 280 228 445 156 545 347 219 282 443 749 642 102 751  67
       4  90 331  40 484 687 446  77 592 789 462 247 941 710 909 436 534 583
     544 643 876 269 864 390 138 949 847 439 935   6 672 766  91 918 391 134
     848  13 691 233 457 251 407 732 329  49 563 508 944 240 704 460 472 764
      69 791 667 170 514 293 521 191 695 629 834 438 348  93 254 676 469 806
     754 571 498 180 504 274 574 568 151 635 888 493 755 373 825  81 350 926
     794 618 164  87 306 826 550 874 291 231 937 799 377 346 659 435 411 803
     807 262 220 790 179 954 535  94 624 492 928 904 382  61 152 728 863 889
     886 647  18 408 399 202 182 322 838 678 898 787 212 590 419 924 851 196
      83 509 715 850 500 609 683 188 264 827 481 217  19 734 587 122 487 658
     750 952 120 655  39 402 895 733 557 387 209 425 653 157 776 649 130 573
     140 931 713  22 549  20 369 321  64 739 793 674 415 748 308 902  58 242
     515 936 511 777 819 852 681  65 608 899 686  60 358 288 539 468 832 836
     694 505 319  10 542 149 490 194 378 155 393 688 914 742 229 747 570 225
     625 158 893  41 849 616 192 543 588 756 788 410 104 266 246 372 576 862
     578 906 383 841  48 882 137 689 569  45 256 527 184 332 441 737 185 853
     579 177 792  38 559 778 651 161 349 657 816 942 187 660 845 673 679 414
     413  35  36 475 921 582 136 163 270 359   2 309 828 449 654 404 877 330
     429 538 757 767 548 844 341 796 437 637 703  85 392 172 397 661 442 380
     132 811 770 232   1 354 227 714 801 617  75 701 771 541 630 798 491 781
     605  50 489   9 769 868 200 900 292 736 581 873 553 294 417 315 167 320
     705 236  79 300 943 371  47 386 763 510 497 117 317 147 917 289 857 951
      88 572 113 633 210 818 712 141 706  37 934 881 741  89 427 665 111 910
     118 199 365 440 453 566 364 663 176 927 537 342 528 333 303  30 416  42
     473 597 947 375 903 639 162 452 555 901 638 467  34 905 208 148  92 357
     190 671 797  68 890 257 883 206 168 290 252 466 207 920  23 394 374 238
     666 768 249 139 248 433  62 518  52 641 517 800 822 226 829 708 696 360
     197   8 843 558 476 730 523 388 494 434 946 861 129 878 817 839  63 628
     840 459 611 745 250 773 146 621  96 645  82 871 738 869 345 805 298 802
     809 765 930 896 831 821 721 955 361 253 406 680 128 101 824 634 284 279
     115 181 224 327 556  32 784 669 615 376 577 218 743 887 536  98 237 458
     486 296 925 945 324 243 344 865 823   0 531 631 447 153 403 513 363  78
     722 716 367 263 891 272 875 277  70 444 668 719 533 255 503 211 957 131
     422 530  24 507 718  80 740  21 814 310 516 938 311 753 112 870 351 454
     201 522 804 664 150 223 599 620 316 600  71 276 384 729 121 560 423 143
     525 646 450 352 337 421  33 532 709 216 606 343  16 858 644 684]
    Test:  [114 222 854 837 456 195 124 338 412 552 775 353 833 780 774 103 502 725
     175 214 866 702 126 929 640 420 697 125  66  57 144  43   7 610 451 782
     595 632 717 880  74 860 304 213 601 859 727 551 318 830 123  54 700 692
     567 726 594 707 431 159 892 461 314  72 940 772 670 432 562 485 915 506
     690 939 160 785 612 127 699 234 731 622 267 546 455 867   5 109  51  31
     401 948 626 619 297 916 366 198 636 547 585 744 340 307 810 301 586 379
     846  86 286  46 261 735 554 465 471 677 398 323 894 448 230 328 400 275
     607 501 783  44  56 245 396 215 779 430 591 480 474 746 879 596 760 604
     241 813 105 100 564 135 495 488 171 589 107 283 812 540  59 186 662 145
     287  97 648 478 302 598 221 872  14 169 711 108 786  95 520 426 835 409
     855 908 271  55 496 239 110 326 325 885 418 675 119 336 106 281  15 165
     424 656 720 762 278 368   3 759 724 580 950 273 482 463  99 953 428 614
     464 693 897  26 154 385 561 183  84  12  29 265 339 193 258 856 335  17
     259 795 911 758 189 723]

```python
print(" -- VALIDACIÓN SIMPLE CON GERMAN DATA 75% -- ")
estrategia = ValidacionSimple(0.75)
estrategia.creaParticiones(dataset3)
print(estrategia.particiones[0])
```

     -- VALIDACIÓN SIMPLE CON GERMAN DATA 75% --
    Train: [516 410 479  48 130 864  16 550 695  73 134 246  15 427  23 737 318 611
     456  65 346 614 453 997 436 113 883 899 243 966 748 424 591  55 499 701
     375 564 661 944 849 489 785 874 284 642 710 267 329 744 822 897 496 281
     419 439  39 594 223 773 351 880 866 380 482 494 625 242 306 925 368 754
      33 878 544 600 647 750 248 824 801 562  47 228 138 177 188 369 728 753
     417 511 596 355 595 741 821 493  21 696 546 373 859 549 632  46 432 658
     886 580 464 644 840  66 277 557 289  78 716 828  18 746 505 761 397 685
     868 650 558 504 876 694 574 330 514 816 843 796  42 856 163 599 920 911
      57 510 183 190 317 818  22 297 934 909  38 906 837 245 589 879 724 234
     408 450  93 778 729  75 205 141 648 407 980 115 635 872 722 437 780 639
     584 683  89 328 310 825 521 403 128   2 161 327   0 255   9 636 362 295
     268 517 791 698 795 951 358 214 217 940 143 735 480 910 195  36 231 534
     264 535 755 382 561 942 829 280 303  97 846 211 900 553 560 889 416 775
     691 927 604 144 430 383 133  13  99 405 915 893 336 218 830 367 107 220
     763 739  79 364 124 207 756 473 165 261  51 253 476 314 137 988 806 497
     187 629 171  35 804 258 844 921 465 749 425 519 723 543 463 787 851 492
     917 483 139 770 973 678 786 429 300 363 509 993 765 345 800 907 447 654
     986   4 953 185 140 814  56 379 394 882 452 142 254 180  60 620 794 759
     381 971 937  68 674 222 237  96 182 114 100 978 472 542 556 225 344 455
     841 132 860   5 601 834 168 421 151 607 266 602 751 624 512 626 478 819
     332 547 960 875 727 395 287 365 660 995 621 252 663 301 449 941 817 404
     426 581 215 613 372 468 563 783 212 569 760 777 152 216 963 337 551 977
     106  32 194 490 319 686 865 396 508 315 249 265 201 665 668 340  74 854
     279   8 774 108 916 175 964 745 414 657 131  45 641 764 119 420 998 554
     538 996 565 968 257 148 711 708  37  62  34 930 690 895 938  43 983 959
     662 707  86 486 333 305 676  17 302 576 443 605 477 256 976 833 154 736
     628 360 967 999 970  29 954 994 392 158 987 923 653 612 191 530 627 103
      87 460 890 720  54 293 805 931 260 227 922 766 230 157  64 377 802 853
     659 771 850 127 615 316  44 495 655 898 247  58 877 782 975 441 461 529
     159 990 992 583 680 118 862 384 393 592 179 769 979 233 522 292 950 359
     250 197 936 415 418  71 263 758 884 203 238 166 466 622 193 272 112 278
     539 206 428  14 903 282 164 200 475  92 842 241 244  80 323  24 308 520
     969 656 401  31 721 689  81 767   7 792 341 640 283  94 671 371 196 974
     552 320 730 705 491 167 667 387 350 962 672 169 366 105 221 873 413 891
     679 313 335 498 858 444  98 454 926 545 488  27 136  53 374 867 675 275
     697 718 881 451 847 390 807 904 704 772 406 831   3  49 378 870 887 273
     174 808 343 669 651 713 677 892 682  10  82 471 793 939  41 567 943 484
     664 309 784 274 570 572 172 634 326 918 202 577 348 385 376 798 291 924
     610  90 536  95 349 956 102 631 762 170 573 507 448 199 262 932 643 422
     502 532 435 989  70 957 109 526 582 457 666 445 598 178 646  63 470 325
     474  88 645 991 286 869 515 706 630 126 606 603   6 213 269 533  19 321
     145 354 434 353 537 597 232 399 198 901 947 160]
    Test:  [885 731 402 673 855 559 259 848 540 240 985  67 423 700 981 322 162 153
     670 500 352 820  59  40 189 811 186 155 984 440 637 725 742 528 933  28
      12 949 914 919  77 438 965 285 121 150 311 835 442 324 411 501 684 799
      84 836 459  85 952 391 719 902 566 743 687 649 726 712 946 149 541 709
     524   1 575 251 433  25 129 487 609 294 815 961 356 863 334 431  20 146
     579 838 116 347 125  83 224 738 173 331 409 715 236 226 312 827 469 122
     618 531 176 361 209 184 693  69 912 593 779 101 857 896 619 192 776 688
     797 204 803 982 905 342 555  72 958 752 617 945 400 714 616 568 467 523
     757 481 147 587 812 111 578 888  26 703 790 768 181  11 548 702 276 462
     852 503 788 288 398 845 571 296 732 518 652 229 527 972 110 832 633 590
     339 299 235 458 717 338 638 809 485 747 506 446 928 734 239 120 357 740
     913 117 388 871 270  50 839 208 826 935  91 608 948 823 389 861 370 623
      61 699 588 156  52 733 789 307 894 813 412 929 908 210 586 810 104 692
     525 585  30 781 135  76 290 955 304 386 271 298 219 513 123 681]

Nuestra estrategia de validación cruzada consiste en dividir nuestro conjunto de datos en particiones de Train y Test como en validación simple, pero este proceso lo vamos a hacer K veces, para que todos los datos esten presenten en los dos subconjunto de datos para poder obtener una mejora a la hora de entrenar y clasificar.A continuación, mostraremos nuestra implementación de la validación cruzada; donde vamos a hacer K veces las divisiones del conunto de datos y si por algún motivo nuestra división de todos los subconjuntos no es perfecta balancearemos los datos sobrantes para poder entrenarlos y clasificarlos.

```python
class ValidacionCruzada(EstrategiaParticionado):

  # Crea particiones segun el metodo de validacion cruzada.
  # El conjunto de entrenamiento se crea con las nfolds-1 particiones y el de test con la particion restante
  # Esta funcion devuelve una lista de particiones (clase Particion)
  # TODO: implementar

  def __init__(self, k):
    self.k = k
    super().__init__("Validacion cruzada")

  def creaParticiones(self, datos, seed=None):

    np.random.seed(seed)

    self.numeroParticiones = self.k

    # Generamos una lista con todos los números de datos aleatorios
    indicesAleatorios = np.random.permutation(int(datos.numDatos))

    # Hallamos el tamaño de cada bloque
    tamBloque = int(datos.numDatos / self.k)

    datosSobran = datos.numDatos - (tamBloque * self.k)
    count = 0
    for i in range(self.k):

      train = np.delete(indicesAleatorios, range(i * tamBloque, (i + 1) * tamBloque))
      test = indicesAleatorios[i * tamBloque:(i + 1) * tamBloque]

      # Caso en el que la cuenta es justa
      if datosSobran == 0:
        self.particiones.append(Particion(train, test))

      # Contemplamos el caso de que la division para sacar el numero de subconjuntos no fuese entera
      if datosSobran > 0:
        count += 1
        particionTest = np.append(test, train[(datos.numDatos - tamBloque) - i - 1])
        particionTrain = np.delete(train, (datos.numDatos - tamBloque) - i - 1)
        datosSobran -= 1
        self.particiones.append(Particion(particionTrain, particionTest))
```

A continuación, mostraremos la ejecución de nuestra estrategia de partcionado validación simple o también llamada K-fold, con los diferentes conjuntos de datos y con diferentes K's. Vamos poder observar en la salida de nuestra celda que todos los valores van a estar una vez en la partición de Test.

```python
print(" -- VALIDACIÓN CRUZADA CON LENSES DATA K=5 -- ")
estrategia = ValidacionCruzada(5)
estrategia.creaParticiones(dataset1)
for particion in estrategia.particiones:
    print(particion)
```

     -- VALIDACIÓN CRUZADA CON LENSES DATA K=5 --
    Train: [23 19  7 12  5  1  4  9  3  8 18 10 22 17 13 16  0 11 21]
    Test:  [15 14  6  2 20]
    Train: [15 14  6  2  5  1  4  9  3  8 18 10 22 17 13 16  0 11 20]
    Test:  [23 19  7 12 21]
    Train: [15 14  6  2 23 19  7 12  3  8 18 10 22 17 13 16  0 21 20]
    Test:  [ 5  1  4  9 11]
    Train: [15 14  6  2 23 19  7 12  5  1  4  9 22 17 13 16 11 21 20]
    Test:  [ 3  8 18 10  0]
    Train: [15 14  6  2 23 19  7 12  5  1  4  9  3  8 18 10  0 11 21 20]
    Test:  [22 17 13 16]

```python
print(" -- VALIDACIÓN CRUZADA CON TIC-TAC-TOE DATA K=4 -- ")
estrategia = ValidacionCruzada(5)
estrategia.creaParticiones(dataset2)
for particion in estrategia.particiones:
    print(particion)
```

     -- VALIDACIÓN CRUZADA CON TIC-TAC-TOE DATA K=4 --
    Train: [170 552 825 358 594 676 943 578 479 470 824 593 679 569 883 214 325 472
     844 868 819 719 428 639 851 464  79  12 525 401   2 462 127 128 282 618
     495 206 600  72  52 754 190 941 801 604 211  80 776 218 134 224 384 278
     288 777 544 634 275 865 924 138 745 755 104 633 699 753 891 923 931 362
     673 571 869 286 829 222  71 123 107 625 424 260 367 626 452 368  37 149
     305 610 460 559   5 649 512 304 327 277 212  38 257   8 292 296 765 946
      32 697 888  78 348 576 711 417 778 871 480  48 320 620  92  20  10  86
     528 875 900 567 560 700 328 514 249 572 596 656 137 381 459 172 481 245
     437 779 194 131 642 496  11 342 650 323 308 219 827 252 716 549 202 498
     337  19 795 863  42 326 167 756 272 379 706 785 758 944  55 743  88 757
      69 768 907 313 804 484 261  24 925 105 936 341 457   3 562 786  65 165
     161 740 688 289 471 784 114 436 396   1  25 468 741  62 112 636 823 773
     441 483 407 391  49 246 630 248 347  87 474 780 335 232  99 199 505 707
     590 385 942 110 147 720 651 599 524 704 279 659  94 432 254 511 136 103
     811  21 306  27 895 912 781 575 698 208 879 461 545 867  57 264 833 624
     276 393 908 178 916   0 274 443 638 668  45 592 265 150 179 271 184 595
     363 663 601 574 356 244 106 526 301 478 834 122 809 332 815 489  26 196
     100 680 491 397 940 111 629 536 632 797 608  35 770 413 510 369 383 802
     873 854 919 718 838 774 800 317 516 794  16 376 733 654 887 622 392  91
     598 806 315 135 921 690 898 640 456 856 903  46 933 336 645 451 708 343
     674 660 939  23 166 799 423 140 852 102 529 889 193 420 318 820   9  33
     537 519 255 546 192 897 399 253 508 878 841 119 909 581  29 488 299 792
     532 226 767 803  22 143  60 845 582 486 647 435 195 364 926 586 771 345
     284  83 357 746 422 591 387  76 418 390 221 446 409 331 164   4 502 492
     216 507 533 731  58 787 310 694 465 482 144 609 300 859 298 597 670 382
     228 652 894 124  54 712 744 949 534 747  13 262 497 434 438 840 400  47
     587 454 287 737 527 751 388 605 191 948 155 913  59 886 911 730 568 729
     256 531 108 360 444 759 866 749 251 613  43 242 762 421 835 812 473 808
     269 775 843 355 405 685 116 739 513  98 406 732 938 394 918 880 791 542
     893 717 500 565 885 408 539 929 200 872 957 419 234 449 501 475 312  41
     588 126 543  66 615 403 934 669 742 439 727 504 793 563 736 506 426 129
      81 810 217 188 509 455 210 294 487 239 231 721 133 361 892  67 445 954
      44 846 189 207 266 346 577 951 490 485 121 555 201 666 453 158 258 953
     850  68 906 247 159 160  34 215   7  56 476 766 646 518 890 113 316 561
     303 927 631  30 831 197 297 517 238 714 682 705 876  93 223 425 564 187
     538 653 881 156 280  77 334  74 324 684 932   6 788 621  84 530 225  89
     329 411 607 772 817 101 440 726 321 146 701 373 469 142 148 782 378 354
      70 603 213  73 648 667 176 952 442 896 904  90 338 644 130 655 349 340
     606 842 477 268 185 230 157 404 554 398 836 463 139 319 783 627 855 821
     678 259 584 662 713 372 928 429 450 734 579 585 370  28 448 293 715 696
     541 664 311 760 763 344 847 617 175 307 915 467 493 920 583 905 748 725
     683 515 566 882 864 154 955 830 818 602 769 359 220 227 956 860 728 371
     580 550 351 120 241  82 250 535  61 837]
    Test:  [173 553 466 671  40 350 291  36 814 947 857 910 619 171 235  17  64 695
     243 522 290 628 267 935 612 661 377 551 273 151  39 641 380 169  63 302
     822 828 686 693 570 789 109 556 309 558 689 163  14 589 523 635 870 410
     162 548 236 853 735 950 764 691 415 861 884 402  53 186 723 675 263 503
     877 416 412 314 687 902 805 174 917 181 240 427 703 389 366 209 798 521
     637 447  97 611 281 198 796  18 832 738  50 930 499 365 430 816 540 724
     182 750 352 433 458 677 848 937  75  96 125 395 117 901 283  15 374 807
     702 183 414 858 386 547 826 520 914 573 839 614 709 237 813 874 205 431
     270 722  31 330 945 180 285 132 849 141 557 899  85 623 177 681 233  51
      95 657 665 658 339 616 115 494 353 790 168 203 204 761 862 375 752 145
     118 643 295 153 322 152 672 710 922 333 692 229]
    Train: [173 553 466 671  40 350 291  36 814 947 857 910 619 171 235  17  64 695
     243 522 290 628 267 935 612 661 377 551 273 151  39 641 380 169  63 302
     822 828 686 693 570 789 109 556 309 558 689 163  14 589 523 635 870 410
     162 548 236 853 735 950 764 691 415 861 884 402  53 186 723 675 263 503
     877 416 412 314 687 902 805 174 917 181 240 427 703 389 366 209 798 521
     637 447  97 611 281 198 796  18 832 738  50 930 499 365 430 816 540 724
     182 750 352 433 458 677 848 937  75  96 125 395 117 901 283  15 374 807
     702 183 414 858 386 547 826 520 914 573 839 614 709 237 813 874 205 431
     270 722  31 330 945 180 285 132 849 141 557 899  85 623 177 681 233  51
      95 657 665 658 339 616 115 494 353 790 168 203 204 761 862 375 752 145
     118 643 295 153 322 152 672 710 922 333 692 341 457   3 562 786  65 165
     161 740 688 289 471 784 114 436 396   1  25 468 741  62 112 636 823 773
     441 483 407 391  49 246 630 248 347  87 474 780 335 232  99 199 505 707
     590 385 942 110 147 720 651 599 524 704 279 659  94 432 254 511 136 103
     811  21 306  27 895 912 781 575 698 208 879 461 545 867  57 264 833 624
     276 393 908 178 916   0 274 443 638 668  45 592 265 150 179 271 184 595
     363 663 601 574 356 244 106 526 301 478 834 122 809 332 815 489  26 196
     100 680 491 397 940 111 629 536 632 797 608  35 770 413 510 369 383 802
     873 854 919 718 838 774 800 317 516 794  16 376 733 654 887 622 392  91
     598 806 315 135 921 690 898 640 456 856 903  46 933 336 645 451 708 343
     674 660 939  23 166 799 423 140 852 102 529 889 193 420 318 820   9  33
     537 519 255 546 192 897 399 253 508 878 841 119 909 581  29 488 299 792
     532 226 767 803  22 143  60 845 582 486 647 435 195 364 926 586 771 345
     284  83 357 746 422 591 387  76 418 390 221 446 409 331 164   4 502 492
     216 507 533 731  58 787 310 694 465 482 144 609 300 859 298 597 670 382
     228 652 894 124  54 712 744 949 534 747  13 262 497 434 438 840 400  47
     587 454 287 737 527 751 388 605 191 948 155 913  59 886 911 730 568 729
     256 531 108 360 444 759 866 749 251 613  43 242 762 421 835 812 473 808
     269 775 843 355 405 685 116 739 513  98 406 732 938 394 918 880 791 542
     893 717 500 565 885 408 539 929 200 872 957 419 234 449 501 475 312  41
     588 126 543  66 615 403 934 669 742 439 727 504 793 563 736 506 426 129
      81 810 217 188 509 455 210 294 487 239 231 721 133 361 892  67 445 954
      44 846 189 207 266 346 577 951 490 485 121 555 201 666 453 158 258 953
     850  68 906 247 159 160  34 215   7  56 476 766 646 518 890 113 316 561
     303 927 631  30 831 197 297 517 238 714 682 705 876  93 223 425 564 187
     538 653 881 156 280  77 334  74 324 684 932   6 788 621  84 530 225  89
     329 411 607 772 817 101 440 726 321 146 701 373 469 142 148 782 378 354
      70 603 213  73 648 667 176 952 442 896 904  90 338 644 130 655 349 340
     606 842 477 268 185 230 157 404 554 398 836 463 139 319 783 627 855 821
     678 259 584 662 713 372 928 429 450 734 579 585 370  28 448 293 715 696
     541 664 311 760 763 344 847 617 175 307 915 467 493 920 583 905 748 725
     683 515 566 882 864 154 955 830 818 602 769 359 220 227 956 860 728 371
     580 550 351 120 241  82 250 535  61 229]
    Test:  [170 552 825 358 594 676 943 578 479 470 824 593 679 569 883 214 325 472
     844 868 819 719 428 639 851 464  79  12 525 401   2 462 127 128 282 618
     495 206 600  72  52 754 190 941 801 604 211  80 776 218 134 224 384 278
     288 777 544 634 275 865 924 138 745 755 104 633 699 753 891 923 931 362
     673 571 869 286 829 222  71 123 107 625 424 260 367 626 452 368  37 149
     305 610 460 559   5 649 512 304 327 277 212  38 257   8 292 296 765 946
      32 697 888  78 348 576 711 417 778 871 480  48 320 620  92  20  10  86
     528 875 900 567 560 700 328 514 249 572 596 656 137 381 459 172 481 245
     437 779 194 131 642 496  11 342 650 323 308 219 827 252 716 549 202 498
     337  19 795 863  42 326 167 756 272 379 706 785 758 944  55 743  88 757
      69 768 907 313 804 484 261  24 925 105 936 837]
    Train: [173 553 466 671  40 350 291  36 814 947 857 910 619 171 235  17  64 695
     243 522 290 628 267 935 612 661 377 551 273 151  39 641 380 169  63 302
     822 828 686 693 570 789 109 556 309 558 689 163  14 589 523 635 870 410
     162 548 236 853 735 950 764 691 415 861 884 402  53 186 723 675 263 503
     877 416 412 314 687 902 805 174 917 181 240 427 703 389 366 209 798 521
     637 447  97 611 281 198 796  18 832 738  50 930 499 365 430 816 540 724
     182 750 352 433 458 677 848 937  75  96 125 395 117 901 283  15 374 807
     702 183 414 858 386 547 826 520 914 573 839 614 709 237 813 874 205 431
     270 722  31 330 945 180 285 132 849 141 557 899  85 623 177 681 233  51
      95 657 665 658 339 616 115 494 353 790 168 203 204 761 862 375 752 145
     118 643 295 153 322 152 672 710 922 333 692 170 552 825 358 594 676 943
     578 479 470 824 593 679 569 883 214 325 472 844 868 819 719 428 639 851
     464  79  12 525 401   2 462 127 128 282 618 495 206 600  72  52 754 190
     941 801 604 211  80 776 218 134 224 384 278 288 777 544 634 275 865 924
     138 745 755 104 633 699 753 891 923 931 362 673 571 869 286 829 222  71
     123 107 625 424 260 367 626 452 368  37 149 305 610 460 559   5 649 512
     304 327 277 212  38 257   8 292 296 765 946  32 697 888  78 348 576 711
     417 778 871 480  48 320 620  92  20  10  86 528 875 900 567 560 700 328
     514 249 572 596 656 137 381 459 172 481 245 437 779 194 131 642 496  11
     342 650 323 308 219 827 252 716 549 202 498 337  19 795 863  42 326 167
     756 272 379 706 785 758 944  55 743  88 757  69 768 907 313 804 484 261
      24 925 105 936 192 897 399 253 508 878 841 119 909 581  29 488 299 792
     532 226 767 803  22 143  60 845 582 486 647 435 195 364 926 586 771 345
     284  83 357 746 422 591 387  76 418 390 221 446 409 331 164   4 502 492
     216 507 533 731  58 787 310 694 465 482 144 609 300 859 298 597 670 382
     228 652 894 124  54 712 744 949 534 747  13 262 497 434 438 840 400  47
     587 454 287 737 527 751 388 605 191 948 155 913  59 886 911 730 568 729
     256 531 108 360 444 759 866 749 251 613  43 242 762 421 835 812 473 808
     269 775 843 355 405 685 116 739 513  98 406 732 938 394 918 880 791 542
     893 717 500 565 885 408 539 929 200 872 957 419 234 449 501 475 312  41
     588 126 543  66 615 403 934 669 742 439 727 504 793 563 736 506 426 129
      81 810 217 188 509 455 210 294 487 239 231 721 133 361 892  67 445 954
      44 846 189 207 266 346 577 951 490 485 121 555 201 666 453 158 258 953
     850  68 906 247 159 160  34 215   7  56 476 766 646 518 890 113 316 561
     303 927 631  30 831 197 297 517 238 714 682 705 876  93 223 425 564 187
     538 653 881 156 280  77 334  74 324 684 932   6 788 621  84 530 225  89
     329 411 607 772 817 101 440 726 321 146 701 373 469 142 148 782 378 354
      70 603 213  73 648 667 176 952 442 896 904  90 338 644 130 655 349 340
     606 842 477 268 185 230 157 404 554 398 836 463 139 319 783 627 855 821
     678 259 584 662 713 372 928 429 450 734 579 585 370  28 448 293 715 696
     541 664 311 760 763 344 847 617 175 307 915 467 493 920 583 905 748 725
     683 515 566 882 864 154 955 830 818 602 769 359 220 227 956 860 728 371
     580 550 351 120 241  82 250 535 837 229]
    Test:  [341 457   3 562 786  65 165 161 740 688 289 471 784 114 436 396   1  25
     468 741  62 112 636 823 773 441 483 407 391  49 246 630 248 347  87 474
     780 335 232  99 199 505 707 590 385 942 110 147 720 651 599 524 704 279
     659  94 432 254 511 136 103 811  21 306  27 895 912 781 575 698 208 879
     461 545 867  57 264 833 624 276 393 908 178 916   0 274 443 638 668  45
     592 265 150 179 271 184 595 363 663 601 574 356 244 106 526 301 478 834
     122 809 332 815 489  26 196 100 680 491 397 940 111 629 536 632 797 608
      35 770 413 510 369 383 802 873 854 919 718 838 774 800 317 516 794  16
     376 733 654 887 622 392  91 598 806 315 135 921 690 898 640 456 856 903
      46 933 336 645 451 708 343 674 660 939  23 166 799 423 140 852 102 529
     889 193 420 318 820   9  33 537 519 255 546  61]
    Train: [173 553 466 671  40 350 291  36 814 947 857 910 619 171 235  17  64 695
     243 522 290 628 267 935 612 661 377 551 273 151  39 641 380 169  63 302
     822 828 686 693 570 789 109 556 309 558 689 163  14 589 523 635 870 410
     162 548 236 853 735 950 764 691 415 861 884 402  53 186 723 675 263 503
     877 416 412 314 687 902 805 174 917 181 240 427 703 389 366 209 798 521
     637 447  97 611 281 198 796  18 832 738  50 930 499 365 430 816 540 724
     182 750 352 433 458 677 848 937  75  96 125 395 117 901 283  15 374 807
     702 183 414 858 386 547 826 520 914 573 839 614 709 237 813 874 205 431
     270 722  31 330 945 180 285 132 849 141 557 899  85 623 177 681 233  51
      95 657 665 658 339 616 115 494 353 790 168 203 204 761 862 375 752 145
     118 643 295 153 322 152 672 710 922 333 692 170 552 825 358 594 676 943
     578 479 470 824 593 679 569 883 214 325 472 844 868 819 719 428 639 851
     464  79  12 525 401   2 462 127 128 282 618 495 206 600  72  52 754 190
     941 801 604 211  80 776 218 134 224 384 278 288 777 544 634 275 865 924
     138 745 755 104 633 699 753 891 923 931 362 673 571 869 286 829 222  71
     123 107 625 424 260 367 626 452 368  37 149 305 610 460 559   5 649 512
     304 327 277 212  38 257   8 292 296 765 946  32 697 888  78 348 576 711
     417 778 871 480  48 320 620  92  20  10  86 528 875 900 567 560 700 328
     514 249 572 596 656 137 381 459 172 481 245 437 779 194 131 642 496  11
     342 650 323 308 219 827 252 716 549 202 498 337  19 795 863  42 326 167
     756 272 379 706 785 758 944  55 743  88 757  69 768 907 313 804 484 261
      24 925 105 936 341 457   3 562 786  65 165 161 740 688 289 471 784 114
     436 396   1  25 468 741  62 112 636 823 773 441 483 407 391  49 246 630
     248 347  87 474 780 335 232  99 199 505 707 590 385 942 110 147 720 651
     599 524 704 279 659  94 432 254 511 136 103 811  21 306  27 895 912 781
     575 698 208 879 461 545 867  57 264 833 624 276 393 908 178 916   0 274
     443 638 668  45 592 265 150 179 271 184 595 363 663 601 574 356 244 106
     526 301 478 834 122 809 332 815 489  26 196 100 680 491 397 940 111 629
     536 632 797 608  35 770 413 510 369 383 802 873 854 919 718 838 774 800
     317 516 794  16 376 733 654 887 622 392  91 598 806 315 135 921 690 898
     640 456 856 903  46 933 336 645 451 708 343 674 660 939  23 166 799 423
     140 852 102 529 889 193 420 318 820   9  33 537 519 255 546  67 445 954
      44 846 189 207 266 346 577 951 490 485 121 555 201 666 453 158 258 953
     850  68 906 247 159 160  34 215   7  56 476 766 646 518 890 113 316 561
     303 927 631  30 831 197 297 517 238 714 682 705 876  93 223 425 564 187
     538 653 881 156 280  77 334  74 324 684 932   6 788 621  84 530 225  89
     329 411 607 772 817 101 440 726 321 146 701 373 469 142 148 782 378 354
      70 603 213  73 648 667 176 952 442 896 904  90 338 644 130 655 349 340
     606 842 477 268 185 230 157 404 554 398 836 463 139 319 783 627 855 821
     678 259 584 662 713 372 928 429 450 734 579 585 370  28 448 293 715 696
     541 664 311 760 763 344 847 617 175 307 915 467 493 920 583 905 748 725
     683 515 566 882 864 154 955 830 818 602 769 359 220 227 956 860 728 371
     580 550 351 120 241  82 250 535  61 837 229]
    Test:  [192 897 399 253 508 878 841 119 909 581  29 488 299 792 532 226 767 803
      22 143  60 845 582 486 647 435 195 364 926 586 771 345 284  83 357 746
     422 591 387  76 418 390 221 446 409 331 164   4 502 492 216 507 533 731
      58 787 310 694 465 482 144 609 300 859 298 597 670 382 228 652 894 124
      54 712 744 949 534 747  13 262 497 434 438 840 400  47 587 454 287 737
     527 751 388 605 191 948 155 913  59 886 911 730 568 729 256 531 108 360
     444 759 866 749 251 613  43 242 762 421 835 812 473 808 269 775 843 355
     405 685 116 739 513  98 406 732 938 394 918 880 791 542 893 717 500 565
     885 408 539 929 200 872 957 419 234 449 501 475 312  41 588 126 543  66
     615 403 934 669 742 439 727 504 793 563 736 506 426 129  81 810 217 188
     509 455 210 294 487 239 231 721 133 361 892]
    Train: [173 553 466 671  40 350 291  36 814 947 857 910 619 171 235  17  64 695
     243 522 290 628 267 935 612 661 377 551 273 151  39 641 380 169  63 302
     822 828 686 693 570 789 109 556 309 558 689 163  14 589 523 635 870 410
     162 548 236 853 735 950 764 691 415 861 884 402  53 186 723 675 263 503
     877 416 412 314 687 902 805 174 917 181 240 427 703 389 366 209 798 521
     637 447  97 611 281 198 796  18 832 738  50 930 499 365 430 816 540 724
     182 750 352 433 458 677 848 937  75  96 125 395 117 901 283  15 374 807
     702 183 414 858 386 547 826 520 914 573 839 614 709 237 813 874 205 431
     270 722  31 330 945 180 285 132 849 141 557 899  85 623 177 681 233  51
      95 657 665 658 339 616 115 494 353 790 168 203 204 761 862 375 752 145
     118 643 295 153 322 152 672 710 922 333 692 170 552 825 358 594 676 943
     578 479 470 824 593 679 569 883 214 325 472 844 868 819 719 428 639 851
     464  79  12 525 401   2 462 127 128 282 618 495 206 600  72  52 754 190
     941 801 604 211  80 776 218 134 224 384 278 288 777 544 634 275 865 924
     138 745 755 104 633 699 753 891 923 931 362 673 571 869 286 829 222  71
     123 107 625 424 260 367 626 452 368  37 149 305 610 460 559   5 649 512
     304 327 277 212  38 257   8 292 296 765 946  32 697 888  78 348 576 711
     417 778 871 480  48 320 620  92  20  10  86 528 875 900 567 560 700 328
     514 249 572 596 656 137 381 459 172 481 245 437 779 194 131 642 496  11
     342 650 323 308 219 827 252 716 549 202 498 337  19 795 863  42 326 167
     756 272 379 706 785 758 944  55 743  88 757  69 768 907 313 804 484 261
      24 925 105 936 341 457   3 562 786  65 165 161 740 688 289 471 784 114
     436 396   1  25 468 741  62 112 636 823 773 441 483 407 391  49 246 630
     248 347  87 474 780 335 232  99 199 505 707 590 385 942 110 147 720 651
     599 524 704 279 659  94 432 254 511 136 103 811  21 306  27 895 912 781
     575 698 208 879 461 545 867  57 264 833 624 276 393 908 178 916   0 274
     443 638 668  45 592 265 150 179 271 184 595 363 663 601 574 356 244 106
     526 301 478 834 122 809 332 815 489  26 196 100 680 491 397 940 111 629
     536 632 797 608  35 770 413 510 369 383 802 873 854 919 718 838 774 800
     317 516 794  16 376 733 654 887 622 392  91 598 806 315 135 921 690 898
     640 456 856 903  46 933 336 645 451 708 343 674 660 939  23 166 799 423
     140 852 102 529 889 193 420 318 820   9  33 537 519 255 546 192 897 399
     253 508 878 841 119 909 581  29 488 299 792 532 226 767 803  22 143  60
     845 582 486 647 435 195 364 926 586 771 345 284  83 357 746 422 591 387
      76 418 390 221 446 409 331 164   4 502 492 216 507 533 731  58 787 310
     694 465 482 144 609 300 859 298 597 670 382 228 652 894 124  54 712 744
     949 534 747  13 262 497 434 438 840 400  47 587 454 287 737 527 751 388
     605 191 948 155 913  59 886 911 730 568 729 256 531 108 360 444 759 866
     749 251 613  43 242 762 421 835 812 473 808 269 775 843 355 405 685 116
     739 513  98 406 732 938 394 918 880 791 542 893 717 500 565 885 408 539
     929 200 872 957 419 234 449 501 475 312  41 588 126 543  66 615 403 934
     669 742 439 727 504 793 563 736 506 426 129  81 810 217 188 509 455 210
     294 487 239 231 721 133 361 892  61 837 229]
    Test:  [ 67 445 954  44 846 189 207 266 346 577 951 490 485 121 555 201 666 453
     158 258 953 850  68 906 247 159 160  34 215   7  56 476 766 646 518 890
     113 316 561 303 927 631  30 831 197 297 517 238 714 682 705 876  93 223
     425 564 187 538 653 881 156 280  77 334  74 324 684 932   6 788 621  84
     530 225  89 329 411 607 772 817 101 440 726 321 146 701 373 469 142 148
     782 378 354  70 603 213  73 648 667 176 952 442 896 904  90 338 644 130
     655 349 340 606 842 477 268 185 230 157 404 554 398 836 463 139 319 783
     627 855 821 678 259 584 662 713 372 928 429 450 734 579 585 370  28 448
     293 715 696 541 664 311 760 763 344 847 617 175 307 915 467 493 920 583
     905 748 725 683 515 566 882 864 154 955 830 818 602 769 359 220 227 956
     860 728 371 580 550 351 120 241  82 250 535]

```python
print(" -- VALIDACIÓN CRUZADA CON GERMAN DATA K=4 -- ")
estrategia = ValidacionCruzada(4)
estrategia.creaParticiones(dataset3)
for particion in estrategia.particiones:
    print(particion)
```

     -- VALIDACIÓN CRUZADA CON GERMAN DATA K=4 --
    Train: [ 18  92 694 888 452 726 641 860 301 706 945 949 464 465 910 751 976 588
     230 602 253 101 380  31 928 338 210 788 164 415 607 361 916 989 431 618
     349 865 174 421  86 836 975 768 612  45 500 911 796 130 625 934 383 311
     778 175 761 168 590  58 963 355 769 727 571 718 100 555 703 548 771  83
     109 966 523 497 192 867 461 743 426 151 732 483 398 981 547 940 515 856
     809  99 960 959  97 988 319 429 919 845 848 240 972 819 360 929 806 927
     258 315 628 576 345 843   0 884 636 290   4 512  54 146 887 247 705  11
     930  78 249 558 931 518 654 148 953 886 920 239 979 637 573 691 179 690
     858 632 291 219 651 399 575 987 801 813 938 951 237 792  40 119 829 781
     730 344 619 763 165 266 683 810 485 354 877 561 698 488 630 950 587 525
     104 529 394 702 572 747 847 593   6 454 814 740 451  32 166 557 816 455
     800 685  35 830 403 121  87 269 430 106 872 370 591 185 284  96 376 840
     655 970 400 815 138 762 221 335 644 735 484 915 528 811 849 839 855 760
     372 753 719 994 435 866 446 333 520 853 777 826 216 326 957 450 657 812
     213 141 774 384 508 717  46 389 734 791 453   2 943 265 274 478 687 861
     123 116  91 736 112 752 874 707 170 259  53 466 842 638  71  60  94 428
     495 480 377 256 171 458 402 715 664 704 346  98 554 410 139 386 882 890
     708 254 303 739  93 903 215 456 608 933 300 334 287 578  76 549 892 232
      49 883 378 765 896 643 351 288 263  82 594 441 133 195 971 562 492 234
     513 468 621 268 731 406 660 248 184  36 857 519 203 808 153 585 653  72
     932   9 479 908 656 941 128 924 530  89 723 880 766 714 140 336 442 517
     531  79 737 395 392 712  62 310 283 397 209  61 481 629 250 746 204 894
     224 294  22 581 510 419 645  69  57 362 569 524 463 783  27 514  25 538
     767 681 438 494 545 779 648 782 331 275 670 697 954  15 309 436 667 194
      12 144 183 198 983 413 490 639 526 570 582 182 680 460 324 382 107 611
     432 158 700 595 271 347  42 127 371 977 330 764 328 770 412 120 617 457
      47 912 634 173 881 214 600 317 631 921 597 110 537 666 260 359  37 756
     947 401 489 901 535 276 620 350  19 635 939 190 835 425 486 550 329 367
      44 623 374 952 599 533   5 846 935 821 281 135 559 755 228 633 640 869
     652 834 125 448 307 678 467 375 824 604 292 688 605  13 893 729 102 906
     907 658 137 178 285 974 661 964 475 962 188 534 298 741 507 738 863 169
     754 473 564 876 437 679 108   1 418 471 784 131  80 499 142 565 790 364
     613 616 827 889 155 327 583 822 823 306 407 709 676 918 427 948  64  81
     286 420 225 733 440 937 482 759 172 337 838 999 798 469 417 978 984 995
     601 802 794 904 897 504 122 358 161 132 551 318 832 682  74 196 837 566
     965 546  63 577 443 539 584 270 891 305 212 993 222 900 986 985 343 246
     261 828 552  33 387 439 150 543 156 396  55 279 787 873 385 293 748 176
     390 668 393 899 540 509 563 200 854 677 187 749 646 229 603  84 449 695
     850 202 967 521 299  88 147 115 574 669 312 180 560  48 236 414 532 231
     308   8 459 416 186 665 304 322 875  39 973 235 750 674  14 472 722 793
     803 505  52 227 363 785 162 160 673 701 580 423 624 223  59  73 373 340
     422 404 262 721 627  43  51 659 476 280 825 136]
    Test:  [615 353  34 118 313 289 710 851 365 316 556 493 650 586 409 775 113 609
     477  68 117 103 238 208 323 961 264 220 157 917 197 692 909 111 226   7
     424 862 503 462 990 622 946 332 797 267 272 134 342 724  95 820 693 672
     255  41 925 997 177 589 206 804 598 852 716 996 501 251 696 663 252 914
     699 942 314  24 233 348 958 211 502 470  77 273 789  38 567 297 191 217
     955 411 522 149 902 496 114 542  29 870 357 444 926 799 379 905 982 686
     805  20  50 366 885 282  26 242  90  66 321 498 278 408 339 159 807  17
     143 381 817 913 341 592  23  30 207  10 969 126 105 152 568 243 780 193
     878 163 647 675 649 145  67 610 859  75 474 711 277 795 181  85 980 895
     742 295 868 786 356 871 720 998 844 434 369 713  28 757 527 944 818 388
     773 728 936 296 201 991 167 671  16  56 516 776 642 864 189 205 544 325
       3 391 662 841 368 257 758 154 898 923 199 536 445 879  70  21 352 487
     129 506 725 320 684 553  65 596 968 956 614 689 579 922 245 433 511 244
     491 606 745 833 302 405 831 124 744 241 447 772 218 992 541 626]
    Train: [615 353  34 118 313 289 710 851 365 316 556 493 650 586 409 775 113 609
     477  68 117 103 238 208 323 961 264 220 157 917 197 692 909 111 226   7
     424 862 503 462 990 622 946 332 797 267 272 134 342 724  95 820 693 672
     255  41 925 997 177 589 206 804 598 852 716 996 501 251 696 663 252 914
     699 942 314  24 233 348 958 211 502 470  77 273 789  38 567 297 191 217
     955 411 522 149 902 496 114 542  29 870 357 444 926 799 379 905 982 686
     805  20  50 366 885 282  26 242  90  66 321 498 278 408 339 159 807  17
     143 381 817 913 341 592  23  30 207  10 969 126 105 152 568 243 780 193
     878 163 647 675 649 145  67 610 859  75 474 711 277 795 181  85 980 895
     742 295 868 786 356 871 720 998 844 434 369 713  28 757 527 944 818 388
     773 728 936 296 201 991 167 671  16  56 516 776 642 864 189 205 544 325
       3 391 662 841 368 257 758 154 898 923 199 536 445 879  70  21 352 487
     129 506 725 320 684 553  65 596 968 956 614 689 579 922 245 433 511 244
     491 606 745 833 302 405 831 124 744 241 447 772 218 992 541 626 657 812
     213 141 774 384 508 717  46 389 734 791 453   2 943 265 274 478 687 861
     123 116  91 736 112 752 874 707 170 259  53 466 842 638  71  60  94 428
     495 480 377 256 171 458 402 715 664 704 346  98 554 410 139 386 882 890
     708 254 303 739  93 903 215 456 608 933 300 334 287 578  76 549 892 232
      49 883 378 765 896 643 351 288 263  82 594 441 133 195 971 562 492 234
     513 468 621 268 731 406 660 248 184  36 857 519 203 808 153 585 653  72
     932   9 479 908 656 941 128 924 530  89 723 880 766 714 140 336 442 517
     531  79 737 395 392 712  62 310 283 397 209  61 481 629 250 746 204 894
     224 294  22 581 510 419 645  69  57 362 569 524 463 783  27 514  25 538
     767 681 438 494 545 779 648 782 331 275 670 697 954  15 309 436 667 194
      12 144 183 198 983 413 490 639 526 570 582 182 680 460 324 382 107 611
     432 158 700 595 271 347  42 127 371 977 330 764 328 770 412 120 617 457
      47 912 634 173 881 214 600 317 631 921 597 110 537 666 260 359  37 756
     947 401 489 901 535 276 620 350  19 635 939 190 835 425 486 550 329 367
      44 623 374 952 599 533   5 846 935 821 281 135 559 755 228 633 640 869
     652 834 125 448 307 678 467 375 824 604 292 688 605  13 893 729 102 906
     907 658 137 178 285 974 661 964 475 962 188 534 298 741 507 738 863 169
     754 473 564 876 437 679 108   1 418 471 784 131  80 499 142 565 790 364
     613 616 827 889 155 327 583 822 823 306 407 709 676 918 427 948  64  81
     286 420 225 733 440 937 482 759 172 337 838 999 798 469 417 978 984 995
     601 802 794 904 897 504 122 358 161 132 551 318 832 682  74 196 837 566
     965 546  63 577 443 539 584 270 891 305 212 993 222 900 986 985 343 246
     261 828 552  33 387 439 150 543 156 396  55 279 787 873 385 293 748 176
     390 668 393 899 540 509 563 200 854 677 187 749 646 229 603  84 449 695
     850 202 967 521 299  88 147 115 574 669 312 180 560  48 236 414 532 231
     308   8 459 416 186 665 304 322 875  39 973 235 750 674  14 472 722 793
     803 505  52 227 363 785 162 160 673 701 580 423 624 223  59  73 373 340
     422 404 262 721 627  43  51 659 476 280 825 136]
    Test:  [ 18  92 694 888 452 726 641 860 301 706 945 949 464 465 910 751 976 588
     230 602 253 101 380  31 928 338 210 788 164 415 607 361 916 989 431 618
     349 865 174 421  86 836 975 768 612  45 500 911 796 130 625 934 383 311
     778 175 761 168 590  58 963 355 769 727 571 718 100 555 703 548 771  83
     109 966 523 497 192 867 461 743 426 151 732 483 398 981 547 940 515 856
     809  99 960 959  97 988 319 429 919 845 848 240 972 819 360 929 806 927
     258 315 628 576 345 843   0 884 636 290   4 512  54 146 887 247 705  11
     930  78 249 558 931 518 654 148 953 886 920 239 979 637 573 691 179 690
     858 632 291 219 651 399 575 987 801 813 938 951 237 792  40 119 829 781
     730 344 619 763 165 266 683 810 485 354 877 561 698 488 630 950 587 525
     104 529 394 702 572 747 847 593   6 454 814 740 451  32 166 557 816 455
     800 685  35 830 403 121  87 269 430 106 872 370 591 185 284  96 376 840
     655 970 400 815 138 762 221 335 644 735 484 915 528 811 849 839 855 760
     372 753 719 994 435 866 446 333 520 853 777 826 216 326 957 450]
    Train: [615 353  34 118 313 289 710 851 365 316 556 493 650 586 409 775 113 609
     477  68 117 103 238 208 323 961 264 220 157 917 197 692 909 111 226   7
     424 862 503 462 990 622 946 332 797 267 272 134 342 724  95 820 693 672
     255  41 925 997 177 589 206 804 598 852 716 996 501 251 696 663 252 914
     699 942 314  24 233 348 958 211 502 470  77 273 789  38 567 297 191 217
     955 411 522 149 902 496 114 542  29 870 357 444 926 799 379 905 982 686
     805  20  50 366 885 282  26 242  90  66 321 498 278 408 339 159 807  17
     143 381 817 913 341 592  23  30 207  10 969 126 105 152 568 243 780 193
     878 163 647 675 649 145  67 610 859  75 474 711 277 795 181  85 980 895
     742 295 868 786 356 871 720 998 844 434 369 713  28 757 527 944 818 388
     773 728 936 296 201 991 167 671  16  56 516 776 642 864 189 205 544 325
       3 391 662 841 368 257 758 154 898 923 199 536 445 879  70  21 352 487
     129 506 725 320 684 553  65 596 968 956 614 689 579 922 245 433 511 244
     491 606 745 833 302 405 831 124 744 241 447 772 218 992 541 626  18  92
     694 888 452 726 641 860 301 706 945 949 464 465 910 751 976 588 230 602
     253 101 380  31 928 338 210 788 164 415 607 361 916 989 431 618 349 865
     174 421  86 836 975 768 612  45 500 911 796 130 625 934 383 311 778 175
     761 168 590  58 963 355 769 727 571 718 100 555 703 548 771  83 109 966
     523 497 192 867 461 743 426 151 732 483 398 981 547 940 515 856 809  99
     960 959  97 988 319 429 919 845 848 240 972 819 360 929 806 927 258 315
     628 576 345 843   0 884 636 290   4 512  54 146 887 247 705  11 930  78
     249 558 931 518 654 148 953 886 920 239 979 637 573 691 179 690 858 632
     291 219 651 399 575 987 801 813 938 951 237 792  40 119 829 781 730 344
     619 763 165 266 683 810 485 354 877 561 698 488 630 950 587 525 104 529
     394 702 572 747 847 593   6 454 814 740 451  32 166 557 816 455 800 685
      35 830 403 121  87 269 430 106 872 370 591 185 284  96 376 840 655 970
     400 815 138 762 221 335 644 735 484 915 528 811 849 839 855 760 372 753
     719 994 435 866 446 333 520 853 777 826 216 326 957 450 486 550 329 367
      44 623 374 952 599 533   5 846 935 821 281 135 559 755 228 633 640 869
     652 834 125 448 307 678 467 375 824 604 292 688 605  13 893 729 102 906
     907 658 137 178 285 974 661 964 475 962 188 534 298 741 507 738 863 169
     754 473 564 876 437 679 108   1 418 471 784 131  80 499 142 565 790 364
     613 616 827 889 155 327 583 822 823 306 407 709 676 918 427 948  64  81
     286 420 225 733 440 937 482 759 172 337 838 999 798 469 417 978 984 995
     601 802 794 904 897 504 122 358 161 132 551 318 832 682  74 196 837 566
     965 546  63 577 443 539 584 270 891 305 212 993 222 900 986 985 343 246
     261 828 552  33 387 439 150 543 156 396  55 279 787 873 385 293 748 176
     390 668 393 899 540 509 563 200 854 677 187 749 646 229 603  84 449 695
     850 202 967 521 299  88 147 115 574 669 312 180 560  48 236 414 532 231
     308   8 459 416 186 665 304 322 875  39 973 235 750 674  14 472 722 793
     803 505  52 227 363 785 162 160 673 701 580 423 624 223  59  73 373 340
     422 404 262 721 627  43  51 659 476 280 825 136]
    Test:  [657 812 213 141 774 384 508 717  46 389 734 791 453   2 943 265 274 478
     687 861 123 116  91 736 112 752 874 707 170 259  53 466 842 638  71  60
      94 428 495 480 377 256 171 458 402 715 664 704 346  98 554 410 139 386
     882 890 708 254 303 739  93 903 215 456 608 933 300 334 287 578  76 549
     892 232  49 883 378 765 896 643 351 288 263  82 594 441 133 195 971 562
     492 234 513 468 621 268 731 406 660 248 184  36 857 519 203 808 153 585
     653  72 932   9 479 908 656 941 128 924 530  89 723 880 766 714 140 336
     442 517 531  79 737 395 392 712  62 310 283 397 209  61 481 629 250 746
     204 894 224 294  22 581 510 419 645  69  57 362 569 524 463 783  27 514
      25 538 767 681 438 494 545 779 648 782 331 275 670 697 954  15 309 436
     667 194  12 144 183 198 983 413 490 639 526 570 582 182 680 460 324 382
     107 611 432 158 700 595 271 347  42 127 371 977 330 764 328 770 412 120
     617 457  47 912 634 173 881 214 600 317 631 921 597 110 537 666 260 359
      37 756 947 401 489 901 535 276 620 350  19 635 939 190 835 425]
    Train: [615 353  34 118 313 289 710 851 365 316 556 493 650 586 409 775 113 609
     477  68 117 103 238 208 323 961 264 220 157 917 197 692 909 111 226   7
     424 862 503 462 990 622 946 332 797 267 272 134 342 724  95 820 693 672
     255  41 925 997 177 589 206 804 598 852 716 996 501 251 696 663 252 914
     699 942 314  24 233 348 958 211 502 470  77 273 789  38 567 297 191 217
     955 411 522 149 902 496 114 542  29 870 357 444 926 799 379 905 982 686
     805  20  50 366 885 282  26 242  90  66 321 498 278 408 339 159 807  17
     143 381 817 913 341 592  23  30 207  10 969 126 105 152 568 243 780 193
     878 163 647 675 649 145  67 610 859  75 474 711 277 795 181  85 980 895
     742 295 868 786 356 871 720 998 844 434 369 713  28 757 527 944 818 388
     773 728 936 296 201 991 167 671  16  56 516 776 642 864 189 205 544 325
       3 391 662 841 368 257 758 154 898 923 199 536 445 879  70  21 352 487
     129 506 725 320 684 553  65 596 968 956 614 689 579 922 245 433 511 244
     491 606 745 833 302 405 831 124 744 241 447 772 218 992 541 626  18  92
     694 888 452 726 641 860 301 706 945 949 464 465 910 751 976 588 230 602
     253 101 380  31 928 338 210 788 164 415 607 361 916 989 431 618 349 865
     174 421  86 836 975 768 612  45 500 911 796 130 625 934 383 311 778 175
     761 168 590  58 963 355 769 727 571 718 100 555 703 548 771  83 109 966
     523 497 192 867 461 743 426 151 732 483 398 981 547 940 515 856 809  99
     960 959  97 988 319 429 919 845 848 240 972 819 360 929 806 927 258 315
     628 576 345 843   0 884 636 290   4 512  54 146 887 247 705  11 930  78
     249 558 931 518 654 148 953 886 920 239 979 637 573 691 179 690 858 632
     291 219 651 399 575 987 801 813 938 951 237 792  40 119 829 781 730 344
     619 763 165 266 683 810 485 354 877 561 698 488 630 950 587 525 104 529
     394 702 572 747 847 593   6 454 814 740 451  32 166 557 816 455 800 685
      35 830 403 121  87 269 430 106 872 370 591 185 284  96 376 840 655 970
     400 815 138 762 221 335 644 735 484 915 528 811 849 839 855 760 372 753
     719 994 435 866 446 333 520 853 777 826 216 326 957 450 657 812 213 141
     774 384 508 717  46 389 734 791 453   2 943 265 274 478 687 861 123 116
      91 736 112 752 874 707 170 259  53 466 842 638  71  60  94 428 495 480
     377 256 171 458 402 715 664 704 346  98 554 410 139 386 882 890 708 254
     303 739  93 903 215 456 608 933 300 334 287 578  76 549 892 232  49 883
     378 765 896 643 351 288 263  82 594 441 133 195 971 562 492 234 513 468
     621 268 731 406 660 248 184  36 857 519 203 808 153 585 653  72 932   9
     479 908 656 941 128 924 530  89 723 880 766 714 140 336 442 517 531  79
     737 395 392 712  62 310 283 397 209  61 481 629 250 746 204 894 224 294
      22 581 510 419 645  69  57 362 569 524 463 783  27 514  25 538 767 681
     438 494 545 779 648 782 331 275 670 697 954  15 309 436 667 194  12 144
     183 198 983 413 490 639 526 570 582 182 680 460 324 382 107 611 432 158
     700 595 271 347  42 127 371 977 330 764 328 770 412 120 617 457  47 912
     634 173 881 214 600 317 631 921 597 110 537 666 260 359  37 756 947 401
     489 901 535 276 620 350  19 635 939 190 835 425]
    Test:  [486 550 329 367  44 623 374 952 599 533   5 846 935 821 281 135 559 755
     228 633 640 869 652 834 125 448 307 678 467 375 824 604 292 688 605  13
     893 729 102 906 907 658 137 178 285 974 661 964 475 962 188 534 298 741
     507 738 863 169 754 473 564 876 437 679 108   1 418 471 784 131  80 499
     142 565 790 364 613 616 827 889 155 327 583 822 823 306 407 709 676 918
     427 948  64  81 286 420 225 733 440 937 482 759 172 337 838 999 798 469
     417 978 984 995 601 802 794 904 897 504 122 358 161 132 551 318 832 682
      74 196 837 566 965 546  63 577 443 539 584 270 891 305 212 993 222 900
     986 985 343 246 261 828 552  33 387 439 150 543 156 396  55 279 787 873
     385 293 748 176 390 668 393 899 540 509 563 200 854 677 187 749 646 229
     603  84 449 695 850 202 967 521 299  88 147 115 574 669 312 180 560  48
     236 414 532 231 308   8 459 416 186 665 304 322 875  39 973 235 750 674
      14 472 722 793 803 505  52 227 363 785 162 160 673 701 580 423 624 223
      59  73 373 340 422 404 262 721 627  43  51 659 476 280 825 136]

Apartado 2: Naive-Bayes

Es un clasificador de datos que se basa en la regla de Bayes. Donde primero vamos a dividir el conjunto de datos y poder particionarlo en dos subconunto de datos con validación simple o en varios subconjunto de datos con validación cruzada. En el código que mostramos a continuación es lo que van hacer todos los clasificadores que podemos implementar. Los métodos de entrenamiento y clasifica cada clasificador lo hace el clasificador debido a que los métodos que van a utilizar son únicos y los tenemos que implementar en las clases especificas de cada clasificador.

El método error va a comprobar los errores que ha obtenido nuestro clasificador, para ver el error que hemos obtenido se hace comparando la última columna de nuestra matriz de datos con la predicción que hemos obtenido en el método de clasifica del clasificador. Si es dintinto la predicción con la última columna de los datos le sumamos uno y lo vamos a dividir entre el número de lineas que tiene el subconjunto de datos Test.

El método validación lo que va hacer es realizar los métodos de entrenamiento, clasifica y calcula error del clasificador seguido sin ninguna interrupcion. El método va a comprobar si le estan pasando validación simple o cruzada con el número de partciones que tiene. Si el tamaño es igual a 1 va a llamar a los métodos mencionados anteriormente y va a devolver el error que ha obtenido tras el entrenamiento y la clasificación. Si el tamaño es mayor a 1 hacemos un bucle que cubra todas las partciones para entrenarlas, clasificarlas y obtener su error, despues de la realización de esos métodos vamos a hacer la media aritmetica de todos los errores obtenidos con las diferentes particiones que tenemos en nuestra estrategia.

El método matrizConfusion genera la matriz de confusión utlizando el método confusion_matriz() de SKLearn y calcula las tasas de falsos negativos, verdaderos positivos, verdaderos negativos y falsos positivos, añadiendo las dos tasas necesarias para el análisis ROC a unas listas.

El método curvaROC únicamente pinta la curva ROC correspondiente a la clasificación realizada, utliza los datos de las listas generadas en matrizConfusion para obtener los valores.

```python
class Clasificador:
  # Clase abstracta
  __metaclass__ = ABCMeta

  # Metodos abstractos que se implementan en casa clasificador concreto
  @abstractmethod
  # TODO: esta funcion debe ser implementada en cada clasificador concreto
  # datosTrain: matriz numpy con los datos de entrenamiento
  # atributosDiscretos: array bool con la indicatriz de los atributos nominales
  # diccionario: array de diccionarios de la estructura Datos utilizados para la codificacion de variables discretas
  def entrenamiento(self, datos, datosTrain, atributosDiscretos, diccionario):
    pass

  @abstractmethod
  # TODO: esta funcion debe ser implementada en cada clasificador concreto
  # devuelve un numpy array con las predicciones
  def clasifica(self, datosTest, atributosDiscretos, diccionario):
    pass

  # Obtiene el numero de aciertos y errores para calcular la tasa de fallo
  # TODO: implementar
  def error(self, datos, pred):
    # Aqui se compara la prediccion (pred) con las clases reales y se calcula el error
    i = 0
    real = datos[:, -1]
    error = 0
    for i in range(len(real)):
      if real[i] != pred[i]:
        error += 1
    err = (error) / (len(real) + 0.0)
    return err

  # Realiza una clasificacion utilizando una estrategia de particionado determinada
  # particionado : estrategia de validacion que queremos utilizar
  # dataset : clase de tipo Datos que utilizamos para entrenar y clasificar el modelo
  # clasificador: instancia del clasificador que se va a usar
  # TODO: implementar esta funcion
  def validacion(self, particionado, dataset, clasificador, seed: object = None):

    # Creamos las particiones siguiendo la estrategia llamando a particionado.creaParticiones
    # - Para validacion cruzada: en el bucle hasta nv entrenamos el clasificador con la particion de train i
    # y obtenemos el error en la particion de test i
    # - Para validacion simple (hold-out): entrenamos el clasificador con la particion de train
    # y obtenemos el error en la particion test. Otra opci�n es repetir la validaci�n simple un n�mero especificado de veces, obteniendo en cada una un error. Finalmente se calcular�a la media.
    errores = 0
    # particionado.creaParticiones(dataset, seed)
    # Comprobamos si es por validación cruzada o simple, por la longitud de la lista de particiones
    particionado.particiones = []
    particionado.creaParticiones(dataset)

    # Validación Simple
    if len(particionado.particiones) == 1:
      clasificador.entrenamiento(dataset, particionado.particiones[0].indicesTrain)
      pred = clasificador.clasifica(dataset, particionado.particiones[0].indicesTest)
      ret = self.error(dataset.extraeDatos(particionado.particiones[0].indicesTest), pred)
      if ret > 0:
        return ret
      else:
        return 0

    # Validación Cruzada
    else:
      lista_error = []
      for particion in particionado.particiones:
        clasificador.entrenamiento(dataset, particion.indicesTrain)
        pred = clasificador.clasifica(dataset, particion.indicesTest)
        ret = self.error(dataset.extraeDatos(particion.indicesTest), pred)
        lista_error.append(ret)
      return np.mean(lista_error),np.std(lista_error)

  def matrizConfusion(self, dataset, datosTest, prediccion):

    # Calculamos la matriz de confusion utlizando sk-learn. Solo se calcula en el caso de que la clasificacion sea binaria.
    testData = dataset.extraeDatos(datosTest)
    clase_real = testData[:, -1]

    matriz = confusion_matrix(prediccion, clase_real)

    # La funcion ravel() devuelve todas las estadisticas relacionadas con la matriz de confusion
    tn, fp, fn, tp = matriz.ravel()

    # Calculamos las tasas extraídas de la matriz de confusión
    tpr = tp / (tp + fn)
    fpr = fp / (fp + fn)

    self.lista_tpr.append(tpr)
    self.lista_fpr.append(fpr)

    return matriz

  def curvaROC(self):

    x = np.linspace(0, 1, 100)
    plt.plot(x, x, c='blue')
    for i in range(len(self.lista_fpr)):
        plt.plot(self.lista_fpr[i],self.lista_tpr[i],'ro')
    plt.show()
```

Implementación del Clasificador Naive-Bayes

En la siguiente celda vamos a poder observar el codigo de entrenamiento y clasifica del clasificador de Naive-Bayes, a continuación explicaremos brevemente el funcionamiento de cada uno de los métodos especificos del clasificador. En este claisificador podemos aplicar la regla de Laplace, que es si obtenemos un cero en algunas de las mátrices de conteos de los datos, es decir, a la hora de calcular P(D|H), tendremos que sumar 1 a todas las celdas de conteos de esa P(D|H).

El método entrenamiento, lo primero que hace este método es obtener las probabilidades a priori de las clases que hay en el subconjunto de Test. Al calcular esas probabbilades las introducimos en un diccionario para poder utilizarlas más tarde. Ahora vamos a calcular la P(D|H)que se va a calcular de diferentes maneras para datos continuos o discretos

Atributos discretos: se calcula haciendo los conteos de las veces que sale la P(D|H) en el subconjunto de datos Train.

Atributos continuos: se calcula la media y desviación tipica del subconjunto de datos Train.

Todo esto se mete en una matriz que tiene los diferentes datos y las diferentes clases del conjunto de datos, donde esa matriz la vamos a utilizar para calcular las probabilidades a posteriori con todos las datos que tiene las matrices que hemos creado.

El método  clasifica dependiendo de los datos que vamos obteniendo del subconjunto de datos de Test, y vamos a obtener las diferentes probabilidades de las distintas clases que tenemos el problema si nos llega ese dato. Esas probabilidades las guardamos en una lista para luego multiplicarlas por los a priori y poder coger la clase que de más probabilidad para guardarla en la lista de las predicciones de nuestro clasificador Naive-Bayes y así despues obtener el error que hemos obtenenido. Este método tambien clasifica de manera distinta los atributos discretos y continuos:

Atributos discretos: se calcula obteniendo el número que hay en la matriz de probabilidades a posteriori que hemos creado anteriormente.

Atributos continuos: se calcula haciendo la ecuación de la distribución normal.

```python
class ClasificadorNaiveBayes(Clasificador):

  def __init__(self, laplace):
    self.laplace = laplace
    self.lista_fpr = []
    self.lista_tpr = []

  def entrenamiento(self, dataset, datosTrain):

    # Cargamos todos los datos de la clase del dataset desde la matriz de datos
    clasesTrain = dataset.extraeDatos(datosTrain)
    self.numClases = clasesTrain[:, -1]

    # Contamos las apariciones de cada uno para luego calcular la probabilidad a priori de cada clase
    counter = Counter(self.numClases)

    # Calculamos la probabilidad de la clase y lo metemos en un diccionario ordenado segun el numero
    # correspondiente a cada clase asignado en el diccionario
    self.dictPrioris = {}
    for k in counter:
      k = int(k)
      counter[k] = counter[k] / len(self.numClases)
      self.dictPrioris[k] = counter[k]

    # Aqui ordenamos el diccionario para que esten en el mismo orden de como extraemos los datos del dataset
    self.dictPrioris = SortedDict(self.dictPrioris)

    # Calcular tablas de probabilidades del entrenamiento. Tenemos que calcular por cada atributo una cuenta
    # de las apariciones en cada clase
    # Creamos una lista de matrices, donde vamos almacenar todos los datos que hemos obtenido en los datos de Test
    self.posteriori = np.zeros(len(dataset.nombreAtributos) - 1, dtype=object)

    # Recorremos todos los datos de la matriz sin llegar a la clase
    for i in range(len(dataset.nombreAtributos) - 1):

      # Si el dato que obtenemos es Nominal haremos el recuento de todas las veces que sale la P(D|H)
      if dataset.nominalAtributos[i] == True:

        # Creamos una matriz de tamaño X: Número de Atributos menos la clase Y: Número de clases
        post = np.zeros((len(dataset.listaDicts[i]), len(dataset.listaDicts[-1])))

        # Aqui contamos todos las datos que queremos del datos Train para construir la matriz de entrenamiento
        for c in range(len(dataset.listaDicts[-1])):
          datosEnt = dataset.extraeDatos(datosTrain)
          dat = datosEnt[:, i]
          repes = Counter(dat[datosEnt[:, -1] == c])
          for r in repes:
            post[int(r), c] = repes[r]
          if self.laplace == True:
            self.posteriori[i] = post + 1
          else:
            self.posteriori[i] = post

      # Si el dato es Continuo obtendremos la media y la desviación tipica de la clase
      else:

        # Creamos una matriz de X: Los datos de Media y Desivación típica Y: Número de clases
        post = np.zeros((2, len(dataset.listaDicts[-1])))

        # Aqui obtenemos la media y desviación tipica de cada clase, despues de tener los datos de entrenamiento
        for c in range(len(dataset.listaDicts[-1])):
          datosEnt = dataset.extraeDatos(datosTrain)
          dat = datosEnt[:, i]
          datos = dat[datosEnt[:, -1] == c]
          post[0][c] = np.mean(datos)
          post[1][c] = np.std(datos)
        self.posteriori[i] = post

    # Calculamos los valores de los posteriori de todos las tablas anteriores
    for i in range(len(dataset.listaDicts) - 1):
      if dataset.nominalAtributos[i] == True:
        self.posteriori[i] /= sum(self.posteriori[i])

  def clasifica(self, dataset, datosTest):
    acum_probs = 1
    self.prediccion = []
    datTest = dataset.extraeDatos(datosTest)

    # Ahora vamos a estudiar la probabilidad de la clase con los datos obtenidos en el entrenamiento
    # Recorremos todos las datos de la matriz de los datos Test
    for dato in datTest:
      mapa = []
      # Aqui obtenemos los prioris de cada clase para poder obtener la probabilidad de cada una
      for clase in range(len(self.dictPrioris)):
        listaVerosimilitudes = []
        # Aqui obtenemos cada valor posteriori de nuestro entrenamiento de los datos, es decir, P(D|H)
        for atributo in range(len(self.posteriori)):
          if dataset.nominalAtributos[atributo] == True:
            prob = self.posteriori[atributo][int(dato[atributo])][clase]
            listaVerosimilitudes.append(prob)

          # Aqui obtenemos la probabilidad de los atibutos continuos
          else:
            # Hacemos la formula de la distribucion normal
            exp1 = 1 / (self.posteriori[atributo][1][clase] * math.sqrt(2 * math.pi))
            exp2 = np.power((dato[atributo] - self.posteriori[atributo][0][clase]), 2)
            exp3 = np.power(self.posteriori[atributo][1][clase], 2)
            exp4 = exp2 / exp3
            exp4 = math.exp((-1 / 2) * exp4)
            prob = exp1 * exp4
            listaVerosimilitudes.append(prob)

        for verosimilitud in listaVerosimilitudes:
          acum_probs *= verosimilitud
        acum_probs *= self.dictPrioris.get(clase)
        mapa.append(acum_probs)
        acum_probs = 1

      # Aqui obtenemos la predicción de mayor probabilidad y la guardamos en nuestra lista de predicciones
      self.prediccion.append(np.argmax(mapa))

    # Devolvemos la lista con la predicción de nuestro clasifica
    return self.prediccion
```

A continuación, vamos a mostrar una ejecución del claisificador de Naive-Bayes con las diferentes validaciones y los diferentes conjuntos de datos que tenemos, al final de esto mostraremos la probabilidad que hemos obtenido.

Destacar que en el caso de German.data es en el único dataset en el que se realiza el cálculo de probabilidades utilizando también la distribución Normal, ya que cuenta con atributos continuos.

Generamos las estrategias de validación de nuevo y se aplicaran para todos los casos.

```python
estrategia_simple_1 = ValidacionSimple(0.7)

estrategia_simple_2 = ValidacionSimple(0.7)

estrategia_simple_3 = ValidacionSimple(0.7)

print(" -- NAIVE-BAYES CON LENSES DATA -- ")
print(" -- CON LAPLACE Y VALIDACION SIMPLE -- ")
nb = ClasificadorNaiveBayes(True)
error = nb.validacion(estrategia_simple_1,dataset1,nb)
print("ERROR OBTENIDO:",error)
print(" -- SIN LAPLACE Y VALIDACION SIMPLE -- ")
nb = ClasificadorNaiveBayes(False)
error = nb.validacion(estrategia_simple_1,dataset1,nb)
print("ERROR OBTENIDO:",error)
print()
print(" -- NAIVE-BAYES CON TIC-TAC-TOE DATA -- ")
print(" -- CON LAPLACE Y VALIDACION SIMPLE -- ")
nb = ClasificadorNaiveBayes(True)
error = nb.validacion(estrategia_simple_2,dataset2,nb)
print("ERROR OBTENIDO:",error)
print(" -- SIN LAPLACE Y VALIDACION SIMPLE -- ")
nb = ClasificadorNaiveBayes(False)
error = nb.validacion(estrategia_simple_2,dataset2,nb)
print("ERROR OBTENIDO:",error)
print()
print(" -- NAIVE-BAYES CON GERMAN DATA -- ")
print(" -- CON LAPLACE Y VALIDACION SIMPLE -- ")
nb = ClasificadorNaiveBayes(True)
error = nb.validacion(estrategia_simple_3,dataset3,nb)
print("ERROR OBTENIDO:",error)
print(" -- SIN LAPLACE Y VALIDACION SIMPLE --")
nb = ClasificadorNaiveBayes(False)
error = nb.validacion(estrategia_simple_3,dataset3,nb)
print("ERROR OBTENIDO:",error)

```

     -- NAIVE-BAYES CON LENSES DATA --
     -- CON LAPLACE Y VALIDACION SIMPLE --
    ERROR OBTENIDO: 0.375
     -- SIN LAPLACE Y VALIDACION SIMPLE --
    ERROR OBTENIDO: 0.125

     -- NAIVE-BAYES CON TIC-TAC-TOE DATA --
     -- CON LAPLACE Y VALIDACION SIMPLE --
    ERROR OBTENIDO: 0.2951388888888889
     -- SIN LAPLACE Y VALIDACION SIMPLE --
    ERROR OBTENIDO: 0.3090277777777778

     -- NAIVE-BAYES CON GERMAN DATA --
     -- CON LAPLACE Y VALIDACION SIMPLE --
    ERROR OBTENIDO: 0.24
     -- SIN LAPLACE Y VALIDACION SIMPLE --
    ERROR OBTENIDO: 0.24333333333333335

```python
estrategia_cruzada_1 = ValidacionCruzada(4)

estrategia_cruzada_2 = ValidacionCruzada(4)

estrategia_cruzada_3 = ValidacionCruzada(4)

print(" -- NAIVE-BAYES CON LENSES DATA -- ")
print(" -- CON LAPLACE Y VALIDACION CRUZADA -- ")
nb = ClasificadorNaiveBayes(True)
error, desv = nb.validacion(estrategia_cruzada_1,dataset1,nb)
print("ERROR OBTENIDO:",error)
print("DESV. TIPICA OBTENIDA:",desv)
print(" -- SIN LAPLACE Y VALIDACION CRUZADA -- ")
nb = ClasificadorNaiveBayes(False)
error, desv = nb.validacion(estrategia_cruzada_1,dataset1,nb)
print("ERROR OBTENIDO:",error)
print("DESV. TIPICA OBTENIDA:",desv)
print()

print(" -- NAIVE-BAYES CON TIC-TAC-TOE DATA -- ")
print(" -- CON LAPLACE Y VALIDACION CRUZADA -- ")
nb = ClasificadorNaiveBayes(True)
error, desv = nb.validacion(estrategia_cruzada_2,dataset2,nb)
print("ERROR OBTENIDO:",error)
print("DESV. TIPICA OBTENIDA:",desv)
print("-- SIN LAPLACE Y VALIDACION CRUZADA --")
nb = ClasificadorNaiveBayes(False)
error, desv = nb.validacion(estrategia_cruzada_2,dataset2,nb)
print("ERROR OBTENIDO:",error)
print("DESV. TIPICA OBTENIDA:",desv)
print()

print("-- NAIVE-BAYES CON GERMAN DATA --")
print("-- CON LAPLACE Y VALIDACION CRUZADA --")
nb = ClasificadorNaiveBayes(True)
error, desv = nb.validacion(estrategia_cruzada_3,dataset3,nb)
print("ERROR OBTENIDO:",error)
print("DESV. TIPICA OBTENIDA:",desv)
print("-- SIN LAPLACE Y VALIDACION CRUZADA --")
nb = ClasificadorNaiveBayes(False)
error, desv = nb.validacion(estrategia_cruzada_3,dataset3,nb)
print("ERROR OBTENIDO:",error)
print("DESV. TIPICA OBTENIDA:",desv)
```

     -- NAIVE-BAYES CON LENSES DATA --
     -- CON LAPLACE Y VALIDACION CRUZADA --
    ERROR OBTENIDO: 0.25
    DESV. TIPICA OBTENIDA: 0.08333333333333333
     -- SIN LAPLACE Y VALIDACION CRUZADA --
    ERROR OBTENIDO: 0.41666666666666663
    DESV. TIPICA OBTENIDA: 0.18633899812498247

     -- NAIVE-BAYES CON TIC-TAC-TOE DATA --
     -- CON LAPLACE Y VALIDACION CRUZADA --
    ERROR OBTENIDO: 0.2964260808926081
    DESV. TIPICA OBTENIDA: 0.026638048149289276
    -- SIN LAPLACE Y VALIDACION CRUZADA --
    ERROR OBTENIDO: 0.2860094142259414
    DESV. TIPICA OBTENIDA: 0.003312883050380025

    -- NAIVE-BAYES CON GERMAN DATA --
    -- CON LAPLACE Y VALIDACION CRUZADA --
    ERROR OBTENIDO: 0.244
    DESV. TIPICA OBTENIDA: 0.0316227766016838
    -- SIN LAPLACE Y VALIDACION CRUZADA --
    ERROR OBTENIDO: 0.254
    DESV. TIPICA OBTENIDA: 0.015362291495737219

Apartado 3: Clasificador Naive Bayes con SKLearn

En este apartado se va a seguir el mismo procedimiento que para el anterior, primero realizaremos pruebas para la validación simple y cruzada usando SKlearn y posteriormente el entrenamiento de nuestro modelo y clasificación de los ejemplos definidos en la partición de test.

Una indicación a tener en cuenta, hemos creado la validación cruzada utilizando la clase KFold pero posteriormente, se utiliza cross_val_score para entrenar y clasificar los ejemplos para validación cruzada. Es la manera más sencilla que hemos encontrado de hacerlo.

```python
import numpy as np
from sklearn.model_selection import train_test_split, cross_val_score, KFold, cross_val_predict
from sklearn.naive_bayes import MultinomialNB
from sklearn.naive_bayes import GaussianNB
from EstrategiaParticionado import Particion
from sklearn.metrics import confusion_matrix
from matplotlib import pyplot as plt

def validacion_simple_sklearn(dataset, porcentaje):
    # Matriz con los atributos
    X = dataset.datos[:, :-1]

    # Array con las clases
    y = dataset.datos[:, -1]

    # Realizamos la divison en train-test, X_train es la partición sobre la que se va a entrenar e X_test sobre la que se va a clasificar
    X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=porcentaje, shuffle=True)

    return X_train, X_test, y_train, y_test

def validacion_cruzada_sklearn(dataset, k):
    # Matriz con los atributos
    X = dataset.datos[:, :-1]

    # Array con las clases
    y = dataset.datos[:, -1]

    kf = KFold(n_splits=k, shuffle=True)

    particiones = []

    for train_index, test_index in kf.split(X, y):
        particiones.append(Particion(train_index, test_index))

    return particiones

def nb_sklearn(x_train, y_train, x_test, tipo="Multinomial", laplace=True):
    if tipo == "Gaussian":
        clf = GaussianNB()
    elif tipo == "Multinomial":
        if laplace == True:
            clf = MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)
        else:
            clf = MultinomialNB(alpha=0.01, fit_prior=True, class_prior=None)
    else:
        print("Error, clasificador no valido. Utilizar GaussianNB o MultinomialNB")
        return

    # Entrenamos el modelo
    clf.fit(x_train, y_train)

    # Clasificacion
    prediccion = clf.predict(x_test)

    return prediccion

def nb_sklearn_validacion_cruzada(x_train, y_train, k, tipo="Multinomial", laplace=True):
    if tipo == "Gaussian":
        clf = GaussianNB()

    elif tipo == "Multinomial":
        if laplace == True:
            clf = MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)
        else:
            clf = MultinomialNB(alpha=0.01, fit_prior=True, class_prior=None)
    else:
        print("Error, clasificador no valido. Utilizar GaussianNB o MultinomialNB")
        return

    acierto = cross_val_score(clf, x_train, y_train, cv=k)

    return acierto, acierto.std()

def matriz_confusion_sklearn(prediccion, clase_real):
    matriz = confusion_matrix(clase_real, prediccion)
    tn, fp, fn, tp = matriz.ravel()

    # Calculamos las tasas extraídas de la matriz de confusión
    tpr = tp / (tp + fn)
    fpr = fp / (fp + fn)

    return matriz, tpr, fpr

def curvaROC_sklearn(fpr, tpr):
    x = np.linspace(0, 1, 100)
    plt.plot(x, x, c='blue')
    plt.plot(fpr, tpr, 'ro')
    plt.show()

def error(clases_predichas, clases_reales):

    error =  1 - (np.sum(np.equal(clases_predichas, clases_reales)) / len(clases_predichas))

    return error
```

 Ejemplos de la validación simple y cruzada para todos los datasets, utilizando SKLearn :

```python
print(" -- SKLEARN VALIDACIÓN SIMPLE 70% LENSES DATA -- ")
x_train, x_test, y_train, y_test = validacion_simple_sklearn(dataset, 0.7)
print("TRAIN:\n", x_train)
print("TEST:\n", x_test)
```

     -- SKLEARN VALIDACIÓN SIMPLE 70% LENSES DATA --
    TRAIN:
     [[2. 1. 1. 0.]
     [2. 0. 1. 0.]
     [0. 0. 0. 1.]
     [2. 1. 0. 0.]
     [0. 1. 1. 0.]
     [2. 0. 0. 1.]
     [0. 1. 1. 1.]
     [2. 1. 1. 1.]
     [1. 1. 1. 1.]
     [1. 0. 0. 0.]
     [0. 0. 1. 1.]
     [1. 0. 1. 1.]
     [1. 0. 1. 0.]
     [0. 0. 0. 0.]
     [1. 1. 0. 1.]
     [0. 1. 0. 0.]]
    TEST:
     [[2. 0. 0. 0.]
     [2. 0. 1. 1.]
     [1. 1. 1. 0.]
     [0. 1. 0. 1.]
     [1. 1. 0. 0.]
     [2. 1. 0. 1.]
     [1. 0. 0. 1.]
     [0. 0. 1. 0.]]

```python
print(" -- SKLEARN VALIDACIÓN CRUZADA K=5 LENSES DATA -- ")
particiones = validacion_cruzada_sklearn(dataset,5)
for particion in particiones:
    print(particion)
```

     -- SKLEARN VALIDACIÓN CRUZADA K=5 LENSES DATA --
    Train: [ 0  1  2  3  5  6  7  9 10 12 13 14 15 16 17 19 21 22 23]
    Test:  [ 4  8 11 18 20]
    Train: [ 0  2  3  4  5  7  8 11 12 13 14 15 16 17 18 20 21 22 23]
    Test:  [ 1  6  9 10 19]
    Train: [ 1  2  3  4  5  6  8  9 10 11 13 15 16 17 18 19 20 21 23]
    Test:  [ 0  7 12 14 22]
    Train: [ 0  1  3  4  6  7  8  9 10 11 12 14 15 16 18 19 20 22 23]
    Test:  [ 2  5 13 17 21]
    Train: [ 0  1  2  4  5  6  7  8  9 10 11 12 13 14 17 18 19 20 21 22]
    Test:  [ 3 15 16 23]

```python
print(" -- SKLEARN VALIDACIÓN SIMPLE 80% TIC-TAC-TOE DATA -- ")
x_train, x_test, y_train, y_test = validacion_simple_sklearn(dataset2, 0.8)
print("TRAIN:\n", x_train)
print("TEST:\n", x_test)
```

     -- SKLEARN VALIDACIÓN SIMPLE 80% TIC-TAC-TOE DATA --
    TRAIN:
     [[0. 1. 2. ... 0. 2. 2.]
     [0. 2. 1. ... 2. 2. 1.]
     [1. 0. 2. ... 2. 0. 1.]
     ...
     [2. 1. 1. ... 0. 2. 2.]
     [1. 2. 1. ... 1. 2. 0.]
     [2. 1. 0. ... 2. 1. 2.]]
    TEST:
     [[0. 1. 1. ... 1. 0. 2.]
     [2. 2. 1. ... 2. 0. 1.]
     [1. 2. 0. ... 1. 2. 2.]
     ...
     [1. 0. 2. ... 2. 2. 0.]
     [2. 0. 1. ... 0. 1. 1.]
     [1. 2. 1. ... 2. 2. 2.]]

```python
print(" -- SKLEARN VALIDACIÓN CRUZADA K=4 TIC-TAC-TOE DATA --")
particiones = validacion_cruzada_sklearn(dataset2,4)
for particion in particiones:
    print(particion)
```

     -- SKLEARN VALIDACIÓN CRUZADA K=4 TIC-TAC-TOE DATA --
    Train: [  0   1   2   3   5   7   8   9  10  11  12  13  14  15  16  17  20  21
      22  23  26  28  29  30  31  32  33  34  37  38  39  40  41  43  44  45
      46  47  48  49  51  54  57  58  59  60  61  63  64  65  67  70  71  72
      74  76  77  78  80  81  82  83  84  85  86  87  89  91  94  96  98  99
     101 102 103 104 105 106 107 109 110 111 112 113 114 115 116 117 118 119
     120 121 123 124 125 129 132 134 136 138 139 140 141 142 143 144 145 146
     147 148 149 152 153 154 155 156 158 159 160 161 163 164 165 167 168 169
     170 171 172 173 175 176 178 179 180 182 183 184 185 186 187 188 189 191
     192 193 195 196 197 198 199 201 202 203 204 207 208 210 211 212 213 215
     216 217 218 222 223 224 225 226 227 228 229 230 232 233 234 236 238 240
     241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 258 259
     260 262 263 264 265 267 270 271 274 275 276 278 280 281 282 283 284 285
     286 287 288 289 290 291 292 295 297 298 301 302 303 304 305 306 307 310
     312 313 314 315 316 317 318 319 320 322 324 326 327 329 330 331 332 334
     335 336 341 342 343 344 345 346 347 348 349 350 351 352 353 354 356 357
     358 360 361 363 364 366 367 368 369 370 371 372 376 377 378 379 380 381
     382 383 384 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400
     401 402 404 405 406 407 409 410 411 412 413 414 415 416 417 418 419 420
     421 422 423 424 425 426 427 429 432 433 435 436 437 438 439 440 441 442
     443 444 445 447 448 449 450 451 452 453 455 457 458 459 461 462 463 464
     465 467 468 471 475 478 479 480 482 483 485 489 490 491 492 493 494 495
     497 498 499 500 501 502 504 505 506 507 509 511 514 516 517 518 519 521
     522 523 524 525 526 527 528 529 530 531 533 535 536 539 540 542 543 546
     547 548 549 551 553 554 555 557 559 560 561 564 565 566 568 570 572 573
     574 575 576 577 579 581 582 583 584 585 589 590 591 593 594 595 596 598
     599 601 603 605 606 608 609 610 612 614 617 618 619 623 624 625 627 629
     630 632 633 636 637 638 639 640 644 645 646 647 648 649 650 651 652 655
     656 657 658 660 661 662 663 664 665 667 668 669 670 671 672 675 676 677
     678 679 680 681 682 689 690 691 693 695 697 698 699 700 702 703 704 705
     706 707 708 709 710 711 713 715 717 718 719 720 723 724 725 726 729 730
     731 732 733 735 737 738 739 741 742 743 745 746 747 748 750 751 753 754
     755 756 757 759 760 761 762 765 766 769 770 771 772 773 775 777 778 779
     781 782 783 784 785 787 788 789 790 791 792 794 795 797 798 800 801 802
     804 806 807 808 810 811 812 815 816 817 818 820 821 822 823 824 825 826
     827 828 829 830 831 833 834 835 836 837 839 840 841 842 843 844 846 848
     850 851 852 854 855 856 857 858 859 861 863 864 865 866 867 869 870 871
     872 873 874 876 877 878 879 880 881 882 883 884 885 886 887 889 890 891
     893 894 895 896 897 898 899 900 901 902 903 905 906 907 908 909 910 912
     913 914 915 916 917 919 920 922 923 924 926 928 929 930 931 932 933 935
     936 937 938 939 942 943 944 945 947 949 950 952 953 955 956 957]
    Test:  [  4   6  18  19  24  25  27  35  36  42  50  52  53  55  56  62  66  68
      69  73  75  79  88  90  92  93  95  97 100 108 122 126 127 128 130 131
     133 135 137 150 151 157 162 166 174 177 181 190 194 200 205 206 209 214
     219 220 221 231 235 237 239 257 261 266 268 269 272 273 277 279 293 294
     296 299 300 308 309 311 321 323 325 328 333 337 338 339 340 355 359 362
     365 373 374 375 385 403 408 428 430 431 434 446 454 456 460 466 469 470
     472 473 474 476 477 481 484 486 487 488 496 503 508 510 512 513 515 520
     532 534 537 538 541 544 545 550 552 556 558 562 563 567 569 571 578 580
     586 587 588 592 597 600 602 604 607 611 613 615 616 620 621 622 626 628
     631 634 635 641 642 643 653 654 659 666 673 674 683 684 685 686 687 688
     692 694 696 701 712 714 716 721 722 727 728 734 736 740 744 749 752 758
     763 764 767 768 774 776 780 786 793 796 799 803 805 809 813 814 819 832
     838 845 847 849 853 860 862 868 875 888 892 904 911 918 921 925 927 934
     940 941 946 948 951 954]
    Train: [  0   2   3   4   5   6   8   9  10  12  13  17  18  19  22  23  24  25
      27  28  29  31  32  33  34  35  36  39  40  41  42  43  45  46  48  50
      51  52  53  54  55  56  57  58  60  62  64  65  66  68  69  70  71  72
      73  75  76  77  78  79  82  83  84  85  88  89  90  91  92  93  95  97
      98 100 102 103 104 105 106 108 109 110 111 112 115 117 118 119 120 122
     123 125 126 127 128 130 131 132 133 134 135 136 137 138 141 142 144 146
     147 150 151 153 154 155 156 157 158 159 160 161 162 163 164 165 166 169
     170 171 174 175 176 177 179 180 181 183 184 185 186 187 188 190 191 194
     195 196 198 199 200 201 202 203 204 205 206 207 209 211 212 213 214 215
     216 217 219 220 221 222 224 225 226 227 229 231 232 235 237 238 239 241
     243 244 245 247 248 249 251 252 253 254 255 257 258 260 261 262 263 264
     265 266 267 268 269 270 271 272 273 274 276 277 278 279 280 281 284 285
     287 288 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306
     307 308 309 310 311 313 314 317 318 320 321 322 323 324 325 326 327 328
     329 330 331 332 333 334 336 337 338 339 340 341 342 344 345 348 350 351
     353 355 356 357 358 359 361 362 365 367 368 369 370 371 372 373 374 375
     376 378 379 381 382 383 384 385 386 387 388 389 392 393 394 396 397 400
     401 402 403 405 406 407 408 409 411 412 413 414 415 417 418 421 422 423
     424 427 428 429 430 431 432 434 435 436 437 438 439 441 443 444 446 447
     448 449 452 453 454 456 457 460 462 463 464 465 466 468 469 470 471 472
     473 474 475 476 477 478 480 481 482 484 485 486 487 488 489 490 491 496
     498 501 503 504 506 508 510 512 513 514 515 516 517 518 519 520 523 524
     525 526 530 532 533 534 536 537 538 540 541 542 544 545 546 548 550 552
     553 554 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571
     574 575 576 577 578 579 580 581 585 586 587 588 589 590 591 592 595 597
     598 599 600 601 602 603 604 606 607 608 609 611 613 614 615 616 618 619
     620 621 622 623 626 627 628 629 630 631 632 633 634 635 636 637 638 639
     640 641 642 643 644 645 647 648 649 650 653 654 657 659 660 662 663 666
     668 670 672 673 674 675 677 678 680 681 683 684 685 686 687 688 689 690
     692 693 694 696 697 698 699 700 701 702 703 704 706 707 711 712 713 714
     715 716 717 718 719 721 722 723 724 727 728 730 731 732 734 735 736 740
     741 742 743 744 745 749 750 752 754 755 756 757 758 761 762 763 764 766
     767 768 771 773 774 775 776 778 779 780 781 782 783 785 786 787 788 790
     791 793 796 797 798 799 803 804 805 806 807 808 809 810 811 812 813 814
     815 816 817 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833
     834 835 836 837 838 839 843 844 845 846 847 848 849 850 851 852 853 855
     858 859 860 862 863 864 865 866 867 868 869 871 873 874 875 876 877 879
     880 881 882 885 887 888 889 890 892 898 899 900 903 904 906 908 909 910
     911 914 915 917 918 919 921 924 925 926 927 929 930 931 932 934 935 936
     937 938 939 940 941 942 943 946 947 948 949 950 951 953 954 955]
    Test:  [  1   7  11  14  15  16  20  21  26  30  37  38  44  47  49  59  61  63
      67  74  80  81  86  87  94  96  99 101 107 113 114 116 121 124 129 139
     140 143 145 148 149 152 167 168 172 173 178 182 189 192 193 197 208 210
     218 223 228 230 233 234 236 240 242 246 250 256 259 275 282 283 286 289
     290 312 315 316 319 335 343 346 347 349 352 354 360 363 364 366 377 380
     390 391 395 398 399 404 410 416 419 420 425 426 433 440 442 445 450 451
     455 458 459 461 467 479 483 492 493 494 495 497 499 500 502 505 507 509
     511 521 522 527 528 529 531 535 539 543 547 549 551 555 572 573 582 583
     584 593 594 596 605 610 612 617 624 625 646 651 652 655 656 658 661 664
     665 667 669 671 676 679 682 691 695 705 708 709 710 720 725 726 729 733
     737 738 739 746 747 748 751 753 759 760 765 769 770 772 777 784 789 792
     794 795 800 801 802 818 840 841 842 854 856 857 861 870 872 878 883 884
     886 891 893 894 895 896 897 901 902 905 907 912 913 916 920 922 923 928
     933 944 945 952 956 957]
    Train: [  0   1   3   4   6   7   9  11  13  14  15  16  17  18  19  20  21  22
      23  24  25  26  27  29  30  31  34  35  36  37  38  42  44  45  46  47
      49  50  52  53  54  55  56  57  58  59  61  62  63  64  65  66  67  68
      69  70  71  72  73  74  75  79  80  81  84  86  87  88  89  90  92  93
      94  95  96  97  98  99 100 101 106 107 108 110 111 113 114 116 118 119
     121 122 124 125 126 127 128 129 130 131 133 135 137 139 140 143 145 146
     147 148 149 150 151 152 156 157 160 162 163 165 166 167 168 169 171 172
     173 174 175 177 178 181 182 183 188 189 190 192 193 194 196 197 198 200
     203 204 205 206 208 209 210 211 213 214 216 218 219 220 221 222 223 226
     228 230 231 232 233 234 235 236 237 239 240 241 242 244 245 246 247 250
     252 253 254 255 256 257 258 259 260 261 263 264 265 266 268 269 270 271
     272 273 274 275 277 278 279 282 283 284 285 286 287 289 290 291 293 294
     295 296 299 300 303 308 309 311 312 313 315 316 317 318 319 320 321 323
     325 327 328 329 330 331 333 334 335 336 337 338 339 340 342 343 345 346
     347 349 352 354 355 357 358 359 360 361 362 363 364 365 366 367 372 373
     374 375 377 378 380 381 382 384 385 386 387 388 389 390 391 392 393 395
     397 398 399 400 401 403 404 407 408 410 411 412 413 414 416 418 419 420
     425 426 427 428 430 431 432 433 434 435 437 438 440 441 442 444 445 446
     447 448 450 451 452 454 455 456 457 458 459 460 461 464 465 466 467 468
     469 470 472 473 474 476 477 478 479 481 482 483 484 486 487 488 490 492
     493 494 495 496 497 498 499 500 501 502 503 505 507 508 509 510 511 512
     513 514 515 516 520 521 522 523 524 526 527 528 529 530 531 532 534 535
     537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 555 556
     558 559 562 563 565 566 567 568 569 570 571 572 573 574 576 578 580 581
     582 583 584 585 586 587 588 591 592 593 594 595 596 597 598 599 600 601
     602 603 604 605 607 608 609 610 611 612 613 615 616 617 618 619 620 621
     622 623 624 625 626 628 629 631 632 633 634 635 637 638 641 642 643 646
     647 650 651 652 653 654 655 656 658 659 661 663 664 665 666 667 669 671
     672 673 674 676 677 678 679 680 682 683 684 685 686 687 688 691 692 693
     694 695 696 698 699 701 703 704 705 707 708 709 710 711 712 714 716 717
     720 721 722 723 725 726 727 728 729 731 732 733 734 735 736 737 738 739
     740 741 742 744 746 747 748 749 751 752 753 754 756 757 758 759 760 761
     763 764 765 766 767 768 769 770 771 772 774 776 777 779 780 781 784 786
     789 790 792 793 794 795 796 798 799 800 801 802 803 804 805 806 808 809
     810 811 812 813 814 818 819 820 822 830 831 832 834 835 836 837 838 839
     840 841 842 845 846 847 848 849 850 853 854 856 857 858 859 860 861 862
     863 864 865 866 867 868 870 871 872 874 875 878 880 883 884 886 888 890
     891 892 893 894 895 896 897 899 901 902 904 905 906 907 908 910 911 912
     913 914 915 916 917 918 920 921 922 923 925 927 928 929 930 933 934 937
     939 940 941 942 943 944 945 946 948 949 950 951 952 954 955 956 957]
    Test:  [  2   5   8  10  12  28  32  33  39  40  41  43  48  51  60  76  77  78
      82  83  85  91 102 103 104 105 109 112 115 117 120 123 132 134 136 138
     141 142 144 153 154 155 158 159 161 164 170 176 179 180 184 185 186 187
     191 195 199 201 202 207 212 215 217 224 225 227 229 238 243 248 249 251
     262 267 276 280 281 288 292 297 298 301 302 304 305 306 307 310 314 322
     324 326 332 341 344 348 350 351 353 356 368 369 370 371 376 379 383 394
     396 402 405 406 409 415 417 421 422 423 424 429 436 439 443 449 453 462
     463 471 475 480 485 489 491 504 506 517 518 519 525 533 536 553 554 557
     560 561 564 575 577 579 589 590 606 614 627 630 636 639 640 644 645 648
     649 657 660 662 668 670 675 681 689 690 697 700 702 706 713 715 718 719
     724 730 743 745 750 755 762 773 775 778 782 783 785 787 788 791 797 807
     815 816 817 821 823 824 825 826 827 828 829 833 843 844 851 852 855 869
     873 876 877 879 881 882 885 887 889 898 900 903 909 919 924 926 931 932
     935 936 938 947 953]
    Train: [  1   2   4   5   6   7   8  10  11  12  14  15  16  18  19  20  21  24
      25  26  27  28  30  32  33  35  36  37  38  39  40  41  42  43  44  47
      48  49  50  51  52  53  55  56  59  60  61  62  63  66  67  68  69  73
      74  75  76  77  78  79  80  81  82  83  85  86  87  88  90  91  92  93
      94  95  96  97  99 100 101 102 103 104 105 107 108 109 112 113 114 115
     116 117 120 121 122 123 124 126 127 128 129 130 131 132 133 134 135 136
     137 138 139 140 141 142 143 144 145 148 149 150 151 152 153 154 155 157
     158 159 161 162 164 166 167 168 170 172 173 174 176 177 178 179 180 181
     182 184 185 186 187 189 190 191 192 193 194 195 197 199 200 201 202 205
     206 207 208 209 210 212 214 215 217 218 219 220 221 223 224 225 227 228
     229 230 231 233 234 235 236 237 238 239 240 242 243 246 248 249 250 251
     256 257 259 261 262 266 267 268 269 272 273 275 276 277 279 280 281 282
     283 286 288 289 290 292 293 294 296 297 298 299 300 301 302 304 305 306
     307 308 309 310 311 312 314 315 316 319 321 322 323 324 325 326 328 332
     333 335 337 338 339 340 341 343 344 346 347 348 349 350 351 352 353 354
     355 356 359 360 362 363 364 365 366 368 369 370 371 373 374 375 376 377
     379 380 383 385 390 391 394 395 396 398 399 402 403 404 405 406 408 409
     410 415 416 417 419 420 421 422 423 424 425 426 428 429 430 431 433 434
     436 439 440 442 443 445 446 449 450 451 453 454 455 456 458 459 460 461
     462 463 466 467 469 470 471 472 473 474 475 476 477 479 480 481 483 484
     485 486 487 488 489 491 492 493 494 495 496 497 499 500 502 503 504 505
     506 507 508 509 510 511 512 513 515 517 518 519 520 521 522 525 527 528
     529 531 532 533 534 535 536 537 538 539 541 543 544 545 547 549 550 551
     552 553 554 555 556 557 558 560 561 562 563 564 567 569 571 572 573 575
     577 578 579 580 582 583 584 586 587 588 589 590 592 593 594 596 597 600
     602 604 605 606 607 610 611 612 613 614 615 616 617 620 621 622 624 625
     626 627 628 630 631 634 635 636 639 640 641 642 643 644 645 646 648 649
     651 652 653 654 655 656 657 658 659 660 661 662 664 665 666 667 668 669
     670 671 673 674 675 676 679 681 682 683 684 685 686 687 688 689 690 691
     692 694 695 696 697 700 701 702 705 706 708 709 710 712 713 714 715 716
     718 719 720 721 722 724 725 726 727 728 729 730 733 734 736 737 738 739
     740 743 744 745 746 747 748 749 750 751 752 753 755 758 759 760 762 763
     764 765 767 768 769 770 772 773 774 775 776 777 778 780 782 783 784 785
     786 787 788 789 791 792 793 794 795 796 797 799 800 801 802 803 805 807
     809 813 814 815 816 817 818 819 821 823 824 825 826 827 828 829 832 833
     838 840 841 842 843 844 845 847 849 851 852 853 854 855 856 857 860 861
     862 868 869 870 872 873 875 876 877 878 879 881 882 883 884 885 886 887
     888 889 891 892 893 894 895 896 897 898 900 901 902 903 904 905 907 909
     911 912 913 916 918 919 920 921 922 923 924 925 926 927 928 931 932 933
     934 935 936 938 940 941 944 945 946 947 948 951 952 953 954 956 957]
    Test:  [  0   3   9  13  17  22  23  29  31  34  45  46  54  57  58  64  65  70
      71  72  84  89  98 106 110 111 118 119 125 146 147 156 160 163 165 169
     171 175 183 188 196 198 203 204 211 213 216 222 226 232 241 244 245 247
     252 253 254 255 258 260 263 264 265 270 271 274 278 284 285 287 291 295
     303 313 317 318 320 327 329 330 331 334 336 342 345 357 358 361 367 372
     378 381 382 384 386 387 388 389 392 393 397 400 401 407 411 412 413 414
     418 427 432 435 437 438 441 444 447 448 452 457 464 465 468 478 482 490
     498 501 514 516 523 524 526 530 540 542 546 548 559 565 566 568 570 574
     576 581 585 591 595 598 599 601 603 608 609 618 619 623 629 632 633 637
     638 647 650 663 672 677 678 680 693 698 699 703 704 707 711 717 723 731
     732 735 741 742 754 756 757 761 766 771 779 781 790 798 804 806 808 810
     811 812 820 822 830 831 834 835 836 837 839 846 848 850 858 859 863 864
     865 866 867 871 874 880 890 899 906 908 910 914 915 917 929 930 937 939
     942 943 949 950 955]

```python
print(" -- SKLEARN VALIDACIÓN SIMPLE 75% GERMAN DATA -- ")
x_train, x_test, y_train, y_test = validacion_simple_sklearn(dataset3, 0.75)
print("TRAIN:\n", x_train)
print("TEST:\n", x_test)
```

     -- SKLEARN VALIDACIÓN SIMPLE 75% GERMAN DATA --
    TRAIN:
     [[ 0. 30.  0. ...  1.  0.  0.]
     [ 0. 12.  2. ...  1.  0.  0.]
     [ 0. 24.  1. ...  1.  1.  0.]
     ...
     [ 3. 36.  3. ...  2.  1.  0.]
     [ 3. 18.  4. ...  1.  0.  0.]
     [ 3. 48.  2. ...  1.  1.  0.]]
    TEST:
     [[ 3. 36.  2. ...  1.  1.  0.]
     [ 1. 24.  3. ...  1.  1.  0.]
     [ 3. 15.  3. ...  1.  0.  0.]
     ...
     [ 1. 12.  2. ...  1.  1.  0.]
     [ 1. 36.  3. ...  2.  1.  0.]
     [ 0. 48.  2. ...  1.  0.  0.]]

```python
print(" -- SKLEARN VALIDACIÓN CRUZADA K=4 GERMAN DATA -- ")
particiones = validacion_cruzada_sklearn(dataset3,4)
for particion in particiones:
    print(particion)
```

     -- SKLEARN VALIDACIÓN CRUZADA K=4 GERMAN DATA --
    Train: [  0   1   3   4   6   7   8   9  10  11  12  16  18  20  21  22  24  25
      26  27  29  30  31  32  33  34  35  36  37  38  39  40  42  43  44  46
      47  48  50  51  53  55  56  57  58  59  60  61  62  63  64  65  67  68
      69  72  73  74  77  78  79  82  84  86  87  91  92  93  94  95  96  97
      99 100 101 103 105 106 107 108 109 110 112 113 114 116 117 118 119 122
     123 124 126 127 129 130 131 132 133 135 136 138 139 140 141 143 144 145
     146 147 148 149 150 151 152 154 155 156 157 158 159 161 162 163 165 166
     168 170 171 172 175 177 181 182 183 184 185 186 187 188 189 190 191 192
     193 194 195 196 197 198 199 200 201 202 204 205 207 208 209 211 212 213
     214 215 216 219 222 223 224 225 226 229 230 231 232 233 234 235 237 238
     242 244 245 246 247 248 250 251 252 253 255 256 257 258 259 260 261 262
     263 265 266 267 268 269 271 272 273 274 275 276 277 278 279 280 282 283
     285 286 287 288 289 290 293 294 295 297 299 300 302 303 304 305 308 309
     310 311 312 313 316 318 320 322 323 324 325 326 327 329 330 332 334 335
     336 337 338 339 340 341 342 343 344 345 346 349 350 352 353 354 356 357
     358 360 362 363 364 367 368 369 370 373 374 375 376 377 378 379 380 381
     382 384 385 386 387 388 391 392 394 396 397 399 401 402 403 404 405 408
     411 412 413 415 416 417 418 419 420 421 422 423 424 425 426 428 429 430
     431 432 433 435 436 438 441 442 443 444 445 447 449 450 451 452 454 455
     456 458 461 462 463 465 466 467 468 469 470 471 473 475 476 477 479 480
     481 483 485 486 487 488 489 490 492 493 494 495 497 498 500 501 503 505
     506 507 508 509 510 512 513 514 515 516 517 518 519 520 522 523 525 527
     528 529 530 531 532 533 534 535 536 537 538 542 543 546 547 548 550 552
     553 554 555 556 557 558 559 560 562 564 565 566 567 568 569 573 574 575
     576 577 578 579 581 584 585 586 587 588 589 591 592 593 596 597 598 600
     602 603 604 605 606 607 609 610 612 615 616 617 618 619 620 621 622 623
     625 627 628 629 630 631 632 633 634 635 636 638 640 641 642 643 644 645
     647 649 650 651 652 654 655 656 657 659 661 662 663 664 665 666 667 669
     670 671 672 673 674 675 676 677 678 680 681 682 683 684 685 686 687 688
     689 690 692 694 696 697 699 702 703 704 708 709 710 712 713 714 717 718
     719 721 722 723 724 725 726 728 729 730 731 732 734 735 736 737 738 739
     740 742 743 744 745 746 747 748 750 751 752 753 754 755 756 757 758 762
     763 764 765 767 768 772 773 775 776 777 779 781 782 784 785 786 787 788
     789 790 791 792 793 794 795 796 797 798 799 800 801 802 806 807 808 809
     810 812 813 814 815 818 820 821 822 823 825 826 827 828 829 830 831 833
     835 836 837 838 839 840 842 843 844 845 846 849 850 851 853 855 857 858
     859 860 861 862 863 864 865 866 869 871 873 874 875 876 877 878 880 881
     883 884 885 886 887 890 891 893 894 896 898 899 900 901 902 904 905 906
     907 909 910 913 914 915 916 919 924 925 927 929 930 931 933 934 935 936
     937 939 940 941 942 943 944 945 947 948 949 950 951 952 953 955 956 958
     961 962 965 966 968 969 970 971 973 974 976 977 978 979 983 984 985 986
     987 988 989 990 991 993 994 995 996 997 998 999]
    Test:  [  2   5  13  14  15  17  19  23  28  41  45  49  52  54  66  70  71  75
      76  80  81  83  85  88  89  90  98 102 104 111 115 120 121 125 128 134
     137 142 153 160 164 167 169 173 174 176 178 179 180 203 206 210 217 218
     220 221 227 228 236 239 240 241 243 249 254 264 270 281 284 291 292 296
     298 301 306 307 314 315 317 319 321 328 331 333 347 348 351 355 359 361
     365 366 371 372 383 389 390 393 395 398 400 406 407 409 410 414 427 434
     437 439 440 446 448 453 457 459 460 464 472 474 478 482 484 491 496 499
     502 504 511 521 524 526 539 540 541 544 545 549 551 561 563 570 571 572
     580 582 583 590 594 595 599 601 608 611 613 614 624 626 637 639 646 648
     653 658 660 668 679 691 693 695 698 700 701 705 706 707 711 715 716 720
     727 733 741 749 759 760 761 766 769 770 771 774 778 780 783 803 804 805
     811 816 817 819 824 832 834 841 847 848 852 854 856 867 868 870 872 879
     882 888 889 892 895 897 903 908 911 912 917 918 920 921 922 923 926 928
     932 938 946 954 957 959 960 963 964 967 972 975 980 981 982 992]
    Train: [  2   4   5   6   8   9  10  11  12  13  14  15  16  17  18  19  23  24
      25  26  27  28  29  30  32  37  38  39  40  41  42  43  44  45  46  47
      48  49  52  54  55  56  57  58  59  60  61  62  64  65  66  67  68  70
      71  72  73  74  75  76  80  81  82  83  84  85  86  88  89  90  91  92
      93  94  95  96  97  98  99 100 101 102 103 104 105 106 110 111 112 113
     115 119 120 121 122 123 125 128 130 131 132 133 134 135 137 138 139 142
     143 144 145 146 148 150 151 152 153 154 155 158 159 160 163 164 165 166
     167 169 171 173 174 175 176 177 178 179 180 182 183 185 186 188 189 190
     192 193 195 196 197 198 200 201 202 203 204 205 206 207 210 211 212 213
     214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 231 232 233
     235 236 237 238 239 240 241 243 244 245 247 249 250 253 254 256 258 260
     261 262 263 264 266 267 268 270 271 273 275 277 278 280 281 282 283 284
     288 289 290 291 292 293 295 296 298 301 302 304 305 306 307 308 309 311
     312 313 314 315 316 317 319 320 321 323 324 326 327 328 329 330 331 332
     333 334 337 341 343 345 346 347 348 349 350 351 354 355 356 357 359 360
     361 362 363 364 365 366 368 371 372 374 375 376 377 380 381 382 383 385
     386 387 389 390 391 392 393 394 395 396 397 398 399 400 401 402 404 406
     407 409 410 411 413 414 415 416 417 418 419 420 422 423 424 426 427 428
     429 431 432 434 435 437 439 440 441 442 443 444 445 446 447 448 449 450
     452 453 455 457 458 459 460 461 462 463 464 465 466 468 469 472 473 474
     475 476 477 478 479 482 483 484 485 486 488 491 492 493 495 496 497 498
     499 500 501 502 503 504 505 506 507 509 510 511 513 515 516 517 519 521
     522 523 524 526 527 530 531 533 535 537 538 539 540 541 544 545 547 549
     551 552 553 554 555 556 557 558 560 561 562 563 564 566 567 569 570 571
     572 573 576 578 579 580 581 582 583 585 586 587 588 589 590 591 592 594
     595 597 599 600 601 603 604 605 606 608 610 611 613 614 615 616 617 618
     619 620 622 623 624 625 626 629 630 632 633 634 636 637 638 639 640 641
     643 644 645 646 647 648 650 651 653 654 658 659 660 662 665 668 670 671
     672 673 674 675 678 679 680 682 684 687 688 690 691 693 694 695 697 698
     699 700 701 702 703 704 705 706 707 709 711 713 714 715 716 717 720 721
     722 723 724 727 728 729 730 731 732 733 734 735 736 737 739 741 742 743
     747 748 749 750 751 752 753 755 756 757 758 759 760 761 762 764 765 766
     767 768 769 770 771 772 773 774 775 777 778 780 783 784 785 789 790 791
     792 793 795 796 797 798 799 801 802 803 804 805 806 807 809 811 812 813
     814 816 817 818 819 820 821 822 823 824 826 828 830 831 832 833 834 835
     837 840 841 843 844 845 846 847 848 849 852 853 854 856 857 861 862 864
     865 867 868 869 870 871 872 873 874 875 877 879 881 882 883 886 888 889
     891 892 894 895 896 897 898 899 901 902 903 906 907 908 911 912 917 918
     919 920 921 922 923 924 925 926 928 929 930 932 933 935 936 937 938 939
     940 941 942 943 946 947 948 950 951 952 953 954 955 956 957 958 959 960
     961 962 963 964 966 967 968 970 971 972 973 975 976 978 980 981 982 984
     987 988 989 991 992 993 994 995 996 997 998 999]
    Test:  [  0   1   3   7  20  21  22  31  33  34  35  36  50  51  53  63  69  77
      78  79  87 107 108 109 114 116 117 118 124 126 127 129 136 140 141 147
     149 156 157 161 162 168 170 172 181 184 187 191 194 199 208 209 229 230
     234 242 246 248 251 252 255 257 259 265 269 272 274 276 279 285 286 287
     294 297 299 300 303 310 318 322 325 335 336 338 339 340 342 344 352 353
     358 367 369 370 373 378 379 384 388 403 405 408 412 421 425 430 433 436
     438 451 454 456 467 470 471 480 481 487 489 490 494 508 512 514 518 520
     525 528 529 532 534 536 542 543 546 548 550 559 565 568 574 575 577 584
     593 596 598 602 607 609 612 621 627 628 631 635 642 649 652 655 656 657
     661 663 664 666 667 669 676 677 681 683 685 686 689 692 696 708 710 712
     718 719 725 726 738 740 744 745 746 754 763 776 779 781 782 786 787 788
     794 800 808 810 815 825 827 829 836 838 839 842 850 851 855 858 859 860
     863 866 876 878 880 884 885 887 890 893 900 904 905 909 910 913 914 915
     916 927 931 934 944 945 949 965 969 974 977 979 983 985 986 990]
    Train: [  0   1   2   3   5   6   7  10  12  13  14  15  17  19  20  21  22  23
      25  27  28  29  30  31  32  33  34  35  36  37  38  39  41  42  44  45
      47  48  49  50  51  52  53  54  56  57  59  60  62  63  64  65  66  67
      68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85
      86  87  88  89  90  94  95  96  97  98  99 102 103 104 106 107 108 109
     110 111 114 115 116 117 118 120 121 122 124 125 126 127 128 129 131 134
     135 136 137 138 139 140 141 142 144 147 148 149 150 151 152 153 154 155
     156 157 158 159 160 161 162 164 166 167 168 169 170 172 173 174 175 176
     178 179 180 181 182 184 185 187 188 189 191 194 195 196 198 199 200 201
     203 204 205 206 208 209 210 211 215 216 217 218 220 221 222 225 226 227
     228 229 230 233 234 236 237 238 239 240 241 242 243 244 246 248 249 250
     251 252 254 255 256 257 259 260 264 265 266 269 270 271 272 273 274 275
     276 277 278 279 280 281 282 284 285 286 287 289 290 291 292 294 296 297
     298 299 300 301 302 303 304 305 306 307 310 311 313 314 315 316 317 318
     319 321 322 323 325 326 328 331 333 335 336 338 339 340 341 342 343 344
     345 346 347 348 349 350 351 352 353 354 355 356 358 359 360 361 362 364
     365 366 367 368 369 370 371 372 373 375 376 378 379 382 383 384 387 388
     389 390 392 393 394 395 396 397 398 399 400 403 404 405 406 407 408 409
     410 412 413 414 417 421 424 425 426 427 428 429 430 431 432 433 434 436
     437 438 439 440 445 446 447 448 451 453 454 455 456 457 459 460 464 465
     467 470 471 472 473 474 476 477 478 480 481 482 483 484 487 489 490 491
     492 493 494 496 497 499 501 502 504 508 510 511 512 513 514 517 518 519
     520 521 524 525 526 527 528 529 531 532 534 535 536 539 540 541 542 543
     544 545 546 547 548 549 550 551 553 554 557 559 561 563 565 567 568 569
     570 571 572 574 575 577 579 580 582 583 584 585 586 587 588 589 590 593
     594 595 596 597 598 599 600 601 602 607 608 609 610 611 612 613 614 620
     621 622 623 624 626 627 628 630 631 632 635 636 637 639 640 642 646 647
     648 649 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667
     668 669 670 675 676 677 679 681 682 683 684 685 686 688 689 690 691 692
     693 695 696 698 700 701 702 704 705 706 707 708 710 711 712 714 715 716
     717 718 719 720 721 722 724 725 726 727 728 729 730 733 735 738 739 740
     741 742 743 744 745 746 747 748 749 750 752 753 754 755 756 757 759 760
     761 762 763 766 767 769 770 771 774 775 776 778 779 780 781 782 783 786
     787 788 790 792 794 795 796 800 803 804 805 806 807 808 810 811 814 815
     816 817 818 819 820 822 824 825 826 827 828 829 831 832 834 835 836 837
     838 839 841 842 845 847 848 850 851 852 853 854 855 856 858 859 860 861
     862 863 865 866 867 868 870 872 873 876 878 879 880 882 883 884 885 887
     888 889 890 892 893 895 896 897 898 900 902 903 904 905 907 908 909 910
     911 912 913 914 915 916 917 918 919 920 921 922 923 924 926 927 928 929
     931 932 933 934 935 937 938 939 940 941 944 945 946 947 948 949 953 954
     955 957 958 959 960 963 964 965 967 969 972 974 975 976 977 979 980 981
     982 983 984 985 986 989 990 992 993 996 998 999]
    Test:  [  4   8   9  11  16  18  24  26  40  43  46  55  58  61  91  92  93 100
     101 105 112 113 119 123 130 132 133 143 145 146 163 165 171 177 183 186
     190 192 193 197 202 207 212 213 214 219 223 224 231 232 235 245 247 253
     258 261 262 263 267 268 283 288 293 295 308 309 312 320 324 327 329 330
     332 334 337 357 363 374 377 380 381 385 386 391 401 402 411 415 416 418
     419 420 422 423 435 441 442 443 444 449 450 452 458 461 462 463 466 468
     469 475 479 485 486 488 495 498 500 503 505 506 507 509 515 516 522 523
     530 533 537 538 552 555 556 558 560 562 564 566 573 576 578 581 591 592
     603 604 605 606 615 616 617 618 619 625 629 633 634 638 641 643 644 645
     650 651 671 672 673 674 678 680 687 694 697 699 703 709 713 723 731 732
     734 736 737 751 758 764 765 768 772 773 777 784 785 789 791 793 797 798
     799 801 802 809 812 813 821 823 830 833 840 843 844 846 849 857 864 869
     871 874 875 877 881 886 891 894 899 901 906 925 930 936 942 943 950 951
     952 956 961 962 966 968 970 971 973 978 987 988 991 994 995 997]
    Train: [  0   1   2   3   4   5   7   8   9  11  13  14  15  16  17  18  19  20
      21  22  23  24  26  28  31  33  34  35  36  40  41  43  45  46  49  50
      51  52  53  54  55  58  61  63  66  69  70  71  75  76  77  78  79  80
      81  83  85  87  88  89  90  91  92  93  98 100 101 102 104 105 107 108
     109 111 112 113 114 115 116 117 118 119 120 121 123 124 125 126 127 128
     129 130 132 133 134 136 137 140 141 142 143 145 146 147 149 153 156 157
     160 161 162 163 164 165 167 168 169 170 171 172 173 174 176 177 178 179
     180 181 183 184 186 187 190 191 192 193 194 197 199 202 203 206 207 208
     209 210 212 213 214 217 218 219 220 221 223 224 227 228 229 230 231 232
     234 235 236 239 240 241 242 243 245 246 247 248 249 251 252 253 254 255
     257 258 259 261 262 263 264 265 267 268 269 270 272 274 276 279 281 283
     284 285 286 287 288 291 292 293 294 295 296 297 298 299 300 301 303 306
     307 308 309 310 312 314 315 317 318 319 320 321 322 324 325 327 328 329
     330 331 332 333 334 335 336 337 338 339 340 342 344 347 348 351 352 353
     355 357 358 359 361 363 365 366 367 369 370 371 372 373 374 377 378 379
     380 381 383 384 385 386 388 389 390 391 393 395 398 400 401 402 403 405
     406 407 408 409 410 411 412 414 415 416 418 419 420 421 422 423 425 427
     430 433 434 435 436 437 438 439 440 441 442 443 444 446 448 449 450 451
     452 453 454 456 457 458 459 460 461 462 463 464 466 467 468 469 470 471
     472 474 475 478 479 480 481 482 484 485 486 487 488 489 490 491 494 495
     496 498 499 500 502 503 504 505 506 507 508 509 511 512 514 515 516 518
     520 521 522 523 524 525 526 528 529 530 532 533 534 536 537 538 539 540
     541 542 543 544 545 546 548 549 550 551 552 555 556 558 559 560 561 562
     563 564 565 566 568 570 571 572 573 574 575 576 577 578 580 581 582 583
     584 590 591 592 593 594 595 596 598 599 601 602 603 604 605 606 607 608
     609 611 612 613 614 615 616 617 618 619 621 624 625 626 627 628 629 631
     633 634 635 637 638 639 641 642 643 644 645 646 648 649 650 651 652 653
     655 656 657 658 660 661 663 664 666 667 668 669 671 672 673 674 676 677
     678 679 680 681 683 685 686 687 689 691 692 693 694 695 696 697 698 699
     700 701 703 705 706 707 708 709 710 711 712 713 715 716 718 719 720 723
     725 726 727 731 732 733 734 736 737 738 740 741 744 745 746 749 751 754
     758 759 760 761 763 764 765 766 768 769 770 771 772 773 774 776 777 778
     779 780 781 782 783 784 785 786 787 788 789 791 793 794 797 798 799 800
     801 802 803 804 805 808 809 810 811 812 813 815 816 817 819 821 823 824
     825 827 829 830 832 833 834 836 838 839 840 841 842 843 844 846 847 848
     849 850 851 852 854 855 856 857 858 859 860 863 864 866 867 868 869 870
     871 872 874 875 876 877 878 879 880 881 882 884 885 886 887 888 889 890
     891 892 893 894 895 897 899 900 901 903 904 905 906 908 909 910 911 912
     913 914 915 916 917 918 920 921 922 923 925 926 927 928 930 931 932 934
     936 938 942 943 944 945 946 949 950 951 952 954 956 957 959 960 961 962
     963 964 965 966 967 968 969 970 971 972 973 974 975 977 978 979 980 981
     982 983 985 986 987 988 990 991 992 994 995 997]
    Test:  [  6  10  12  25  27  29  30  32  37  38  39  42  44  47  48  56  57  59
      60  62  64  65  67  68  72  73  74  82  84  86  94  95  96  97  99 103
     106 110 122 131 135 138 139 144 148 150 151 152 154 155 158 159 166 175
     182 185 188 189 195 196 198 200 201 204 205 211 215 216 222 225 226 233
     237 238 244 250 256 260 266 271 273 275 277 278 280 282 289 290 302 304
     305 311 313 316 323 326 341 343 345 346 349 350 354 356 360 362 364 368
     375 376 382 387 392 394 396 397 399 404 413 417 424 426 428 429 431 432
     445 447 455 465 473 476 477 483 492 493 497 501 510 513 517 519 527 531
     535 547 553 554 557 567 569 579 585 586 587 588 589 597 600 610 620 622
     623 630 632 636 640 647 654 659 662 665 670 675 682 684 688 690 702 704
     714 717 721 722 724 728 729 730 735 739 742 743 747 748 750 752 753 755
     756 757 762 767 775 790 792 795 796 806 807 814 818 820 822 826 828 831
     835 837 845 853 861 862 865 873 883 896 898 902 907 919 924 929 933 935
     937 939 940 941 947 948 953 955 958 976 984 989 993 996 998 999]

Ejemplos del clasificador Naive Bayes SKLearn - Validación Simple :

```python
print("-- Lenses.data -- ")
print("-- CON LAPLACE -- ")
x_train, x_test, y_train, y_test = validacion_simple_sklearn(dataset1, 0.7)
pred = nb_sklearn(x_train, y_train, x_test)
errornb = error(pred, y_test)
print("ERROR OBTENIDO:", errornb)

print("-- SIN LAPLACE -- ")
pred = nb_sklearn(x_train, y_train, x_test)
errornb = error(pred, y_test)
print("ERROR OBTENIDO:", errornb)
```

    -- Lenses.data --
    -- CON LAPLACE --
    ERROR OBTENIDO: 0.25
    -- SIN LAPLACE --
    ERROR OBTENIDO: 0.25

```python
print("-- Tic-tac-toe.data -- ")
print("-- CON LAPLACE -- ")
x_train, x_test, y_train, y_test = validacion_simple_sklearn(dataset2, 0.8)
pred = nb_sklearn(x_train, y_train, x_test)
errornb = error(pred, y_test)
print("ERROR OBTENIDO:", errornb)

print("-- SIN LAPLACE -- ")
pred = nb_sklearn(x_train, y_train, x_test, "Multinomial",False)
errornb = error(pred, y_test)
print("ERROR OBTENIDO:", errornb)
```

    -- Tic-tac-toe.data --
    -- CON LAPLACE --
    ERROR OBTENIDO: 0.36458333333333337
    -- SIN LAPLACE --
    ERROR OBTENIDO: 0.36458333333333337

```python
print(" -- German.data -- ")
x_train, x_test, y_train, y_test = validacion_simple_sklearn(dataset3, 0.75)
pred = nb_sklearn(x_train, y_train, x_test,"Gaussian")
errornb = error(pred, y_test)
print("ERROR OBTENIDO:", errornb)

# En este caso no hay distincion entre laplace o no, ya que el Gaussian no lo utiliza.
# Utilizamos Gaussian porque tiene atributos Continuos

```

     -- German.data --
    ERROR OBTENIDO: 0.256

Ejemplos del clasificador Naive Bayes SKLearn - Validación Cruzada :

```python
print("-- Lenses.data -- ")
X = dataset.datos[:,:-1]
y = dataset.datos[:,-1]

print(" -- CON LAPLACE -- ")
aciertos, desv = nb_sklearn_validacion_cruzada(X, y, 4, "Multinomial")
print("ERROR OBTENIDO",1 - np.mean(aciertos))
print("DESV. TIPICA", desv)

print(" -- SIN LAPLACE -- ")
aciertos, desv = nb_sklearn_validacion_cruzada(X, y, 4, "Multinomial", False)
print("ERROR OBTENIDO",1 - np.mean(aciertos))
print("DESV. TIPICA", desv)
```

    -- Lenses.data --
     -- CON LAPLACE --
    ERROR OBTENIDO 0.3380952380952381
    DESV. TIPICA 0.04068573212055968
     -- SIN LAPLACE --
    ERROR OBTENIDO 0.2607142857142857
    DESV. TIPICA 0.108868380455661

```python
print(" -- Tic-tac-toe.data -- ")
X = dataset2.datos[:,:-1]
y = dataset2.datos[:,-1]

print(" -- CON LAPLACE -- ")
aciertos, desv = nb_sklearn_validacion_cruzada(X, y, 4, "Multinomial")
print("ERROR OBTENIDO",1 - np.mean(aciertos))
print("DESV. TIPICA", desv)

print(" -- SIN LAPLACE -- ")
aciertos, desv = nb_sklearn_validacion_cruzada(X, y, 4, "Multinomial", False)
print("ERROR OBTENIDO",1 - np.mean(aciertos))
print("DESV. TIPICA", desv)
```

     -- Tic-tac-toe.data --
     -- CON LAPLACE --
    ERROR OBTENIDO 0.3507017085076708
    DESV. TIPICA 0.014643056198736864
     -- SIN LAPLACE --
    ERROR OBTENIDO 0.3507017085076708
    DESV. TIPICA 0.014643056198736864

```python
print(" -- German.data --")
X = dataset3.datos[:,:-1]
y = dataset3.datos[:,-1]

aciertos, desv = nb_sklearn_validacion_cruzada(X, y, 4, "Gaussian")
print("ERROR OBTENIDO",1 - np.mean(aciertos))
print("DESV. TIPICA", desv)

# De nuevo no hay distincio entre Laplace
```

     -- German.data --
    ERROR OBTENIDO 0.266
    DESV. TIPICA 0.024248711305964305

Puntualización:

En el caso de "german.data" los atributos no son continuos todos ellos, para refinar la clasificación lo máximo posible sería necesario clasificar utilizando MultinomialNB los atributos discretos y GaussianNB clasificaría los continuos. En nuestro caso, no hemos llevado a cabo esa división por falta de tiempo, hemos utilizado la implementación de MultinomialNB(), como en los demás casos en los que solo hay atributos discretos.

Apartado 4:Evaluación de hipótesis mediante Análisis ROC

La curva ROC es una representación gráfica de la sensibilidad a la especifidad de un clasificador, en esta práctica este análisis lo vamos a realizar del clasificador implementado que es Naive-Bayes. En este gráfico se representan los verdaderos postivos frente a los falsos positivos.

Es una herramienta que nos proporciona la selección de modelos más óptimos y descartar los menos óptimos.

A continuación, mostraremos la implementación que hemos realizado en para crear este análisis ROC:

El primer paso es crear la  matriz de confusión, donde esta matriz la hemos utilizado con un método de la libreria de sklearn que nos dibuja la matriz de confusion para los datos que queremos del conjunto de datos. Despues de haber creado la matriz calculamos los valores de verdaderos positivos, falsos positivos, falsos negativos y verdaderos negativos y, por último, calculamos las tasas de la matriz de confusion y las guardamos en una lista.

En segundo lugar, debemos sacar la gráfica de la curva ROC. Esta gráfica lo sacamos con la libreria pyplot, mas concretamente, con matplotlib. Donde en el eje Y pondremos los valores TPR y en el eje de las X pondremos los valores de FPR.

La manera de ejecutar el clasificador varía con respecto a cuando solamente queremos obtener el error, debido a nuestra implementación de la matriz de confusión y la curva ROC.

Vamos a generar nuevas particiones para que así pueda haber más variedad.

 CURVAS ROC - Clasificador Naive Bayes propio

```python
print(" -- CURVA ROC TIC-TAC-TOE VAL. SIMPLE --")
nb = ClasificadorNaiveBayes(True)
nb.entrenamiento(dataset2,estrategia_simple_2.particiones[0].indicesTrain)
pred = nb.clasifica(dataset2,estrategia_simple_2.particiones[0].indicesTest)
matriz = nb.matrizConfusion(dataset2,estrategia_simple_2.particiones[0].indicesTest,pred)
print(" -- MATRIZ DE CONFUSION -- ")
print(matriz)
nb.curvaROC()
```

```python
print(" -- CURVA ROC GERMAN VAL. SIMPLE --")
nb = ClasificadorNaiveBayes(True)
nb.entrenamiento(dataset3,estrategia_simple_3.particiones[0].indicesTrain)
pred = nb.clasifica(dataset3,estrategia_simple_3.particiones[0].indicesTest)
matriz = nb.matrizConfusion(dataset3,estrategia_simple_3.particiones[0].indicesTest,pred)
print(" -- MATRIZ DE CONFUSION -- ")
print(matriz)
nb.curvaROC()
```

```python
print(" -- CURVA ROC TIC-TAC-TOE VAL. CRUZADA --")
nb = ClasificadorNaiveBayes(True)

i = 1
for particion in estrategia_cruzada_2.particiones:
    nb.entrenamiento(dataset2, particion.indicesTrain)
    pred = nb.clasifica(dataset2, particion.indicesTest)
    matriz = nb.matrizConfusion(dataset2, particion.indicesTest, pred)
    print("MATRIZ DE CONFUSION" , str(i))
    print(matriz)
    i += 1
nb.curvaROC()
```

```python
print(" -- CURVA ROC GERMAN VAL. CRUZADA --")
nb = ClasificadorNaiveBayes(True)
i = 1
for particion in estrategia_cruzada_3.particiones:
    nb.entrenamiento(dataset3, particion.indicesTrain)
    pred = nb.clasifica(dataset3, particion.indicesTest)
    matriz = nb.matrizConfusion(dataset3, particion.indicesTest, pred)
    print("MATRIZ DE CONFUSION" , str(i))
    print(matriz)
    i += 1
nb.curvaROC()
```

```python
print(" -- ANÁLISIS ROC GERMAN SKLEARN VAL. SIMPLE -- ")
X_train, X_test, y_train, y_test = validacion_simple_sklearn(dataset2, 0.8)
pred =  nb_sklearn(X_train, y_train, X_test, "Gaussian")

matriz, tpr, fpr = matriz_confusion_sklearn(pred,y_test)
print("MATRIZ CONFUSION")
print(matriz)
curvaROC_sklearn(fpr,tpr)
```

```python
print (" -- ANÁLISIS ROC TIC-TAC-TOE SKLEARN VAL. SIMPLE -- ")
X_train, X_test, y_train, y_test = validacion_simple_sklearn(dataset3, 0.8)
pred =  nb_sklearn(X_train, y_train, X_test)

matriz, tpr, fpr = matriz_confusion_sklearn(pred,y_test)
print("MATRIZ CONFUSION")
print(matriz)
curvaROC_sklearn(fpr,tpr)
```

Solo se han realizado análisis ROC para el caso de los datasets "tic-tac-toe" y "german", ya que la clasificación en ambos casos es binaria, mientras que el dataset "lenses.data" clasifica entre 3 clases distintas.

En todos los casos se ha utilizado la corrección de Laplace, ya que generamos menos gráficas y los valores aplicando Laplace en "German.data" y "Tic-tac-toe.data" son muy similares que en el caso de no aplicarlos.

Para el caso de SKLearn, solamente se ha analizado utilizando validación simple, ya que para el caso de validación cruzada, no hemos visto ninguna función que nos de la predicción por partición y sería necesario para estimar correctamente las tasas de falsos positivos y verdaderos positivos.

 NAIVE BAYES PROPIO - VAL. SIMPLE

    DATOS

    LAPLACE
    ERROR
    DESV. TÍPICA

    Lenses
    Si
    0.375
    -

    No
    0.125
    -

    Tic-Tac-Toe
    Si
    0.295

    -

    No
    0.309
    -

    German
    Si
    0.24
    -

    No
    0.243

    -

NAIVE BAYES PROPIO - VAL. CRUZADA

    DATOS

    LAPLACE
    ERROR
    DESV. TÍPICA

    Lenses
    Si
    0.25
    0.083

    No
    0.417

    0.186

    Tic-Tac-Toe
    Si
    0.296
    0.027

    No
    0.286
    0.003

    German
    Si
    0.244
    0.032

    No
    0.254
    0.015

NAIVE BAYES SKLEARN - VALIDACION SIMPLE

    DATOS

    LAPLACE
    ERROR
    DESV. TÍPICA

    Lenses
    Si
    0.25
    -

    No
    0.25

    -

    Tic-Tac-Toe
    Si
    0.365
    -

    No
    0.365
    -

    German
    Si
    0.256
    -

    No
    -
    -

NAIVE BAYES SKLEARN - VALIDACION CRUZADA

    DATOS

    LAPLACE
    ERROR
    DESV. TÍPICA

    Lenses
    Si
    0.338
    0.041

    No
    0.261

    0.109

    Tic-Tac-Toe
    Si
    0.351
    0.015

    No
    0.351
    0.015

    German
    Si
    0.266
    0.024

    No
    -
    -

 CONCLUSIONES

En vista a los resultados obtenidos podemos observar que nuestro clasificador obtiene mejores resultados que la implementación de SKLearn, en general. Esto puede ser debido a que no hemos sabido explotar la potencia que tiene SKLearn, ya que las funciones tienen muchos parámetros que no hemos tenido tiempo para comprender bien y probarlos. Seguramente, si hubiesemos optimizado esas funcionalidades para cada uno de los datasets los resultados habrían sido muy parecidos o ligeramente mejores que los nuestros.

En cuanto a las ejecuciones con Laplace y sin él, en el único dataset en el que es realmente relevante es en el de Lenses.data ya que tiene pocos ejemplos y es fácil que alguno de ellos haga que aparezca un 0 en alguna de las casillas de las tablas de probabilidades. En el caso de SKLearn, podemos observar que hay veces que cuando no tenemos tablas de probabilidad por atributo con 0's hay veces que incluso penaliza un poco, aunque la diferencia es mínima.

Por último, en cuanto a las curvas ROC, creemos que son algo engañosas, ya que hay casos en los que los Verdaderos negativos provocan que el punto se encuentre por debajo de la línea. Esto nos puede llevar a pensar que nuestro clasificador no es bueno, pero obtenemos tasas de error razonables, este fenómeno es debido a que la tasa de Verdaderos negativos realmente indica que nuestro modelo está clasificando la clase correctamente, pero a la hora de generar la matriz de confusión no se está comparando con la clase que se acierta, si no con la contraria. Por todo lo anterior, el punto "ROC" aparece, aunque en realidad los resultados no son tan malo como parece si solo miramos la curva.

Un poco al hilo de lo último, quizá sería mejor medir nuestro clasificador por la Accuracy, que se define con la siguiente fórmula:

\begin{equation}
Accuracy =  \frac{TP + TN}{T + TN + FP + FN}
\end{equation}

Dandonos una medida más real de la precisión de nuestro clasificador.

```python

```