Шаг 1. Проблема и предыстория

Классификация - один из основных видов проектов, с которыми вы можете столкнуться в мире Data Science. Поэтому наш инструктор поручил нам выполнить проект классификации для третьих индивидуальных проектов.

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

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

Шаг 2: знание данных

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

  • Спектроскопические данные: различные величины, измеряемые по спектру объекта. Например, его спектральный тип или красное смещение.
  • Фотометрические данные: различные величины, измеряемые по изображению объекта. Например, его яркость, величина, поток или размер.

Этот набор данных состоит из 22 столбцов и 500000 строк, в которых отсутствуют пропущенные значения. И у меня есть три уникальных значения в целевом столбце: Galaxy, Star и Quasar.

Баланс между тремя классами моей целевой переменной составлял 54% Galaxy, 35,4% Star и 10,6% Quasar. Итак, мой набор данных не несбалансирован, и я могу перейти к части разработки функций после некоторой базовой очистки и визуализации данных.

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

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

  1. Электромагнитный спектр: интенсивность света, излучаемого астрономическими объектами. Диапазоны наблюдения: ультрафиолетовый (u), зеленый (g), красный (r), инфракрасный (i) и z-диапазон.
  2. Плотность потока: скорость потока энергии от поверхности астрономического объекта.
  3. Красное смещение

Я начал с резко отклоняющихся значений. Были выбросы в i-диапазоне и z-диапазоне, поэтому я обработал их с помощью метода pandas clip. Во-вторых, поскольку диапазон моих характеристик потока был слишком широк, я также сделал некоторые преобразования единиц измерения. Когда я собирал данные, характеристики потока выражались в единицах наномагии, поэтому я преобразовал их в единицу Янски (единица спектральной плотности потока), 1 наномагия = 3,631 * 10 ^ -6 Янски. Кроме того, я сделал логарифмическое преобразование, чтобы уменьшить влияние выбросов для функции красного смещения.

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

# Colour Indexes-difference between the two spectrum range
df1['color_u_g'] = df1['u'] - df1['g']
df1['color_g_r'] = df1['g'] - df1['r']
df1['color_r_i'] = df1['r'] - df1['i']
df1['color_i_z'] = df1['i'] - df1['z']

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

Шаг 4: модели классификации

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

  • Алгоритмы упаковки: случайный лес, лишние деревья и классификатор упаковки
  • Алгоритмы повышения: AdaBoost и GradientBoosting
  • Классификатор голосования: мягкий и жесткий

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

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

Я должен указать, что в реальном мире нет такой вещи, как лучшая модель. Как сказал Джордж Э. Бокс однажды сказал: «Все модели неправильные, но некоторые полезны». Вам просто нужно найти наиболее полезную модель для вашей проблемы и данных.

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

Шаг 5: Улучшение модели

Я перешел к разделу оптимизации, следующему за оценками моделей. Для этого я решил использовать GridSearch.

#specify the parameters to be tested
n_est = [80, 100, 120, 140]
max_features_opt = [0.93, 0.95, 0.97]
param_grid = dict(n_estimators = n_est, max_features=max_features_opt)

Мы можем подогнать модель после определения параметров, которые будет проверять GridSearchCV. Имейте в виду, что GridSearchCV включает в себя перекрестную проверку, поэтому мне также нужно указать значение KFold. Я смогу изучить лучший оценщик, когда процесс подгонки будет завершен.

kf=KFold(n_splits=10, shuffle=True, random_state=76)
bag_grid = GridSearchCV(bag, param_grid, cv = kf, 	scoring='accuracy', n_jobs=-1)
bag_grid.fit(X_train, y_train)

И в свете результатов, которые я получил от GridSearch, я переопределил модель классификатора упаковки.

bag_opt = BaggingClassifier(base_estimator=dtree, n_estimators=120,  max_features=0.93, bootstrap=True, random_state=seed, n_jobs = -1)
bag_opt_acc = round(cross_val_score(bag_opt, X_train, y_train, 																																																 cv=kf).mean())bag_opt_std = round(cross_val_score(bag_opt, X_train, y_train, cv=kf).std())

Шаг 6: результаты

На последнем этапе я прошел тест на удержание, чтобы убедиться в точности оптимизированной модели бэггинга. Результат точности, который я получил от оптимизированной модели, составил 99,44%, поэтому я добился увеличения ~ 0,06%. Это не так уж и много, но у моей модели все равно хороший показатель точности.

Заключительные выводы:

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

Что ж, пока это все. До скорой встречи в следующем посте!

Также загляните в мой профиль Github, если хотите узнать больше!