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

Это довольно большая тема для обсуждения, поэтому я решил разделить ее на две части, и эта статья является частью 1.

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

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

Anyhoo, Coursera предлагает широкий спектр управляемых проектов. Это был один из них. Вы можете проверить это прямо здесь:

Https://www.coursera.org/courses?query=guided%20projects

Слово. Убедитесь, что вы уделяете достаточно времени пониманию своего проекта. Ознакомительное чтение в Google и составление личного отчета могут творить чудеса.

Что нужно знать о машинном обучении

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

  1. Контролируемое и неконтролируемое машинное обучение:


2. Регрессия против классификации:



3. Кластеризация:



Предпосылки:

  1. Набор данных
  2. Код Github
  3. Панды
  4. Матплотлиб (PyPlot)
  5. Нумпи
  6. Фолиум
  7. Scikit Learn
  8. К-средства
  9. Кластеризация K-средних
  10. Другие формы кластеризации

Постановка проблемы и наш подход к ее решению:

Стоянки такси - это места стоянки такси, когда они находятся в режиме ожидания. Нам нужно проанализировать их геолокационные данные, чтобы понять, где строить СТО с помощью кластеризации. Самый простой способ - построить станцию ​​обслуживания в центре каждого кластера, которая будет обслуживать каждое такси, принадлежащее этому кластеру. Вы узнаете, как сначала выполнить кластеризацию с использованием подхода K-средних, а затем использовать более сложный алгоритм, основанный на плотности, DBSCAN. Мы обсудим, как оценивать эти модели, и предложим улучшения DBSCAN с введением HDBSCAN.

Начиная:

Я использую Google Colab для кодирования.

  1. Импорт файла из локальной системы:

2. Импорт библиотек и цветов (cols), которые будут использоваться в проекте.

1. Исследовательский анализ данных

Мы читаем данные из фрейма данных и проверяем наличие повторяющихся и нулевых значений. У нас есть повторяющиеся и нулевые значения. Наш следующий шаг - удалить их.

Это скелетный код, который помогает нам получить представление о нашем фрейме данных до и после внесения этих изменений. Мы используем df.head (), чтобы проверить, выглядит ли наш фрейм данных так же. Да.

Мы извлекаем наши значения широты и долготы в виде массива numpy. Dtype - это вид данных, которые мы хотим визуализировать, поскольку они представляют собой большие числа.

dt = np.dtype (‘float64’) # 64-битное число с плавающей запятой

А потом точечный график X.

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

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

2. Визуализация географических данных

Для построения удобных интерактивных географических данных мы используем хороший пакет Folium, написанный на Python.

Нам нужно указать местоположение при написании кода, чтобы Folium мог обработать то место, где мы хотим изначально визуализировать нашу карту. Поскольку он принимает значения широты и долготы, самым простым способом для нас будет просто взять среднее значение широты и долготы из уже имеющегося у нас фрейма данных. С этого и начнется наша карта. Затем мы даем значение масштабирования и значение тайла, которое в основном является цветовой схемой для карты. И мы запускаем ‘m’, чтобы подготовить карту. (Вывод в Img1 задается первыми двумя строками кода в Img2)

Затем мы добавляем данные о стоянках такси на карту, и мы можем сделать это, итеративно добавляя все строки и столбцы фрейма данных. Вот как работает folium, и нам будет легко в будущем, когда мы дадим имя каждому кластеру.

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

Мы запускаем код Img2 и снова запускаем ‘m’, чтобы получить вывод Img2 в качестве вывода.

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

Далее мы увидим, как определить силу кластера.

3. Метрика силы / эффективности кластеризации

Здесь мы будем тестировать алгоритм кластеризации и посмотрим, улучшится ли кластеризация при его изменении. Мы собираемся начать этот сегмент с создания тестовых данных с помощью функции ‘make_blobs’ в scikit-learn. Функцию make_blobs () можно использовать для создания капель точек с распределением Гаусса. Вы можете контролировать, сколько больших двоичных объектов нужно сгенерировать, и количество сэмплов, которые нужно сгенерировать, а также множество других свойств.

