Эта статья участвовала в "Проект «Звезда раскопок»”, чтобы выиграть творческий подарочный пакет и бросить вызов творческим поощрительным деньгам.
Мало знаний, большой вызов! Эта статья участвует в "Необходимые знания для программистов«Творческая деятельность.
1. Обработка категориальных признаков: кодирование и фиктивные переменные
В машинном обучении большинство алгоритмов, таких как логистическая регрессия, метод опорных векторов SVM, алгоритм k-ближайшего соседа и т. д., могут обрабатывать только числовые данные, а не текст.Когда требуются все входные массивы или матрицы, а текстовые данные не могут быть импортированы (на самом деле, рукописные деревья решений и Байес Пута могут обрабатывать текст, но sklearn требует, чтобы числовые данные были импортированы). В действительности, однако, многие метки и функции не представлены в числовом виде при сборе данных. Например, значение образования может быть ["начальная школа", "неполная средняя школа", "средняя школа", "университет"], а способ оплаты может включать ["Alipay", "Cash", "WeChat"]. и так далее. В этом случае, чтобы вписать данные в алгоритмы и библиотеки, мы должны закодировать данные, то есть преобразовать буквенные данные в числовые.
preprocessing.LabelEncoder: предназначен для меток, способных преобразовывать классификации в значения классификации.
from sklearn.preprocessing import LabelEncoder
y = data.iloc[:,-1] #要输入的是标签,不是特征矩阵,所以允许一维
le = LabelEncoder() #实例化
le = le.fit(y) #导入数据
label = le.transform(y) #transform接口调取结果
le.classes_ #属性.classes_查看标签中究竟有多少类别
label #查看获取的结果label
le.fit_transform(y) #也可以直接fit_transform一步到位
le.inverse_transform(label) #使用inverse_transform可以逆转
data.iloc[:,-1] = label #让标签等于我们运行出来的结果
data.head()
#如果不需要教学展示的话我会这么写:
from sklearn.preprocessing import LabelEncoder
data.iloc[:,-1] = LabelEncoder().fit_transform(data.iloc[:,-1])
preprocessing.OrdinalEncoder: для конкретных функций, способный преобразовывать категориальные функции в категориальные значения.
from sklearn.preprocessing import OrdinalEncoder
#接口categories_对应LabelEncoder的接口classes_,一模一样的功能
data_ = data.copy()
data_.head()
OrdinalEncoder().fit(data_.iloc[:,1:-1]).categories_
data_.iloc[:,1:-1] = OrdinalEncoder().fit_transform(data_.iloc[:,1:-1])
data_.head()
preprocessing.OneHotEncoder: горячее кодирование, создание фиктивных переменных
Категориальные переменные Sex и Embarked были преобразованы в числовые категории с помощью OrdinalEncoder. В столбце Hatch Embarked мы используем [0,1,2] для представления трех разных штриховок, но правильно ли это преобразование? Рассмотрим три различных типа категориальных данных:
- 1) люки (S, c, Q)
- Три величины S, C и Q независимы друг от друга и никак не связаны друг с другом, выражая понятие S≠C+Q. Это номинальная переменная.
- 2) Образование (начальная школа, неполная средняя школа, старшая школа)
- Эти три значения не являются полностью независимыми.Мы можем ясно видеть, что могут быть отношения, такие как средняя школа > неполная средняя школа > начальная школа в природе.Образовательные степени бывают высокими и низкими, но ценности образования не Мы не можем сказать, что начальная школа + определенное значение = неполная средняя школа. Это порядковая переменная.
- 3) Вес (> 45 кг,> 90 кг,> 135 кг)
- Существует взаимосвязь между различными значениями, и они могут быть рассчитаны друг из друга, например, 120 кг - 45 кг = 90 кг, и категории могут быть преобразованы друг в друга с помощью математических расчетов. Это переменная расстояния.
- Однако при кодировании признаков эти три классификационных данных будут преобразованы нами в [0, 1, 2] Эти три числа непрерывны и вычислимы в глазах алгоритма, и эти три числа не равны друг другу. , имеет размер и имеет соединения, которые можно добавлять и умножать. Таким образом, алгоритм неправильно интерпретирует классификационные признаки, такие как дверь и образование, как такие классификационные признаки, как вес. Это означает, что когда мы конвертируем классификацию в числа, мы игнорируем математические свойства, присущие числам, поэтому передаем алгоритму некоторую неточную информацию, что повлияет на наше моделирование.
- Категория OrdinalEncoder может использоваться для работы с порядковыми переменными, но для номинальных переменных мы можем использовать только фиктивные переменные для работы с ними, чтобы максимально передать алгоритму наиболее точную информацию: