)}"
pd.factorize()Является функцией библиотеки Pandas, используемой длякодирования категориальных переменныхФункция преобразует категориальные данные в целочисленные коды и возвращает список уникальных значений.
Это распространённая техника в предварительной обработке машинного обучения, преобразующая текстовые категории в числовые значения, что упрощает обработку алгоритмами. По сравнению с one-hot кодированием (pd.get_dummies()), факторизационное кодирование не увеличивает размерность данных.
Определение слова: factorizeОзначает "факторизацию", здесь подразумевается преобразование категориальных переменных в числовые факторы (целочисленные коды).
Базовый синтаксис и параметры
pd.factorize()Это функция верхнего уровня библиотеки Pandas, используемая для кодирования категориальных переменных в виде целых чисел.
Формат синтаксиса
pd.factorize(values, sort=False, na_sentinel=-1, size_hint=None)
Описание параметра
- Параметр:
values- Тип: объект, подобный массиву, например Series, list, array и т. д.
- Описание: категориальные данные для кодирования.
- Параметр:
sort- Тип: логическое значение.
- Если он равен
True, сортировать уникальные значения перед кодированием. По умолчанию —False(кодировать в порядке появления).
na_sentinel
- Type: Integer.
- Integer used to mark missing values. Default is
-1. If set toNone, missing values will be kept as NaN.
Описание функций
- Возвращаемое значение: Возвращает кортеж (codes, uniques), где codes — закодированный целочисленный массив, а uniques — массив уникальных значений.
- Эффект: Сопоставляет категориальные переменные с последовательностью целых чисел, начиная с 0, при этом каждому уникальному значению соответствует целое число.
Примеры
Давайте досконально освоим через серию примеров от простого к сложномуpd.factorize()его использование.
Пример 1: Базовое использование — кодирование категориальных переменных
Пример
import numpy as np
# 1. Создайте категориальные данные
colors = pd.Series(['red', 'blue', 'green', 'red', 'blue', 'yellow'])
print("=== Исходные категориальные данные ===")
print(colors)
# 2. Используйте pd.factorize() для кодирования
codes, uniques = pd.factorize(colors)
print("\n=== результат кодирования pd.factorize() ===")
print(fКодирование: {codes}) # Закодированное целое
print(fУникальные значения: {uniques}) # uniqueValueList
print(f"Тип: {type(codes)}")
Ожидаемый вывод:
=== 原始分类数据 === 0 red 1 blue 2 green 3 red 4 blue 5 yellow 原始数据中 'red' 出现 2 次,'blue' 出现 2 次,'green' 和 'yellow' 各出现 1 次。 按出现顺序分配编码: - 'red' -> 0 - 'blue' -> 1 - 'green' -> 2 - 'yellow' -> 3 === 编码: [0 1 2 0 1 3] === 唯一值数组: ['red' 'blue' 'green' 'yellow']
Пояснение к коду:
- Возвращаемый codes — это массив целых чисел, в котором каждое исходное значение заменено соответствующим целочисленным кодом.
- Массив uniques хранит все уникальные значения, расположенные в соответствующем порядке кодирования.
- По умолчанию codes присваиваются в порядке появления (первое появившееся значение кодируется как 0).
Пример 2: параметр sort — сортировка уникальных значений перед кодированием
Использованиеsort=Trueможно сортировать уникальные значения перед кодированием, что делает результаты более предсказуемыми.
Пример
import numpy as np
# Создание категориальных данных
colors = pd.Series(['red', 'blue', 'green', 'red', 'blue', 'yellow'])
print(=== Исходные данные ===)
print(colors)
# 1. Без сортировки (по умолчанию) — кодировать в порядке появления
codes_unsorted, uniques_unsorted = pd.factorize(colors, sort=False)
print("\n=== sort=False (по умолчанию) ===")
print(f"Коды: {codes_unsorted}")
print(fУникальные значения: {uniques_unsorted})
# 2. Кодировать после сортировки - в алфавитном порядке
codes_sorted, uniques_sorted = pd.factorize(colors, sort=True)
print("\n=== sort=True (в алфавитном порядке) ===)
print(fКоды: {codes_sorted})
print(f"Уникальные значения: {uniques_sorted}")
# 3. Сортировать числовые значения
numbers = pd.Series([5, 2, 8, 5, 3, 2, 9])
codes_num, uniques_num = pd.factorize(numbers, sort=True)
print("\n=== Кодирование числовой сортировки ===)
print(f"Коды: {codes_num}")
print(fУникальные значения: {uniques_num})
Ожидаемый вывод:
=== 原始数据 === 0 red 1 blue 2 green 3 red 4 blue 5 yellow === sort=False (默认) === 编码: [0 1 2 0 1 3] 唯一值: ['red' 'blue' 'green' 'yellow'] === sort=True (按字母顺序) === 编码: [2 0 1 2 0 3] 唯一值: ['blue' 'green', 'red', 'yellow'] 按字母顺序排列:blue, green, red, yellow - blue -> 0 - green -> 1 - red -> 2 - yellow -> 3 === 数值排序编码 === 编码: [2 0 3 2 1 0 4] 唯一值: [2, 3, 5, 8, 9] 按数值排序:2, 3, 5, 8, 9 - 2 -> 0 - 3 -> 1 - 5 -> 2 - 8 -> 3 - 9 -> 4
Пояснение к коду:
sort=TrueПосле сортировки уникальных значений и последующего кодирования порядок кодирования детерминирован и предсказуем.- Это полезно, когда требуются воспроизводимые результаты.
Пример 3: Обработка пропущенных значений
na_sentinelПараметр используется для управления обработкой пропущенных значений.
Пример
import numpy as np
Данные, содержащие пропущенные значения
data = pd.Series(['a', 'b', np.nan, 'a', None, 'c', 'b'])
print("=== Данные с пропущенными значениями ===")
print(data)
# 2. Поведение по умолчанию (пропущенное значение → -1)
codes_default, uniques_default = pd.factorize(data)
print("\n=== Обработка по умолчанию (пропущенные значения = -1) ===)
print(fКодирование: {codes_default})
print(f"Уникальные значения: {uniques_default}")
# 4. Пользовательское кодирование пропущенных значений (имитация na_sentinel=-999)
codes_custom = np.where⟧codes_default(codes_default == -1, -999, codes_default)
print("\n=== Пользовательское кодирование пропущенных значений (-) ===)
print(fКоды: {codes_custom})
# 4. Сохранить NaN (имитация na_sentinel=None)
codes_nan = codes_default.astype('float')
codes_nan[codes_nan == -1] = np.nan
print("\n=== Сохранить NaN ===)
print(f"Коды: {codes_nan}")
print(f"Тип кодирования: {type(codes_nan)
Ожидаемый вывод:
=== 包含缺失值的数据 === 0 a 1 b 2 NaN 3 a 4 None 5 c 6 b dtype: object === 默认处理(缺失值 = -1)=== 编码: [ 0 1 -1 0 -1 2 1] 唯一值: Index(['a', 'b', 'c'], dtype='object') === 自定义缺失值编码(-999)=== 编码: [ 0 1 -999 0 -999 2 1] === 保持 NaN === 编码: [ 0. 1. nan 0. nan 2. 1.] 编码类型: <class 'numpy.float64'>
Пример 4: Применение в машинном обучении
Кодирование факторизацией очень практично при предобработке в машинном обучении, особенно для категориальных переменных с высокой кардинальностью.
Пример
Создайте DataFrame, содержащий категориальные переменные
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'Diana', 'Eve', 'Frank'],
'city': ['Пекин', 'Шанхай', 'Пекин', 'Guangzhou', 'Shanghai', 'Beijing'],
'department': ['Sales', 'Engineering', 'Sales', 'HR', 'Engineering', 'Sales']
})
print("=== Исходный DataFrame ===")
print(df)
# 2. Факторизация категориальных столбцов
# Создайте словарь сопоставлений
city_codes, city_uniques = pd.factorize(df['city'])
dept_codes, dept_uniques = pd.factorize(df['department'])
print("\n=== Результат кодирования факторизацией ===)
print(f"коды городов: {city_codes.tolist()}")
print(f"уникальные значения города: {city_uniques}")
print(f"код отдела: {dept_codes.tolist()}")
print(f"уникальные значения отдела: {dept_uniques}")
# 3. Создание закодированного DataFrame
df_encoded = df.copy()
df_encoded['city_encoded'] = city_codes
df_encoded['dept_encoded'] = dept_codes
print("\n=== Закодированный DataFrame ===)
print(df_encoded)
# 4. Использование словаря сопоставления для кодирования новых данных
print("\n=== Словарь сопоставления ===)
city_mapping = dict(zip(city_uniques, range(len(city_uniques))))
print(fсопоставление городов: {city_mapping})
# Закодировать новые данные
new_cities = pd.Series(['Beijing', 'Shanghai', 'Shenzhen'])
new_codes = new_cities.map(city_mapping)
print(f"\nКодирование новых данных: {new_codes.tolist()}")
Ожидаемый вывод:
=== 原始 DataFrame ===
name city department
0 Alice Beijing Sales
1 Bob Shanghai Engineering
2 Charlie Beijing Sales
3 Diana Guangzhou HR
4 eve Shanghai Engineering
5 Frank Beijing Sales
=== 因子化编码结果 ===
city 编码: [0 1 0 2 1 0]
city 唯一值: ['Beijing' 'Shanghai' 'Guangzhou']
department 编码: [0 1 0 2 1 0]
department 唯一值: ['Sales' 'Engineering' 'HR']
=== 编码后的 DataFrame ===
name city department city_encoded dept_encoded
0 Alice Beijing Sales 0 0
1 Bob Shanghai Engineering 1 1
2 Charlie Beijing Sales 0 0
3 Diana Guangzhou HR 2 2
4 Eve Shanghai Engineering 1 1
5 Frank Beijing Sales 0 0
=== 映射字典 ===
city 映射: {'Beijing': 0, 'Shanghai': 1, 'Guangzhou': 2}
Пояснение к коду:
pd.factorize()Возвращает кортеж, который можно напрямую распаковать для получения кодов и уникальных значений.- После создания словаря сопоставления ту же кодировку можно применить к новым данным, что упрощает вывод модели машинного обучения.
- Факторизационное кодирование не увеличивает размерность данных, что делает его подходящим для обработки категориальных переменных с высокой кардинальностью.
Другие расширенияСовет:
pd.factorize()Подходит для обработки упорядоченных или неупорядоченных категориальных переменных. Если требуется one-hot кодирование (для таких алгоритмов, как логистическая регрессия), используйтеpd.get_dummies()функцию.
Pandas: общие функции