Время прочтения: 4 мин.

Существует множество методов для очистки данных, и я расскажу об одном из них, с которым я познакомился во время участия в соревновании на платформе Kaggle.

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

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

Kalman filter

Итак, Kalman Filter — это мощнейший инструмент фильтрации данных.

Основной его принцип состоит в том, что при фильтрации используется информация о физике самого явления. Фильтр носит имя американского инженера и исследователя Рудольфа Калмана, который эмигрировал в США из Венгрии в 1943-м. Семейство фильтров Калмана оказалось критически важным для реализации разнообразных навигационных систем.

Kalman Filter основан на использовании динамической модели системы (например, законы электродинамики, описывающие прохождение электрического тока в различных средах или законы классической механики описывающие процессы перемещения тел в пространстве), известные управляющие воздействия и множество последовательных измерений для формирования оптимальной оценки состояния.

Алгоритм представляет собой две повторяющихся части – это фаза предсказания и фаза корректировки. На первом этапе определяется предсказание состояния, исследуемого объекта, в последующий момент времени (с учетом погрешностей возникающих при измерении). На втором этапе, свежие данные, поступающие с датчиков, корректируют предсказанное значение (с учетом зашумленности этой информации).

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

Реализация Kalman Filter в языке Python

В языке программирования Python существует несколько вариантов реализации Kalman Filter. Один из них предоставляет модуль pykalman, который включает в себя алгоритмы для обработки сигналов – это фильтрация и сглаживание, и так называемый EM–алгоритм.

EMалгоритм (на английском Expectation – Maximization) – это программные методы, используемые в статистике для вычисления оценок максимального правдоподобия параметров вероятностных моделей, при условии, что модели зависят от неявных параметров. Все эти алгоритмы реализованы в классе KalmanFilter. Непосредственно для фильтрации используется метод KalmanFilter.filter(), для сглаживания – метод KalmanFilter.smooth() и метод KalmanFilter.em() используется для EM – алгоритма. Первые два алгоритма используются для решения предиктивных задач.

Модуль pykalman связан со следующими библиотеками: Numpy, scipy, Sphinx, umpydoc, nose.

Фильтр Калмана полностью определяется следующими параметрами:

  1. начальное состояние (initial_state_mean, initial_state_covariance);
  2. модель системы (transition_matrices, transition_offsets, transition_covariance);
  3. модель наблюдения (observation_matrices, observation_offsets, observation_covariance).

Функционально сглаживание Калмана может быть предпочтительнее, потому что в отличие от фильтра Калмана, он может включать «будущие» измерения, а также прошлые при той же вычислительной стоимости. Единственная причина, по которой предпочтение отдается фильтру Калмана, а не сглаживателю, заключается в его способности включать новые измерения в режиме онлайн при помощи метода KalmanFilter.filter_update()

Использование Kalman Filter в соревновании

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

from pykalman import KalmanFilter

def Kalman1D(observations,damping=1):
    # To return the smoothed time series data
    observation_covariance = damping
    initial_value_guess = observations[0]
    transition_matrix = 1
    transition_covariance = 0.1
    initial_value_guess
    kf = KalmanFilter(
            initial_state_mean=initial_value_guess,
            initial_state_covariance=observation_covariance,
            observation_covariance=observation_covariance,
            transition_covariance=transition_covariance,
            transition_matrices=transition_matrix
        )
    pred_state, state_cov = kf.smooth(observations)
    return pred_state

train, test, submission = read_data()

observation_covariance = .0015
train['signal'] = Kalman1D(train.signal.values,observation_covariance)
test['signal'] = Kalman1D(test.signal.values,observation_covariance)

Kalman Filter был использован мной в одном из базовых решений. С его помощью я получил возможность работы с очищенным набором данных. И в результате я смог улучшить свою позицию в лидерборде и войти в топ 18%.

Заключение

Kalman Filter — это алгоритм «без учителя» для отслеживания одного объекта в непрерывном пространстве состояний. Учитывая последовательность зашумленных измерений, Kalman Filter способен восстановить «истинное состояние» отслеживаемого объекта.

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