Машинное обучение играет важную роль для ученых в понимании взаимосвязи между определенными видами деятельности мозга, связанными с некоторыми природными явлениями. Поиск ключа к закодированной мозговой деятельности с использованием необработанных сигналов становится критически важным, и именно тогда машинное обучение начинает действовать. Нейробиологи часто используют для своего анализа модели машинного обучения и глубокого обучения. Но иногда бывает очень сложно выбрать правильный порядок для нашей модели. Такие проблемы, как недостаточная и чрезмерная подгонка, были постоянной проблемой для Data Scientist, и были найдены различные решения. Честно говоря, не существует особого подхода к решению этой неоднозначности, все зависит от сложности модели и характеристик компромисса смещения и дисперсии. Мы можем получить представление о том, как выбрать лучшую модель для заданного набора данных, используя эксперименты и исследования, описанные ниже.
Загрузка набора данных:
Нейроны - это строительные блоки мозга. Они отвечают за получение сенсорных действий из внешнего мира. Процесс коммуникации между нейронами посредством шипов или потенциала действия, который приводит к быстрому изменению напряжения в активности нейрона. Данные, используемые для этого анализа, взяты из этого Журнала. Спайки в этом эксперименте были зарегистрированы для 196 нейронов в первичной моторной коре (M1) обезьяны с электродной решеткой, имплантированной через поверхность мозга. Данные записывались для различных задач по вытягиванию и движения руки обезьяны, то есть также записывалась скорость руки в направлении x и скорость в направлении y. Хотя иногда необработанные мозговые сигналы очень трудно прочитать, а могут быть очень большими, но благодаря удивительным усилиям команды Kording Lab в UPenn. Они создали удивительное хранилище с предварительно обработанными сигналами мозга. Доступ к файлу данных example_data_s1.pickle
можно получить, используя ссылку Dropbox. Мы можем получить доступ к данным напрямую, используя следующую команду:
!wget 'https://www.dropbox.com/sh/n4924ipcfjqc0t6/AADOv9JYMUBK1tlg9P71gSSra/example_data_s1.pickle?dl=1' -O example_data_s1.pickle
Прежде чем мы начнем изучать наши данные и графики, нам нужно импортировать необходимые библиотеки для нашего анализа.
Изучение данных:
Этот файл представляет собой структуру данных pickle, которая использует пакет Python pickle
для сериализации объектов Python в файлы данных. После того, как вы загрузили файл, вы можете запустить следующую команду, чтобы получить данные из файла pickle.
with open('example_data_s1.pickle', 'rb') as fp: X,y = pickle.load(fp)
Данные здесь будут сигналами, зависящими от времени, и позже для их эффективного использования потребуется обработка. Матрица X
- это матрица количества импульсов от разных нейронов, где X[i,j]
- количество импульсов от нейрона j
во временном интервале i
.
Матрица y
имеет два столбца:
y[i,0] =
скорость руки обезьяны в x-направленииy[i,1] =
скорость руки обезьяны в направлении y. Наша цель - предсказатьy
изX
.
Каждый временной интервал представляет tsamp=0.05
секунд времени. Используя X.shape
и y.shape
, мы можем вычислить и распечатать:
nt =
общее количество временных интерваловnneuron =
общее количество нейроновnout =
общее количество выходных переменных для отслеживания = количество столбцов вy
ttotal =
общее время эксперимента составляет секунды.
Используйте следующий код, чтобы найти значение каждого параметра.
Чтобы визуализировать данные мозга за несколько минут, мы можем использовать следующий код:
Чтобы лучше понять, мы можем увеличить наши данные и одновременно увидеть активность мозга обезьяны.
Подбираем простую линейную модель:
Сначала мы выбираем линейную модель, чтобы уменьшить зависимость функций. Сначала мы разделяем данные на обучающие и тестовые с помощью train_test_split
. Значение по умолчанию для аргумента перемешивания в train_test_split
- «Истина». Для нашего анализа у нас есть данные временных рядов, и перетасовка данных временных рядов не рекомендуется, поскольку мы теряем целостность данных, а также истинный характер данных. Нам нужно установить shuffle = False. Давайте создадим наш обучающий и тестовый набор с test_size=0.33
. Теперь примените линейную регрессию к обучающим данным Xtr,ytr
. Сделайте прогноз yhat
, используя тестовые данные, Xts
. Сравните yhat
с yts
, чтобы измерить rsq
, значение R2. Для этого мы можем использовать метод r2_score
. После выполнения вышеуказанных шагов мы можем увидеть, как предсказанное значение направления X ведет себя с исходным значением направления X, то же самое можно сделать и для y.
Примерка модели с опозданием:
Поскольку очевидно, что простая линейная модель - не лучший выбор, можно повысить точность, добавив в модель больше функций. Для этого мы можем использовать модель с задержкой. Чтобы смоделировать этот эффект, мы добавляем дополнительные функции к каждой строке данных, представляющие количество импульсов каждого нейрона в предыдущей строке. Затем выходной сигнал в момент времени i будет смоделирован как эффект срабатывания нейронов во время i и эффект срабатывания нейронов во время i-1. Выполните следующие действия, чтобы создать модель с задержкой:
Теперь мы подбираем линейную модель с задержкой с задержкой dly=2
. То есть,
- Создать отложенные данные
Xdly,ydly=create_dly_data(X,y,dly=2)
- Разделите данные на обучение и тестирование, как раньше
- Подобрать модель на тренировочных данных
- Измерьте результат
R^2
на тестовых данных.
Как мы видим, мы получаем лучшую точность и более высокий балл R2, просто добавляя несколько функций. Теперь осталось выбрать модель с оптимальной задержкой. Для этого мы реализуем кросс-валидацию K-Fold.
Выбор оптимальной задержки с K-кратным CV:
Ранее мы использовали задержку (dly = 2), но, безусловно, мы можем улучшить модель, используя K-кратное CV. Поскольку выборка огромна, мы можем рассмотреть только 10% точек выборки для нашего анализа. Мы вычислим Xred
и yred
, взяв первые nred=6000
выборок данных X
и y
. После этого будем рассматривать при заказе моделей до dmax=15
. Мы создадим матрицу отложенных данных, Xdly,ydly
, используя create_dly_data
с сокращенными данными Xred,yred
и dly=dmax
. Мы собираемся использовать K-кратное CV с nfold=10
, чтобы найти оптимальную задержку для всех значений задержки в dtest_list
.
Теперь мы вычисляем среднее значение и стандартную ошибку значений R2 для каждой модели (каждое значение задержки) и строим график как функцию задержки. Мы можем использовать график 45_. После этого мы вычисляем задержку, которая имеет наивысшую проверку R2, и строим ее.
Заключение:
Применение машинного обучения широко распространено, будь то простые рекламные данные или сложные нейронные сигналы. Таким образом, с помощью приведенного выше анализа мы можем сказать, что добавление дополнительных функций к заданным выборочным данным может помочь нам повысить точность модели. С помощью функции задержки мы смогли создать важные функции из данного набора данных, это очень важно для оценки временных рядов, поскольку мы называем системы без памяти в области обработки сигналов. Введение задержки во временную последовательность помогает нам воспроизвести один и тот же сигнал, а также расширить функции для большей точности модели. Мы рассчитали значение R2 и заметили, что чем ближе значение R2 к единице, тем выше точность модели. В конце концов, чтобы получить оптимальную задержку, мы использовали K-кратную CV и обнаружили, что модель лучше всего работает при order = 7.