Уровень статьи: Расширенный

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

В этой серии о предварительной обработке:

Стандартизация данных — Краткое объяснение — для начинающих
Нормализация данных — Краткое объяснение — для начинающих
Горячее кодирование — Краткое объяснение — для начинающих
Порядковое кодирование — Краткое объяснение — для начинающих
Отсутствующие значения в предварительной обработке набора данных — Средний уровень
Токенизация и векторизация текста в НЛП — средний уровень

Обнаружение выбросов в предварительной обработке набора данных — средний уровень

Выбор функций в предварительной обработке данных —Дополнительно

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

Выбор функций

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

Методы фильтрации

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

  • Корреляция Пирсона измеряет линейную зависимость между функцией x и целью y. Более высокий r означает более сильную линейную корреляцию.

r = (Сумма (x — среднее значение x) * (y — среднее значение y)) / (стандартное отклонение x * стандартное отклонение y)

Пример: Учитывая данные о росте и весе для 100 человек, коэффициент корреляции r равен 0,7. Это положительное значение r указывает на сильную корреляцию — по мере увеличения роста вес также имеет тенденцию к линейному увеличению. Поскольку рост имеет высокую корреляцию с весом, он выбран в качестве полезной функции для включения в моделирование прогнозов веса. Другие признаки, такие как цвет волос, могут иметь очень низкую корреляцию с весом и не будут выбраны.

  • F-критерий ANOVA сравнивает дисперсию между средними группами с дисперсией внутри групп. Более высокое значение F означает, что средние групповые значения находятся дальше друг от друга по сравнению с дисперсией внутри групп.

F = разница между средними значениями группы / разница внутри групп

Пример: Модель прогнозирует уровень дохода на основе характеристик образования. F-тест ANOVA показывает, что средние доходы для средней школы, колледжа и ученых степеней сильно отличаются друг от друга по сравнению с вариациями доходов в каждой образовательной группе. Характеристики образования с самыми высокими значениями F имеют наиболее разброс средних доходов, что указывает на то, что они сильно различаются по уровням доходов. Эти характеристики будут выбраны, в то время как характеристики образования, которые не показывают больших различий в среднем доходе между их группами, не будут выбраны.

  • Взаимная информация между x и y количественно определяет зависимость. Более высокий MI означает, что x и y более тесно связаны.

MI = Сумма (вероятность x и y) * log (вероятность x и y) — Сумма вероятности x * логарифмическая вероятность x — Сумма вероятности y * логарифмическая вероятность y

Пример: если характеристика x, например еженедельные учебные часы, имеет очень высокий уровень взаимной информации с целевым значением среднего балла студента y, то x предоставляет много информации об y, и эти две переменные сильно зависят друг от друга. Функция x будет выбрана из-за ее высокой прогностической способности GPA. Другие функции с более низкой взаимной информацией, такие как количество внеклассных мероприятий, менее полезны для прогнозирования среднего балла.

Методы оболочки

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

  • Исчерпывающий поиск проверяет все возможные комбинации функций.

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

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

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

  • Генетические алгоритмы эволюционируют совокупность подмножеств признаков в направлении оптимального решения.

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

Встроенные методы

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

  • Регрессия LASSO суммирует абсолютные размеры коэффициентов в качестве штрафа:

min (Ошибка + альфа*сумма абсолютных значений коэффициентов)

Пример: регрессия LASSO прогнозирует цены на жилье на основе таких характеристик, как количество спален, размер, местоположение и т. д. Параметр альфа управляет силой штрафа. Чем выше альфа, тем больше коэффициентов признаков будет сведено к нулю и удалено. Например, при сильной регуляризации может остаться только количество спален и размер, а другие функции будут удалены.

  • Регрессия гребня суммирует квадраты коэффициентов в качестве штрафа:

мин (ошибка + лямбда*сумма квадратов коэффициентов)

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

Пример кода Python

Вот пример кода, показывающий, как использовать scikit-learn для выбора функций. Сначала я покажу вам, как использовать корреляцию Пирсона из описанных выше методов Фильтрации, а затем воспользуюсь исчерпывающим поиском в широко используемом наборе данных Iris из обертки. методы, и, наконец, я буду использовать регрессию Лассо из встроенных методов. (Обратите внимание, что код используется в демонстрационных целях, он не предназначен для победы в соревнованиях Kaggle по эффективности, хе-хе)

Корреляция Пирсона

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

from scipy.stats import pearsonr

height = [1, 2, 3, 4, 5]
weight = [3, 4, 5, 9, 10]

# calculate pearson corrrelation
r, p_value = pearsonr(height, weight)
print("Correlation:", r) 

# feature selection thresholds
strong_threshold = 0.7
strong_inverse_threshold = -0.7

# feature selection decision
if r > strong_threshold:
    print("Strong positive correlation between height and weight.")
    print("Select both features.")
elif r < strong_inverse_threshold:
    print("Strong negative correlation between height and weight.")
    print("Select both features.")
else:
    print("Weak correlation between height and weight.")
    print("Only select height feature.")

Это выведет следующее:

Correlation: 0.9645788568769382
Strong positive correlation between height and weight.
Select both features.

Полный поиск

