Код Python для классификации спутниковых изображений по различным классам земного покрова.

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

В этом руководстве рассказывается, как анализировать краудсорсинговые данные из OpenStreetMap (OSM) для определения класса земного покрова; лес, трава, вода и т. д. Вы можете загрузить набор данныхздесь, если хотите продолжить.

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

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

О наборе данных:

Два набора данных предоставляются для обучения и тестирования. Оба они содержат 29 столбцов; 1 метка класса (цель), 1 столбец со значением максимального нормализованного индекса различий растительности (NDVI), а остальные столбцы содержат значения NDVI, полученные в разные дни в обратном хронологическом порядке.

Основываясь на значении NDVI, мы можем классифицировать спутниковую информацию как относящуюся к одному из 6 классов земного покрова; Лес, Непроницаемый, Вода, Трава, Сад или Ферма,поскольку значение NDVI является мерой растительного покрова.

Руководство:

1) Предварительная обработка данных-

Как обычно, мы импортируем необходимые библиотеки и наборы данных в 2 панды DataFrames.

Здесь мы перетасовываем строки в наборе данных и рассматриваем только двухмесячные переменные NDVI.

2) Техника передискретизации синтетического меньшинства -

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

Класс Forest имеет наибольшее количество наблюдений (7441), в то время как класс фруктов имеет наименьшее количество (53) из 10 545 общих наблюдений для всех классов.

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

Чтобы преодолеть эту проблему, мы выполним передискретизацию классов меньшинств, используя метод синтетической передискретизации меньшинства (SMOTE).

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

Приведенный ниже код заботится о кодировании целевой переменной и реализации SMOTE.

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

3) Наивный байесовский классификатор и оценка -

На следующем этапе мы применяем нормализацию для стандартизации независимых функций с помощью метода MinMaxScaler Scikit-learn.

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

Наконец, как обычно, мы заканчиваем вычислением показателя точности и выполнением перекрестной проверки K-Fold, чтобы установить показатели производительности нашей модели.

На тестовом наборе мне удалось добиться точности 74%.

Несмотря на 2 разных типа шума, присутствующих в наборе обучающих данных; как атрибут , так ишум маркировки, наша модель достигла хорошей точности 74%. Сегодня я узнал (и вы тоже!) о новой методике обработки дисбаланса в распределении классов под названием «Техника передискретизации синтетического меньшинства».

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

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

Большое спасибо за чтение, и увидимся на следующей неделе!