📅  最后修改于: 2023-12-03 15:08:57.062000             🧑  作者: Mango
在进行机器学习任务时,经常需要将分类数据转换为数值数据,以便能够在模型中使用。本文将介绍几种常见的方法。
Label Encoding 是将每个分类值映射到一个整数值的过程。这个方法适用于分类值之间没有任何顺序关系的情况。
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
data['category_encoded'] = le.fit_transform(data['category'])
上面代码中,我们使用 scikit-learn 的 LabelEncoder
,将 data
数据集中的 category
列进行编码,并赋值到 category_encoded
列。
对于有序分类值,使用 Label Encoding 会导致模型产生错误的假设关于数据。而 One-Hot Encoding 可以解决这个问题。
One-Hot Encoding 是将每个分类值分别编码为一个二进制向量的过程。每个向量都是相同的长度,向量中的元素数量等于分类值数量。每个向量中的元素在分类值列中代表相应分类值是否出现。
import pandas as pd
one_hot = pd.get_dummies(data['category'])
data = data.drop('category',axis = 1)
data = data.join(one_hot)
上面代码中,我们使用 pandas 的 get_dummies
函数,将 data
数据集中的 category
列进行 One-Hot 编码,并将生成的新的列与原数据集拼合在一起。
One-Hot Encoding 可以解决分类值有序的问题,但它具有一定的缺陷,那就是,当分类值的数量达到几千个时,会导致数据集的维度急剧上升,从而导致模型变得很难处理。
Binary Encoding 是对 One-Hot Encoding 的改进,它使用二进制对分类值进行编码。
import category_encoders as ce
encoder = ce.BinaryEncoder(cols=['category'])
data = encoder.fit_transform(data)
上面代码中,我们使用 category_encoders 库的 BinaryEncoder
,将 data
数据集中的 category
列进行 Binary 编码。
Backward Difference Encoding 是将每个分类值编码为前一个分类值和当前分类值之间的差异。
encoder = ce.BackwardDifferenceEncoder(cols=['category'])
data = encoder.fit_transform(data)
上面代码中,我们使用 category_encoders 库的 BackwardDifferenceEncoder
,将 data
数据集中的 category
列进行 Backward Difference 编码。
Helmert Encoding 是将每个分类值编码为该分类值出现在数据集中的位置以及该位置之前所有分类值的出现次数之和。
encoder = ce.HelmertEncoder(cols=['category'])
data = encoder.fit_transform(data)
上面代码中,我们使用 category_encoders 库的 HelmertEncoder
,将 data
数据集中的 category
列进行 Helmert 编码。
Sum Encoding 是将每个分类值编码为该分类值与所有其他分类值的平均水平之间的差异。
encoder = ce.SumEncoder(cols=['category'])
data = encoder.fit_transform(data)
上面代码中,我们使用 category_encoders 库的 SumEncoder
,将 data
数据集中的 category
列进行 Sum 编码。
以上就是将分类数据转换为数值数据的几种方法。你可以根据实际情况选择适合你的方法。