Каталог предыдущих статей по теме:
- Линейная регрессия для машинного обучения
- Логистическая регрессия и реализация машинного обучения на Python
- Борьба с проектами машинного обучения Обнаружение аномалий данных транзакций
- Дерево решений для машинного обучения
- Реализация дерева решений машинного обучения (Decision Tree) на Python
- PCA (анализ основных компонентов) для машинного обучения
- Разработка функций для машинного обучения
Когда дело доходит до проектирования признаков, в отрасли широко распространена поговорка: данные и признаки определяют верхний предел машинного обучения, а модели и алгоритмы только приближаются к этому верхнему пределу, что показывает важность проектирования признаков.
1. Объяснение и значение разработки признаков
Так что же такое фиче-инжиниринг? Сначала посмотрите на характеристики,
Особенности: относится к информации, извлеченной из данных, которая полезна для прогнозирования результатов, то есть соответствующих атрибутов данных.
Разработка функций: процесс использования специальных фоновых знаний и навыков для обработки данных, чтобы функции могли играть более важную роль в алгоритмах машинного обучения.
значение:
1. Лучшие функции означают большую гибкость
2. Лучшие функции означают, что вы можете очень хорошо тренироваться с простой моделью
3. Лучшие функции означают, что можно тренировать лучшие результаты
2. Конкретный процесс разработки признаков
Весь процесс можно представить следующей схемой
)1. Схема использования функции
После определения нашей цели первое, что нам нужно сделать, это проанализировать, какие данные необходимы для достижения нашей цели в соответствии с бизнес-сценарием. То есть, исходя из понимания бизнеса, попытайтесь найти все независимые переменные, которые влияют на зависимую переменную. Например: я хочу спрогнозировать заказ продуктов пользователем или я хочу порекомендовать продукты пользователям, так какую информацию мне нужно собрать? Его можно разделить на три направления сбора,
- Магазин: категория магазина, рейтинг магазина, курьер, которым пользуется магазин и т.д.
- Товар: категория товара, рейтинг, количество покупателей, цвет и т. д.
- Пользователь: историческая информация о покупках, покупательная способность, коэффициент конверсии корзины покупок, время пребывания продукта, возраст пользователя, адрес и т. д.
Затем для нужных нам данных нам нужно выполнить оценку юзабилити.
- Сложность приобретения, можем ли мы собрать данные? Например, возраст пользователя получить сложнее, и не все впишут возраст при регистрации.
- Покрытие, некоторые данные доступны не для каждого объекта, например, историческая информация о покупках, для новых пользователей нет
- Точность, такая как возраст пользователя и рейтинг магазина, также будет иметь проблемы с точностью, потому что магазин может провести заказ, а пользователь может не написать реальный возраст.
- Быстро ли получить онлайн расчет в режиме реального времени?
2. Схема приобретения признаков
После определения необходимых нам функций следующим шагом будет рассмотрение приобретения и хранения функций, которые в основном делятся на приобретение функций в автономном режиме и приобретение функций в Интернете.
1 Схема приобретения функций в автономном режиме
Большие данные можно использовать в автономном режиме. С помощью распределенных платформ хранения файлов, таких как HDFS, инструменты обработки, такие как MapReduce и Spark, можно использовать для обработки больших данных.
2 Схема приобретения онлайн-функций
Онлайн-функции уделяют больше внимания задержке в получении данных.Поскольку это онлайн-сервис, ему необходимо получить соответствующие данные за очень короткое время, что требует очень высокой производительности поиска.Данные могут храниться в индексах, хранилищах kv и т. д. . Однако возникнет конфликт между производительностью поиска и объемом данных, которые необходимо скомпрометировать.Мы используем схему многоуровневого сбора данных, как показано на следующем рисунке.
3. Обработка признаков
Далее идет самая важная функция в разработке признаков, и то, чем мы в основном занимаемся, обработка признаков.
3.1 Очистка функций
При обработке признаков первое, что необходимо сделать, — это очистка признаков, которая в основном делает две вещи.
3.1.1 Очистка грязных данных (аномальных данных)
Как обнаружить аномальные данные? В основном это следующие
1. Алгоритм обнаружения статистических выбросов
(1) Простой статистический анализ:
Например, выполните описательную статистику по значениям атрибутов, чтобы увидеть, какие значения являются необоснованными.Например, для возраста мы указываем размерность диапазона [0,100], а образцы, не входящие в этот диапазон, считаются аномальными образцами.
(2).3δ принцип (δ — дисперсия):
Когда данные подчиняются нормальному распределению: в соответствии с определением нормального распределения, вероятность отклонения на 3δ от среднего значения составляет P(|x-μ|>3δ) (3) Обнаружение аномальных данных по диапазону и межквартильному диапазону
2. Алгоритм обнаружения выбросов на основе расстояния (фактически та же идея, что и у алгоритма K-ближайшего соседа)
Метод расстояния в основном используется для обнаружения аномальных точек, а точки, расстояние которых между точкой данных и большинством точек превышает определенный порог, считаются аномальными точками.Основные используемые методы измерения расстояния: абсолютное расстояние (манхэттенское расстояние), евклидово методы расстояния и Ма, такие как расстояние
3. Алгоритм обнаружения выбросов на основе плотности
Изучая плотность вокруг текущей точки, можно найти локальные аномальные точки.
3.1.2 Обработка пропущенных значений
для функции
- Если во всех образцах слишком много пропущенных значений, вы можете удалить их напрямую.
- Если пропущенных значений немного, рассмотрите возможность заполнения глобального среднего значения или медианы.
- Возьмите эту функцию в качестве цели и используйте соответствующую модель алгоритма для прогнозирования отсутствующего значения на основе неотсутствующих данных.
3.1.3 Выборка данных
Выборка данных в основном предназначена для решения проблемы несбалансированности выборки. Например, в некоторых случаях количество положительных и отрицательных выборок в полученных данных сильно различается, и большинство моделей чувствительны к соотношению положительных и отрицательных выборок (например, логистическая регрессия), поэтому необходимо выполнить выборку данные, чтобы сделать данные положительными и отрицательными выборками.
При решении проблемы несбалансированности выборки ее в основном делят на два случая.
-
Существует большой разрыв между количеством положительных и отрицательных образцов, и в то же время количество положительных и отрицательных образцов также очень велико.В настоящее время может быть принят метод понижения дискретизации.
Понижающая выборка: недостаточная выборка класса с большим количеством выборок в обучающем наборе (класс большинства) и отбрасывание некоторых выборок для устранения дисбаланса классов. -
Количество положительных и отрицательных образцов сильно различается, и в то же время количество положительных и отрицательных образцов относительно невелико.В настоящее время можно использовать метод повышения дискретизации.
Апсемплинг: передискретизация класса с небольшим количеством выборок в обучающем наборе (класс меньшинства) и синтез новых выборок для устранения дисбаланса классов. На этот раз будет использоваться очень классический алгоритм передискретизации SMOTE (об алгоритме передискретизации SMOTE, в предыдущей статье (Борьба с проектами машинного обучения Обнаружение аномалий данных транзакций), в нем есть описания и приложения, которые в этом блоке повторяться не будут)
3.2 Предварительная обработка признаков
Для разных типов объектов методы обработки различны, и ниже приводится обзор
3.2.1 Числовой тип (относится к непрерывным данным)
Числовые признаки обычно необходимо обрабатывать в следующих аспектах.
1.1 Статистика.
Необходимо просмотреть максимальное значение, минимальное значение, среднее значение, дисперсию и т. д. соответствующего признака, чтобы выполнить лучший анализ данных.
Давайте возьмем в качестве примера набор данных радужной оболочки, который поставляется со sklearn, и продемонстрируем его с помощью кода.
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris() #获取数据集
# iris.data[:5] # 展示数据集的前5个数据
series = pd.Series(iris.data[:,0])
series.describe() #通过describe方法,可以直接获得当前特征下数据的总数,均值,方差,各个分位数,以及最大最小值等
count 150.000000
mean 5.843333
std 0.828066
min 4.300000
25% 5.100000
50% 5.800000
75% 6.400000
max 7.900000
dtype: float64
1.2 Безразмерный. Обычно используемыми безразмерными методами являются стандартизация и интервальное масштабирование.
(1).Стандартизация: при стандартизации необходимо рассчитать среднее значение и дисперсию данных по соответствующему признаку, а затем посмотреть на отклонение каждого значения по текущему признаку от среднего.Конкретная формула выглядит следующим образом:
(2)Метод интервального масштабирования: существует много идей метода интервального масштабирования.Обычно используется два максимальных значения для масштабирования.Конкретная формула выглядит следующим образом:
(3) Разница между нормализацией и нормализацией: ее можно отличить таким образом: для выборки m и матрицы признаков m * n из n признаков одна строка представляет выборочные данные, включая n признаков, а один столбец представляет признак м пример данных ниже. Упомянутая выше нормализация предназначена для обработки данных для столбцов матрицы признаков и преобразования собственных значений выборок в одно и то же измерение, а нормализация заключается в обработке данных в соответствии со строками матрицы признаков. строка данных рассматривается как вектор , что эквивалентно нормализации векторов
Вышеупомянутые два метода (стандартизация и интервальное масштабирование) были упакованы для нас в sklearn, Конкретный код выглядит следующим образом
from sklearn.preprocessing import StandardScaler
StandardScaler().fit_transform(iris.data) #标准化
from sklearn.preprocessing import MinMaxScaler
MinMaxScaler().fit_transform(iris.data)
array([[0.22222222, 0.625 , 0.06779661, 0.04166667],
[0.16666667, 0.41666667, 0.06779661, 0.04166667],
[0.11111111, 0.5 , 0.05084746, 0.04166667],
[0.08333333, 0.45833333, 0.08474576, 0.04166667],
[0.19444444, 0.66666667, 0.06779661, 0.04166667],
[0.30555556, 0.79166667, 0.11864407, 0.125 ],
[0.08333333, 0.58333333, 0.06779661, 0.08333333],
[0.19444444, 0.58333333, 0.08474576, 0.04166667],
[0.02777778, 0.375 , 0.06779661, 0.04166667],
[0.16666667, 0.45833333, 0.08474576, 0. ],
[0.30555556, 0.70833333, 0.08474576, 0.04166667],
[0.13888889, 0.58333333, 0.10169492, 0.04166667],
[0.13888889, 0.41666667, 0.06779661, 0. ],
[0. , 0.41666667, 0.01694915, 0. ],
[0.41666667, 0.83333333, 0.03389831, 0.04166667],
[0.38888889, 1. , 0.08474576, 0.125 ],
[0.30555556, 0.79166667, 0.05084746, 0.125 ],
[0.22222222, 0.625 , 0.06779661, 0.08333333],
[0.38888889, 0.75 , 0.11864407, 0.08333333],
[0.22222222, 0.75 , 0.08474576, 0.08333333],
[0.30555556, 0.58333333, 0.11864407, 0.04166667],
[0.22222222, 0.70833333, 0.08474576, 0.125 ],
[0.08333333, 0.66666667, 0. , 0.04166667],
[0.22222222, 0.54166667, 0.11864407, 0.16666667],
[0.13888889, 0.58333333, 0.15254237, 0.04166667],
[0.19444444, 0.41666667, 0.10169492, 0.04166667],
[0.19444444, 0.58333333, 0.10169492, 0.125 ],
[0.25 , 0.625 , 0.08474576, 0.04166667],
[0.25 , 0.58333333, 0.06779661, 0.04166667],
[0.11111111, 0.5 , 0.10169492, 0.04166667],
[0.13888889, 0.45833333, 0.10169492, 0.04166667],
[0.30555556, 0.58333333, 0.08474576, 0.125 ],
[0.25 , 0.875 , 0.08474576, 0. ],
[0.33333333, 0.91666667, 0.06779661, 0.04166667],
[0.16666667, 0.45833333, 0.08474576, 0. ],
[0.19444444, 0.5 , 0.03389831, 0.04166667],
[0.33333333, 0.625 , 0.05084746, 0.04166667],
[0.16666667, 0.45833333, 0.08474576, 0. ],
[0.02777778, 0.41666667, 0.05084746, 0.04166667],
[0.22222222, 0.58333333, 0.08474576, 0.04166667],
[0.19444444, 0.625 , 0.05084746, 0.08333333],
[0.05555556, 0.125 , 0.05084746, 0.08333333],
[0.02777778, 0.5 , 0.05084746, 0.04166667],
[0.19444444, 0.625 , 0.10169492, 0.20833333],
[0.22222222, 0.75 , 0.15254237, 0.125 ],
[0.13888889, 0.41666667, 0.06779661, 0.08333333],
[0.22222222, 0.75 , 0.10169492, 0.04166667],
[0.08333333, 0.5 , 0.06779661, 0.04166667],
[0.27777778, 0.70833333, 0.08474576, 0.04166667],
[0.19444444, 0.54166667, 0.06779661, 0.04166667],
[0.75 , 0.5 , 0.62711864, 0.54166667],
[0.58333333, 0.5 , 0.59322034, 0.58333333],
[0.72222222, 0.45833333, 0.66101695, 0.58333333],
[0.33333333, 0.125 , 0.50847458, 0.5 ],
[0.61111111, 0.33333333, 0.61016949, 0.58333333],
[0.38888889, 0.33333333, 0.59322034, 0.5 ],
[0.55555556, 0.54166667, 0.62711864, 0.625 ],
[0.16666667, 0.16666667, 0.38983051, 0.375 ],
[0.63888889, 0.375 , 0.61016949, 0.5 ],
[0.25 , 0.29166667, 0.49152542, 0.54166667],
[0.19444444, 0. , 0.42372881, 0.375 ],
[0.44444444, 0.41666667, 0.54237288, 0.58333333],
[0.47222222, 0.08333333, 0.50847458, 0.375 ],
[0.5 , 0.375 , 0.62711864, 0.54166667],
[0.36111111, 0.375 , 0.44067797, 0.5 ],
[0.66666667, 0.45833333, 0.57627119, 0.54166667],
[0.36111111, 0.41666667, 0.59322034, 0.58333333],
[0.41666667, 0.29166667, 0.52542373, 0.375 ],
[0.52777778, 0.08333333, 0.59322034, 0.58333333],
[0.36111111, 0.20833333, 0.49152542, 0.41666667],
[0.44444444, 0.5 , 0.6440678 , 0.70833333],
[0.5 , 0.33333333, 0.50847458, 0.5 ],
[0.55555556, 0.20833333, 0.66101695, 0.58333333],
[0.5 , 0.33333333, 0.62711864, 0.45833333],
[0.58333333, 0.375 , 0.55932203, 0.5 ],
[0.63888889, 0.41666667, 0.57627119, 0.54166667],
[0.69444444, 0.33333333, 0.6440678 , 0.54166667],
[0.66666667, 0.41666667, 0.6779661 , 0.66666667],
[0.47222222, 0.375 , 0.59322034, 0.58333333],
[0.38888889, 0.25 , 0.42372881, 0.375 ],
[0.33333333, 0.16666667, 0.47457627, 0.41666667],
[0.33333333, 0.16666667, 0.45762712, 0.375 ],
[0.41666667, 0.29166667, 0.49152542, 0.45833333],
[0.47222222, 0.29166667, 0.69491525, 0.625 ],
[0.30555556, 0.41666667, 0.59322034, 0.58333333],
[0.47222222, 0.58333333, 0.59322034, 0.625 ],
[0.66666667, 0.45833333, 0.62711864, 0.58333333],
[0.55555556, 0.125 , 0.57627119, 0.5 ],
[0.36111111, 0.41666667, 0.52542373, 0.5 ],
[0.33333333, 0.20833333, 0.50847458, 0.5 ],
[0.33333333, 0.25 , 0.57627119, 0.45833333],
[0.5 , 0.41666667, 0.61016949, 0.54166667],
[0.41666667, 0.25 , 0.50847458, 0.45833333],
[0.19444444, 0.125 , 0.38983051, 0.375 ],
[0.36111111, 0.29166667, 0.54237288, 0.5 ],
[0.38888889, 0.41666667, 0.54237288, 0.45833333],
[0.38888889, 0.375 , 0.54237288, 0.5 ],
[0.52777778, 0.375 , 0.55932203, 0.5 ],
[0.22222222, 0.20833333, 0.33898305, 0.41666667],
[0.38888889, 0.33333333, 0.52542373, 0.5 ],
[0.55555556, 0.54166667, 0.84745763, 1. ],
[0.41666667, 0.29166667, 0.69491525, 0.75 ],
[0.77777778, 0.41666667, 0.83050847, 0.83333333],
[0.55555556, 0.375 , 0.77966102, 0.70833333],
[0.61111111, 0.41666667, 0.81355932, 0.875 ],
[0.91666667, 0.41666667, 0.94915254, 0.83333333],
[0.16666667, 0.20833333, 0.59322034, 0.66666667],
[0.83333333, 0.375 , 0.89830508, 0.70833333],
[0.66666667, 0.20833333, 0.81355932, 0.70833333],
[0.80555556, 0.66666667, 0.86440678, 1. ],
[0.61111111, 0.5 , 0.69491525, 0.79166667],
[0.58333333, 0.29166667, 0.72881356, 0.75 ],
[0.69444444, 0.41666667, 0.76271186, 0.83333333],
[0.38888889, 0.20833333, 0.6779661 , 0.79166667],
[0.41666667, 0.33333333, 0.69491525, 0.95833333],
[0.58333333, 0.5 , 0.72881356, 0.91666667],
[0.61111111, 0.41666667, 0.76271186, 0.70833333],
[0.94444444, 0.75 , 0.96610169, 0.875 ],
[0.94444444, 0.25 , 1. , 0.91666667],
[0.47222222, 0.08333333, 0.6779661 , 0.58333333],
[0.72222222, 0.5 , 0.79661017, 0.91666667],
[0.36111111, 0.33333333, 0.66101695, 0.79166667],
[0.94444444, 0.33333333, 0.96610169, 0.79166667],
[0.55555556, 0.29166667, 0.66101695, 0.70833333],
[0.66666667, 0.54166667, 0.79661017, 0.83333333],
[0.80555556, 0.5 , 0.84745763, 0.70833333],
[0.52777778, 0.33333333, 0.6440678 , 0.70833333],
[0.5 , 0.41666667, 0.66101695, 0.70833333],
[0.58333333, 0.33333333, 0.77966102, 0.83333333],
[0.80555556, 0.41666667, 0.81355932, 0.625 ],
[0.86111111, 0.33333333, 0.86440678, 0.75 ],
[1. , 0.75 , 0.91525424, 0.79166667],
[0.58333333, 0.33333333, 0.77966102, 0.875 ],
[0.55555556, 0.33333333, 0.69491525, 0.58333333],
[0.5 , 0.25 , 0.77966102, 0.54166667],
[0.94444444, 0.41666667, 0.86440678, 0.91666667],
[0.55555556, 0.58333333, 0.77966102, 0.95833333],
[0.58333333, 0.45833333, 0.76271186, 0.70833333],
[0.47222222, 0.41666667, 0.6440678 , 0.70833333],
[0.72222222, 0.45833333, 0.74576271, 0.83333333],
[0.66666667, 0.45833333, 0.77966102, 0.95833333],
[0.72222222, 0.45833333, 0.69491525, 0.91666667],
[0.41666667, 0.29166667, 0.69491525, 0.75 ],
[0.69444444, 0.5 , 0.83050847, 0.91666667],
[0.66666667, 0.54166667, 0.79661017, 1. ],
[0.66666667, 0.41666667, 0.71186441, 0.91666667],
[0.55555556, 0.20833333, 0.6779661 , 0.75 ],
[0.61111111, 0.41666667, 0.71186441, 0.79166667],
[0.52777778, 0.58333333, 0.74576271, 0.91666667],
[0.44444444, 0.41666667, 0.69491525, 0.70833333]])
1.3 Дискретизация
Дискретизация — очень важный процесс для числовых признаков, фактически он заключается в преобразовании числовых данных в категориальные данные.
Пространство значений непрерывных значений может быть бесконечным.Чтобы облегчить представление и обработку в модели, необходимо дискретизировать признаки непрерывных значений.
В отрасли редко напрямую передают непрерывные значения в качестве признаков для моделей логистической регрессии.Вместо этого непрерывные признаки дискретизируются в серию признаков 0 и 1 для модели логистической регрессии.Преимущества этого заключаются в следующем:
-
Умножение разреженного векторного внутреннего произведения выполняется быстро, а результаты вычислений легко хранить и масштабировать.
-
Дискретизированные признаки очень устойчивы к аномальным данным: например, признак, возраст которого >30, равен 1, в противном случае он равен 0. Если функции не дискретизированы, аномальные данные «возраст 300» могут сильно нарушить модель.
-
Логистическая регрессия относится к обобщенной линейной модели, и ее выразительная способность ограничена; после дискретизации одномерной переменной в N каждая переменная имеет отдельный вес, что эквивалентно введению в модель нелинейности, что может улучшить выразительную способность модели и увеличить примерка.
-
После дискретизации можно выполнить кроссовер признаков, заменив переменные M N на переменные M * N, дополнительно введя нелинейность и улучшив способность выражения.
-
После дискретизации признаков модель будет более стабильной, например, если возраст пользователя дискретизирован, в качестве интервала используется 20-30, и пользователь не станет совсем другим человеком, потому что возраст пользователя равен единице. на год старше. Конечно, выборки, примыкающие к интервалу, будут как раз наоборот, так что как делить интервал — дело знаний.
Обычно используемые методы дискретизации включают равное деление и равное деление.
(1) Эквивалентное деление состоит в том, чтобы разделить признаки поровну в соответствии с диапазоном значений, и значения в каждом сегменте обрабатываются одинаково. Например, диапазон значений признака [0, 10], мы можем разделить его на 10 сегментов, [0, 1), [1, 2), ..., [9, 10).
(2) Равное деление основано на общем количестве образцов, и каждый сегмент делится на 1 сегмент. Например, признак расстояния имеет диапазон значений [0, 3000000].Теперь его нужно разделить на 10 сегментов.Если разделить на равные пропорции, то окажется, что большинство выборок находится в первом сегменте. Использование равного деления позволит избежать этой проблемы.Конечное возможное деление [0, 100), [100, 300), [300, 500),.., [10000, 3000000], предыдущее интервальное деление относительно плотное, последнее относительно редко
Посмотрим на реализацию кода
ages = np.array([20, 22,25,27,21,23,37,31,61,45,41,32]) #一些年龄数据
# 通过 pandas中的cut方法可以分割数据
# factory = pd.cut(ages,4) #arr原始数据 , 4:要分割成几段
factory = pd.cut(ages,4,labels=['Youth', 'YoungAdult', 'MiddleAged', 'Senior']) #lable,对于每个类别可以自己命名
# factory = pd.cut(arr,bins=[18,25,35,60,100],labels=['a','b','c','d']) #bins 自己指定的分割界限
# factory.dtype #CategoricalDtype,可以看到,cut后返回的是一个Categorical 类型的对象
test = np.array(factory) #获取出分类后的数据
test
# factory.codes # array([0, 0, 0, 0, 0, 0, 1, 1, 3, 2, 2, 1], dtype=int8)
array(['Youth', 'Youth', 'Youth', 'Youth', 'Youth', 'Youth', 'YoungAdult',
'YoungAdult', 'Senior', 'MiddleAged', 'MiddleAged', 'YoungAdult'],
dtype=object)
# 下面看下等量划分
# 通过 pandas中的qcut方法可以分割数据
factory = pd.qcut(ages,4)
# factory
factory.value_counts() #可以看到,通过等量划分,每个类别中的数据个数都一样
(19.999, 22.75] 3
(22.75, 29.0] 3
(29.0, 38.0] 3
(38.0, 61.0] 3
dtype: int64
3.2.2 Категориальные данные
однократное кодирование
Для категориальных данных наиболее важной обработкой является однократное кодирование, см. конкретный пример.
# 创建一个简单的原始数据
testdata = pd.DataFrame({'age':[4,6,3,3],'pet':['cat','dog','dog','fish']})
testdata
age | pet | |
---|---|---|
0 | 4 | cat |
1 | 6 | dog |
2 | 3 | dog |
3 | 3 | fish |
#第一种方法,通过pandas中的提供的get_dummies方法
pd.get_dummies(testdata,columns=['pet']) #第一个参数为原始数据,columns传入需要编码转换的特征,可以为多个,返回新的数据
age | pet_cat | pet_dog | pet_fish | |
---|---|---|---|---|
0 | 4 | 1 | 0 | 0 |
1 | 6 | 0 | 1 | 0 |
2 | 3 | 0 | 1 | 0 |
3 | 3 | 0 | 0 | 1 |
testdata.pet.values.reshape(-1,1)
array([['cat'],
['dog'],
['dog'],
['fish']], dtype=object)
#第二种方法,使用sklearn中的OneHotEncoder方法
from sklearn.preprocessing import OneHotEncoder
OneHotEncoder().fit_transform(testdata.age.values.reshape(-1,1)).toarray()
array([[0., 1., 0.],
[0., 0., 1.],
[1., 0., 0.],
[1., 0., 0.]])
#OneHotEncoder不能对String型的数值做处理,对String类型做处理的话需要先进行转换
# OneHotEncoder().fit_transform(testdata.pet.values.reshape(-1,1)).toarray() #会报错
from sklearn.preprocessing import LabelEncoder
petvalue = LabelEncoder().fit_transform(testdata.pet)
print(petvalue) # [0 1 1 2] 将字符串类别转换成整型类别
OneHotEncoder().fit_transform(petvalue.reshape(-1,1)).toarray() #可以看到结果和上面通过get_dummies转换出的结果相同
[0 1 1 2]
array([[1., 0., 0.],
[0., 1., 0.],
[0., 1., 0.],
[0., 0., 1.]])
3.2.3 Данные о времени
Для временных данных их можно преобразовать в непрерывные значения или дискретные значения.
непрерывное значение
Например, продолжительность (время просмотра одной страницы), интервал (время от последней покупки/клика до настоящего момента)
дискретное значение
Например, какой период дня (час_0-23), день недели (неделя_понедельник...), какая неделя года, день недели/выходные, какой квартал года и т. д.
#下面看个例子,这个数据是一个2年内按小时做的自行车租赁数据
import pandas as pd
data = pd.read_csv('kaggle_bike_competition_train.csv', header = 0, error_bad_lines=False)
data.head() #先看下数据的样子,打印前5行
datetime | season | holiday | workingday | weather | temp | atemp | humidity | windspeed | casual | registered | count | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2011-01-01 00:00:00 | 1 | 0 | 0 | 1 | 9.84 | 14.395 | 81 | 0.0 | 3 | 13 | 16 |
1 | 2011-01-01 01:00:00 | 1 | 0 | 0 | 1 | 9.02 | 13.635 | 80 | 0.0 | 8 | 32 | 40 |
2 | 2011-01-01 02:00:00 | 1 | 0 | 0 | 1 | 9.02 | 13.635 | 80 | 0.0 | 5 | 27 | 32 |
3 | 2011-01-01 03:00:00 | 1 | 0 | 0 | 1 | 9.84 | 14.395 | 75 | 0.0 | 3 | 10 | 13 |
4 | 2011-01-01 04:00:00 | 1 | 0 | 0 | 1 | 9.84 | 14.395 | 75 | 0.0 | 0 | 1 | 1 |
#下面我们只看datatime这个时间类型属性,
#首先,我们可以将它切分成
data = data.iloc[:,:1] #只看datatime这个属性
temp = pd.DatetimeIndex(data['datetime'])
data['date'] = temp.date #日期
data['time'] = temp.time #时间
data['year'] = temp.year #年
data['month'] = temp.month #月
data['day'] = temp.day #日
data['hour'] = temp.hour #小时
data['dayofweek'] = temp.dayofweek #具体星期几
data['dateDays'] = (data.date - data.date[0]) #生成一个时间长度特征 ['0days','0days',...,'1days',...]
data['dateDays'] = data['dateDays'].astype('timedelta64[D]') #转换成float型
data
datetime | date | time | year | month | day | hour | dayofweek | dateDays | |
---|---|---|---|---|---|---|---|---|---|
0 | 2011-01-01 00:00:00 | 2011-01-01 | 00:00:00 | 2011 | 1 | 1 | 0 | 5 | 0.0 |
1 | 2011-01-01 01:00:00 | 2011-01-01 | 01:00:00 | 2011 | 1 | 1 | 1 | 5 | 0.0 |
2 | 2011-01-01 02:00:00 | 2011-01-01 | 02:00:00 | 2011 | 1 | 1 | 2 | 5 | 0.0 |
3 | 2011-01-01 03:00:00 | 2011-01-01 | 03:00:00 | 2011 | 1 | 1 | 3 | 5 | 0.0 |
4 | 2011-01-01 04:00:00 | 2011-01-01 | 04:00:00 | 2011 | 1 | 1 | 4 | 5 | 0.0 |
5 | 2011-01-01 05:00:00 | 2011-01-01 | 05:00:00 | 2011 | 1 | 1 | 5 | 5 | 0.0 |
6 | 2011-01-01 06:00:00 | 2011-01-01 | 06:00:00 | 2011 | 1 | 1 | 6 | 5 | 0.0 |
7 | 2011-01-01 07:00:00 | 2011-01-01 | 07:00:00 | 2011 | 1 | 1 | 7 | 5 | 0.0 |
8 | 2011-01-01 08:00:00 | 2011-01-01 | 08:00:00 | 2011 | 1 | 1 | 8 | 5 | 0.0 |
9 | 2011-01-01 09:00:00 | 2011-01-01 | 09:00:00 | 2011 | 1 | 1 | 9 | 5 | 0.0 |
10 | 2011-01-01 10:00:00 | 2011-01-01 | 10:00:00 | 2011 | 1 | 1 | 10 | 5 | 0.0 |
11 | 2011-01-01 11:00:00 | 2011-01-01 | 11:00:00 | 2011 | 1 | 1 | 11 | 5 | 0.0 |
12 | 2011-01-01 12:00:00 | 2011-01-01 | 12:00:00 | 2011 | 1 | 1 | 12 | 5 | 0.0 |
13 | 2011-01-01 13:00:00 | 2011-01-01 | 13:00:00 | 2011 | 1 | 1 | 13 | 5 | 0.0 |
14 | 2011-01-01 14:00:00 | 2011-01-01 | 14:00:00 | 2011 | 1 | 1 | 14 | 5 | 0.0 |
15 | 2011-01-01 15:00:00 | 2011-01-01 | 15:00:00 | 2011 | 1 | 1 | 15 | 5 | 0.0 |
16 | 2011-01-01 16:00:00 | 2011-01-01 | 16:00:00 | 2011 | 1 | 1 | 16 | 5 | 0.0 |
17 | 2011-01-01 17:00:00 | 2011-01-01 | 17:00:00 | 2011 | 1 | 1 | 17 | 5 | 0.0 |
18 | 2011-01-01 18:00:00 | 2011-01-01 | 18:00:00 | 2011 | 1 | 1 | 18 | 5 | 0.0 |
19 | 2011-01-01 19:00:00 | 2011-01-01 | 19:00:00 | 2011 | 1 | 1 | 19 | 5 | 0.0 |
20 | 2011-01-01 20:00:00 | 2011-01-01 | 20:00:00 | 2011 | 1 | 1 | 20 | 5 | 0.0 |
21 | 2011-01-01 21:00:00 | 2011-01-01 | 21:00:00 | 2011 | 1 | 1 | 21 | 5 | 0.0 |
22 | 2011-01-01 22:00:00 | 2011-01-01 | 22:00:00 | 2011 | 1 | 1 | 22 | 5 | 0.0 |
23 | 2011-01-01 23:00:00 | 2011-01-01 | 23:00:00 | 2011 | 1 | 1 | 23 | 5 | 0.0 |
24 | 2011-01-02 00:00:00 | 2011-01-02 | 00:00:00 | 2011 | 1 | 2 | 0 | 6 | 1.0 |
25 | 2011-01-02 01:00:00 | 2011-01-02 | 01:00:00 | 2011 | 1 | 2 | 1 | 6 | 1.0 |
26 | 2011-01-02 02:00:00 | 2011-01-02 | 02:00:00 | 2011 | 1 | 2 | 2 | 6 | 1.0 |
27 | 2011-01-02 03:00:00 | 2011-01-02 | 03:00:00 | 2011 | 1 | 2 | 3 | 6 | 1.0 |
28 | 2011-01-02 04:00:00 | 2011-01-02 | 04:00:00 | 2011 | 1 | 2 | 4 | 6 | 1.0 |
29 | 2011-01-02 06:00:00 | 2011-01-02 | 06:00:00 | 2011 | 1 | 2 | 6 | 6 | 1.0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
10856 | 2012-12-18 18:00:00 | 2012-12-18 | 18:00:00 | 2012 | 12 | 18 | 18 | 1 | 717.0 |
10857 | 2012-12-18 19:00:00 | 2012-12-18 | 19:00:00 | 2012 | 12 | 18 | 19 | 1 | 717.0 |
10858 | 2012-12-18 20:00:00 | 2012-12-18 | 20:00:00 | 2012 | 12 | 18 | 20 | 1 | 717.0 |
10859 | 2012-12-18 21:00:00 | 2012-12-18 | 21:00:00 | 2012 | 12 | 18 | 21 | 1 | 717.0 |
10860 | 2012-12-18 22:00:00 | 2012-12-18 | 22:00:00 | 2012 | 12 | 18 | 22 | 1 | 717.0 |
10861 | 2012-12-18 23:00:00 | 2012-12-18 | 23:00:00 | 2012 | 12 | 18 | 23 | 1 | 717.0 |
10862 | 2012-12-19 00:00:00 | 2012-12-19 | 00:00:00 | 2012 | 12 | 19 | 0 | 2 | 718.0 |
10863 | 2012-12-19 01:00:00 | 2012-12-19 | 01:00:00 | 2012 | 12 | 19 | 1 | 2 | 718.0 |
10864 | 2012-12-19 02:00:00 | 2012-12-19 | 02:00:00 | 2012 | 12 | 19 | 2 | 2 | 718.0 |
10865 | 2012-12-19 03:00:00 | 2012-12-19 | 03:00:00 | 2012 | 12 | 19 | 3 | 2 | 718.0 |
10866 | 2012-12-19 04:00:00 | 2012-12-19 | 04:00:00 | 2012 | 12 | 19 | 4 | 2 | 718.0 |
10867 | 2012-12-19 05:00:00 | 2012-12-19 | 05:00:00 | 2012 | 12 | 19 | 5 | 2 | 718.0 |
10868 | 2012-12-19 06:00:00 | 2012-12-19 | 06:00:00 | 2012 | 12 | 19 | 6 | 2 | 718.0 |
10869 | 2012-12-19 07:00:00 | 2012-12-19 | 07:00:00 | 2012 | 12 | 19 | 7 | 2 | 718.0 |
10870 | 2012-12-19 08:00:00 | 2012-12-19 | 08:00:00 | 2012 | 12 | 19 | 8 | 2 | 718.0 |
10871 | 2012-12-19 09:00:00 | 2012-12-19 | 09:00:00 | 2012 | 12 | 19 | 9 | 2 | 718.0 |
10872 | 2012-12-19 10:00:00 | 2012-12-19 | 10:00:00 | 2012 | 12 | 19 | 10 | 2 | 718.0 |
10873 | 2012-12-19 11:00:00 | 2012-12-19 | 11:00:00 | 2012 | 12 | 19 | 11 | 2 | 718.0 |
10874 | 2012-12-19 12:00:00 | 2012-12-19 | 12:00:00 | 2012 | 12 | 19 | 12 | 2 | 718.0 |
10875 | 2012-12-19 13:00:00 | 2012-12-19 | 13:00:00 | 2012 | 12 | 19 | 13 | 2 | 718.0 |
10876 | 2012-12-19 14:00:00 | 2012-12-19 | 14:00:00 | 2012 | 12 | 19 | 14 | 2 | 718.0 |
10877 | 2012-12-19 15:00:00 | 2012-12-19 | 15:00:00 | 2012 | 12 | 19 | 15 | 2 | 718.0 |
10878 | 2012-12-19 16:00:00 | 2012-12-19 | 16:00:00 | 2012 | 12 | 19 | 16 | 2 | 718.0 |
10879 | 2012-12-19 17:00:00 | 2012-12-19 | 17:00:00 | 2012 | 12 | 19 | 17 | 2 | 718.0 |
10880 | 2012-12-19 18:00:00 | 2012-12-19 | 18:00:00 | 2012 | 12 | 19 | 18 | 2 | 718.0 |
10881 | 2012-12-19 19:00:00 | 2012-12-19 | 19:00:00 | 2012 | 12 | 19 | 19 | 2 | 718.0 |
10882 | 2012-12-19 20:00:00 | 2012-12-19 | 20:00:00 | 2012 | 12 | 19 | 20 | 2 | 718.0 |
10883 | 2012-12-19 21:00:00 | 2012-12-19 | 21:00:00 | 2012 | 12 | 19 | 21 | 2 | 718.0 |
10884 | 2012-12-19 22:00:00 | 2012-12-19 | 22:00:00 | 2012 | 12 | 19 | 22 | 2 | 718.0 |
10885 | 2012-12-19 23:00:00 | 2012-12-19 | 23:00:00 | 2012 | 12 | 19 | 23 | 2 | 718.0 |
10886 строк × 9 столбцов
temp
DatetimeIndex(['2011-01-01 00:00:00', '2011-01-01 01:00:00',
'2011-01-01 02:00:00', '2011-01-01 03:00:00',
'2011-01-01 04:00:00', '2011-01-01 05:00:00',
'2011-01-01 06:00:00', '2011-01-01 07:00:00',
'2011-01-01 08:00:00', '2011-01-01 09:00:00',
...
'2012-12-19 14:00:00', '2012-12-19 15:00:00',
'2012-12-19 16:00:00', '2012-12-19 17:00:00',
'2012-12-19 18:00:00', '2012-12-19 19:00:00',
'2012-12-19 20:00:00', '2012-12-19 21:00:00',
'2012-12-19 22:00:00', '2012-12-19 23:00:00'],
dtype='datetime64[ns]', name='datetime', length=10886, freq=None)
3.3 Снижение размерности признаков
В реальных проектах дело не в том, что чем выше размерность, тем лучше Причина, по которой выполняется операция уменьшения размерности, заключается главным образом в следующих соображениях.
- Чем выше размер объекта, тем легче переобучить модель, а более сложные модели в настоящее время использовать непросто.
- Чем выше размерность взаимно независимых признаков, тем большее количество обучающих выборок требуется для достижения той же производительности на тестовом наборе без изменения модели.
- Накладные расходы на обучение, тестирование и хранение будут увеличиваться по мере увеличения количества функций.
- В некоторых моделях, таких как модели, основанные на расчете расстояния KMeans, KNN и других моделях, при выполнении расчета расстояния размерность слишком велика, что повлияет на точность и производительность. 5. Необходимость визуального анализа. В низкоразмерных случаях, таких как двумерные, трехмерные, мы можем отображать данные и видеть данные визуально. Когда размер увеличивается, становится трудно рисовать.
В машинном обучении есть очень классическая концепция проклятия размерности.
Именно потому, что многомерные функции имеют различные проблемы, как описано выше, поэтому нам необходимо выполнить уменьшение размерности функций и выбор функций. Обычно используемые алгоритмы уменьшения размерности признаков включают PCA, LDA и т. д. Цель уменьшения размерности признаков состоит в том, чтобы сопоставить набор данных в многомерном пространстве с данными в низкоразмерном пространстве, теряя при этом как можно меньше информации, или чтобы точки данных после уменьшения размерности были настолько легко различимы, насколько это возможно. Что касается алгоритма PCA, то он был представлен в предыдущей статье.Анализ алгоритма PCA
3.4 Выбор функций
После завершения предварительной обработки данных нам нужно выбрать значимые функции для ввода в алгоритмы и модели машинного обучения для обучения.
Цель выбора признаков состоит в том, чтобы найти оптимальное подмножество признаков. Выбор признаков может устранить нерелевантные (нерелевантные) или избыточные (избыточные) признаки, тем самым уменьшив количество признаков, повысив точность модели и сократив время выполнения. С другой стороны, выбор действительно релевантных функций упрощает модель, помогая понять процесс генерации данных.
По форме опций признаков методы выбора признаков можно разделить на три типа.
- Фильтр: метод фильтрации, оценка каждой функции в соответствии с дивергенцией или корреляцией, установка порогового значения или количества пороговых значений для выбора, а также сортировка и оставление наиболее связанных частей функций.
- Обертка: метод обертки в соответствии с целевой функцией (обычно оценкой эффекта прогнозирования) выбирает несколько функций одновременно или исключает несколько функций.
- Встроенный: встроенный метод, сначала используйте некоторые алгоритмы и модели машинного обучения для обучения, получите весовые коэффициенты каждой функции и выберите функции от больших до малых в соответствии с коэффициентами. Аналогичен методу Filter, но качество признаков определяется обучением.
3.4.1 Фильтр (метод фильтрации)
выбор дисперсии
Используя метод выбора дисперсии, сначала вычислите дисперсию каждого признака, а затем выберите признаки с дисперсией, превышающей пороговое значение, в соответствии с пороговым значением.
from sklearn.feature_selection import VarianceThreshold
# iris.data[:,0].var() #0.6811222222222223
# iris.data[:,1].var() #0.18675066666666668
# iris.data[:,2].var() #3.092424888888889
# iris.data[:,3].var() #0.5785315555555555
#threshold:比较的方差的阈值,返回方差大于阈值的特征对应的数据。针对上面的鸢尾花数据集,只会返回第三列数据
# VarianceThreshold(threshold=3).fit_transform(iris.data)
Метод коэффициента корреляции
Чтобы использовать метод коэффициента корреляции, сначала вычислите коэффициент корреляции каждой функции с целевым значением и значением P коэффициента корреляции.
Код для выбора признаков с использованием класса SelectKBest библиотеки feature_selection в сочетании с коэффициентом корреляции выглядит следующим образом.
#首先看下皮尔森相关系数的计算
from scipy.stats import pearsonr #用来计算相关系数
np.random.seed(0) #设置相同的seed,每次生成的随机数相同
size = 300
test = np.random.normal(0,1,size)
# print("加入低噪声后:",pearsonr(test,test+np.random.normal(0,1,size))) #返回的第一个值为相关系数,第二个值为P值
# print("加入高噪声后:",pearsonr(test,test+np.random.normal(0,10,size)))
#相关系统越高,p值越小
from sklearn.feature_selection import SelectKBest
#选择K个最好的特征,返回选择特征后的数据
#第一个参数为计算评估特征是否好的函数,该函数输入特征矩阵和目标向量,输出二元组(评分,P值)的数组,数组第i项为第i个特征的评分和P值。在此定义为计算相关系数
#参数k为选择的特征个数
SelectKBest(lambda X, Y: list(np.array(list(map(lambda x:pearsonr(x, Y), X.T))).T), k=2).fit_transform(iris.data, iris.target)
array([[1.4, 0.2],
[1.4, 0.2],
[1.3, 0.2],
[1.5, 0.2],
[1.4, 0.2],
[1.7, 0.4],
[1.4, 0.3],
[1.5, 0.2],
[1.4, 0.2],
[1.5, 0.1],
[1.5, 0.2],
[1.6, 0.2],
[1.4, 0.1],
[1.1, 0.1],
[1.2, 0.2],
[1.5, 0.4],
[1.3, 0.4],
[1.4, 0.3],
[1.7, 0.3],
[1.5, 0.3],
[1.7, 0.2],
[1.5, 0.4],
[1. , 0.2],
[1.7, 0.5],
[1.9, 0.2],
[1.6, 0.2],
[1.6, 0.4],
[1.5, 0.2],
[1.4, 0.2],
[1.6, 0.2],
[1.6, 0.2],
[1.5, 0.4],
[1.5, 0.1],
[1.4, 0.2],
[1.5, 0.1],
[1.2, 0.2],
[1.3, 0.2],
[1.5, 0.1],
[1.3, 0.2],
[1.5, 0.2],
[1.3, 0.3],
[1.3, 0.3],
[1.3, 0.2],
[1.6, 0.6],
[1.9, 0.4],
[1.4, 0.3],
[1.6, 0.2],
[1.4, 0.2],
[1.5, 0.2],
[1.4, 0.2],
[4.7, 1.4],
[4.5, 1.5],
[4.9, 1.5],
[4. , 1.3],
[4.6, 1.5],
[4.5, 1.3],
[4.7, 1.6],
[3.3, 1. ],
[4.6, 1.3],
[3.9, 1.4],
[3.5, 1. ],
[4.2, 1.5],
[4. , 1. ],
[4.7, 1.4],
[3.6, 1.3],
[4.4, 1.4],
[4.5, 1.5],
[4.1, 1. ],
[4.5, 1.5],
[3.9, 1.1],
[4.8, 1.8],
[4. , 1.3],
[4.9, 1.5],
[4.7, 1.2],
[4.3, 1.3],
[4.4, 1.4],
[4.8, 1.4],
[5. , 1.7],
[4.5, 1.5],
[3.5, 1. ],
[3.8, 1.1],
[3.7, 1. ],
[3.9, 1.2],
[5.1, 1.6],
[4.5, 1.5],
[4.5, 1.6],
[4.7, 1.5],
[4.4, 1.3],
[4.1, 1.3],
[4. , 1.3],
[4.4, 1.2],
[4.6, 1.4],
[4. , 1.2],
[3.3, 1. ],
[4.2, 1.3],
[4.2, 1.2],
[4.2, 1.3],
[4.3, 1.3],
[3. , 1.1],
[4.1, 1.3],
[6. , 2.5],
[5.1, 1.9],
[5.9, 2.1],
[5.6, 1.8],
[5.8, 2.2],
[6.6, 2.1],
[4.5, 1.7],
[6.3, 1.8],
[5.8, 1.8],
[6.1, 2.5],
[5.1, 2. ],
[5.3, 1.9],
[5.5, 2.1],
[5. , 2. ],
[5.1, 2.4],
[5.3, 2.3],
[5.5, 1.8],
[6.7, 2.2],
[6.9, 2.3],
[5. , 1.5],
[5.7, 2.3],
[4.9, 2. ],
[6.7, 2. ],
[4.9, 1.8],
[5.7, 2.1],
[6. , 1.8],
[4.8, 1.8],
[4.9, 1.8],
[5.6, 2.1],
[5.8, 1.6],
[6.1, 1.9],
[6.4, 2. ],
[5.6, 2.2],
[5.1, 1.5],
[5.6, 1.4],
[6.1, 2.3],
[5.6, 2.4],
[5.5, 1.8],
[4.8, 1.8],
[5.4, 2.1],
[5.6, 2.4],
[5.1, 2.3],
[5.1, 1.9],
[5.9, 2.3],
[5.7, 2.5],
[5.2, 2.3],
[5. , 1.9],
[5.2, 2. ],
[5.4, 2.3],
[5.1, 1.8]])
критерий хи-квадрат
Классический тест хи-квадрат предназначен для проверки корреляции между качественными независимыми переменными и качественными зависимыми переменными. Предполагая, что независимая переменная имеет N значений, а зависимая переменная имеет M значений, рассмотрим разницу между наблюдаемым значением и ожидаемой частотой выборки независимой переменной, равной i, и зависимой переменной, равной j, и построим статистику:
Код для выбора функций с использованием класса SelectKBest библиотеки feature_selection в сочетании с критерием хи-квадрат выглядит следующим образом:
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
#选择K个最好的特征,返回选择特征后的数据
SelectKBest(chi2, k=2).fit_transform(iris.data, iris.target)
array([[1.4, 0.2],
[1.4, 0.2],
[1.3, 0.2],
[1.5, 0.2],
[1.4, 0.2],
[1.7, 0.4],
[1.4, 0.3],
[1.5, 0.2],
[1.4, 0.2],
[1.5, 0.1],
[1.5, 0.2],
[1.6, 0.2],
[1.4, 0.1],
[1.1, 0.1],
[1.2, 0.2],
[1.5, 0.4],
[1.3, 0.4],
[1.4, 0.3],
[1.7, 0.3],
[1.5, 0.3],
[1.7, 0.2],
[1.5, 0.4],
[1. , 0.2],
[1.7, 0.5],
[1.9, 0.2],
[1.6, 0.2],
[1.6, 0.4],
[1.5, 0.2],
[1.4, 0.2],
[1.6, 0.2],
[1.6, 0.2],
[1.5, 0.4],
[1.5, 0.1],
[1.4, 0.2],
[1.5, 0.1],
[1.2, 0.2],
[1.3, 0.2],
[1.5, 0.1],
[1.3, 0.2],
[1.5, 0.2],
[1.3, 0.3],
[1.3, 0.3],
[1.3, 0.2],
[1.6, 0.6],
[1.9, 0.4],
[1.4, 0.3],
[1.6, 0.2],
[1.4, 0.2],
[1.5, 0.2],
[1.4, 0.2],
[4.7, 1.4],
[4.5, 1.5],
[4.9, 1.5],
[4. , 1.3],
[4.6, 1.5],
[4.5, 1.3],
[4.7, 1.6],
[3.3, 1. ],
[4.6, 1.3],
[3.9, 1.4],
[3.5, 1. ],
[4.2, 1.5],
[4. , 1. ],
[4.7, 1.4],
[3.6, 1.3],
[4.4, 1.4],
[4.5, 1.5],
[4.1, 1. ],
[4.5, 1.5],
[3.9, 1.1],
[4.8, 1.8],
[4. , 1.3],
[4.9, 1.5],
[4.7, 1.2],
[4.3, 1.3],
[4.4, 1.4],
[4.8, 1.4],
[5. , 1.7],
[4.5, 1.5],
[3.5, 1. ],
[3.8, 1.1],
[3.7, 1. ],
[3.9, 1.2],
[5.1, 1.6],
[4.5, 1.5],
[4.5, 1.6],
[4.7, 1.5],
[4.4, 1.3],
[4.1, 1.3],
[4. , 1.3],
[4.4, 1.2],
[4.6, 1.4],
[4. , 1.2],
[3.3, 1. ],
[4.2, 1.3],
[4.2, 1.2],
[4.2, 1.3],
[4.3, 1.3],
[3. , 1.1],
[4.1, 1.3],
[6. , 2.5],
[5.1, 1.9],
[5.9, 2.1],
[5.6, 1.8],
[5.8, 2.2],
[6.6, 2.1],
[4.5, 1.7],
[6.3, 1.8],
[5.8, 1.8],
[6.1, 2.5],
[5.1, 2. ],
[5.3, 1.9],
[5.5, 2.1],
[5. , 2. ],
[5.1, 2.4],
[5.3, 2.3],
[5.5, 1.8],
[6.7, 2.2],
[6.9, 2.3],
[5. , 1.5],
[5.7, 2.3],
[4.9, 2. ],
[6.7, 2. ],
[4.9, 1.8],
[5.7, 2.1],
[6. , 1.8],
[4.8, 1.8],
[4.9, 1.8],
[5.6, 2.1],
[5.8, 1.6],
[6.1, 1.9],
[6.4, 2. ],
[5.6, 2.2],
[5.1, 1.5],
[5.6, 1.4],
[6.1, 2.3],
[5.6, 2.4],
[5.5, 1.8],
[4.8, 1.8],
[5.4, 2.1],
[5.6, 2.4],
[5.1, 2.3],
[5.1, 1.9],
[5.9, 2.3],
[5.7, 2.5],
[5.2, 2.3],
[5. , 1.9],
[5.2, 2. ],
[5.4, 2.3],
[5.1, 1.8]])
3.4.2 Обертка
Думайте о выборе функций как о проблеме поиска подмножества функций, фильтруйте различные подмножества функций и используйте модель для оценки эффекта.
Типичным алгоритмом упаковки является «алгоритм рекурсивного удаления признаков».
рекурсивное устранение признаков
Метод рекурсивного исключения признаков использует базовую модель для нескольких раундов обучения.После каждого раунда обучения исключаются признаки нескольких весовых коэффициентов, а затем выполняется следующий раунд обучения на основе нового набора признаков.
Например, используя логистическую регрессию, как это сделать?
① Запустите модель с полным набором функций.
② В соответствии с коэффициентом линейной модели (отражающим корреляцию) удалите 5-10% слабых признаков и наблюдайте за изменением точности / auc.
③ Постепенно продолжайте до тех пор, пока точность/auc не покажет значительное снижение и не остановится.
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
#递归特征消除法,返回特征选择后的数据
#参数estimator为基模型
#参数n_features_to_select为选择的特征个数
RFE(estimator=LogisticRegression(), n_features_to_select=2).fit_transform(iris.data, iris.target)
array([[3.5, 0.2],
[3. , 0.2],
[3.2, 0.2],
[3.1, 0.2],
[3.6, 0.2],
[3.9, 0.4],
[3.4, 0.3],
[3.4, 0.2],
[2.9, 0.2],
[3.1, 0.1],
[3.7, 0.2],
[3.4, 0.2],
[3. , 0.1],
[3. , 0.1],
[4. , 0.2],
[4.4, 0.4],
[3.9, 0.4],
[3.5, 0.3],
[3.8, 0.3],
[3.8, 0.3],
[3.4, 0.2],
[3.7, 0.4],
[3.6, 0.2],
[3.3, 0.5],
[3.4, 0.2],
[3. , 0.2],
[3.4, 0.4],
[3.5, 0.2],
[3.4, 0.2],
[3.2, 0.2],
[3.1, 0.2],
[3.4, 0.4],
[4.1, 0.1],
[4.2, 0.2],
[3.1, 0.1],
[3.2, 0.2],
[3.5, 0.2],
[3.1, 0.1],
[3. , 0.2],
[3.4, 0.2],
[3.5, 0.3],
[2.3, 0.3],
[3.2, 0.2],
[3.5, 0.6],
[3.8, 0.4],
[3. , 0.3],
[3.8, 0.2],
[3.2, 0.2],
[3.7, 0.2],
[3.3, 0.2],
[3.2, 1.4],
[3.2, 1.5],
[3.1, 1.5],
[2.3, 1.3],
[2.8, 1.5],
[2.8, 1.3],
[3.3, 1.6],
[2.4, 1. ],
[2.9, 1.3],
[2.7, 1.4],
[2. , 1. ],
[3. , 1.5],
[2.2, 1. ],
[2.9, 1.4],
[2.9, 1.3],
[3.1, 1.4],
[3. , 1.5],
[2.7, 1. ],
[2.2, 1.5],
[2.5, 1.1],
[3.2, 1.8],
[2.8, 1.3],
[2.5, 1.5],
[2.8, 1.2],
[2.9, 1.3],
[3. , 1.4],
[2.8, 1.4],
[3. , 1.7],
[2.9, 1.5],
[2.6, 1. ],
[2.4, 1.1],
[2.4, 1. ],
[2.7, 1.2],
[2.7, 1.6],
[3. , 1.5],
[3.4, 1.6],
[3.1, 1.5],
[2.3, 1.3],
[3. , 1.3],
[2.5, 1.3],
[2.6, 1.2],
[3. , 1.4],
[2.6, 1.2],
[2.3, 1. ],
[2.7, 1.3],
[3. , 1.2],
[2.9, 1.3],
[2.9, 1.3],
[2.5, 1.1],
[2.8, 1.3],
[3.3, 2.5],
[2.7, 1.9],
[3. , 2.1],
[2.9, 1.8],
[3. , 2.2],
[3. , 2.1],
[2.5, 1.7],
[2.9, 1.8],
[2.5, 1.8],
[3.6, 2.5],
[3.2, 2. ],
[2.7, 1.9],
[3. , 2.1],
[2.5, 2. ],
[2.8, 2.4],
[3.2, 2.3],
[3. , 1.8],
[3.8, 2.2],
[2.6, 2.3],
[2.2, 1.5],
[3.2, 2.3],
[2.8, 2. ],
[2.8, 2. ],
[2.7, 1.8],
[3.3, 2.1],
[3.2, 1.8],
[2.8, 1.8],
[3. , 1.8],
[2.8, 2.1],
[3. , 1.6],
[2.8, 1.9],
[3.8, 2. ],
[2.8, 2.2],
[2.8, 1.5],
[2.6, 1.4],
[3. , 2.3],
[3.4, 2.4],
[3.1, 1.8],
[3. , 1.8],
[3.1, 2.1],
[3.1, 2.4],
[3.1, 2.3],
[2.7, 1.9],
[3.2, 2.3],
[3.3, 2.5],
[3. , 2.3],
[2.5, 1.9],
[3. , 2. ],
[3.4, 2.3],
[3. , 1.8]])
3.4.3 Встроенный
Выбор функции на основе штрафа
Используя базовую модель со штрафными условиями, кроме отсеивания признаков, также выполняется уменьшение размерности. Используя класс SelectFromModel библиотеки feature_selection в сочетании с моделью логистической регрессии с условием штрафа L1, код для выбора функций выглядит следующим образом:
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression
#带L1惩罚项的逻辑回归作为基模型的特征选择
SelectFromModel(LogisticRegression(penalty="l1", C=0.1)).fit_transform(iris.data, iris.target)
array([[5.1, 3.5, 1.4],
[4.9, 3. , 1.4],
[4.7, 3.2, 1.3],
[4.6, 3.1, 1.5],
[5. , 3.6, 1.4],
[5.4, 3.9, 1.7],
[4.6, 3.4, 1.4],
[5. , 3.4, 1.5],
[4.4, 2.9, 1.4],
[4.9, 3.1, 1.5],
[5.4, 3.7, 1.5],
[4.8, 3.4, 1.6],
[4.8, 3. , 1.4],
[4.3, 3. , 1.1],
[5.8, 4. , 1.2],
[5.7, 4.4, 1.5],
[5.4, 3.9, 1.3],
[5.1, 3.5, 1.4],
[5.7, 3.8, 1.7],
[5.1, 3.8, 1.5],
[5.4, 3.4, 1.7],
[5.1, 3.7, 1.5],
[4.6, 3.6, 1. ],
[5.1, 3.3, 1.7],
[4.8, 3.4, 1.9],
[5. , 3. , 1.6],
[5. , 3.4, 1.6],
[5.2, 3.5, 1.5],
[5.2, 3.4, 1.4],
[4.7, 3.2, 1.6],
[4.8, 3.1, 1.6],
[5.4, 3.4, 1.5],
[5.2, 4.1, 1.5],
[5.5, 4.2, 1.4],
[4.9, 3.1, 1.5],
[5. , 3.2, 1.2],
[5.5, 3.5, 1.3],
[4.9, 3.1, 1.5],
[4.4, 3. , 1.3],
[5.1, 3.4, 1.5],
[5. , 3.5, 1.3],
[4.5, 2.3, 1.3],
[4.4, 3.2, 1.3],
[5. , 3.5, 1.6],
[5.1, 3.8, 1.9],
[4.8, 3. , 1.4],
[5.1, 3.8, 1.6],
[4.6, 3.2, 1.4],
[5.3, 3.7, 1.5],
[5. , 3.3, 1.4],
[7. , 3.2, 4.7],
[6.4, 3.2, 4.5],
[6.9, 3.1, 4.9],
[5.5, 2.3, 4. ],
[6.5, 2.8, 4.6],
[5.7, 2.8, 4.5],
[6.3, 3.3, 4.7],
[4.9, 2.4, 3.3],
[6.6, 2.9, 4.6],
[5.2, 2.7, 3.9],
[5. , 2. , 3.5],
[5.9, 3. , 4.2],
[6. , 2.2, 4. ],
[6.1, 2.9, 4.7],
[5.6, 2.9, 3.6],
[6.7, 3.1, 4.4],
[5.6, 3. , 4.5],
[5.8, 2.7, 4.1],
[6.2, 2.2, 4.5],
[5.6, 2.5, 3.9],
[5.9, 3.2, 4.8],
[6.1, 2.8, 4. ],
[6.3, 2.5, 4.9],
[6.1, 2.8, 4.7],
[6.4, 2.9, 4.3],
[6.6, 3. , 4.4],
[6.8, 2.8, 4.8],
[6.7, 3. , 5. ],
[6. , 2.9, 4.5],
[5.7, 2.6, 3.5],
[5.5, 2.4, 3.8],
[5.5, 2.4, 3.7],
[5.8, 2.7, 3.9],
[6. , 2.7, 5.1],
[5.4, 3. , 4.5],
[6. , 3.4, 4.5],
[6.7, 3.1, 4.7],
[6.3, 2.3, 4.4],
[5.6, 3. , 4.1],
[5.5, 2.5, 4. ],
[5.5, 2.6, 4.4],
[6.1, 3. , 4.6],
[5.8, 2.6, 4. ],
[5. , 2.3, 3.3],
[5.6, 2.7, 4.2],
[5.7, 3. , 4.2],
[5.7, 2.9, 4.2],
[6.2, 2.9, 4.3],
[5.1, 2.5, 3. ],
[5.7, 2.8, 4.1],
[6.3, 3.3, 6. ],
[5.8, 2.7, 5.1],
[7.1, 3. , 5.9],
[6.3, 2.9, 5.6],
[6.5, 3. , 5.8],
[7.6, 3. , 6.6],
[4.9, 2.5, 4.5],
[7.3, 2.9, 6.3],
[6.7, 2.5, 5.8],
[7.2, 3.6, 6.1],
[6.5, 3.2, 5.1],
[6.4, 2.7, 5.3],
[6.8, 3. , 5.5],
[5.7, 2.5, 5. ],
[5.8, 2.8, 5.1],
[6.4, 3.2, 5.3],
[6.5, 3. , 5.5],
[7.7, 3.8, 6.7],
[7.7, 2.6, 6.9],
[6. , 2.2, 5. ],
[6.9, 3.2, 5.7],
[5.6, 2.8, 4.9],
[7.7, 2.8, 6.7],
[6.3, 2.7, 4.9],
[6.7, 3.3, 5.7],
[7.2, 3.2, 6. ],
[6.2, 2.8, 4.8],
[6.1, 3. , 4.9],
[6.4, 2.8, 5.6],
[7.2, 3. , 5.8],
[7.4, 2.8, 6.1],
[7.9, 3.8, 6.4],
[6.4, 2.8, 5.6],
[6.3, 2.8, 5.1],
[6.1, 2.6, 5.6],
[7.7, 3. , 6.1],
[6.3, 3.4, 5.6],
[6.4, 3.1, 5.5],
[6. , 3. , 4.8],
[6.9, 3.1, 5.4],
[6.7, 3.1, 5.6],
[6.9, 3.1, 5.1],
[5.8, 2.7, 5.1],
[6.8, 3.2, 5.9],
[6.7, 3.3, 5.7],
[6.7, 3. , 5.2],
[6.3, 2.5, 5. ],
[6.5, 3. , 5.2],
[6.2, 3.4, 5.4],
[5.9, 3. , 5.1]])
Метод выбора признаков на основе модели дерева
GBDT в древовидной модели также можно использовать в качестве базовой модели для выбора функций.Используя класс SelectFromModel библиотеки feature_selection в сочетании с моделью GBDT, код для выбора функций выглядит следующим образом.
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import GradientBoostingClassifier
#GBDT作为基模型的特征选择
SelectFromModel(GradientBoostingClassifier()).fit_transform(iris.data, iris.target)
array([[1.4, 0.2],
[1.4, 0.2],
[1.3, 0.2],
[1.5, 0.2],
[1.4, 0.2],
[1.7, 0.4],
[1.4, 0.3],
[1.5, 0.2],
[1.4, 0.2],
[1.5, 0.1],
[1.5, 0.2],
[1.6, 0.2],
[1.4, 0.1],
[1.1, 0.1],
[1.2, 0.2],
[1.5, 0.4],
[1.3, 0.4],
[1.4, 0.3],
[1.7, 0.3],
[1.5, 0.3],
[1.7, 0.2],
[1.5, 0.4],
[1. , 0.2],
[1.7, 0.5],
[1.9, 0.2],
[1.6, 0.2],
[1.6, 0.4],
[1.5, 0.2],
[1.4, 0.2],
[1.6, 0.2],
[1.6, 0.2],
[1.5, 0.4],
[1.5, 0.1],
[1.4, 0.2],
[1.5, 0.1],
[1.2, 0.2],
[1.3, 0.2],
[1.5, 0.1],
[1.3, 0.2],
[1.5, 0.2],
[1.3, 0.3],
[1.3, 0.3],
[1.3, 0.2],
[1.6, 0.6],
[1.9, 0.4],
[1.4, 0.3],
[1.6, 0.2],
[1.4, 0.2],
[1.5, 0.2],
[1.4, 0.2],
[4.7, 1.4],
[4.5, 1.5],
[4.9, 1.5],
[4. , 1.3],
[4.6, 1.5],
[4.5, 1.3],
[4.7, 1.6],
[3.3, 1. ],
[4.6, 1.3],
[3.9, 1.4],
[3.5, 1. ],
[4.2, 1.5],
[4. , 1. ],
[4.7, 1.4],
[3.6, 1.3],
[4.4, 1.4],
[4.5, 1.5],
[4.1, 1. ],
[4.5, 1.5],
[3.9, 1.1],
[4.8, 1.8],
[4. , 1.3],
[4.9, 1.5],
[4.7, 1.2],
[4.3, 1.3],
[4.4, 1.4],
[4.8, 1.4],
[5. , 1.7],
[4.5, 1.5],
[3.5, 1. ],
[3.8, 1.1],
[3.7, 1. ],
[3.9, 1.2],
[5.1, 1.6],
[4.5, 1.5],
[4.5, 1.6],
[4.7, 1.5],
[4.4, 1.3],
[4.1, 1.3],
[4. , 1.3],
[4.4, 1.2],
[4.6, 1.4],
[4. , 1.2],
[3.3, 1. ],
[4.2, 1.3],
[4.2, 1.2],
[4.2, 1.3],
[4.3, 1.3],
[3. , 1.1],
[4.1, 1.3],
[6. , 2.5],
[5.1, 1.9],
[5.9, 2.1],
[5.6, 1.8],
[5.8, 2.2],
[6.6, 2.1],
[4.5, 1.7],
[6.3, 1.8],
[5.8, 1.8],
[6.1, 2.5],
[5.1, 2. ],
[5.3, 1.9],
[5.5, 2.1],
[5. , 2. ],
[5.1, 2.4],
[5.3, 2.3],
[5.5, 1.8],
[6.7, 2.2],
[6.9, 2.3],
[5. , 1.5],
[5.7, 2.3],
[4.9, 2. ],
[6.7, 2. ],
[4.9, 1.8],
[5.7, 2.1],
[6. , 1.8],
[4.8, 1.8],
[4.9, 1.8],
[5.6, 2.1],
[5.8, 1.6],
[6.1, 1.9],
[6.4, 2. ],
[5.6, 2.2],
[5.1, 1.5],
[5.6, 1.4],
[6.1, 2.3],
[5.6, 2.4],
[5.5, 1.8],
[4.8, 1.8],
[5.4, 2.1],
[5.6, 2.4],
[5.1, 2.3],
[5.1, 1.9],
[5.9, 2.3],
[5.7, 2.5],
[5.2, 2.3],
[5. , 1.9],
[5.2, 2. ],
[5.4, 2.3],
[5.1, 1.8]])
Выше приведено соответствующее описание разработки функций, а что касается контента, связанного с мониторингом функций, я еще не понял его, и я добавлю его после того, как изучу его позже.
После того, как проектирование признаков завершено, следующим шагом будет выбор и настройка модели.В следующей статье мы в основном изучим и разберем эти знания.
Справочная статья:
1.blog.CSDN.net/rose nor1/AR…
2.woohoo.cn blog.com/Jason Freak/…
Добро пожаловать, чтобы обратить внимание на мою личную общедоступную учетную запись AI Computer Vision Workshop. Эта общедоступная учетная запись будет время от времени публиковать статьи о машинном обучении, глубоком обучении, компьютерном зрении и другие связанные статьи. Приглашаю всех учиться и общаться со мной.