¿Has escuchado esto?
Tenemos esos valores muy grandes en esta serie de tiempos, pero esos son solo “valores atípicos“Y solo pasa [insert small number here]% del tiempo
Durante mis años de ciencia de datos, he escuchado mucho esa oración. En conferencias, durante las revisiones de productos y durante las llamadas con los clientes, se ha dicho que esta oración asegura que algunos valores muy grandes (o pequeños) no deseados que pueden parecer no son “estándar”, no pertenecen al “proceso habitual” (todas las palabras vagas de las que he oído hablar), y no constituyen un problema para el sistema que intentamos construir (por la razón X, Y y Z).
En la configuración de producción, esos valores muy pequeños o muy grandes (conocidos como valores extremos) están acompañados de barandillas para “fallar con gracia” en caso de que se midan los valores extremos. Esto suele ser suficiente para los casos en que solo necesita que su sistema funcione, y desea estar seguro para que funcione en todo momento, incluso cuando ocurren valores extremos no deseados/no estándar/groseros, locos y molestos.
No obstante, al analizar un Timeseries, podemos hacer algo más que “arreglar” el valor extremo con las barandillas y el umbral de si/else: en realidad podemos monitor valores extremos para que podamos entenderlos.
En Timeseries, los valores extremos en realidad representan algo en el sistema de interés. Por ejemplo, si su serie de tiempo describe el consumo de energía de una ciudad, un nivel de energía irrazonablemente alto podría indicar un preocupante consumo de energía en un área específica, lo que puede requerir acción. Si se trata de datos financieros, los altibajos tienen un significado obvio y crucial, y comprender su comportamiento es extremadamente importante.
En esta publicación de blog, lidiaremos con datos meteorológicosdonde la serie temporal representará la temperatura (en Kelvin). Los datos, como veremos, tendrán múltiples ciudades, y cada ciudad produce una gran cantidad. Si selecciona una ciudad específica, tiene un Timeseries como la que está viendo a continuación:
Entonces, en este tipo de conjunto de datos, es bastante importante modelar los máximos y mínimos, porque significan que hace tanto calor como un horno o extremadamente frío. Con suerte, en este punto, te estás preguntando
“¿Qué queremos decir con modelado ¿El máximo y los mínimos? “
Cuando se trata de un conjunto de datos de la serie temporal, es razonable esperar una distribución gaussiana, como la que ves aquí:
Pero si considera solo los valores extremos, la distribución está lejos de eso. Y como verá en un segundo, hay múltiples capas de complejidad asociadas con la extracción de la distribución de valores extremos. Tres de ellos son:
- Definición de un valor extremo: ¿Cómo sabes que algo es extremo? Definiremos la implementación de nuestro valor extremo como primera etapa
- Definición de las distribuciones que describen estos eventos: Hay múltiples distribuciones posibles de valores extremos. Las tres distribuciones que se tratarán en esta publicación de blog son las Valor extremo generalizado (GEV), Weibull, y Gumbel (un caso especial de GEV) distribuciones.
- Elegir la mejor distribución: Hay múltiples métricas que podemos usar para determinar las distribuciones de “mejor ajuste”. Trataremos el Información de Akaike, el Probabilidady el Información bayesiana Criterio.
Todas las cosas de las que hablaremos en este artículo 🥹
Parece que tenemos mucho terreno que cubrir. Comencemos.
0. Fuente de datos y script
El idioma que usaremos es Pitón. La fuente de código se puede encontrar en esto Carpeta Pieropaialungai/Rareevents. La fuente de datos se puede encontrar en este código abierto Conjunto de datos de Kaggle. Eso sí, si clona la carpeta GitHub, no necesitará descargar el conjunto de datos. El conjunto de datos está dentro de la carpeta RawData dentro de la carpeta principal de Rareevents GitHub (de nada).
1. Exploración de datos preliminar
Para simplificar todo durante la fase de exploración y darnos la máxima versatilidad en el cuaderno sin escribir cientos de líneas de código. El código que hace eso [data.py] es lo siguiente:
Este código hace todos los datos de trabajo sucio; Por lo tanto, podemos hacer todos los siguientes pasos en muy pocas líneas de código.
Lo primero que podemos hacer es mostrar algunas de las filas del conjunto de datos. Podemos hacerlo con este código:
Observe que hay 36 columnas/ciudades, no solo 4, en el conjunto de datos. Mostré 4 para tener una mesa bien formateada. 🙂
Algunas cosas a notar:
- Cada columna, excepto “DateTime”, es una ciudad y representa una serie de tiempo, donde cada valor corresponde a la hora y hora, que representa el eje de tiempo
- Cada valor en la columna de la ciudad representa la temperatura de Kelvin para la fecha en la columna de fecha y hora correspondiente. Por ejemplo, índice = 3 para columna = ‘Vancouver’ nos dice que, en el tiempo 2012-10-01 15:00:00, la temperatura era 284.627 K
También desarrollé una función que le permite trazar la columna de la ciudad. Por ejemplo, si desea echar un vistazo a lo que sucede en Nueva York, puede usar esto:
Ahora, la columna DateTime es solo una columna de cadena, pero sería realmente útil tener el mes, día y año específicos en columnas separadas. Además, tenemos algunos valores de NAN que debemos cuidar. Todos estos pasos de preprocesamiento aburridos están dentro de `.Clean_and_PreProcess ()`
Esta es la salida:
2. Detección de eventos extremos
Ahora, una pregunta crucial:
¿Qué es un evento extremo? ¿Y cómo lo vamos a detectar?
Hay dos formas principales de definir un “evento extremo”. Por ejemplo, si queremos identificar el máximopodemos aplicar:
- La primera definición: pico sobre el umbral (POT). Dado un umbral, todo por encima de ese umbral es un punto máximo (evento extremo).
- La segunda definición: extremo dentro de una región. Dada una ventana, definimos el valor máximo de la ventana como un evento extremo.
En esta publicación de blog, utilizaremos el segundo enfoque. Por ejemplo, si usamos ventanas diarias, escaneamos el conjunto de datos y extraemos el valor más alto para cada día. Esto le daría muchos puntos, ya que nuestro conjunto de datos abarca más de 5 años. O podríamos hacerlo con ventanas mensuales o ventanas anuales. Esto le daría menos puntos, pero quizás información más rica.
Este es exactamente el poder de este método: tenemos control sobre la cantidad de puntos y su “calidad”. Para este estudio, podría decirse que el mejor tamaño de la ventana es el “de tamaño diario. Para otro conjunto de datos, no dude en ajustar en función de la cantidad de sus puntos; por ejemplo, es posible que desee reducir el tamaño de la ventana si tiene una ventana natural muy corta (por ejemplo, que recopila datos cada segundo), o aumentar si tiene un conjunto de datos muy grande (EG, tiene más de 50 años de datos y una ventana de semana es más apropiada).
Esta definición de valor máximo se define dentro del RareeVentstoolbox clase, en [rare_events_toolbox.py] script (mire la función extract_block_max).
Y podemos mostrar rápidamente la distribución de eventos raros en diferentes tamaños de ventana utilizando el siguiente bloque de código:
3. Distribución de eventos extremos
Antes de sumergirnos en el código, retrocedamos. En general, las distribuciones de valor extremo no exhiben el hermoso comportamiento de la campana gaussiana que ha visto anteriormente (la distribución gaussiana para San Francisco). Desde una perspectiva teórica, las dos distribuciones para saber son las Valor extremo generalizado (GEV) distribución y el Weibull distribución.
GEV (valor extremo generalizado)
- El GEV es la base de la teoría del valor extremo y proporciona una familia de distribuciones adaptadas para modelar el bloqueo del bloque Maxima o los mínimos. Un caso especial es el Gumbel distribución.
- Su flexibilidad proviene de un parámetro de forma que determina el “comportamiento de la cola”. Dependiendo de este parámetro, el GEV puede imitar diferentes tipos de extremos (por ejemplo, moderado, de cola pesada).
- La demostración de la distribución de GEV es muy elegante: al igual que la teoría del valor central (CLT) dice: “Si promedia un montón de variables aleatorias IID, la distribución del promedio tiende a un gaussiano”, el EVT (teoría de valor extremo) dice “si toma la máximo (o mínimo) de un montón de variables aleatorias IID, la distribución de ese máximo tiende a un GEV “.
Weibull
- El Weibull es una de las distribuciones más utilizadas en ingeniería de confiabilidad, meteorología y modelado ambiental.
- Es especialmente útil para describir datos donde hay una sensación de extremos “limitados” o cónicos.
- A diferencia de la (s) distribución (s) de GEV, la formulación de Weibull es empírico. Waloddi Weibull, un ingeniero sueco, propuso por primera vez la distribución en 1939 para modelar la resistencia de la rotura de los materiales.
Entonces tenemos tres posibilidades: Gev, gumbel, y Weibull. Ahora, ¿cuál es el mejor? La respuesta corta es “depende”, y otra respuesta corta es “es mejor probarlos todos y ver cuál funciona mejor”.
Así que ahora tenemos otra pregunta:
¿Cómo evaluamos la calidad de una función de distribución y un conjunto de datos?
Tres métricas para usar son las siguientes:
Tres métricas para usar son las siguientes:
- Lig-Likelilidad (LL). Mide cuán probables son los datos observados bajo la distribución ajustada: más alto es mejor.
donde F es la función de densidad de probabilidad (o masa) de la distribución con los parámetros θ y x_i es el punto de datos observado I-th
- Criterio de información de Akaike (AIC) AIC equilibra dos fuerzas: Calidad de ajuste (a través de la Lig-Likelilidad = L) y sencillez (penaliza modelos con demasiados parámetros, número de parámetros = k).
- Criterio de información bayesiana (BIC). Espíritu similar a AIC, pero más duro en la complejidad (tamaño del conjunto de datos = norte).
La recomendación estándar es usar una entre AIC y BIC, ya que consideran la probabilidad logarítmica y la complejidad.
La implementación de las tres funciones de distribución, y los valores de L, AIC y BIC correspondientes, es la siguiente:
Y luego podemos mostrar nuestra distribución utilizando la siguiente:
Bastante buen ajuste, ¿verdad? Si bien se ve visualmente bien, podemos ser un poco más cuantitativos y mirar el gráfico QQ, que muestra la coincidencia del cuartil entre los datos y la distribución ajustada:
Esto muestra que nuestra distribución coincide muy bien con el conjunto de datos proporcionado. Ahora, puede notar cómo, si hubiera intentado con una distribución estándar (por ejemplo, la curva gaussiana), seguramente habría fallado: la distribución de los datos es muy sesgada (como se esperaba, porque estamos tratando con valores extremos, y esto requiere distribuciones de valores extremos (esto se siente extrañamente motivacional 😁).
Ahora lo bueno es que, como lo hicimos estructurado, también podemos ejecutar esto para cada ciudad del conjunto de datos utilizando el siguiente bloque de código:
Y la salida se verá así:
{'Dallas': {'dist_type': 'gev',
'param': (0.5006578789482107, 296.2415220841758, 9.140132853556741),
'dist': <scipy.stats._continuous_distns.genextreme_gen at 0x13e9fa290>,
'metrics': {'log_likelihood': -6602.222429209462,
'aic': 13210.444858418923,
'bic': 13227.07308905503}},
'Pittsburgh': {'dist_type': 'gev',
'param': (0.5847547512518895, 287.21064374616327, 11.190557085335278),
'dist': <scipy.stats._continuous_distns.genextreme_gen at 0x13e9fa290>,
'metrics': {'log_likelihood': -6904.563305593636,
'aic': 13815.126611187272,
'bic': 13831.754841823378}},
'New York': {'dist_type': 'weibull_min',
'param': (6.0505720895039445, 238.93568735311248, 55.21556483095677),
'dist': <scipy.stats._continuous_distns.weibull_min_gen at 0x13e9cd390>,
'metrics': {'log_likelihood': -6870.265288196851,
'aic': 13746.530576393701,
'bic': 13763.10587863208}},
'Kansas City': {'dist_type': 'gev',
'param': (0.5483246490879885, 290.4564464294219, 11.284265203196664),
'dist': <scipy.stats._continuous_distns.genextreme_gen at 0x13e9fa290>,
'metrics': {'log_likelihood': -6949.785968553707,
'aic': 13905.571937107414,
'bic': 13922.20016774352}}
4. Resumen
Gracias por pasar tiempo conmigo hasta ahora, significa mucho ❤️
Recapitulemos lo que hicimos. En lugar de agitar a mano “atípicos”, tratamos los extremos como señales de primera clase. Como ejemplo:
- Tomamos un conjunto de datos que representa la temperatura de las ciudades de todo el mundo.
- Definimos nuestros eventos extremos usando Maxima de bloque en una ventana fija
- Modelamos los máximos de temperatura a nivel de la ciudad con tres familias candidatas (GEV, Gumbel y Weibull)
- Seleccionamos el mejor ajuste con Log-Likeliliosidad, AIC y BIC, luego verificados con los ajustes con gráficos QQ.
Los resultados muestran que “mejor” varía según la ciudad: por ejemplo, Dallas, Pittsburgh y Kansas City inclinó a Gev, mientras que Nueva York encajaba en un Weibull.
Este tipo de enfoque es muy importante cuando los valores extremos son de gran importancia en su sistema, y necesitamos revelar cómo se comporta estadísticamente en condiciones raras y extremas.
5. Conclusiones
Gracias de nuevo por tu tiempo. Significa mucho ❤️
Mi nombre es Piero Paialunga, y soy este tipo aquí:
Soy Ph.D. Candidato en el Departamento de Ingeniería Aeroespacial de la Universidad de Cincinnati. Hablo sobre IA y aprendizaje automático en las publicaciones de mi blog y en LinkedIn, y aquí en TDS. Si te gustó el artículo y quieres saber más sobre el aprendizaje automático y seguir mis estudios, puedes:
A. Sígueme LinkedIndonde publico todas mis historias
B. Sígueme Githubdonde puedes ver todo mi código
C. Para preguntas, puede enviarme un correo electrónico a piero.paialunga@hotmail