Давайте воспользуемся набором данных NASA Airfoil Self-Noise Dataset для прогнозирования уровня звукового давления.

Оглавление

  1. Введение
  2. О наборе данных
  3. Предварительная обработка
  4. Разработка функций
  5. Линейная регрессия с перекрестной проверкой
  6. Лассо-регрессия с перекрестной проверкой
  7. Ридж-регрессия с перекрестной проверкой
  8. Оценка различных моделей регрессии
  9. Заключение

Введение

Привет, ребята! В этой статье я расскажу, как вы можете предварительно обработать набор данных и как вы можете применить Feature Engineering к набору данных. В конце мы предскажем целевую переменную, используя различные модели регрессии. И в качестве последнего шага мы оценим эти модели.

Предпосылки

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

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

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

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

Как видно из рисунка 1, этот набор данных НАСА включает аэродинамические поверхности NACA 0012 разного размера, с разной скоростью в аэродинамической трубе и под разными углами атаки. Масштабированный уровень звукового давления является основным показателем шума, создаваемого самолетом.

Таким образом, эти функции можно рассматривать как входные данные,

  1. Частота (Гц)
  2. Угол атаки (градусы)
  3. Длина хорды (метры)
  4. Скорость набегающего потока (метры в секунду)
  5. Толщина смещения стороны всасывания (метры)

Наша целевая переменная будет,

6. Масштабированный уровень звукового давления (дБ)

Начнем с предварительной обработки набора данных.

Предварительная обработка

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

  1. Обработка пропущенных значений
  2. Обработка выбросов
  3. Преобразования функций
  4. Кодирование функций
  5. Масштабирование функций
  6. Дискретизация признаков

1. Обработка пропущенных значений

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

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

2. Обработка выбросов

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

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

Точно так же я идентифицировал и заменил выбросы в переменных Angle of Attack и Displacement Thickness. Поскольку этот набор данных был собран в качестве эксперимента путем изменения различных скоростей набегающего потока и длины хорды, мы не будем удалять выбросы в этих переменных.

Если вы хотите узнать больше об обработке выбросов в наборах данных, обратитесь к этой записи в блоге.

3. Преобразование функций

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

Давайте используем гистограммы и графики Q-Q, чтобы увидеть, следуют ли наши переменные нормальному распределению.

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

  • Толщина смещения стороны всасывания (SSD) — перекос вправо
  • Частота — правый перекос
  • Угол атаки — правый перекос

Поскольку все эти переменные искажены вправо, у нас есть два варианта преобразования данных. Мы можем применить логарифмические преобразования или преобразования квадратного корня. Переменные SSD Thickness и Frequency имеют только положительные значения, мы можем использовать логарифмическое преобразование. Но поскольку переменная Angle of Attack имеет нулевые значения, мы можем применить преобразование квадратного корня.

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

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

Давайте проверим наши столбцы «Частота» (Гц) и «Толщина смещения на стороне всасывания» (дельта) после применения логарифмических преобразований.

3. Кодирование функций

Если у нас есть категориальные данные в нашем наборе данных, нам нужно преобразовать их в числовые данные. Для этого мы можем использовать методы кодирования, такие как горячее кодирование, целочисленное (меточное) кодирование и упорядоченное кодирование меток.

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

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

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

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

Давайте построим переменные после масштабирования набора данных.

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

5. Дискретизация признаков

Дискретизация переменных — это процесс преобразования непрерывных переменных в дискретные. Поскольку у нас есть наборы данных с небольшими диапазонами и небольшими уникальными значениями, применение дискретизации признаков не требуется.

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

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

Теперь это последний шаг нашей предварительной обработки. Давайте перейдем к Feature Engineering.

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

На этапе Feature Engineering мы в основном попытаемся сделать несколько вещей.

  • Функции фильтрации на основе их значимости при определении выходных данных.
  • Сожмите набор данных, идентифицируя и удаляя избыточные функции.

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

Извлечение признаков

1. Анализ корреляции

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

Матрица корреляции просто определяет, насколько изменится одна переменная при незначительном изменении другой переменной. Если корреляция близка к +1 или близка к -1, то существует сильная положительная или отрицательная корреляция соответственно. Если корреляция между двумя функциями близка к 0, мы можем предположить, что эти две переменные независимы.

В этом наборе данных мы видим, что «Толщина смещения на стороне всасывания (дельта)» и «Угол атаки (o)» имеют довольно высокую корреляцию 0,84. Поскольку он ниже 0,9, мы можем предположить, что все независимые признаки не имеют сильной положительной или отрицательной корреляции между любыми двумя признаками. Поэтому нам нужно извлечь все функции, поскольку они независимы.

2. Проанализируйте важные функции

Давайте воспользуемся новой корреляционной матрицей для анализа важных независимых характеристик путем сравнения этих характеристик с нашей зависимой характеристикой — Масштабированным уровнем звукового давления (дБ).

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

Уменьшение размерности

На этом этапе мы пытаемся сжать наши точки данных в пространство более низкого измерения. Для этого давайте применим PCA (анализ основных компонентов) к нашему набору данных.

Чтобы узнать больше о применении PCA и концепции PCA, вы можете обратиться к этой статье.

Мы можем использовать sklearn pipe и метод выбора модели GridSearchCV, чтобы найти оптимальное количество компонентов.

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

Давайте определим PCA с 4 компонентами и сократим наш набор данных до 4 измерений.

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

Полиномиальные функции

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

Было показано, что наши алгоритмы машинного обучения работают значительно лучше после применения полиномиальных признаков. Здесь я использовал библиотеку классов PolynomialFeature, предоставленную библиотекой машинного обучения Python scikit-learn.

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

Линейная регрессия с перекрестной проверкой

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

Здесь мы использовали библиотеку sklearn linear_model. Обратите внимание, что у нас есть более 5 коэффициентов, потому что мы увеличили размеры на шаге Feature Engineering.

Кросс-валидация

Теперь давайте воспользуемся методом K-Fold Cross-Validation для измерения производительности нашей модели. K представляет собой количество групп, на которые делится выборка данных. Давайте использовать k = 10 для нашей оценки.

Чтобы узнать больше о K-Cross Validation, обратитесь к этой статье.

Мы ясно видим, что наша модель линейной регрессии имеет точность 92,349% для 10-кратной перекрестной проверки.

Лассо-регрессия с перекрестной проверкой

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

Давайте проверим нашу модель с помощью K-Fold Cross-Validation.

При тестировании с перекрестной проверкой наша модель регрессии лассо показала точность 91,130%.

Ридж-регрессия с перекрестной проверкой

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

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

При тестировании с перекрестной проверкой наша модель регрессии лассо показала точность 87,069%.

Оценка различных моделей регрессии

Теперь мы находимся в нашем последнем шаге. Давайте оценим наши модели, рассчитав ошибки модели для каждых трех моделей, которые мы обучили до сих пор. В основном мы будем использовать среднеквадратичную ошибку (MSE), среднеквадратичную ошибку (RMSE) и среднюю абсолютную ошибку (MAE).

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

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

Заключение

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

На этом мы не остановились, мы смогли оценить разные модели, используя разные метрики оценки. Вы можете найти записную книжку Python в следующем репозитории Github.

Я надеюсь, что вы нашли этот урок полезным. Не стесняйтесь задавать любые вопросы в разделе комментариев ниже. Удачного кодирования!💫