Я буду использовать набор данных Iris и классификатор Decision Tree от Sklearn. Поскольку это исчерпывающий поиск по 4 функциям, я распечатаю все результаты для каждой комбинации вместе с решением, следует ли использовать комбинацию функций или нет.

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score
import itertools 

# load iris dataset
X, y = load_iris(return_X_y=True)
feature_names = load_iris().feature_names

# generate feature combinations
combos = itertools.chain(
  itertools.combinations(feature_names, 4),
  itertools.combinations(feature_names, 3),
  itertools.combinations(feature_names, 2),
  itertools.combinations(feature_names, 1))

# evaluate feature subsets
for features in combos:

  X_temp = X[:,[i for i,f in enumerate(feature_names) if f in features]]

  model = DecisionTreeClassifier()
  scores = cross_val_score(model, X_temp, y, cv=5)

  print("Selected features:", features)
  if scores.mean() > 0.90:
    print("Accuracy:", scores.mean(),"High accuracy. Select all features.")  
  else:   
    print("Accuracy:", scores.mean(), "Low accuracy with features. Do not select.")

Это выведет следующее (результаты будут различаться):

Selected features: ('sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)')
Accuracy: 0.9600000000000002 High accuracy. Select all features.
Selected features: ('sepal length (cm)', 'sepal width (cm)', 'petal length (cm)')
Accuracy: 0.9333333333333332 High accuracy. Select all features.
Selected features: ('sepal length (cm)', 'sepal width (cm)', 'petal width (cm)')
Accuracy: 0.9199999999999999 High accuracy. Select all features.
Selected features: ('sepal length (cm)', 'petal length (cm)', 'petal width (cm)')
Accuracy: 0.9600000000000002 High accuracy. Select all features.
Selected features: ('sepal width (cm)', 'petal length (cm)', 'petal width (cm)')
Accuracy: 0.9600000000000002 High accuracy. Select all features.
Selected features: ('sepal length (cm)', 'sepal width (cm)')
Accuracy: 0.7333333333333333 Low accuracy with features. Do not select.
Selected features: ('sepal length (cm)', 'petal length (cm)')
Accuracy: 0.9133333333333333 High accuracy. Select all features.
Selected features: ('sepal length (cm)', 'petal width (cm)')
Accuracy: 0.9266666666666665 High accuracy. Select all features.
Selected features: ('sepal width (cm)', 'petal length (cm)')
Accuracy: 0.8933333333333333 Low accuracy with features. Do not select.
Selected features: ('sepal width (cm)', 'petal width (cm)')
Accuracy: 0.9333333333333332 High accuracy. Select all features.
Selected features: ('petal length (cm)', 'petal width (cm)')
Accuracy: 0.9533333333333334 High accuracy. Select all features.
Selected features: ('sepal length (cm)',)
Accuracy: 0.6933333333333334 Low accuracy with features. Do not select.
Selected features: ('sepal width (cm)',)
Accuracy: 0.5066666666666666 Low accuracy with features. Do not select.
Selected features: ('petal length (cm)',)
Accuracy: 0.9200000000000002 High accuracy. Select all features.
Selected features: ('petal width (cm)',)
Accuracy: 0.9533333333333334 High accuracy. Select all features.

Регрессия Лассо

Я снова буду использовать набор данных Iris, который я сопоставил с переименованными именами объектов «A, B, C и D», и модель Lasso от Sklearn. Я настроил альфа-параметр, чтобы вывести 2 полезных ненулевых функции, а остальные функции уменьшились до 0.

from sklearn.datasets import load_iris
from sklearn.linear_model import Lasso 
from sklearn.model_selection import train_test_split
import numpy as np

# feature mapping dictionar
feature_mapping = {'A': 'sepal length',
                   'B': 'sepal width',
                   'C': 'petal length',
                   'D': 'petal width'}
                   
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)  

lasso = Lasso(alpha=0.04)
lasso.fit(X_train, y_train)

coefs = lasso.coef_  
selected, = np.nonzero(coefs)

# get the selected letters
selected_letters = [list(feature_mapping.keys())[i] for i in selected]
print(feature_mapping)
print("Selected features:")
print(selected_letters)
print("Lasso accuracy:", lasso.score(X_test, y_test))

Это выведет следующее (результаты будут различаться):

{'A': 'sepal length', 'B': 'sepal width', 'C': 'petal length', 'D': 'petal width'}
Selected features:
['C', 'D']
Lasso accuracy: 0.9090708820329702

И это все! Я оставлю вас с некоторыми «веселыми» мелочами 😊

Разное

  • Одна из первых работ по автоматическому выбору признаков была опубликована в 1953 году Хасслером Уитни. Он предложил математические критерии для выбора признаков на основе их предсказательной силы, и его метод определил, какие параметры наиболее важны для расчета траекторий физических объектов. Это помогло точно определить траектории астрономических объектов, таких как комета Свифта, используя минимальный набор входных параметров.
  • В важной статье 1989 года Джон, Кохави и Пфлегер представили обертки для выбора функций. Статья называлась Нерелевантные признаки и проблема выбора подмножества. Это был большой шаг вперед по сравнению с предыдущими методами фильтрации, которые основывались на простых статистических показателях, не зависящих от какой-либо модели.