В этом блоге мы проведем тематическое исследование о землетрясении LANL, которое представляет собой конкурс, проводимый на Kaggle.com. В этом примере мы предскажем время следующего землетрясения.

Набор данных:

Набор данных был создан в лаборатории, где с помощью экспериментов они создали землетрясение и записали его. Вот — видео эксперимента.

  1. Набор данных можно найти здесь.
  2. Этот набор данных содержит 8,9 ГБ обучающего CSV-файла и тестовую папку с 2624 файлами, каждый из которых содержит 150 000 строк.
  3. Данные тренировки состоят из двух столбцов (акустические данные и время до отказа).

а. акустические_данные: сейсмические сигналы, имеющие целочисленный тип данных.

б. time_to_failure: время в секундах до следующего лабораторного землетрясения, этот тип данных находится в плавающем формате.

4. У нас также есть seg_id. Для каждого seg_id в тестовой папке мы должны предсказать один раз time_to_failure. Данные в тестовом наборе данных являются непрерывными, но все тестовые файлы не составляют непрерывный сегмент, как в обучающих данных.

Метрика:

Метрики, которые здесь могут быть использованы, это Среднеквадратическая ошибка, Средняя абсолютная ошибка или R-квадрат. Но здесь мы будем использовать MAE (средняя абсолютная ошибка) для оценки, поскольку отправка будет оцениваться с использованием MAE в Kaggle.

MAE представляет собой среднее значение абсолютного значения каждой точки прогнозируемого значения и фактического значения. Ниже приведена формула для MAE, где Yi — фактическое значение, Xi — прогнозируемое значение, а n — общее количество значений, присутствующих в наборе данных.

Загрузка данных из Kaggle:

Загрузить данные из Kaggle в colab очень просто, и здесь я расскажу вам, как вы можете загрузить набор данных LANL Earthquake Prediction за 2–3 минуты в свой блокнот colab.

Шаг 1: Войдите в свою учетную запись Kaggle или создайте учетную запись Kaggle.

Шаг 2: Перейдите на сайт набора данных (https://www.kaggle.com/competitions/LANL-Earthquake-Prediction/data) и примите правила конкурса.

Шаг 3: После принятия перейдите в свою учетную запись Kaggle, прокрутите до раздела API и нажмите «Срок действия токена API», чтобы удалить предыдущие токены, если есть, а затем нажмите «Создать новый токен API» — он загрузит файл kaggle.json на ваш компьютер.

Шаг 4: Теперь напишите следующий код, чтобы загрузить файл kaggle.json с вашего компьютера на сервер colab.

Шаг 5: Теперь, чтобы загрузить набор данных, скопируйте команду API и вставьте ее в ячейку colab. (скачать соревнования kaggle -c LANL-Earthquake-Prediction). Через минуту будет загружен «LANL-Earthquake-Prediction.zip».

Шаг 6: Теперь для распаковки файла скопируйте следующий код.

И вот вы загрузили файл train.csv, файл sample_submission.csv и тестовую папку.

Загрузка данных и выполнение EDA:

В train.csv у нас есть 629145480 строк и 2 столбца. Таким образом, вместо того, чтобы брать все строки, мы также можем взять 10 миллионов строк. Обычно мы делаем это из-за вычислительных ограничений.

Фрейм данных имеет форму (629145480, 2), и во фрейме данных нет значений NULL или Nan.

Первый подход:

Это базовый подход, при котором мы будем прогнозировать с помощью модели без какого-либо предварительного подхода. Мы добавим некоторые статистические функции и разделим набор данных на обучающий и тестовый наборы. Теперь мы создадим модель KNN и Random forest. После создания моделей мы получаем ошибки обучения и тестирования: 1,6 и 2,3 в KNN и 1,4 и 2,2 в случайном лесу. Это хороший результат, но обе модели немного переоснащены. Чтобы уменьшить его, мы сделаем некоторые дополнительные функции, такие как скользящее окно, и создадим больше моделей.

ЭДА:

Исследовательский анализ данных (EDA) играет важную роль при создании модели. Это необходимый шаг при создании модели. Это помогает нам понять набор данных и его распределение. Мы можем выполнить одномерный анализ или многомерный анализ.

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

EDA по акустическим данным:

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

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

EDA on Данные о времени до отказа:

Значения варьируются от 0 до 15. На приведенном выше графике немного.

Блок-схема акустических данных:

По ящичковой диаграмме акустических данных мы мало что можем сказать о 25-м, 50-м или 75-м процентиле. Итак, мы должны использовать процентили здесь.

Отклонения:

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

Здесь мы можем ясно видеть, что некоторые значения очень большие, а некоторые очень маленькие. Итак, после наблюдения за процентилем от 95-го до 100-го и от 0-го до 5-го, мы можем заявить, что точки меньше -2 и больше 41 являются выбросами. Итак, теперь мы создаем новый фрейм данных, который имеет значения акустических данных в диапазоне от -2 до 41.

Разработка функций:

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

  1. Иметь в виду,
  2. Среднеквадратичное отклонение,
  3. Мин и Макс,
  4. Эксцесс и асимметрия
  5. Абсолютный Макс, Среднее, Стандартное,
  6. Квантиль от 1 до 99
  7. Сворачивающиеся окна

Здесь мы создадим функцию, которая будет принимать кадр данных и возвращать статистические функции, такие как Std, эксцесс и т. д., а также некоторые функции, использующие скользящие окна, такие как 3_std300, 3_max300 и т. д. Для получения дополнительной информации см. мой код GitHub. После этого у нас будет всего 101 столбец, включая столбец time_to_failure. Однако у нас есть функция min, которая имеет одинаковое значение, поэтому эта функция бесполезна. Поэтому мы удалим эту функцию. Теперь у нас есть 100 функций.

Корреляция:

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

После удаления коррелированных функций у нас осталось только 34 столбца, включая time_to_failure. Нам нужно найти 10 лучших функций, полезных для предсказания.

10 лучших функций:

Для нахождения первой десятки функций мы будем использовать метод ансамбля под названием Градиентная повышающая регрессия. Теперь нам нужно разделить набор данных на входную переменную (X) и целевую переменную (y).

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

С помощью приведенного ниже кода мы подберем данные поезда и найдем список важных функций.

Теперь у нас есть отсортированный индекс всех функций. Однако эти функции расположены в порядке возрастания, то есть наименее важные функции сохраняются первыми. Итак, нам нужны последние 10 функций из sorted_idx.

С помощью приведенного выше кода мы получим 10 самых важных функций, а именно:

2_Std300, 3_skew80, 2_min80, 3_skew300, 1_skew10, 2_Std80, 3_Mean10, 2_skew10, 2_min300, 2_90th precentile10

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

Создание модели:

Сначала мы импортируем загруженный набор данных, а теперь мы разделим набор данных на отдельный набор данных во входной переменной (X) и целевой переменной (y).

После этого шага мы должны разделить набор данных

Разделение набора данных:

Мы разделим наши данные на x_train, x_test, y_train и y_test с 10% данных в качестве тестовых данных и 90% в качестве обучающих данных. Здесь необходимо выполнить разделение, потому что наш следующий шаг — стандартизация набора данных, а мы не хотим стандартизировать данные при наличии тестового набора, потому что это приведет к проблеме, называемой утечкой. Итак, чтобы предотвратить утечку, мы сначала разделим данные, а затем стандартизируем их.

Масштабирование функций:

Здесь мы преобразуем наш набор данных, используя технику стандартизации. Стандартизация — это метод, при котором все наши значения сосредоточены вокруг среднего значения с единичным стандартным отклонением, и здесь среднее значение равно 0. I]

Сначала мы подгоним наши данные x_train, то есть изучим данные, а затем преобразуем x_train и x_test в стандартизированные x_train и x_test. Мы не будем использовать данные x_test для подбора модели, потому что это создаст проблему утечки данных, как обсуждалось в предыдущем разделе.

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

Модели:

Здесь мы попробуем различные типы алгоритмов, такие как KNN, линейная регрессия, случайный лес и т. д.

Линейная регрессия с регуляризатором L2:

Для получения дополнительной информации о регистре L2 обратитесь к этой.

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

Таким образом, после использования 0,25 в качестве альфы мы получаем 2,785, 2,7002 и 2,727 в качестве средней абсолютной ошибки при поездке, перекрестной проверке и наборе тестовых данных соответственно. Мы можем улучшить нашу модель, используя некоторую сложную модель. Хорошо, что наша модель не является ни чрезмерной, ни недостаточной.

Кнн:

