Два варианта: локальный фактор выброса и модели гауссовой смеси.
Введение
Выбросы — часто обсуждаемая тема на многих форумах и в блогах по науке о данных. Вероятно, это связано с тем, что эти точки данных могут исказить наш анализ и повлиять на моделирование, если используемый нами алгоритм не устойчив к этим аномалиям.
Набор данных во многих случаях будет приводить большинство наблюдений в определенный диапазон значений, следуя некоторым шаблонам, оставаясь не слишком далеко от «группы». Это вставки. Но будут и такие наблюдения, которые никуда не впишутся, которые далеки от стандартов этих данных и не следуют этому образцу. Это аномалии, выбросы.
Алгоритм, на который сильно влияют выбросы, — это старая добрая линейная регрессия. Если у вас есть наблюдение, которое слишком далеко от центрального значения, это исказит расчет регрессии, что ухудшит работу модели.
Давайте изучим два быстрых способа найти выбросы с использованием алгоритмов обучения без учителя: KNN с локальным фактором выброса и гауссовой смесью, оба от Scikit-Learn.
Фактор локального выброса [LOF]
Этот алгоритм доступен в модуле sklearn.neighbors, и вы можете импортировать его с помощью from sklearn.neighbors import LocalOutlierFactor
. Он основан на алгоритме K-ближайших соседей, и здесь интересно то, что LOF имеет гиперпараметр contamination
, который помогает нам определить порог для выбросов. Итак, если вы используете contamination= 0.1
, это означает, что вы хотите учитывать 10% данных как выбросы.
Степень загрязнения набора данных, т. е. доля выбросов в наборе данных. (склерн документация)
Затем следует кодирование с применением этого алгоритма. Мы будем использовать набор данных car_crashes, который является родным из пакета seaborn в Python.
# Dataset df = sns.load_dataset('car_crashes')
Я просто добавлю сюда некоторые странные данные, которые будут нашими выбросами. Обратите внимание, что я хочу, чтобы он был совсем другим, чтобы убедиться, что это выброс, чтобы я мог продемонстрировать детекторы выбросов в действии.
# Creating very odd observations = OUTLIERS s1 = pd.DataFrame([30,30,30,30,30,30,30,'AB']).T s2 = pd.DataFrame([40,40,40,40,40,40,40,'AB']).T s3 = pd.DataFrame([30,30,30,30,50,50,50,'AB']).T s4 = pd.DataFrame([99,99,99,39,99,59,59,'AB']).T s5 = pd.DataFrame([99,99,90,9,99,9,99,'AB']).T s1.columns = s2.columns = s3.columns = s4.columns = s5.columns= df.columns # Adding them to the dataset df=pd.concat([df,s1, s2, s3, s4, s5], axis=0) # X X = df.drop('abbrev', axis=1)
Затем мы можем импортировать Pipeline
, StandardScaler
и создать этот простой конвейер для масштабирования данных, поместив их в тот же диапазон, а затем запустив алгоритм LOF. Обратите внимание, что мы используем уровень загрязнения 9%, поскольку данные содержат 51 наблюдение, и мы знаем, что нам нужно найти 5 выбросов (5/51 = 9,8%).
# Let's create a Pipeline to scale the data and find outliers using KNN Classifier steps = [ ('scale', StandardScaler()), ('LOF', LocalOutlierFactor(contamination=0.09)) ] # Fit and predict outliers = Pipeline(steps).fit_predict(X)
Это то, что вы увидите, если назовете вывод outliers
.
Как только это будет сделано, мы можем добавить данные в исходный набор данных и просмотреть его.
# Add column df['outliers'] = outliers # Look at the top 8 df.sort_values(by='outliers').head(8)
Отличный. Мы смогли найти ранее созданные выбросы. Если мы используем t-SNE для создания 2D-графика этого набора данных, вот что мы увидим ( код для этого графика можно найти по ссылке на GitHub в конце статьи).
Перейдем к тому, что только что произошло: LOF использует KNN, классификатор, который группирует точки данных на основе расстояний и сходств между ними. Естественно, поскольку созданные данные отличаются от остальных данных, они помечаются как аномалии.
Модели гауссовых смесей
Другой алгоритм, который можно найти, - это Модель смеси Гаусса (GMM). Этот просмотрит данные и разделит их на n групп. Чтобы добавить каждое наблюдение в группу, алгоритм вычисляет и создает n распределений Гаусса, а затем проверяет, где точка данных лучше подходит (более высокая вероятность) среди этих распределений Гаусса.
GMM от sklearn вычисляет баллы для наблюдений в соответствии с плотностью расположения каждой точки в этом пространстве. Таким образом, точки в областях с более высокой плотностью с меньшей вероятностью будут выбросами, в то время как верно и обратное, поэтому выбросы будут находиться в областях с низкой плотностью.
Давайте кодировать. Во-первых, импорт модуля.
from sklearn.mixture import GaussianMixture
Далее мы можем установить GMM. Мы используем 3 компонента, что означает, что эти данные разделены на 3 распределения Гаусса. n_init= 10
означает, что GMM выполняет 10 итераций, чтобы найти наилучшее соответствие.
gm = GaussianMixture(n_components=3, n_init=10) gm.fit(X)
Хорошо, теперь мы должны подсчитать баллы.
# Finding densities density_scores = gm.score_samples(X)
Если мы его напечатаем, то в этом случае мы увидим только отрицательные числа. Итак, я просто возьму их абсолютное значение, чтобы упростить вычисление процентилей.
density_scores= abs(density_scores)
Теперь мы можем рассчитать процентиль, который мы хотим использовать в качестве порога, или количество выбросов, которые нужно найти. Давайте работать с теми же 9%
# Define threshold threshold = np.percentile(density_scores, 9) # Finding outliers X[density_scores< threshold] X['densities'] = density_scores
Пороговое значение равно 16.36102
. Мы видим, что он находит те же результаты, то есть все, что ниже этого числа (наши фальшивые выбросы).
Это сработало, как и ожидалось.
Перед тем, как ты уйдешь
Поиск выбросов — это задача, которую можно выполнить разными способами. Есть и другие хорошие алгоритмы, например Isolation Forest. Есть и другие методы, такие как Z-Score, IQR… ну и множество вариантов.
Я хотел показать эти два, потому что нашел их очень простыми в применении.
Для LOF просто используйте:
LocalOutlierFactor(contamination= n)
.
Для GMM используйте:
scores = gm.score_samples(X) threshold = np.percentile(scores, 9) X[scores< threshold]
Вот полный код в GitHub.
Если вам понравился этот контент, подписывайтесь на мой блог.
Найдите меня в LinkedIn. Если вы планируете присоединиться к Medium, вот реферальная ссылка.
Ссылка
Орельен Жерон, 2019 г. Практическое машинное обучение с помощью Scikit-Learn, Keras и TensorFlow. 2 изд, О'Рейли.
Майкл Уокер, 2022 г. Очистка и исследование данных с помощью машинного обучения. 1-е изд. Публикации пакета.