Уровень статьи: Расширенный
Мои клиенты часто спрашивают меня об особенностях тех или иных методов предварительной обработки данных, зачем они нужны и когда их использовать. Я расскажу о нескольких распространенных (и не очень) методах предварительной обработки в серии статей на эту тему.
В этой серии о предварительной обработке:
Стандартизация данных — Краткое объяснение — для начинающих
Нормализация данных — Краткое объяснение — для начинающих
Горячее кодирование — Краткое объяснение — для начинающих
Порядковое кодирование — Краткое объяснение — для начинающих
Отсутствующие значения в предварительной обработке набора данных — Средний уровень
Токенизация и векторизация текста в НЛП — средний уровень
Обнаружение выбросов в предварительной обработке набора данных — средний уровень
Выбор функций в предварительной обработке данных —Дополнительно
В этом кратком обзоре я объясню, как выполнять выбор объектов в вашем наборе данных. Обычно я даю глоссарий в начале каждой статьи, но для продвинутых и экспертных статей я предполагаю, что читатели имеют практические знания некоторых аспектов машинного обучения, поэтому я не буду использовать глоссарий. Попробуйте, и если вам нужна дополнительная информация, просто спросите в разделе комментариев!
Выбор функций
Выбор функций — важный шаг в конвейерах машинного обучения. Это относится к выбору наиболее подходящих функций для обучения модели. Уменьшение количества функций может упростить модели, сократить время обучения, повысить точность и предотвратить переоснащение. Существует множество методов выбора подмножеств признаков.
Методы фильтрации
Методы фильтрации выбирают объекты на основе статистических свойств данных. Простые фильтры, такие как порог дисперсии, удаляют функции с низкой дисперсией, которые не предоставляют много информации. Статистические тесты, такие как 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 года Джон, Кохави и Пфлегер представили обертки для выбора функций. Статья называлась Нерелевантные признаки и проблема выбора подмножества. Это был большой шаг вперед по сравнению с предыдущими методами фильтрации, которые основывались на простых статистических показателях, не зависящих от какой-либо модели.