Я работаю над системой обнаружения аномалий для устройств IoT с использованием данных датчиков (температура, относительная влажность и давление). Устройства герметизированы, но имеют некоторую естественную «воздухопроницаемость», что означает, что они показывают нормальные изменения шаблона с течением времени (дни), которые могут быть приняты за утечки с использованием стандартных методов обнаружения (например, уравнения Ван -дер -Ваальс не сработают).
i Пытались настроить пару вещей, и теперь я пробую автосодер, но я чувствую, что мои слои не верны, или мне не хватает некоторых шагов для этого. Не стесняйтесь обсуждать любые ошибки, которые я мог сделать. Strong> входные данные: < /strong> последовательности 38 4D векторов (время, влажность, температура, давление - все нормализованные)
Каждое устройство может иметь несколько окон (например, 10 Windows = 380 точек данных на устройство)
Начальный подход: < /strong> Hybrid CNN-LSTM AutoEncoder
Цель: < /strong> изучить нормальные «шаблоны дыхания», чтобы различать естественные вариации и фактические утечки
Сделано улучшения: искатель скорости обучения (циклический тест), перекрестная проверка, адаптивная скорость обучения с ранней остановкой, несколько сгибаний с повторной режимализацией
слои: def build_hybrid_ae(self):
encoder_inputs = Input(shape=(self.sequence_length, self.input_dim))
x = encoder_inputs
if self.use_attention:
x = self.attention_layer(x)
# CNN feature extraction
for n_filters in [32, 16]:
conv1 = Conv1D(n_filters, kernel_size=3, padding='same', activation='relu')
x = conv1(x)
x = BatchNormalization()(x)
# LSTM processing
lstm1 = LSTM(16, return_sequences=False)
x = lstm1(x)
x = Dropout(self.dropout_rate)(x)
encoded = Dense(self.encoding_dim)(x)
self.encoder = Model(encoder_inputs, encoded, name='encoder')
# Decoder
decoder_inputs = Input(shape=(self.encoding_dim,))
x = Dense(16)(decoder_inputs)
x = RepeatVector(self.sequence_length)(x)
# LSTM decoder
x = LSTM(16, return_sequences=True)(x)
x = Dropout(self.dropout_rate)(x)
# CNN decoder
x = Conv1D(16, kernel_size=3, padding='same', activation='relu')(x)
x = BatchNormalization()(x)
decoded = Conv1D(self.input_dim, kernel_size=3, padding='same', activation='sigmoid')(x)
self.decoder = Model(decoder_inputs, decoded, name='decoder')
< /code>
Загрузка данных < /h2>
class SlidingWindows:
def __init__(self, windows, train_split=0.8, random_state=42):
self.windows = windows
self.train_split = train_split
self.random_state = random_state
self.RANGES = {
'temp': (-100.0, 70.0),
'humid': (0.0, 100.0),
'press': (868.0, 1085.0)
}
def normalize_data(self, val, start, end):
"""Normalize to [0,1] range"""
return (val - start) / (end - start)
def denormalize_data(self, val, start, end):
"""Convert back to original range"""
return val * (end - start) + start
def load_data(self, time_based_split=False):
X = np.array([[
[
ts.timestamp(),
float(self.normalize_data(temp, *self.RANGES['temp'])),
float(self.normalize_data(humid, *self.RANGES['humid'])),
float(self.normalize_data(press, *self.RANGES['press']))
] for ts, temp, humid, press in w['data']
] for w in self.windows], dtype=np.float32)
if time_based_split:
# Sort by mean timestamp of each window
mean_times = np.mean(X[:, :, 0], axis=1)
sorted_indices = np.argsort(mean_times)
X = X[sorted_indices]
else:
# Random split
rng = np.random.default_rng(self.random_state)
indices = rng.permutation(len(X))
X = X[indices]
split_idx = int(len(X) * self.train_split)
return (X[:split_idx],), (X[split_idx:],)
sliding_windows = create_sliding_windows(valid_recording_periods, df, threshold_value)
slidingwindows = SlidingWindows(sliding_windows)
< /code>
Результаты < /h2>
График, показывающий плохие результаты обучения от Auto Encoder < /p>
Шаги, предпринятые для улучшения энкодера < /h2>
Поскольку результаты были плохими, я попробовал некоторые вещи, как упоминалось:
Sceent Finder (циклический тест), перекрестная проверка, адаптивная скорость обучения с ранней остановкой, множественные складки с Модель повторноализации. < /p>
Но эти результаты были не намного лучше. Он пытается соответствовать данным к 0,5 каждый раз, кажется.>
Подробнее здесь: https://stackoverflow.com/questions/794 ... omalies-in
Улучшение AutoEncoder CNN-LSTM (или лучших подходов) для обнаружения аномалий в данных датчика временных рядов ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение