5 algoritmos de detección de valores atípicos (puntos de cambio) que todo científico de datos debería conocer

Autor: CSDN @ _乐多_

El análisis de series de tiempo es uno de los temas a los que deben estar expuestos los científicos de datos. El análisis de series de tiempo implica el proceso de utilizar una variedad de herramientas matemáticas para estudiar datos de series de tiempo para comprender qué sucedió, cuándo y por qué sucedió, y qué es probable que suceda en el futuro.

Los puntos de cambio son cambios repentinos en los datos de series temporales que pueden representar transiciones entre estados. Cuando se trata de casos de uso de pronóstico de series de tiempo, es crucial detectar puntos de cambio para determinar cuándo ha cambiado un proceso aleatorio o la distribución de probabilidad de una serie de tiempo.

Figura 1 Posibles puntos de cambio en el gráfico de la serie temporal de muestra (resaltado)


Este artículo analizará e implementará cinco técnicas de detección de puntos de cambio y comparará su rendimiento.

1. Regresión lineal por partes

Cuando ocurre un punto de cambio, el patrón o tendencia de los datos de la serie temporal cambia. La idea básica de los modelos de regresión lineal por partes es identificar dichos cambios en patrones o tendencias dentro de diferentes regiones de datos. En presencia de un punto de cambio, el valor del coeficiente es mayor o menor que el del área cercana.

实现的伪代码:

1. 将时间序列数据分成x(比如说100)天的子段
2. 遍历每个子段的数据:
	训练数据:枚举数据
	目标数据:原始时间序列值
	在训练数据和目标数据上训练一个线性回归模型
	计算训练后的线性回归模型的系数
3. 绘制系数图表
Figura 2 Resultados del algoritmo de detección de punto de cambio lineal por partes

Las líneas rojas en la imagen de arriba representan los valores de los coeficientes de cada modelo de regresión lineal entrenado en ese subsegmento o porción de los datos de la serie temporal. El coeficiente es el valor multiplicado por el valor predicho, por lo que cuanto mayor sea el valor predicho, mayor será el coeficiente y viceversa.

def piece_wise_lr_cpd(data, columnName, peice_diff=100):

  st_idx, end_idx = 0, peice_diff
  coeff = []
  while end_idx<=data.shape[0]:
      
      X = [[x] for x in np.arange(peice_diff)]
      y = list(data.iloc[list(range(st_idx, end_idx, 1))][columnName])
      
      min_v, max_v = min(y), max(y)
      y = [(x-min_v)/(max_v-min_v) for x in y]
      
      model = LinearRegression()
      model.fit(X, y)
      
      coeff.extend([abs(model.coef_[0])]*peice_diff)
      #print(data.iloc[st_idx].index, data.iloc[end_idx].index, abs(model.coef_[0]))
      
      st_idx = end_idx
      end_idx = end_idx+peice_diff
      
  return coeff
  
# compute results
ts_df['coeff_1'] = piece_wise_lr_cpd(ts_df, 'series_1', peice_diff=200)

# Plot the results
fig, ax1 = plt.subplots(figsize=(16,4))
ax2 = ax1.twinx()
ax1.plot(ts_df.index, ts_df.series_1)
ax2.plot(ts_df.index, ts_df.coeff_1, color='red', alpha=0.5)
ax2.plot(ts_df.index, [np.mean(ts_df.coeff_1)]*ts_df.shape[0], color='grey', alpha=0.5)
ax1.grid(axis='x')
plt.title('Piece-wise linear CPD model')
plt.show()

2. Buscador de cambios

Change Point Finder es un paquete Python de código abierto que proporciona algoritmos de detección de puntos de cambio en línea o en tiempo real. Utiliza el algoritmo de aprendizaje SDAR (Autorregresivo con descuento secuencial), que espera que el proceso autorregresivo antes y después del punto de cambio sea diferente.
El método SDAR tiene dos etapas de aprendizaje:

  • La primera etapa de aprendizaje: generar una puntuación intermedia, llamada puntuación de anomalía.
  • La segunda etapa de aprendizaje: generar una puntuación de puntos de cambio que pueda detectar puntos de cambio.
