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

В целом разработка функций состоит из следующих подэтапов:

  • Преобразование функции
  • Особенности строительства
  • Выбор функции
  • Извлечение признаков

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

В преобразовании функций у нас есть следующий вид обработки

  1. Вменение отсутствующих значений

В реальных условиях часто невозможно найти полные данные без пропущенных значений или значений NaN. Следовательно, мы можем либо удалить те строки, которые содержат эти пропущенные значения, либо выполнить вменение (заполнение пропущенных значений), чтобы гарантировать, что модели ML обрабатывают эти данные.

Чтобы удалить строки из кадра данных pandas, мы используем следующее

#Assuming data is store in df dataframe
df.isnull().sum()
#This returns the count of all the missing values in the columns

#In order to remove the missing values, we use drop function
df.drop(inplace=True)

2. Вменение данных

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

def mean_imputation(data, inplace=False):
    """
    This function replaces the missing values in the data with the average (mean) value of the data.
    
    Parameters:
    - data: The input data with missing values.
    - inplace: A boolean indicating whether to modify the data in place or return a new copy.
               If True, the missing values are filled in the original data; if False, a new copy with filled values is returned.
               (Default: False)
    """
    data.fillna(data.mean(), inplace=inplace)

def median_imputation(data, inplace=False):
    """
    This function replaces the missing values in the data with the median value of the data.
    
    Parameters:
    - data: The input data with missing values.
    - inplace: A boolean indicating whether to modify the data in place or return a new copy.
               If True, the missing values are filled in the original data; if False, a new copy with filled values is returned.
               (Default: False)
    """
    data.fillna(data.median(), inplace=inplace)

def mode_imputation(data, inplace=False):
    """
    This function replaces the missing values in the data with the mode value of the data.
    
    Parameters:
    - data: The input data with missing values.
    - inplace: A boolean indicating whether to modify the data in place or return a new copy.
               If True, the missing values are filled in the original data; if False, a new copy with filled values is returned.
               (Default: False)
    """
    data.fillna(data.mode(), inplace=inplace)

Альтернативный подход

threshold = 0.7
#Dropping columns with missing value rate higher than threshold
data = data[data.columns[data.isnull().mean() < threshold]]

#Dropping rows with missing value rate higher than threshold
data = data.loc[data.isnull().mean(axis=1) < threshold]

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

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

3. Обработка категориальных функций

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

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

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

encoded_columns = pd.get_dummies(data['column'])
data = data.join(encoded_columns).drop('column', axis=1)

4. Обнаружение выбросов

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

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

Статистические методы:

  • Z-оценка: Вычислите Z-оценку каждой точки данных и отметьте те, у которых Z-оценка выше определенного порога.
import numpy as np

def zscore_outlier_detection(data, threshold=3):
    z_scores = (data - np.mean(data)) / np.std(data)
    outliers = np.abs(z_scores) > threshold
    return outliers
  • Модифицированный метод Z-оценки: аналогичен методу Z-оценки, но использует надежную оценку вариации, такую ​​как среднее абсолютное отклонение.
from scipy.stats import median_absolute_deviation

def modified_zscore_outlier_detection(data, threshold=3.5):
    median = np.median(data)
    median_abs_dev = median_absolute_deviation(data)
    modified_z_scores = 0.6745 * (data - median) / median_abs_dev
    outliers = np.abs(modified_z_scores) > threshold
    return outliers
  • Ограждения Тьюки: идентифицируйте выбросы как значения, которые находятся ниже нижнего предела (Q1 — k * IQR) или выше верхнего предела (Q3 + k * IQR), где Q1 и Q3 — первый и третий квартили, а IQR — межквартильный диапазон. .
def tukey_fences_outlier_detection(data, k=1.5):
    q1 = np.percentile(data, 25)
    q3 = np.percentile(data, 75)
    iqr = q3 - q1
    lower_fence = q1 - k * iqr
    upper_fence = q3 + k * iqr
    outliers = (data < lower_fence) | (data > upper_fence)
    return outliers
  • K-ближайшие соседи (KNN): Измерьте расстояние каждой точки до k ближайших соседей и определите точки с большими расстояниями как выбросы.
from sklearn.neighbors import NearestNeighbors

def knn_outlier_detection(data, k=5, threshold=1.5):
    neigh = NearestNeighbors(n_neighbors=k)
    neigh.fit(data)
    distances, _ = neigh.kneighbors(data)
    median_distance = np.median(distances[:, -1])
    normalized_distances = distances[:, -1] / median_distance
    outliers = normalized_distances > threshold
    return outliers
  • Фактор локального выброса: Вычислите локальную плотность каждой точки по сравнению с ее соседями и пометьте точки со значительно более низкой плотностью как выбросы.
from sklearn.neighbors import LocalOutlierFactor

def lof_outlier_detection(data, contamination=0.1):
    lof = LocalOutlierFactor(n_neighbors=20, contamination=contamination)
    outliers = lof.fit_predict(data) == -1
    return outliers

Другой вариант обработки выбросов — ограничивать их, а не отбрасывать.

#Capping the outlier rows with percentiles
upper_lim = data['column'].quantile(.95)
lower_lim = data['column'].quantile(.05)
data.loc[(df[column] > upper_lim),column] = upper_lim
data.loc[(df[column] < lower_lim),column] = lower_lim

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

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

Несколько методов масштабирования функций:

Стандартизация (нормализация Z-показателя)
Этот метод масштабирует признаки, чтобы иметь нулевое среднее значение и единичную дисперсию. Он вычитает среднее значение признака и делит на стандартное отклонение. Формула стандартизации: x_scaled = (x — mean(x)) / std(x)
Стандартизация гарантирует, что каждый признак имеет среднее значение 0 и >стандартное отклонение 1, что приводит к одинаковой величине всех признаков.

from sklearn.preprocessing import StandardScaler

# Create an instance of StandardScaler
scaler = StandardScaler()

# Assuming your data is stored in a 2D array or dataframe X

# Fit the scaler to your data
scaler.fit(X)

# Transform the data
X_scaled = scaler.transform(X)

# The transformed data is now normalized using Z-score normalization

Min-Max Scaling
Этот метод масштабирует функции до указанного диапазона, обычно от 0 до 1. Он вычитает минимальное значение функции и делит на диапазон (максимальное значение минус минимальное значение). ). Формула для масштабирования min-max: x_scaled = (x — min(x)) / (max(x) — min(x))

from sklearn.preprocessing import MinMaxScaler
import numpy as np

# 4 samples/observations and 2 variables/features
data = np.array([[4, 6], [11, 34], [10, 17], [1, 5]])

# create scaler method
scaler = MinMaxScaler(feature_range=(0,1))

# fit and transform the data
scaled_data = scaler.fit_transform(data)

print(scaled_data)

# [[0.3        0.03448276]
#  [1.         1.        ] 
#  [0.9        0.4137931 ] 
#  [0.         0.        ]]

Масштабирование Max-abs
Этот метод масштабирует объекты в диапазоне [-1, 1]. Он делит каждое значение признака на максимальное абсолютное значение этого признака. Формула для масштабирования max-abs: x_scaled = x / max(abs(x))

from sklearn.preprocessing import MaxAbsScaler

# Create an instance of MaxAbsScaler
scaler = MaxAbsScaler()

# Assuming your data is stored in a 2D array or dataframe X

# Fit the scaler to your data
scaler.fit(X)

# Transform the data
X_scaled = scaler.transform(X)

# The transformed data is now scaled using max-abs scaling

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