Мы используем [:, 0] для всех строк и 0-го столбца массива и [:, 1] для всех строк и 1-го столбца массива.

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

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

А затем отличите их друг от друга, выделив цвета (cols).

Результат выглядит примерно так:

Теперь мы будем использовать так называемый «показатель силуэта». Он используется для оценки алгоритма кластеризации. Как это работает, так это то, что алгоритм кластеризации присваивает оценку от -1 до 1, и чем ближе она к 1, тем лучше. Он проверяет, насколько хорошо кластеризован отдельный кластер по сравнению с центром противоположного кластера.

0: означает, что кластеры безразличны, или мы можем сказать, что расстояние между кластерами не имеет значения.

-1: означает, что кластеры назначены неправильно.

Оценка силуэта = (b-a) / max (a, b)

куда

a = среднее расстояние внутри кластера, т.е. среднее расстояние между каждой точкой в ​​кластере.

b = среднее расстояние между кластерами, т.е. среднее расстояние между всеми кластерами.

Функция оценки примет проверенные данные X_blobs (массив), которые мы рассмотрели, и class_predictions.

Мы получили оценку около 0,66, что хорошо. Теперь мы скопируем и запустим вышеупомянутый алгоритм (названный «улучшенный») еще раз, чтобы проверить, действительно ли работает оценка силуэта.

Получаем результат сюжета, который выглядит так:

Видеть?! Теперь мы можем отличить перекрывающиеся кластеры друг от друга. Разве это не здорово?

Теперь мы еще раз проверим оценку силуэта, чтобы увидеть, улучшилась ли она.

Браво! Она имеет! Продолжать идти. Ты прекрасно справляешься. Мы почти закончили.

4. Кластеризация K-средних

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

Это интерактивный сюжет, о котором мы говорили. Из фиктивных данных мы получили этот график и, очевидно, можем дать значение K = 3 (количество кластеров). Также график выше - это 10-я итерация.

Теперь, как работает K-средство, оно итеративно находит центроид каждого из кластеров. (понимание математики, лежащей в основе k-средних - https://heartbeat.fritz.ai/understanding-the-mat Mathematics-behind-k-means-clustering-40e1d55e2f4c)

Алгоритм случайным образом назначил 3 центроида кластеру тестовых данных (черные треугольники).

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

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

Вот как выглядят 1-я и 20-я итерации.

Продолжим кодирование.

Значение ‘k’ обычно основывается на интуиции и его легко угадать с помощью 2D-данных, но не с другими данными более высокого измерения.

Присваиваем k = 70. А затем моделируем его с некоторыми параметрами. Мы используем fit (x), который предназначен для изменения весов (коэффициентов входных переменных), чтобы они соответствовали набору обучающих данных. А также назначил столбец в кадре данных. Распространенная ошибка: не забудьте переопределить X в коде.

Затем мы вызываем df.head (), чтобы увидеть, что первые пять кластерных прогнозов в соответствии с алгоритмом k означает, который мы использовали. Получилось нормально.

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

Когда мы запускаем код, мы получаем значение k и оценку силуэта. Затем мы можем запустить m в следующем ядре, чтобы получить визуализацию карты.

Этот код написан для перебора различных значений «k», чтобы увидеть, как работают наши данные, и найти наилучший возможный диапазон оценок силуэта для этого значения k. Мы можем изменить значение количества кластеров, которое мы хотим иметь, но опять же, у него есть свои ограничения. Мы придерживаемся k = 70, и на следующем этапе мы увидим, почему это хорошее значение для наших данных.

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

Вам не кажется, что точки на карте выглядят слишком тесными в центре? Что ж, возможно, это потому, что K-Means не очень хорошо работают с такими объемными данными.

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

Подробнее об альтернативных подходах мы поговорим в моей следующей статье.

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

Мы скоро встретимся снова.

Будьте на связи! И счастливого кодирования!