Есть ли функция, которая может удалить выбросы?
Вот функция для обнаружения выбросов, но мне нужна помощь в функции для удаления выбросов.
Здесь выбросы печати
Ответы (3)
Простым решением было бы использовать scipy.stats.zscore .
Я предполагаю, что под «удалением выбросов» вы подразумеваете «удалить строки из df фрейма данных, которые содержат выброс в столбце ‘Pre_TOTAL_PURCHASE_ADJ’ ». Если это неверно, возможно, вы могли бы изменить вопрос, чтобы прояснить ваш смысл.
Также полезны выборочные данные, вместо того, чтобы заставлять потенциальных респондентов формулировать свои собственные.
Как правило, гораздо эффективнее избегать итерации по строкам фрейма данных. Для выбора строк используется так называемое логическое индексирование массива. быстрый способ достижения ваших целей. Поскольку у вас уже есть предикат (функция, возвращающая значение истинности), который будет определять строки, которые вы хотите исключить, вы можете использовать такой предикат для создания другого фрейма данных, содержащего только выбросы, или (путем отрицания предикат) только неотпадающие.
Поскольку @political_scientist уже дал практическое решение с использованием scipy.stats.zscore для получения значений предиката в новом столбце is_outlier , я оставлю этот ответ как простой общий совет для работы с numpy и pandas. Учитывая этот ответ, нужные вам строки будут предоставлены
хотя было бы немного более понятно включить отрицание (
) в генерацию столбца селектора, а не в индексирование, как указано выше, переименовав столбец ‘is_not_outlier’ .
Практическое руководство по очистке данных в Python
Перед тем, как погрузиться в фантастический мир алгоритмов машинного обучения (ML), с помощью которых вы пытаетесь предсказать будущее, нужно сделать всего лишь одну крошечную ошибку: Подготовка данных или Предварительная обработка данных.
Подготовка данных — это несексуальная составляющая печально известного самого сексуального дела 21 века.
Обучить алгоритмы машинного обучения и использовать их для прогнозирования целевой переменной — это несложная задача, благодаря различным специализированным библиотекам и пакетам, доступным в Python и R. Тем не менее, извечная пословица Garbage In, Garbage Out (GIGO) все еще сохраняется в данных. наука и мир машинного обучения.
Действия по подготовке данных преобразуют необработанные данные в форму, форму и формат, которые могут эффективно и действенно использоваться алгоритмами машинного обучения. Он является жизненно важным компонентом конвейера машинного обучения и может создать или сломать процесс машинного обучения.
Практики соглашаются, что подавляющее большинство времени при создании конвейера машинного обучения уходит на разработку функций и очистку данных. Тем не менее, несмотря на всю важность, эта тема редко обсуждается сама по себе.
Очистка данных — это всего лишь один из компонентов действий по подготовке данных, которые также включают выбор функций, преобразование данных, разработку функций и уменьшение размерности.
Действия по обработке данных, а также очистка данных по определению уникальны для каждого набора необработанных данных с учетом индивидуальных особенностей, присущих практическому проекту машинного обучения. Несмотря на это, некоторые действия являются стандартными и должны применяться или, по крайней мере, проверяться на необработанных данных перед обучением модели.
Независимо от типа ошибок данных, которые необходимо исправить, действия по очистке данных обычно состоят из двух этапов: (1) обнаружение ошибок, когда различные ошибки и нарушения выявляются и, возможно, проверяются экспертами; и (2) исправление ошибок, при котором обновления базы данных применяются (или предлагаются специалистам-людям) для приведения данных в более чистое состояние, подходящее для последующих приложений и аналитики².
Предупреждение!
Небольшое предостережение, прежде чем мы рассмотрим различные стандартные действия по очистке данных. Как отмечалось в одной из моих предыдущих статей: все следующие операции должны выполняться с числовым обучающим набором данных после разделения всех ваших данных на подмножества обучения / тестирования / проверки, чтобы избежать утечки данных. Только тогда, когда у вас будет чистый набор обучающих данных, повторите тот же набор действий с тестовыми (и проверочными) наборами данных, а также с целевыми переменными, если это необходимо.
Во всех приведенных ниже фрагментах кода и в соответствии с общепринятыми обозначениями X_train относится к набору входных данных для обучения.
Базовая очистка данных
Следующие ниже операции должны стать отправной точкой вашего проекта машинного обучения, которые будут применяться ко всем данным, которые вы получите в свои руки.
Выявление и удаление предикторов с нулевой дисперсией
Предикторы с нулевой дисперсией относятся к входным объектам, которые содержат одно значение для всего спектра наблюдений. Соответственно, они не добавляют никакого значения к алгоритму прогнозирования, поскольку на целевую переменную не влияет входное значение, что делает их избыточными. Некоторые алгоритмы машинного обучения могут также вызывать непредвиденные ошибки или выдавать неверные результаты.
Pandas предоставляет короткую и удобную функцию для подсчета и перечисления количества уникальных значений в каждом столбце фрейма данных Pandas:
Удаление определенных столбцов из фрейма данных Pandas достаточно просто X_train.drop(columns=[‘column_A’, ‘column_B’], inplace=True) , когда столбцов для удаления не так много. Более надежный способ достичь того же результата с несколькими столбцами с нулевой дисперсией:
Приведенный выше код удалит все столбцы с одним значением и обновит фрейм данных X_train .
Оценить столбцы с очень небольшим количеством уникальных значений
Особое внимание следует уделять столбцам, в которых очень мало уникальных значений (иначе говоря, дисперсия с низкой или почти нулевой дисперсией). Такие столбцы не являются автоматическими кандидатами на удаление из набора данных. Например, не ожидается, что порядковые или категориальные столбцы будут иметь большое количество уникальных значений.
Интуитивно мы можем наивно отбросить столбцы с низкой дисперсией, но что, если бы такие предикторы были действительно информативными для обучения модели? Например, предположим, что у двоичного объекта в задаче классификации много нулей и мало единиц (предиктор дисперсии, близкой к нулю). Целевая переменная всегда одна и та же, если эта входная характеристика равна единице; однако это может быть любое из возможных целевых значений, если эта функция равна нулю. Безусловно, оправданно оставить эту колонку в качестве одного из наших предсказателей.
Следовательно, следует учитывать контекстные соображения и знания предметной области, чтобы оценить, следует ли удалять такие столбцы с низкой дисперсией из нашего набора данных или нет. Например:
- Рассмотрите возможность кодирования их как порядковых переменных
- Рассмотрите возможность кодирования их как категориальных переменных
- Рассмотрите возможность объединения этих столбцов с низкой дисперсией с помощью некоторых методов уменьшения размерности, например, анализа главных компонентов (PCA).
Мы можем либо вручную рассчитать количество уникальных значений в каждом столбце в процентах от общего количества наблюдений, как показано ниже:
Приведенный выше код распечатает список всех столбцов вместе с количеством уникальных значений и их процентным соотношением к общему количеству наблюдений.
Или мы можем использовать VarianceThreshold class библиотеки scikit-learn для определения и удаления столбцов с низкой дисперсией. Соблюдайте особую осторожность при использовании класса VarianceThreshold , поскольку он предназначен для удаления столбцов, которые находятся ниже параметризованного порога.
Работа с повторяющимися данными
Скорее всего, из ваших данных следует удалить повторяющиеся строки, поскольку они, скорее всего, в любом случае будут избыточными.
Pandas предоставляет простую функцию для проверки любых повторяющихся строк во фрейме данных. Обратите внимание, что это будет отображать только вторую (и любую строку более высокого порядка), поскольку первая строка, которая была продублирована, не считается дубликатом.
Если после анализа повторяющихся записей вы захотите продолжить их удаление, всего одна строка кода может добиться этого:
Обнаружение выбросов
Выбросы — это любые точки данных, которые кажутся редкими или маловероятными в контексте данного набора данных. Знание предметной области и предметная экспертиза пригодятся для выявления выбросов. Хотя стандартного определения выбросов с учетом их контекстного характера не существует, для их выявления и надлежащего устранения можно использовать различные статистические показатели и методы построения графиков.
Подобно столбцам с низкой дисперсией, выбросы не являются автоматическими кандидатами на удаление. Вместо этого их следует проанализировать дополнительно, чтобы определить, действительно ли они являются аномальными.
Построение прямоугольников и усов — это простой и основной способ визуализировать числовые выбросы в вашем фреймворке данных:
Давайте теперь посмотрим на некоторые статистические методы выявления выбросов.
Использование стандартного отклонения (SD)
Методы SD для обнаружения выбросов могут применяться ко всем числовым характеристикам, которые имеют гауссово или гауссовское распределение. Напоминаем, что:
- 68% нормально распределенных наблюдений лежат в пределах 1 SD от среднего
- 95% нормально распределенных наблюдений лежат в пределах 2 SD от среднего
- 99,7% нормально распределенных наблюдений лежат в пределах 3 SD от среднего
Следующие строки кода выберут и отбросят все строки со значениями, превышающими указанный SDx для каждого числового столбца. 3 SD — стандартный порог; однако 2 SD могут использоваться для небольших наборов данных и 4 SD для относительно больших наборов данных.
Использование межквартильного размаха (IQR)
Мы можем использовать IQR для выявления выбросов во входной функции, которая не соответствует нормальному или нормальному распределению. Значения, выходящие за пределы указанного порога (обычно в 1,5 раза выше 75-го процентиля и ниже 25-го процентиля), отфильтровываются для дальнейшего анализа.
Следующий фрагмент кода отфильтрует выбросы из всех числовых столбцов с порогом 1,5.
Фактор локальных выбросов (LOF)
Метод fit_predict _6 _ предсказывает, включает ли каждая строка в кадре данных числовые выбросы (-1) или нет (1). Строки с выбросами помечаются как -1 и как 1 в противном случае. Ниже показан простой практический пример:
Предупреждение в отношении LOF: он не допускает нулевых или отсутствующих значений в данных, передаваемых методу прогнозирования.
Статистически вменять отсутствующие значения
Чтобы повторить очевидное, пропущенные значения не редкость в реальных данных. Большинство алгоритмов машинного обучения не могут обрабатывать отсутствующие значения и выдают ошибку во время обучения модели. Следовательно, такие пропущенные значения в наборе данных следует либо отбросить (самый наивный способ, и его следует как можно больше избегать — данные — это новая валюта!), Либо как-то логически вменяться.
Некоторые эффективные описательные статистические данные, которые обычно применяются для такого вменения, включают:
- среднее значение столбца
- среднее значение столбца
- значение режима столбца
- какая-то другая общая ценность
Несколько простых способов найти и обнаружить отсутствующие или нулевые значения — это выполнить одну из следующих функций:
Статистическое вычисление пропущенных значений довольно просто с использованием встроенных функций Python. Следующие функции вычисляют описательную статистику для каждого столбца и используют эту вычисленную статистику для заполнения всех пустых значений в этом конкретном столбце:
Однако помните, что описательная статистика должна рассчитываться только на обучающем наборе данных; а затем следует использовать ту же статистику для вменения любых пропущенных значений как в обучающих, так и в тестовых данных. Вышеупомянутый подход хорошо работает с простым разделением поездов / тестов; однако это становится практически невозможным при оценке модели с помощью k-кратной перекрестной проверки, поскольку разделение выполняется и повторяется несколько раз в рамках одного вызова функции.
Здесь нам на помощь приходят Pipeline и SimpleImputer Scikit-learn.
Автономная реализация SimpleImputer
Класс SimpleImputer выполняет преобразование данных с помощью следующих шагов:
- Определите класс с типом описательной статистики, которая будет использоваться. Поддерживаются среднее значение, медиана, режим и конкретное постоянное значение.
- Подогнать к набору обучающих данных, чтобы вычислить статистику для каждого столбца на основе данных обучения.
- Примените подобранный импьютер к обучающим и тестовым наборам данных, чтобы присвоить статистику, вычисленную на 2-м шаге, отсутствующим значениям в обоих этих наборах данных.
Далее следует простая демонстрация:
Реализация SimpleImputer с конвейером
Конвейер Scikit-learn позволяет нам последовательно выполнять несколько преобразований данных перед применением окончательной модели оценки за один шаг. Это предотвращает утечку данных из тестовых данных в обученную модель при перекрестной проверке, гарантируя, что одни и те же образцы используются для обучения преобразователей и предикторов (из документации).
Лучше всего использовать Pipeline при перекрестной проверке, как показано ниже:
Простой for цикл также можно использовать для анализа всех четырех различных стратегий вменения, доступных в SimpleImputer :
В приведенном выше списке перечислены средние значения точности каждой стратегии вменения.
Прогнозирование целевой переменной с новыми живыми данными с потенциально отсутствующими значениями достигается с помощью конвейера следующим образом:
kNN Вменение отсутствующих значений
Помимо использования описательной статистики для вменения пропущенных значений, алгоритм машинного обучения также может использоваться для их прогнозирования. Для прогнозирования пропущенных значений можно использовать простую регрессионную модель; однако модель k-ближайших соседей (kNN) оказалась эффективной и на практике.
Класс KNNImputer Scikit-learn поддерживает вменение kNN, что очень похоже на SimpleImputer по своему использованию. Как и SimpleImputer , я сначала продемонстрирую автономное использование KNNImputer , прежде чем реализовывать его в конвейере.
Реализация KNNImputer с конвейером
Теперь давайте посмотрим, как это можно реализовать в конвейере для эффективной проверки:
Мы также можем применить цикл for , чтобы просмотреть несколько k_neighbors параметров, чтобы определить лучший из них на основе нашей метрики точности:
Прогнозирование целевой переменной с новыми оперативными данными, содержащими пропущенные значения, достигается теми же средствами, что и для SimpleImputer .
Заключение
На этот раз я расскажу о конкретных задачах очистки данных в Python для проектов машинного обучения.
Не стесняйтесь обращаться ко мне, если вы хотите обсудить что-либо, связанное с аналитикой данных и машинным обучением.
До следующего раза — вперед!
Источники вдохновения и ссылки
[1] Чжэн, А., Касари, А. (2018). Предисловие. В статье Разработка функций для машинного обучения: принципы и методы для специалистов по данным (стр. Vii). Севастополь, Калифорния: О’Рейли.
[2] Ильяс, И. Ф., и Чу, X. (2019). Вступление. В Очистка данных (стр. 1). Нью-Йорк: Ассоциация вычислительной техники.
Обнаружение и удаление выбросов в Python – легко понять гид
Здравствуйте, читатели! В нашей серии обработки и анализа данных сегодня мы посмотрим на обнаружение и удаление выбросов в Python.
- Автор записи
Здравствуйте, читатели! В нашей серии обработки данных и анализа данных сегодня мы посмотрим на Обнаружение и удаление выбросов в питоне.
Итак, давайте начнем!
Что такое выбросы в Python?
Перед погружением глубоко в концепцию Выбросы Давайте понять происхождение необработанных данных.
Необработанные данные, которые подаются в систему, обычно генерируются от опросов и извлечения данных из действий в реальном времени в Интернете. Это может привести к изменению данных в данных, и существует вероятность ошибки измерения при записи данных.
Это когда выбросы вступают в сцену.
Оформление – это точка или набор точек данных, которые лежат от остальных значений данных набора данных Отказ То есть это точка данных, которые отображаются вдали от общего распределения значений данных в наборе данных.
Выбросы возможны только в непрерывных значениях. Таким образом, обнаружение и удаление выбросов применимы только к значениям регрессии.
В основном, выбросы, по-видимому, расходятся от общего правильного и хорошо структурированного распределения элементов данных. Это можно считать как Ненормальное распределение, которое появляется вдали от класса или население.
Поняв концепцию выбросов, давайте сейчас сосредоточимся на необходимости удаления выбросов в предстоящем разделе.
Почему необходимо удалить выбросы от данных?
Как обсуждалось выше, выбросы являются точками данных, которые лежат вдали от обычного распределения данных и приводит к тому, что ниже воздействие на общее распределение данных:
- Влияет на общую стандартную вариацию данных.
- Манипулирует общее среднее значение данных.
- Преобразует данные в перекошенную форму.
- Это вызывает смещение в оценке точности модели обучения машины.
- Влияет на распределение и статистику набора данных.
Из-за вышеуказанных причин необходимо обнаружить и избавиться от выбросов до моделирования набора данных.
Обнаружение выбросов – IQR подход
Выбросы в наборе данных могут быть обнаружены методами ниже:
- Z-счет
- Рассеянные участки
- Межструйный диапазон (IQR)
В этой статье мы реализуем метод IQR для обнаружения и лечения выбросов.
IQR – аббревиатура для межступного диапазона Отказ Он измеряет статистическую дисперсию значений данных как мера общего распространения.
IQR эквивалентен разницей между первым квартилем (Q1) и третьим квартилью (Q3) соответственно.
Здесь Q1 относится к первому квартилю I.e. 25% и Q3 относится к третьему квартилю I.e. 75%.
Мы будем использовать Boxplots для обнаружения и визуализации выбросов, присутствующих в наборе данных.
Коробки изображают распределение данных с точки зрения квартилей и состоит из следующих компонентов
- Q1-25%
- Q2-50%
- Q3-75%
- Нижняя граница/усы
- Верхний усы/граница
Любая точка данных, которая лежит ниже нижней границы, и над верхней границей рассматривается как выброс.
Давайте теперь будем реализовать BoxPlot для обнаружения выбросов в приведенном ниже примере.
Пример :
Первоначально мы импортировали набор данных в окружающую среду. Вы можете найти набор данных здесь Отказ
Кроме того, мы сегрегировали переменные в числовые и категорические значения.
Мы применяем BoxPlot, используя BoxPlot () Функция на числовых переменных, как показано ниже:
Как видно выше, вариабельная «ветряная скорость» содержит выбросы, которые лежат над нижней границей.
Удаление выбросов
Сейчас самое время лечить выбросы, которые мы обнаружили, используя BoxPlot в предыдущем разделе.
Используя IQR, мы можем следовать приведенному ниже подходу для замены выбросов в нулевое значение:
- Рассчитайте первый и третий квартиль (Q1 и Q3).
- Кроме того, оцените межквартирный диапазон, IQR-Q1 Отказ
- Оцените нижнюю границу, ниже * 1.5
- Оцените верхнюю границу, Верхний * 1.5.
- Замените точки данных, которые лежат за пределами нижней и верхней границы с Нулевое значение Отказ
Таким образом, мы использовали numpy.percentile () Метод Для расчета значений Q1 и Q3. Кроме того, мы заменили выбросы с numpy.nan как нулевые значения.
Заменив выбросы NAN, давайте теперь проверьте сумму нулевых значений или отсутствующих значений, используя код ниже:
Сумма подсчета нулевых значений/выбросов в каждом столбце набора данных:
Теперь мы можем использовать любую из приведенных ниже методов для лечения нулевых значений:
- Вмешивает недостающие значения со средним, средним или навязчивым значениями.
- Снимите нулевые значения (если пропорция сравнительно меньше)
Здесь мы бросили бы нулевые значения, используя Pandas.dataframe.dropna () функция
Обработавшись к выбросам, давайте теперь проверяем наличие отсутствующих или нулевых значений в наборе данных:
Таким образом, все выбросы, присутствующие в наборе данных, были обнаружены и обработаны (удалены).
Заключение
По этому, мы подошли к концу этой темы. Не стесняйтесь комментировать ниже, если вы столкнетесь с любым вопросом.
Для более таких постов, связанных с Python. Оставайтесь настроиться и до тех пор, до тех пор, пока, счастливое обучение !! .
Outliers
A boxplot showing the median and inter-quartile ranges is a good way to visualise a distribution, especially when the data contains outliers. The meaning of the various aspects of a box plot can be explained as follows —
Generating some data
We are going to need some test data to explore the issues around outliers …
Function Definition
The generate() function below (taken from Stack Overflow) will generate a list of floats with a given median that contains outliers (values a long way from the median) which we can use to explore the concept.
Function Testing
Let’s get the results of generate() into a DataFrame so we can take a look at the output …
Creating some meaningful data
The following creates a DataFrame with 3 columns with means of 630, 740 and 220 which contain outlying values —