Что такое выбросы? Как нам нужно обнаруживать выбросы? Как мы должны относиться к выбросам?

Table of Contents:
· What are Outliers?
· Outlier Detection and Removal Techniques:
· Z Score-based method
· IQR technique
· Percentile Method

Что такое выбросы?

Выброс – это точка данных или наблюдение, поведение которых сильно отличается от остальных данных.

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



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

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

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



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

Поэтому нам нужно осторожно относиться к выбросам,

Обрезка. Удалите выбросы из набора данных перед обучением модели машинного обучения. Например, удалите учащихся из набора данных в приведенном выше примере.

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

Дискретизация. Это метод, при котором числовые признаки преобразуются в дискретные с использованием бинов. Например, если возраст 80–90 лет рассматривать как один бин, то все возрасты от 80 до 90 лет будут рассматриваться одинаково.

Методы обнаружения и удаления выбросов:

1. Метод Z Score

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

Если данные распределены нормально, эмпирическое правило гласит, что 68,2% точек данных находятся между 1-м стандартным отклонением, 95,4% точек данных лежат между 2-е стандартное отклонение, и 99,7% точек данных будут находиться между 3-м стандартным отклонением.

Точки данных, лежащие за пределами 3-го стандартного отклонения, можно рассматривать как выбросы.

Поскольку 99,7% данных будут лежать в пределах 3 стандартных отклонений, мы можем рассматривать остальные данные, лежащие за пределами 3 стандартных отклонений, как выбросы.

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



Рассмотрим практическое применение этой методики.

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')
df = pd.read_csv('placement_dataset.csv')

Набор данных имеет две независимые функции cgpa и placement_exam_marks.

plt.figure(figsize=(10,5))
plt.subplot(1,2,1)
sns.distplot(df['cgpa'])
plt.subplot(1,2,2)
sns.distplot(df['placement_exam_marks'])

Распределение данных показывает, что функция cgpa распределяется нормально, а другая функция, placemet_exam_marks, имеет перекос.

Таким образом, функция cgpa подходит для метода на основе Z Score метода обнаружения выбросов.

print('Mean value of CGPA {}'.format(df['cgpa'].mean()))
print('Min value of CGPA {}'.format(df['cgpa'].min()))
print('Max value of CGPA {}'.format(df['cgpa'].max()))
print('Standard deviation value of CGPA {}'.format(round(df['cgpa'].std(),2)))

# the boundary values are:
print('Highest value of cgpa', round(df['cgpa'].mean()+3*df['cgpa'].std(),3))
print('Lowest value of cgpa', round(df['cgpa'].mean()-3*df['cgpa'].std(),3))

Ниже приведены 5 точек данных, которые обнаружены как выбросы.

Это также может быть достигнуто с помощью формулы Z-оценки, которая показана ниже.

Обработка выброса:

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

Иногда, если набор данных имеет большое количество выбросов, мы теряем значительный объем данных.

Ограничение. В этом методе точки данных с выбросами ограничиваются самыми высокими или самыми низкими значениями, как показано ниже.



2. Метод ИКР

Этот метод используется, когда распределение данных асимметрично.

IQR описывает средние 50 % значений при упорядочении от наименьшего к наибольшему. Чтобы найти межквартильный размах (IQR), сначала найдите медиану (среднее значение) нижней и верхней половины данных. Этими значениями являются квартиль 1 (Q1) и квартиль 3 (Q3). IQR — это разница между Q3 и Q1.

IQR = Q3-Q1

Минимальное значение = Q1–1,5 *IQR

Максимальное значение = Q3+1,5*IQR

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

Рассмотрим практическое применение этой методики.

plt.figure(figsize=(10,5))
plt.subplot(1,2,1)
sns.distplot(df['cgpa'])
plt.subplot(1,2,2)
sns.distplot(df['placement_exam_marks'])

Функция placement_exam_marks искажена и подходит для IQR-метода обнаружения выбросов.

df['placement_exam_marks'].skew()
0.8356419499466834

#Finding the IQR
Q1 = df['placement_exam_marks'].quantile(0.25)
Q3 = df['placement_exam_marks'].quantile(0.75)
IQR = Q3-Q1
upper_limit = Q3+1.5*IQR
lower_limit = Q1-1.5*IQR
print('lower limit: ', lower_limit)
print('upper limit: ', upper_limit)
print('IQR:' , IQR)
lower limit:  -23.5
upper limit:  84.5
IQR: 27.0

