Какой метод машинного обучения выбрать?
Есть данные в таблице | время|-| давление в баке |. С шагом 0.05 секунд с датчика приходит сигнал о показаниях давления. Данная таблица есть как для штатной ситуации, так и для внештатной ситуации( когда давление выходит из допустимой нормы). Хочу обучить модель, чтобы она распознавала внештатные ситуации и сигнализировала об этом. Какой метод мне выбрать, как это можно сделать? Данная модель будет своего рода фильтром для поступающего в нее потока данных.
Вот что ответили на иностранном stack:
Absolutely, time series analysis and machine learning models are indeed appropriate for this problem, given that the sensor data is directly linked with time and the goal is to detect anomalies or emergency situations based on patterns in the time series.
Choose a suitable time series machine learning model for anomaly detection. Some common approaches include:
ARIMA (Autoregressive Integrated Moving Average): Suitable for stationary time series data with a clear trend and seasonality.
SARIMA (Seasonal ARIMA): Extends ARIMA to handle seasonal patterns in the data.
Prophet: A forecasting tool developed by Facebook for time series data with trends and seasonality.
LSTM (Long Short-Term Memory) Networks: Deep learning models that can capture long-term dependencies in sequential data, suitable for time series forecasting and anomaly detection.
Through the utilization of time series machine learning models, temporal trends within sensor data can be efficiently captured, abnormalities or emergency situations can be properly detected, and when needed, prompt alerts or actions may be made.
Ответы (1 шт):
Вот вам пример кода без машинного обучения, чисто статистика. Берётся скользящее окно в два стандартных отклонения вверх и вниз и смотрится, где график давления пробивает эти два стандартных отклонения. Где пробил - там начало что-то не то происходить. Потом окно раздвигается в высоту, но это можно регулировать, например, шириной окна. Если окно будет очень широкое, то инерция у него будет больше, оно не так сильно будет расти в высоту.
import pandas as pd
import seaborn as sns
from sklearn.linear_model import LinearRegression
import matplotlib.pylab as plt
import numpy as np
n = 100
t = np.linspace(1, 10, n)
p = np.cumsum(np.random.randn(n)) + 200 + (np.mod(t, 2) == 0).astype(int) * 5
df = pd.DataFrame({
'time': t,
'pressure': p
})
window = 12
no_of_std = 2
rolling_mean = df['pressure'].rolling(window).mean()
rolling_std = df['pressure'].rolling(window).std()
df['high'] = (rolling_mean + (rolling_std * no_of_std)).bfill()
df['low'] = (rolling_mean - (rolling_std * no_of_std)).bfill()
df['alert'] = np.nan
df.loc[(df['pressure'] > df['high']) | (df['pressure'] < df['low']), 'alert'] = df['pressure']
#df.iloc[:window, -1] = np.nan
plt.figure()
sns.lineplot(x='time', y='pressure', data=df, color='green', alpha=0.5)
sns.lineplot(x='time', y='high', data=df, color='cyan', alpha=0.5)
sns.lineplot(x='time', y='low', data=df, color='cyan', alpha=0.5)
sns.scatterplot(x='time', y='alert', data=df, color='red', alpha=0.5)
plt.ylim(180, 220)