Время прочтения: 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.
Фильтр Калмана полностью определяется следующими параметрами:
- начальное состояние (initial_state_mean, initial_state_covariance);
- модель системы (transition_matrices, transition_offsets, transition_covariance);
- модель наблюдения (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 способен восстановить «истинное состояние» отслеживаемого объекта.
Преимуществами использования этого инструмента являются отсутствие необходимости предоставлять размеченные данные обучения и возможность обработки шумных наблюдений.