Шаг 1. Проблема и предыстория
Классификация - один из основных видов проектов, с которыми вы можете столкнуться в мире Data Science. Поэтому наш инструктор поручил нам выполнить проект классификации для третьих индивидуальных проектов.
С тех пор как я начал заниматься наукой о данных, мне всегда хотелось работать с астрономическими данными. Итак, после некоторых исследований я остановился на работе с данными SDSS, которые включают информацию об объектах неба и их различных характеристиках.
Вступая в этот проект, я стремился классифицировать небесные объекты, такие как звезды, галактики и квазары, по их спектроскопическим и фотометрическим характеристикам. SDSS хранит эти функции в двух разных таблицах, поэтому мне пришлось объединить их с помощью команды SQL. После слияния я добавил эту таблицу в папку своего проекта. Что ж, у меня есть данные, пора поработать над методологией проекта.
Шаг 2: знание данных
Как я уже сказал, мой набор данных состоит из двух таблиц; один - это спектроскопические особенности, а другой - фотометрические.
- Спектроскопические данные: различные величины, измеряемые по спектру объекта. Например, его спектральный тип или красное смещение.
- Фотометрические данные: различные величины, измеряемые по изображению объекта. Например, его яркость, величина, поток или размер.
Этот набор данных состоит из 22 столбцов и 500000 строк, в которых отсутствуют пропущенные значения. И у меня есть три уникальных значения в целевом столбце: Galaxy, Star и Quasar.
Баланс между тремя классами моей целевой переменной составлял 54% Galaxy, 35,4% Star и 10,6% Quasar. Итак, мой набор данных не несбалансирован, и я могу перейти к части разработки функций после некоторой базовой очистки и визуализации данных.
Шаг 3: Разработка функций
Было 11 функций, которые я отметил как важные для построения хорошо работающей классификационной модели. Поэтому я сосредоточился на этих столбцах, чтобы заняться разработкой функций. Вот функции, которые я выбрал для этого раздела:
- Электромагнитный спектр: интенсивность света, излучаемого астрономическими объектами. Диапазоны наблюдения: ультрафиолетовый (u), зеленый (g), красный (r), инфракрасный (i) и z-диапазон.
- Плотность потока: скорость потока энергии от поверхности астрономического объекта.
- Красное смещение
Я начал с резко отклоняющихся значений. Были выбросы в 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, если хотите узнать больше!