Какая архитектура машинного обучения подходит для регрессии сигналов фиксированной длины?

Вопрос или проблема

Моя проблема имеет регрессионный характер –

Как оценить вес рыбы, используя сигнал фиксированной длины (80 точек данных) изменения сопротивления, когда рыба проплывает через ворота с электроды (по сути, 4 секунды прохождения рыбы при 20 Гц накопителе данных)?

Это сигнал в форме всплеска, высота и ширина которого зависят от размера рыбы, её скорости и близости к краям ворот, а также, вероятно, от других факторов, таких как соленость и температура воды.

У меня есть набор данных с 15 различными весами, каждый из которых содержит от 20 до 110 образцов, каждый с 2 всплесками для 2 наборов электродов, которые я использую для измерения (использование 2 наборов помогает определить направление движения рыбы).

Вот пример считывания сопротивления для эксперимента с рыбой весом 340 граммов:

Пример считывания сопротивления для эксперимента с рыбой весом 340 граммов

А вот пример извлечённых всплесков из того же эксперимента с рыбой весом 340 граммов:

введите описание изображения здесь

Как видите, существует значительная варьируемость, что заставило меня искать подход с использованием нейронной сети, которая может получать такой сигнал на входе и оценивать вес рыбы.

Знаете ли вы о такой State of the Art нейронной сети, которая это делает?
Что бы вы попробовали?
Может быть, другую методику машинного обучения?

Спасибо!

Редактировать:

Представленные данные являются постобработкой, я извлекаю всплески, используя этот код на Python (прилагается), поэтому часть шума очищена.
Я не уверен, как очистить данные лучше, поскольку экспериментатор не записывал, когда рыба проходит через ворота – у нас есть только сигнал с электродов, чтобы сделать вывод о том, что рыба прошла.

# извлечение всплесков 
def get_spikes(data_series_elc1, data_series_elc2, signal_meta):
    window_size = int(signal_meta['freq'])*4
    half_window = int(window_size/2)
    
    std = np.std(data_series_elc1)
    p10 = np.quantile(data_series_elc1, 0.9)
    spikes = []
    i = 0
    while i < len(data_series_elc1)-half_window:
        if data_series_elc1[i] > p10:
            #найти следующий максимум, чтобы установить его как центр
            max_indx = np.argmax(data_series_elc1[i:i+window_size]) half_window:i+max_indx+half_window])
            spike_list = [[data_series_elc1[i+max_indx-half_window:i+max_indx+half_window]],[data_series_elc2[i+max_indx-half_window:i+max_indx+half_window]]]
            if len(spike_list[0][0])==window_size:                
                spikes.append(spike_list) 
            
            i = i+max_indx+half_window
        else:        
            i = i+1
    print('Количество всплесков: ',len(spikes))
    return spikes

Кроме того, я извлекаю такие характеристики, как максимум, ширина, интеграл и Гауссово приближение, но линейная регрессионная модель даёт мне лишь ~R^2=0.6 => среднюю ошибку ~103 грамма для всех рыб
[100., 144., 200., 275., 339., 340., 370., 390., 400., 404., 480., 500., 526., 700., 740., 800., 840.], что является довольно большой ошибкой.

Полносвязная нейронная сеть Vanilla показывает примерно такие же результаты.

model = keras.Sequential()
model.add(keras.Input(shape=(80,)))
model.add(layers.Dense(40, activation="relu"))
model.add(layers.Dense(10, activation="relu"))
model.add(layers.Dense(1))

Так что я ищу способы улучшить эти результаты, есть ли идеи?

Обычным подходом для такого типа данных является взятие интеграла и обучение либо функции преобразования к весу рыбы. Взятие интеграла упрощает задачу до одного числа.

Вероятно, вам не нужна модель самого современного уровня. Общая линейная модель, вероятно, выявит сигнал.

Ответ или решение

Регрессия фиксированной длины сигнала с использованием машинного обучения

Ваше исследование, связанное с оценкой веса рыбы на основе фиксированного сигнала, затрагивает интересные аспекты в области машинного обучения и обработки сигналов. Давайте подробнее рассмотрим механизмы, которые могут быть использованы для построения модели регрессии с использованием вашего набора данных.

1. Понимание задачи

Ваша задача — оценить вес рыбы, основываясь на 80-элементном сигнале, который представляет собой изменение сопротивления, когда рыба проходит через ворота с электродами. Определение веса осуществляется на основе таких характеристик, как ширина и высота сигнала, которые напрямую зависят от размера рыбы, её скорости и других абиотических факторов, таких как температура воды и солёность.

2. Предварительная обработка данных

Прежде чем перейти к выбору архитектуры машинного обучения, необходимо убедиться в корректной обработке данных:

  • Удаление шума: Попробуйте использовать более сложные методы фильтрации, такие как полиномиальная регрессия или фильтры Калмана для уменьшения случайных колебаний в данных.
  • Извлечение признаков: Вы уже извлекли некоторые полезные характеристики, такие как максимальная высота, ширина и интеграл сигнала. В дополнение к этому можно рассмотреть возможность применения аналитики временных рядов, чтобы извлекать более глубокие скрытые паттерны.

3. Выбор архитектуры машинного обучения

С учетом описанного вами подхода и характеристик данных, имеются различные архитектуры нейронных сетей, которые могут быть эффективными для решения вашей задачи:

3.1 Углубленные нейронные сети (DNN)

Ваш текущий вариант с полносвязной архитектурой (Dense Network) предоставляет неплохие результаты, но можно пробовать более сложные структуры:

  • Сверточные нейронные сети (CNN): Хотя они чаще используются для обработки изображений, CNN могут хорошо работать и с одномерными сигналами. Попробуйте 1D-сверточную сеть для извлечения пространственных признаков.
from keras import layers, models

model = models.Sequential()
model.add(layers.Conv1D(64, 3, activation='relu', input_shape=(80, 1)))
model.add(layers.MaxPooling1D(2))
model.add(layers.Conv1D(32, 3, activation='relu'))
model.add(layers.MaxPooling1D(2))
model.add(layers.Flatten())
model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(1))
3.2 Рекуррентные нейронные сети (RNN)

Если ваша задача требует учета последовательности во времени, RNN или LSTM (долгосрочная краткосрочная память) могут оказать положительное воздействие на результаты. Эти сети могут отслеживать временные зависимости между пикселями сигнала.

from keras import layers, models

model = models.Sequential()
model.add(layers.LSTM(50, input_shape=(80, 1), return_sequences=True))
model.add(layers.LSTM(50))
model.add(layers.Dense(1))

4. Техники обучения

Не забывайте об использовании таких техник, как кросспроверка и ранняя остановка, чтобы избежать переобучения. Оптимизация гиперпараметров с помощью методов, таких как Grid Search или Random Search, также поможет улучшить производительность модели.

5. Итоговое заключение

Ваше начинание по оценке веса рыбы, используя фиксированные сигналы, открывает множество вызовов и возможностей для зубчатых приложений в области машинного обучения. Используя предложенные модели и подходы к обработке данных, можно существенно улучшить точность предсказаний. Не забывайте про итеративный процесс тестирования различных архитектур и методов, чтобы достичь оптимального результата. Удачи в ваших дальнейших исследованиях!

Оцените материал
Добавить комментарий

Капча загружается...