Два варианта: локальный фактор выброса и модели гауссовой смеси.

Введение

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

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

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

Давайте изучим два быстрых способа найти выбросы с использованием алгоритмов обучения без учителя: 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-е изд. Публикации пакета.