Вышеупомянутые 15 точек данных обнаруживаются как выбросы.

Обрезка:

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

df_new = df[~(df['placement_exam_marks']>upper_limit) | (df['placement_exam_marks']<lower_limit)]
df_new

plt.figure(figsize=(15,5))
plt.subplot(2,2,1)
sns.distplot(df['placement_exam_marks'])
plt.subplot(2,2,2)
sns.boxplot(df['placement_exam_marks'])
plt.subplot(2,2,3)
sns.distplot(df_new['placement_exam_marks'])
plt.subplot(2,2,4)
sns.boxplot(df_new['placement_exam_marks'])

Посмотрите на распределение данных и диаграмму после обрезки функции.

Ограничение:

В этом методе точки данных выбросов ограничиваются самыми высокими или самыми низкими значениями, как показано ниже.

upper_limit = 84.5
lower_limit = -23.5
df_cap = df.copy()
df_cap['placement_exam_marks'] = np.where(df_cap['placement_exam_marks']>upper_limit, upper_limit , df_cap['placement_exam_marks']) 
df_cap['placement_exam_marks'] = np.where(df_cap['placement_exam_marks']<lower_limit , lower_limit , df_cap['placement_exam_marks'])
df_cap['placement_exam_marks'].max()
84.5
df_cap['placement_exam_marks'].min()
0.0

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

plt.figure(figsize=(15,5))
plt.subplot(2,2,1)
sns.distplot(df['placement_exam_marks'])
plt.subplot(2,2,2)
sns.boxplot(df['placement_exam_marks'])
plt.subplot(2,2,3)
sns.distplot(df_cap['placement_exam_marks'])
plt.subplot(2,2,4)
sns.boxplot(df_cap['placement_exam_marks'])

Посмотрите на распределение данных и диаграмму после ограничения функции.



3. Процентильный метод

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

Если вы набрали максимальный балл, равный 95, то это 100 процентиль, что означает, что вы набрали больше, чем 100% студентов, сдавших экзамен.

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

Давайте посмотрим, как мы можем реализовать этот метод на практике.

df = pd.read_csv('weight-height.csv')
df.head()

Применим метод процентилей к признаку Высота.

plt.figure(figsize=(15,5))
plt.subplot(1,2,1)
sns.distplot(df['Height'])
plt.subplot(1,2,2)
sns.boxplot(df['Height'])

Посмотрите на распределение данных и диаграмму функции.

#Finding the upper and lower limit
upper_limit = df['Height'].quantile(0.99)
lower_limit = df['Height'].quantile(0.01)
print('lower limit: ', lower_limit)
print('upper limit: ', upper_limit)
lower limit:  58.13441158671655
upper limit:  74.7857900583366

Вышеупомянутая 201 точка данных обнаружена как выбросы.



Обрезка

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

df_new = df[(df['Height']>=58.13) & (df['Height']<=74.78)]
df_new

plt.figure(figsize=(15,5))
plt.subplot(1,2,1)
sns.distplot(df_new['Height'])
plt.subplot(1,2,2)
sns.boxplot(df_new['Height'])

Посмотрите на распределение данных и диаграмму после обрезки функции.

Укупорка (также называемая Winsorization)

В этом методе точки данных выбросов ограничиваются самыми высокими или самыми низкими значениями, как показано ниже.

upper_limit = df['Height'].quantile(0.99)
lower_limit = df['Height'].quantile(0.01)
df_cap = df.copy()
df_cap['Height'] = np.where(df_cap['Height']>upper_limit , upper_limit , df_cap['Height'])
df_cap['Height'] = np.where(df_cap['Height']<lower_limit , lower_limit , df_cap['Height'])

plt.figure(figsize=(15,5))
plt.subplot(1,2,1)
sns.distplot(df_cap['Height'])
plt.subplot(1,2,2)
sns.boxplot(df_cap['Height'])

Посмотрите на распределение данных и диаграмму после ограничения функции.

Пожалуйста, перейдите по ссылке GitHub, чтобы получить полный код.

Вы можете связаться со мной через LinkedIn