Теперь мы будем использовать нашу вторую модель, это KNN. Мы начнем наш набор обучающих данных с k в качестве гиперпараметра. Первоначально k будет варьироваться от 1 до 30 с промежутком 2, и мы будем хранить все точности K в списке.

Из приведенного ниже графика видно, что после k = 15 разница между точностью обучения, кросса и теста минимальна, и они не являются ни переоснащением, ни недообучением. Итак, мы выберем k › 10. Чтобы выбрать лучший K, мы будем использовать GridSearchCV.

Теперь мы будем использовать GridSearchCV и построить график каждого K с его оценкой.

Из графика лучшее K, которое мы получаем, равно k = 25, и после использования k = 25 мы получаем 2,414, 2,508 и 2,411 как среднюю абсолютную ошибку при поездке, перекрестной проверке и наборе тестовых данных соответственно. Knn работал лучше, чем линейная регрессия, а также не подгонял и не подгонял. Теперь мы можем сохранить веса нашей модели из приведенного ниже кода.

Случайный лес:

Теперь мы будем использовать модель случайного леса с randomizedsearchcv. Гиперпараметры здесь: n_estimators = [5, 10, 15, 20, 15, 30, 40, 50], max_depth = [i для i в диапазоне (5, 25, 2)], bootstrap = [True, False], min_sample_split = [2, 5, 10], max_features = ["auto", "sqrt"] .

После подгонки на тренировочном наборе с cv = 10 мы получили лучшие параметры как n_estimators: 50, min_sample_split = 10, max_features = «sqrt», max_depth = 9 и bootstrap = True. Ниже приведена кривая обучения модели.

После подбора нашего обучающего набора с лучшими параметрами случайного леса мы получили 1,983, 2,399 и 2,411 в качестве средней абсолютной ошибки для набора данных обучения, перекрестной проверки и тестирования соответственно. До сих пор случайный лес работал лучше, чем Knn и линейная регрессия, а также не подгонял и не подгонял. Итак, теперь мы можем сохранить веса нашей модели из приведенного ниже кода.

Регрессор XGBoost:

В XGBoost мы будем использовать гиперпараметр gridsearch, чтобы найти наилучшие значения для нашего гиперпараметра. Здесь мы будем использовать только n_estimators и max_depth с аналогичными значениями, используемыми в случайном лесу. После обучения модели мы получили лучший параметр, поскольку max_depth = 5 и n_estimators = 50. Ниже приведена кривая обучения модели с лучшими параметрами.

После обучения наших данных поезда с лучшими параметрами XGBoost мы получили 1,95, 2,36 и 2,45 в качестве средней абсолютной ошибки для набора данных поезда, перекрестной проверки и теста соответственно. Это также не является ни чрезмерной, ни недостаточной подгонкой. Итак, теперь мы можем сохранить веса нашей модели из приведенного ниже кода.

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

Последний шаг:

На последнем этапе мы возьмем три лучшие модели, а именно Knn, Random forest и XGBoost, и возьмем среднее значение всех значений, предсказанных этими моделями. В конечном результате мы видим, что это дает лучший результат в тестовом наборе данных.

Окончательный результат:

+-------------------+--------------+-----------+-------------+
|       Model       | MAE on train | MAE on cv | MAE on Test |
+-------------------+--------------+-----------+-------------+
| Linear Regression |     2.78     |    2.70   |     2.72    |
|        KNN        |     2.41     |    2.50   |     2.48    |
|   Random Forest   |     1.98     |    2.39   |     2.41    |
|    XGBRegressor   |     1.95     |    2.36   |     2.42    |
| Averaging 3 model |     2.08     |    2.40   |     2.39    |
+-------------------+--------------+-----------+-------------+

Последний блокнот:

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

Каггл Конкурс:

После отправки результата в Kaggle моя оценка составляет 2,23300, а частная оценка — 2,430. Глядя на личное табло, мой результат входит в 5 процентов лучших.

Будущие работы:

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

Заключение:

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

Ссылка:

  1. https://www.kaggle.com/competitions/LANL-Earthquake-Prediction
  2. https://medium.com/@ph_singer/1st-place-in-kaggle-lanl-earthquake-prediction-competition-15a1137c2457
  3. https://www.mdpi.com/1424-8220/20/15/4228
  4. https://www.kaggle.com/code/braindeadcoder/understanding-and-preparing-seismic-data/notebook

Найди меня:

  1. Гитхаб
  2. ЛинкедИн
  3. Почта: [email protected]