2 votos

Cómo tratar los valores NAN en mi conjunto de datos de formación

Soy nuevo en la teledetección. Estoy trabajando en un proyecto en el que necesito realizar una clasificación de la cubierta del suelo. Para esta tarea quiero utilizar el aprendizaje automático (python). Mis características contienen 'BANDS' (6 bandas), 'NDVI', 'NDWI', y 'NORM' extraídas de las imágenes centinela de nivel 1C. Hice un enmascaramiento de las nubes y luego una interpolación (para rellenar los huecos) y, finalmente, muestreé los datos y los dividí en conjuntos de datos de entrenamiento y de prueba. También he utilizado una máscara para eliminar las muestras en las que tengo "0", lo que significa esencialmente "sin datos":

# remove points with no reference from training (so we dont train to recognize "no data")
mask_train     = labels_train == 0
features_train = features_train[~mask_train]
labels_train   = labels_train[~mask_train]

# remove points with no reference from test (so we dont validate on "no data", which doesn't make sense)
mask_test     = labels_test == 0
features_test = features_test[~mask_test]
labels_test   = labels_test[~mask_test]

Sin embargo, para estar más seguro, he comprobado los valores NAN utilizando: np.isnan(train_test).any() (tanto para los conjuntos de datos de entrenamiento como para los de prueba) descubrí que mis características tenían valores NAN. ¿Alguna idea de cómo resolver esto? y ¿por qué tengo valores NAN en primer lugar?

Editar: Este es el aspecto de mi conjunto de datos ( muchos valores NAN): enter image description here

1voto

Maxime Labelle Puntos 1786

Nodata y Nan no son lo mismo. Un valor Nodata es un valor que se asigna a ciertos píxeles en el caso de que no haya sido posible la observación (por ejemplo, debido a la nubosidad). Esto puede ser hecho a propósito por usted o por el creador de los datos con los que trabaja.

Un Nan puede surgir por muchas razones, pero la mayoría de las veces ocurre porque un algoritmo intenta hacer algo en un conjunto de datos que no es posible. Por ejemplo:

import numpy as np
a = np.arange(9)
b = a / 0
print (b) # will be nans or infinate (inf)

Volviendo a tu caso de uso, cuando calculas el NDVI puedes encontrarte con que nir+rojo es 0. Esto dará como resultado un Nan porque dividirás por 0.

Puede detectar y tratar los valores Nans (e Infinitos) de la siguiente manera:

import numpy as np
band1 = np.random.random(10)
nodatavalue = -999
# assign values in the array to nodata, nan and inf
band1[1] = nodata
band1[2] = np.nan
band1[3] = np.inf
mask = np.where(np.logical_or(band1 == nodata, np.logical_not(np.isfinite(band1))), 1, 0)
band1_out = np.where(mask == 1, nodata, band1)
print(band1_out)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X