Как подготовить данные для LSTM

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

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

Ниже приведен скриншот подмножества моего набора данных.

enter image description here

Существует несколько других признаков, не включенных в этот скриншот. Последний столбец – это inhospital_mortality, который имеет значение 0 или 1 для каждой строки.

Каждый признак был взят в определенный момент времени x. Признаки с такими же feature_1,2,3 были взяты в одно и то же время.

Моя идея состоит в том, что мне нужно разбить каждую строку (образец) на примере ниже: таким образом, каждая строка станет 6 новыми строками.

| tc_tb1 | spo2_tb1 | g1_tb1| inhospital_mortality (label 0 | 1) |
| tc_tb2 | spo2_tb2 | g1_tb2| inhospital_mortality (label 0 | 1) |
| tc_tb3 | spo2_tb3 | g1_tb3| inhospital_mortality (label 0 | 1) |
...
| tc_tb6 | spo2_tb6 | g1_tb6| inhospital_mortality (label 0 | 1) |

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

Спасибо.

Добро пожаловать в сообщество.
Что касается вашей проблемы, вы говорите, что ваш последний столбец inhospital_mortality является бинарным, поэтому ваша цель – классифицировать, вероятно ли, что пациенты умрут в больнице в определенный момент времени, имея некоторую информацию о них, если я прав.

Предположим, это ваша цель, я думаю, что вы можете попробовать подход классификации без преобразования вашего набора данных во временной ряд, так как вы не заинтересованы в прогнозировании последовательности (или точки в этой последовательности), у вас есть независимые контейнеры x измерений на пациента, без временной связи в вашей учебной истории.
Вы можете использовать определенные значения задержки (те -1, 2, 3…, которые у вас уже есть) как информативные признаки и продолжить с бинарным классификатором. Другой вариант – с этим подходом и для каждого пациента рассчитать некоторые статистические значения, такие как минимум, максимум, среднее и т. д., для 8 измерений каждого типа показателя пациента, сохраняя то же количество строк, но объединяя атрибуты.

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

Если вас интересует фактически прогнозирование и, возможно, использование LSTM, как вы предлагаете, вы можете ознакомиться с другими ответами по этой проблеме, например, этим

.

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

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

Функции и Особенности Постановки Задачи

Ваше описание и представленные данные указывают на то, что вы работаете с временными рядами пациентов с целью классификации интра-стационарной смертности. Последняя колонка с бинарными метками (0 или 1) позволяет вывести, что задача действительно связана с классификацией, а не предсказанием временных рядов.

Подготовка Данных

  1. Формат Входных Данных:
    Из представленного примера видно, что каждый ряд данных отображает на разные временные моменты (tc_tb1, spo2_tb1, и так далее). Если вы хотите строить модель на основе временных зависимостей, необходимо организовать данные в формат 3D массива: [samples, timesteps, features].

  2. Решейпинг и Подготовка Датасета:
    Можно использовать Pandas для манипуляций. Предположим, что у вас временные компоненты нормально индексированы. Здесь задача — трансформировать данные в такой вид, чтобы каждая запись пациента представляла собой полный временной ряд. Это может быть достигнуто применением .pivot_table() или других манипуляций Pandas:

    import pandas as pd
    import numpy as np
    
    # Пример использования Pandas
    df = pd.read_csv('your_data.csv')
    dataset = df.pivot_table(values=['tc', 'spo2', 'g1'],
                            index='patient_id',
                            columns='time_step',
                            aggfunc=np.sum)
    
    # Преобразование в numpy-массив
    data = dataset.values
    X, y = data[:, :-1], data[:, -1]
    
    # Возможно, потребуется заполнить пропуски
    X = np.nan_to_num(X)
  3. Нормализация:
    LSTM модели чувствительны к масштабу входных данных. Используйте нормализацию или стандартизацию данных перед передачей их модели. Это улучшит производительность и сходимость модели.

  4. Сплит Данных:
    Разделите ваш датасет на обучающую, валидационную, и тестовую выборки. Это необходимо для оценки качества модели на независимых данных.

  5. Модель и Параметры:
    Конфигурация LSTM завист от особенностей задачи. Начните с одной или двух LSTM ячеек, следуя полносвязными слоями. Используйте Dropout для снижения переобучения.

from keras.models import Sequential
from keras.layers import LSTM, Dense, Dropout

model = Sequential()
model.add(LSTM(50, input_shape=(timesteps, features)))
model.add(Dropout(0.2))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

Таким образом, даже если ваши данные выглядят больше как классификационные без явных временных зависимостей, они могут быть адаптированы для работы с LSTM, что позволяет учесть временные зависимости, которые могут оказаться полезными для ваших задач. Полный процесс потребует обращения к каждому аспексу дата-сета с вниманием к детали, включая нормализацию и реструктуризацию данных в удобный для LSTM формат.

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

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

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