# PredTech El producto Predictivo ofrece Estimaciones de productividad y calidad del cultivo. Esta información está disponible en diferentes formatos dependiendo de las necesidades de cada entidad. Actualmente HEMAV cuenta con una infraestructura de IA que trabaja para los cultivos CAÑA DE AZUCAR, MAIZ, SOJA, ALGODÓN, REMOLACHA, VIÑA y PALMA. Los pasos para poder disponer de este servicio son los siguientes. ## 1. Datos de entrada al modelo Los modelos deben contar con la mayor cantidad de datos de entrada posibles. Estos se dividien en diferentes bloques. Siendo un total de poder contar con 140 variables, asociando a cada modelo las más importantes segun los datos de entrada. ### 1. Datos de cliente (datos reales) Este es el bloque de mayor importancia. Los modelos reflejan la calidad de los datos. Si no existen una cantidad suficiente de datos, o estos no tienen una cierta calidad, a la hora de entrenar los modelos pueden no llegar a los resultados esperados. En este apartado nos referimos a los datos que queremos que el modelo aprenda (producción, calidad..) y es el punto de partida para la gestión de datos (fecha de inicio de camapaña, plantación y momento de cosecha). Este apartado cuenta con 40 datos posibles a rellenar, siendo los más importantes: - external_reference_id: Identificador único por parcela. - season_label: Agrupamiento de gestión. - latitude: Georreferenciación de la parcela. - longitude: Georreferenciación de la parcela. - type_id: Cultivo. - sub_type_id: Variedad. - init_date: Fecha de inicio de la campaña (start_date o plantation_date dependiendo del cultivo). - harvest_or_estimation_date: Fecha. - cut_number: Numero de corte para cultivos como la caña de azucar o la palma. - production_per_hectare_real: Producción real obtenida. Variable clave para la estimación del modelo de PRODUCCIÓN. - prodph_lastseason: Variable calculada por nosotros, evaluando siempre para esa parecela la producción obtenida en la campaña anterior. - atr_real: Atr real obtenida. Variable clave para la estimación del modelo de ATR. - atr_lastseason: Variable calculada por nosotros, evaluando siempre para esa parecela la producción obtenida en la campaña anterior. - pol_real: Polarización real obtenida. Variable clave para la estimación del modelo de POL - sac_real: Sacarosa real obtenida. Variable clave para la estimación del modelo de SAC. - sac_lastseason: Variable calculada por nosotros, evaluando siempre para esa parecela la producción obtenida en la campaña anterior. - n_bunches_real: Nº de racimos. Variable clave para la estimación del modelo de N_BUNCHES. - plants_per_hectare: Nº de plantas por hectárea. Variable importante. - irrigation_type: Sistema de riego empleado en la parcela. - days: Días de cultivo. - week: Semana de cultivo. Todas estas variables definiran la calidad del modelo solicitado. Es por ello que se realizan una serie de revisiones que se verán en el apartado de revisión de datos. ### 2. Datos espectrales + radar Al set de datos del modelo, se incorpora para cada fecha a nivel semana el valor medio de la parcela de los siguientes valores espectrales y radar: - cloudcoverage: % de nubes de la parcela para el día de visita. Solo aplicable para los parámetro espectrales. - sigma0: Variable radar. - sigma0_std: Desviación estandar de la variable radar. Nos muestra la uniformdidad de la parcela. - ndre: Indice nitrogeno - clorofilas. - ndvi: Indice de vegetación. - ndvi_std: Desvaición estandar del indice de vegetación. - b1: Bandas espectrales de sentinel 2. - b2: Bandas espectrales de sentinel 2. - b3: Bandas espectrales de sentinel 2. - b4: Bandas espectrales de sentinel 2. - b5: Bandas espectrales de sentinel 2. - b6: Bandas espectrales de sentinel 2. - b7: Bandas espectrales de sentinel 2. - b8: Bandas espectrales de sentinel 2. - b8a: Bandas espectrales de sentinel 2. - b9: Bandas espectrales de sentinel 2. - b11: Bandas espectrales de sentinel 2. - b12: Bandas espectrales de sentinel 2. - tcari_osavi: Indice de vegetación ajutada a eliminar la influencia del suelo. - gndvi: Indice de vegetación potenciando saturación en el verde. - ccci: Indice de clorofila. - ndwi: Indice de estado hidrico (NDMI). - tcari: Indice relacionado con la absorción de clorofila. - osavi: El índice de vegetación OSAVI es un SAVI modificado que también utiliza la reflectancia en el espectro del infrarrojo cercano y del rojo. ### 3. Datos espectrales + radar (temporales) Son combinación de las variables anteriores trabajadas para evitar influencia de nubes, indicando temporalibidad o cambios bruscos de datos, ya que nosotros trabajamos con acumulados desde el inicio de la campaña/plantación, nos ayuda a sacar indicadores de importancia. - ndvi_smoothed: Ndvi trabajando con una función de suavizado eliminando la influencia por la afectación de nubes. - ndwi_smoothed: Ndwi (NDMI) trabajando con una función de suavizado eliminando la influencia por la afectación de nubes. - ndvi_smoothed_temporal_max_diff: Maxima diferencia entre semanas para el indice de NDVI. - ndwi_smoothed_temporal_max_diff: Maxima diferencia entre semanas para el indice de NDWI (NDMI). - ndvi_smoothed_max: Valor de NDVI máximo alcanzando en la camapaña. - ndwi_smoothed_max: Valor de NDWI máximo alcanzaado en la camapaña. - ndvi_smoothed_temporal_mean_diff: Media de diferencia entre semanas para el inidce de NDVI. - ndwi_smoothed_temporal_mean_diff: Media de diferencia entre semanas para el inidce de NDWI (NDMI). - ndvi_std_temporal_max_diff: Diferencia máxima de variabilidad dentro del camapaña. - sigma0_temporal_max_diff: Diferencia mázima de valor de radar dentro de la camapaña. - sigma0_max: Valor maximo de radar alcanzado en la camapaña. - sigma0_min: Valor minimo de radar alcanzado en la campaña. - sigma0_temporal_mean_diff: Diferencia media de radar durante la campaña. - sigma0_std_temporal_max_diff: Diferencia máxima de radar durante la campaña. - ndvi_growth_first_month: NDVI maximo alcanzado en el primer mes de camapaña. - ndwi_growth_first_month: NDWI (NDMI) maximo alcanzado en el primer mes de camapaña. ### 4. Datos climatológicos Los datos climatológicos son muy importantes en el modelo ya que nos indica a que ha estado expuesto el cultivo durante la camapaña. Las variables que medimos son las siguientes: - pres: Presión media (mb). - slp: Presión media a nivel del mar (mb). - wind_spd: Velocidad media del viento (Predeterminado m/s). - wind_gust_spd: Velocidad de ráfagas de viento (m/s). - max_wind_spd: Velocidad máxima del viento de 2 minutos (m/s). - wind_dir: Dirección media del viento (grados). - max_wind_dir: Dirección de ráfaga de viento máxima de 2 minutos (grados). - max_wind_ts: Hora de máxima racha de viento UTC (Unix Timestamp). - temp: Temperatura media (Celsius por defecto). - max_temp: Temperatura máxima (Celsius por defecto). - min_temp: Temperatura mínima (Celsius por defecto). - max_temp_ts: Hora de temperatura máxima diaria UTC (Unix Timestamp). - min_temp_ts: Hora de temperatura mínima diaria UTC (Unix Timestamp). - rh: Humedad relativa media (%). - dewpt: Punto de rocío promedio (Celsius predeterminado). - clouds: Cobertura media de nubes [basada en satélites] (%). - precip: Precipitación acumulada (predeterminado mm). - precip_gpm: Precipitación acumulada [estimada por satélite/radar] (predeterminado en mm). - solar_rad: Radiación solar promedio (W/M^2) - t_solar_rad: Radiación solar total (W/M^2) - ghi: Irradiación solar horizontal global promedio (W/m^2). - t_ghi: Irradiancia solar horizontal global total del día (W/m^2) [Cielo despejado] - max_ghi: Valor máximo de la irradiancia solar horizontal global en el día (W/m^2) [Cielo despejado] - dni: Irradiación solar normal directa promedio (W/m^2) [Cielo despejado] - t_dni: Irradiación solar normal directa total del día (W/m^2) [Cielo despejado] - max_dni: Valor máximo de radiación solar normal directa en el día (W/m^2) [Cielo despejado] - dhi: Irradiancia solar horizontal difusa promedio (W/m^2) [Cielo despejado] - t_dhi: Irradiancia solar horizontal difusa total del día (W/m^2) [Cielo despejado] - max_dhi: Valor máximo de irradiancia solar horizontal difusa en el día (W/m^2) [Cielo despejado] - max_uv: Índice UV máximo (0-11+) ### 5. Datos agro-climáticos Los datos agroclimaticos los incorporamos por la importancia que tienen en el ambito de la agricultura. - bulk_soil_density: Densidad del suelo a granel (kg/m^3). - skin_temp_max: Temperatura máxima de la piel (C). - skin_temp_avg: Temperatura media de la piel (C). - skin_temp_min: Temperatura mínima de la piel (C). - temp_2m_avg: Temperatura promedio de 2 metros (C). - precip: Precipitación acumulada (mm). - specific_humidity: Humedad específica media (kg/kg). - evapotranspiration: Evapotranspiración de referencia - ET0 (mm). - pres_avg: Presión superficial media (mb). - wind_10m_spd_avg: Velocidad media del viento a 10 metros (m/s). - dlwrf_avg: Radiación solar de onda larga descendente media horaria (W/m^2 · H). - dlwrf_max: Máxima radiación solar descendente de onda larga por hora (W/m^2 · H). - dswrf_avg: Radiación solar de onda corta descendente media horaria (W/m^2 · H). - dswrf_max: Máxima radiación solar horaria descendente de onda corta (W/m^2 · H). - dlwrf_net: Radiación solar neta de onda larga (W/m^2 · D). - dswrf_net: Radiación solar neta de onda corta (W/m^2 · D). - soilm_0_10cm: Promedio Contenido de humedad del suelo 0 a 10 cm de profundidad (mm). - soilm_10_40cm: Promedio Contenido de humedad del suelo 10 a 40 cm de profundidad (mm). - soilm_40_100cm: Promedio Contenido de humedad del suelo 40 a 100 cm de profundidad (mm). - soilm_100_200cm: Promedio Contenido de humedad del suelo 100 a 200 cm de profundidad (mm). - v_soilm_0_10cm: Contenido volumétrico promedio de humedad del suelo de 0 a 10 cm de profundidad (fracción). - v_soilm_10_40cm: Contenido volumétrico promedio de humedad del suelo de 10 a 40 cm de profundidad (fracción). - v_soilm_40_100cm: Contenido volumétrico promedio de humedad del suelo de 40 a 100 cm de profundidad (fracción). - v_soilm_100_200cm: Contenido volumétrico promedio de humedad del suelo de 100 a 200 cm de profundidad (fracción) - soilt_0_10cm: Temperatura promedio del suelo a 0 a 10 cm de profundidad (C). - soilt_10_40cm: Temperatura promedio del suelo a 10 a 40 cm de profundidad (C). - soilt_40_100cm: Temperatura promedio del suelo a 40 a 100 cm de profundidad (C). - soilt_100_200cm: Temperatura promedio del suelo a 100 a 200 cm de profundidad (C). ### 6. Datos climatológicos y agro-climaticos tratados. - gdd: Grados día acumulados con temperatura base segun cultivo. - precip_temporal_max_diff: Diferencia máxima entre semanas en precipitación en campaña. - precip_max: Valor de precipitación maxima en una semana. - evapotranspiration_max_diff: Diferencia máxima de evapotranspiración entre semanas durante la campaña. - rh_max_diff: Diferencia máxima de humedad entre semanas durante la campaña. - skin_temporal_max_min_diff: Diferencia máxima de temperatura de suelo max entre semanas durante la campaña. - skin_temporal_min_min_diff: Diferencia máxima de temperatura de suelo min entre semanas durante la campaña. - gdd_min_diff: Diferencia de gdd entre semanas durante la campaña. - precip_first_month: Precipitación maxima alcanzada durante el primer mes de campaña. - rh_first_month: Humedad maxima alcanzada durante el primer mes de campaña. - skin_temp_max_first_month: Temperatura de suelo maxima alcanzada durante el primer mes de campaña. - solar_rad_first_month: Radiacion solar maxima alcanzada durante el primer mes de caapaña. ## 2. Revisión de los datos El primero paso es el cálculo de estadísticos de todas estas variables explicadas en en apartado anterior. Una vez calculados, se procede a una revisión automática de los mismos. Actualmente se genera un report resumen de esta revisión de los datos, pudiendo detectar: - Outliers temporales: Como problemas con las fechas de plantación/cosecha. Problemas con las variables predictioras (estimación anómalas para un cultivo) - Outliers globales: Detecta algún problema de cálculo en todas las variables explicadas. Todo esto se representa en un report resumen como el siguiente: ![REPORT_PREPROCESSING](media/PREDTECH_PREPROCESSINGREPORT.PNG) 1. Indica el nombre del report, nos indica que es un preprocessing de la variable PROD. 2. Nos da información del USER ID (cuidado no confundir user_id con customer_id o agrouser_id). 3. Nos indica el tamaño del dataframe de datos. 4. Indica nº de fields y seasons que dispone ese cliente. 5. Nº de dato real para poder entrenar (muy importante). 6. Nº de datos candidatos a ser considerados outliers. 7. Nº de season que tienen mal la fecha de plantación. Actualmente esto se registra si el ndvi en los primero 30 días es mayor a 0.4 (para "sugarcane", "beetroot", "soybean", "corn", "cotton"). (Se adjunta fichero en S3). 8. Nº de datos que se considera que está mal la fecha de cosecha (Se adjunta fichero en S3) teniendo en cuenta la fecha de plantación (e.g. seasons demasiado largas o cortas). 9. Nº de datos de producciones reales que son consideradas candidatos a outliers, hacemos dos desviaciones estándar sobre la media móvil de los datos en el eje días. (Se adjunta fichero en S3). 10. Gráfico donde nos indica nº de columnas que le faltan datos y % de datos faltantes por variable. 11. Gráfico de evolución de NDVI por días de cultivo para los season_ids que presentan errores. 12. Evolución de las producciones en serie temporal. El gráfico de arriba muestra la cantidad de datos con producción real (verde) con la de datos sin producción real reportada (rojo). El gráfico de abajo muestra la evolución de las producciones reales reportadas. 13. Producción por días de cultivo con los ejes límite para detectar los valores atípicos basándote en datos de la serie temporal utilizando la media poblacional y dos tercios (2/3) de desviacion estándar sobre el promedio movil. 14. Evolución del NDVI por días de cultivo smootheadas por day-cycle de las plantas. 15. Isolation forest: Nos enseña la distribución de scores en un histograma dada por el algoritmo, y la cantidad de observaciones consideradas outliers. (https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html) Todos los candidatos a outliers nos avisa a posibles valores que no se introduzcan en el modelo, pero ese paso se realiza en el siguiente apartado. ## 3. Generación del modelo La generación del modelo también se realiza de manera automática. Actualmente contamos con la generación automática de 3 modelos simultaneos realizando técnicas de hiperparametrización con el objetivo de obtener el mejor modelo para los datos aportados. Tras el entrenamiento automático, se genera también un report resumen de evaluación de resultados: ![REPORT_MODELTECH](media/PREDTECH_MODELTECH.PNG) 1. Título del report. 2. Indica el user del modelo. 3. Datos que finalmente entran al entrenamiento. 4. Outliers detectados con el isolation forest 5. Número de outliers en el preprocessing, como en “faulty_seasons_dict” 6. Nº de variables que han entrado al modelo. 7. Fecha del entrenamiento. 8. El outlier_threshold que se puso en el config. 9. Usuario del modelo. 10. Tipo de modelo. 11. Cultivo del modelo. 12. Tipo de modelo con la mejor accuracy (RFR -> Random Forest Regressor (sirve para no overfitear); GBR -> Gradient Boosting Regressor (entremedio, pero overfitea más); XGBR -> eXtreme Gradient Boosting Regressor (es el que más overfitea, pero también el que suele dar mejores resultados)). 13. Tabla resumen de las accuracies. 14. Gráfico para comprobar los datos reales vs predichos distinguiendo entre train y test. 15. Evolución de las producciones reales a través del tiempo. 16. Variables más importantes del modelo entrenado. 17. Distribución de los errores en train y el test. Si el train y el tests son muy distintos, entonces se debe repasar que ha sucedido, y porqué los datos de testeo no representan los de entrenamiento. 18. Distribución del error a lo largo del tiempo. Además de este report resumen también se podrán consultar junto vuestro KAM/CPM gráficos de interes para el análisis de los datos en mayor profunidad dentro de nuestro gestor de modelos en producción (MLFLOW) ## 4. Generación de predicciones Una vez los datos resvisados y entrenados, el modelo generado lo empleamos para generar predicciones en la campaña. Las predicciones se actualizan a nivel semanal. Para validar internamente los resultados también generamos reports para asegurar que todo va correctamente y no detectamos fuertes anomalias. ![REPORT_FORECASTECH](media/PREDTECH_REPORTFORECAST.PNG) 1. Título del report. 2. Indica el user que se ha realizado la predicción. 3. Tipo de modelo. 4. Si se ha usado algún filtro de season_label. 5. Si se ha aplicado para actualizar solo futuros o todo. 6. Fecha de la predicción. 7. Número de predicciones generadas (para cada season_id hay múltiples dates, de aquí el número tan largo). 8. Parcelas que deberían revisarse la fecha de plantación. 9. Tabla resumen. Muestra las distribuciones de los datos usados para entrenar y los datos predichos. Lo normal es que siempre habrá un poco de desviación entre media de train y el forecast, ya que el train solo coge la fecha de cosecha y el forecast coge todo. 10. Gráfico rescatado del preprocessing para poder detectar problemas de plantación. 11. Gráfico de distribución de variables más importantes del modelo, para ver la distribución del modelo y los datos a predecir 12. Frecuencia de datos según el valor a predecir, segmentado con lo entrenado y lo predicho 13. Evolución de las estimaciones en el tiempo, junto con los datos usados para entrenar el modelo (si existen datos del último año usados para entrenarlo). 14. Variables con más importancia, como afectan sus valores para la predicción. La línea vertical indica el valor esperado (E(X)). Entonces, cada observación, tiene un valor para cada una de las variables. El gráfico de arriba indica cómo valores altos de esa variable (en color rojo), modifican la observación respecto al valor esperado. Por ejemplo, la variable más importante muestra que los valores rojos aumentan el valor de la predicción, respecto al valor esperado o lo que vendría a ser la media. En cambio, los colores azules, representan valores bajos de esa variable, y en la variable más importante se ve cómo valores bajos (color azul), hacen que la predicción sea más baja.