AdrianArnaiz / TFG-Neurodegenerative-Disease-Detection

Uso de biomarcadores extraídos de la voz para la detección de la enfermedad del Parkinson
https://adrianarnaiz.github.io/TFG-Neurodegenerative-Disease-Detection/
2 stars 5 forks source link

Arreglo clase experimenter.py #34

Closed AdrianArnaiz closed 5 years ago

AdrianArnaiz commented 5 years ago

Detectado Fallo en Experimenter.py

Fallo: FIT del GRIDSEARCH con TODO EL CONJUNTO DE DATOS. Se establecen los mejores parametros con los todos los datos: ya están vistos. Solución: Hacer crossvalidation para la selección de parámetros. Arreglo:

AdrianArnaiz commented 5 years ago

Observaciones del arreglo en experimenter

Debemos realizar Nested cross-validation. Esto es debido a que si realizamos el ajuste de parámetros con todos los datos, estamos haciendo 'trampas' ya que hemos visto los datos. Se explica de manera detallada aquí: https://scikit-learn.org/stable/auto_examples/model_selection/plot_nested_cross_validation_iris.html

NestedPython _(Fuente imagen: https://scikit-learn.org/stable/tutorial/statistical_inference/model_selection.html#grid-search-and-cross-validated-estimators)_

Al arreglar eso, perdemos el acceso a los mejores parámetros y a los datos internos como splits_test_score del objeto gridSearch. Por lo tanto, acarrea más cambios en la clase y en los experimentos ya que nuestro experimenter.py se basaba en la devolución de un diccionario con los atributos que contenía experimenter.py y a partir de ahí visualizábamos, listábamos, etc.

AdrianArnaiz commented 5 years ago

También se debe repetir el análisis y la documentación de los resultados, ya que estos cambian para la mayoría de experimentos.

AdrianArnaiz commented 5 years ago

Añadido otro cambio a función gridSearchPipe #38

Se ha añadido la normalización al pipeline en vez de hacerla en todo el conjunto de datos X.

Añadimos al pipe o le creamos. Explicado en notebooks y clase:

 if normalizar:
    if isinstance(pipe, Pipeline):
        pipe.steps.insert(0,['norm',MinMaxScaler()])
    else:
        pipe = Pipeline([('norm', MinMaxScaler()), ('clf', pipe)])
        if isinstance(pg, list):
            #para pasarle a dict: algunos paramgrids les definimos como [dict(params)]
            pg=pg[0]    
        for k in pg:
            pg['clf__'+k]=pg.pop(k)`