Figura 3 Resultados del algoritmo de detección de puntos de cambio del buscador de puntos de cambio
import changefinder

# ChangeFinder
def findChangePoints_changeFinder(ts, r, order, smooth):
    '''
       r: Discounting rate
       order: AR model order
       smooth: smoothing window size T
    '''
    cf = changefinder.ChangeFinder(r=r, order=order, smooth=smooth)
    ts_score = [cf.update(p) for p in ts]
    
    return ts_score

def plotChangePoints_changeFinder(df, ts, ts_score, title):
        
    fig, ax1 = plt.subplots(figsize=(16,4))
    ax2 = ax1.twinx()
    ax1.plot(df.index, ts)
    ax2.plot(df.index, ts_score, color='red')
    
    ax1.set_ylabel('item sale')
    ax1.grid(axis='x', alpha=0.7)
    
    ax2.set_ylabel('CP Score')
    ax2.set_title(title)
    plt.show()
    
    
tsd = np.array(ts_df['series_1'])

cp_score = findChangePoints_changeFinder(tsd, r=0.01, order=3, smooth=7)
plotChangePoints_changeFinder(ts_df, tsd, cp_score, 'Change Finder CPD model')

3.Roturas

Ruptures es una biblioteca Python de código abierto que proporciona algoritmos de detección de puntos de cambio fuera de línea. Esta biblioteca detecta puntos de cambio analizando toda la secuencia y segmentando señales no estacionarias.
Ruptures proporciona 6 algoritmos o técnicas para detectar puntos de cambio en datos de series de tiempo:

  • Programación dinámica
  • PELT (Tiempo lineal exacto podado)
  • Detección de cambios de kernel
  • Segmentación binaria
  • Segmentación ascendente
  • Segmentación de ventanas correderas
Figura 4 Resultados del algoritmo de detección de puntos de cambio de rupturas
import ruptures as rpt

def plot_change_points_ruptures(df, ts, ts_change_all, title):
    
    plt.figure(figsize=(16,4))
    plt.plot(df.index, ts)
    for x in [df.iloc[idx-1].name for idx in ts_change_all]:
        plt.axvline(x, lw=2, color='red')

    plt.title(title)
    plt.show()
    

tsd = np.array(ts_df['series_1'])

detector = rpt.Pelt(model="rbf").fit(tsd)
change_points = detector.predict(pen=3) #penalty
plot_change_points_ruptures(ts_df, tsd, change_points[:-1], 'Ruptures CPD model for series_1')

en conclusión

En este artículo, analizamos tres técnicas prácticas populares para identificar puntos de cambio en datos de series temporales. Los algoritmos de detección de puntos de cambio tienen una variedad de aplicaciones, incluido el monitoreo de condiciones médicas, análisis de actividad humana, seguimiento de sitios web y más.

Además de los algoritmos de detección de puntos de cambio discutidos anteriormente, existen otros algoritmos de detección de puntos de cambio supervisados ​​y no supervisados.

Referencias

Documentación del buscador de cambios: https://pypi.org/project/changefinder/
Documentación de rupturas: https://centre-borelli.github.io/ruptures-docs/

Descargo de responsabilidad:
Como autor, doy gran importancia a mis obras y a mis derechos de propiedad intelectual. Por la presente declaro que todos mis artículos originales están protegidos por la ley de derechos de autor y nadie podrá publicarlos públicamente sin mi autorización.
Mis artículos se han publicado en algunas plataformas conocidas por una tarifa y espero que los lectores puedan respetar los derechos de propiedad intelectual y abstenerse de infringirlos. Cualquier acto de publicación de artículos pagos de forma gratuita o paga (incluido el uso comercial) en Internet sin mi autorización se considerará una infracción de mis derechos de autor y me reservo el derecho de exigir responsabilidad legal.
¡Gracias lectores por su atención y apoyo a mi artículo!

Supongo que te gusta

Origin blog.csdn.net/yyyyyyyyyyy_9/article/details/131844655
Recomendado
Clasificación