【机器学习】在 scikit-learn 中,有哪些特征编码方法?分布详细举例列出

一、在scikit-learn中,有多种特征编码方法可以用来处理分类数据,以下是一些常见的编码方法及其示例:

  1. One-Hot Encoding (独热编码):

    • 使用 OneHotEncoder 类将分类特征转换为二进制向量。
    • 例如,对于颜色特征 ['red', 'blue', 'green'],编码后可能变成 [1, 0, 0], [0, 1, 0], [0, 0, 1]
  2. Label Encoding (标签编码):

    • 使用 LabelEncoder 类将分类特征的每个类别映射到一个整数。
    • 例如,对于性别特征 ['male', 'female'],编码后可能变成 [0, 1]
  3. Ordinal Encoding (序数编码):

    • 将分类特征的每个类别映射到一个有序的整数。
    • 这种方法可能会引入不存在的顺序关系,因此使用时需要谨慎。
  4. Binary Encoding:

    • 将分类特征转换为二进制数,然后将这些二进制数拆分成多个二进制特征。
  5. Feature Hashing (特征哈希):

    • 使用 FeatureHasher 类通过哈希函数将类别映射到一个固定大小的空间中。
  6. Target Encoding (目标编码):

    • 基于特征和目标值之间的对应关系进行编码,通常用于监督学习。
  7. Custom Encoding (自定义编码):

    • 可以创建自定义的编码方案,例如,根据特定的业务逻辑或模型需求。
  8. Leave-One-Out Encoding:

    • 类别特征的每个值被替换为目标变量在该值出现时的平均值。
  9. HashingVectorizer:

    • 用于文本数据,通过哈希函数将文本转换为固定长度的数字向量。
  10. DictVectorizer:

    • 将字典形式的数据转换为矩阵,适用于文本数据。
  11. CountVectorizer:

    • 用于文本数据,计算每个词在文档中出现的次数。
  12. TfidfVectorizer:

    • 用于文本数据,计算每个词的TF-IDF值。

这些方法中,OneHotEncoderLabelEncoder 是最常用的。OneHotEncoder 适用于模型需要处理二进制特征的情况,而 LabelEncoder 适用于模型可以处理整数特征的情况。其他编码方法则根据特定的数据和模型需求选择使用。

二、One-Hot Encoding 处理非数值型特征

eg1:

在scikit-learn中,使用OneHotEncoder类可以对非数值型(分类)特征进行One-Hot Encoding处理。以下是具体的步骤和示例代码:

步骤 1: 导入OneHotEncoder

首先,你需要从sklearn.preprocessing模块导入OneHotEncoder类。

python 复制代码
from sklearn.preprocessing import OneHotEncoder

步骤 2: 创建OneHotEncoder实例

创建OneHotEncoder的实例。你可以设置一些参数,例如:

  • sparse:默认为True,返回稀疏矩阵;如果设置为False,返回密集数组。
  • drop:默认为None,不丢弃任何特征;可以设置为'first'来丢弃每个特征的第一个类别,有时用于减少多重共线性。
python 复制代码
encoder = OneHotEncoder(sparse=False, drop=None)

步骤 3: 拟合编码器

使用你的数据(特征)来拟合编码器。这一步会识别数据中存在的所有不同的类别。

python 复制代码
encoder.fit([['low', 'medium', 'high'],
              ['medium', 'high', 'low'],
              ['high', 'low', 'medium']])

步骤 4: 转换数据

使用transform方法将分类特征转换为One-Hot编码格式。

python 复制代码
encoded_data = encoder.transform([['high', 'medium', 'low']])

步骤 5: 查看结果

如果你设置了sparse=False,你可以直接打印或者查看转换后的数组。如果是稀疏矩阵,可以使用.toarray()方法转换为密集数组。

python 复制代码
print(encoded_data)
# 或者如果是稀疏矩阵
print(encoded_data.toarray())

完整示例代码

python 复制代码
from sklearn.preprocessing import OneHotEncoder

# 创建OneHotEncoder实例
encoder = OneHotEncoder(sparse=False)

# 拟合数据
encoder.fit([['low', 'medium', 'high'],
              ['medium', 'high', 'low'],
              ['high', 'low', 'medium']])

# 转换数据
encoded_data = encoder.transform([['high', 'medium', 'low']])

# 查看转换后的数据
print(encoded_data)

输出

[[0. 0. 1. 1. 0. 0. 0. 1. 0.]]

在这个示例中,我们有三个分类特征,每个特征有三个可能的类别('low', 'medium', 'high')。One-Hot Encoding后,每个特征都被转换为三个二进制特征,其中一个是1(表示类别),其他是0。

请注意,如果你的数据集很大或者分类特征的类别非常多,One-Hot Encoding可能会导致特征数量急剧增加,从而增加模型的复杂性和计算负担。在这种情况下,可能需要考虑其他编码方法,如目标编码或嵌入编码。

eg2:

OneHotEncoder 是 scikit-learn 库中的一个类,用于对分类特征进行编码,将其转换为机器学习模型可以处理的格式。这种编码方式称为"独热编码"(One-Hot Encoding),它将分类变量的每个类别转换为一个二进制向量,其中一个元素设为 1,其余元素设为 0。

以下是 OneHotEncoder 的一些关键参数和属性:

参数:

  • categories: 指定每个特征的类别。可以是 'auto'(默认),让编码器自动从数据中确定类别,或者是一个列表的列表,其中每个子列表包含一个特征的所有预期类别。
  • drop: 指定是否删除每个特征的第一个类别,以减少特征数量并避免多重共线性。可以是 'first'、'if_binary' 或 None(默认)。
  • sparse: 布尔值,指定输出格式是否为稀疏矩阵(True 默认)或密集数组。
  • dtype : 输出的数据类型,默认为 numpy.float64
  • handle_unknown: 指定在转换期间如何处理未知类别。可以是 'error'(默认,如果遇到未知类别则抛出错误)、'ignore' 或 'infrequent_if_exist'。

属性:

  • categories_: 存储在拟合过程中确定的每个特征的类别列表。
  • drop_idx_ : 如果使用了 drop 参数,这个属性会存储每个特征被删除类别的索引。

方法:

  • fit: 计算并存储每个特征的类别。
  • transform: 将独热编码应用于数据。
  • inverse_transform: 将独热编码的数据转换回原始类别。
  • get_feature_names_out: 获取转换后的特征名称。

示例代码:

python 复制代码
from sklearn.preprocessing import OneHotEncoder

# 创建 OneHotEncoder 实例
encoder = OneHotEncoder(sparse=False)

# 拟合数据
encoder.fit([['low', 'medium', 'high'],
              ['medium', 'high', 'low'],
              ['high', 'low', 'medium']])

# 转换数据
encoded = encoder.transform([['high', 'medium', 'low']])

# 查看转换后的数据
print(encoded)

# 查看每个特征的类别
print(encoder.categories_)

# 获取转换后的特征名称
print(encoder.get_feature_names_out(['feature1', 'feature2', 'feature3']))

输出:

放大版输出:

[[1. 0. 0. 0. 0. 1. 0. 1. 0.]]
[array(['high', 'low', 'medium'], dtype=object), array(['high', 'low', 'medium'], dtype=object), array(['high', 'low', 'medium'], dtype=object)]
['feature1_high' 'feature1_low' 'feature1_medium' 'feature2_high'
 'feature2_low' 'feature2_medium' 'feature3_high' 'feature3_low'
 'feature3_medium']

在这个例子中,OneHotEncoder 将三个特征的类别学习为 ['high', 'low', 'medium'],并将其转换为独热编码格式。如果设置了 sparse=Falsetransform 方法将返回一个密集的 NumPy 数组。通过 get_feature_names_out 方法可以获取转换后的特征名称。

eg3:独热编码(One-Hot Encoding)

独热编码将每个类别转换为一个二进制向量,其中每个类别对应一个维度。适用于无序类别。

使用方法:

python 复制代码
from sklearn.preprocessing import OneHotEncoder

# 示例数据
categories = [['apple'], ['banana'], ['orange'], ['banana'], ['apple']]

# 创建 OneHotEncoder 实例
one_hot_encoder = OneHotEncoder(sparse=False)

# 拟合并转换数据
one_hot_encoded = one_hot_encoder.fit_transform(categories)
print(one_hot_encoded)  # 输出: [[1. 0. 0.]
                         #        [0. 1. 0.]
                         #        [0. 0. 1.]
                         #        [0. 1. 0.]
                         #        [1. 0. 0.]]

三、标签编码(Label Encoding)处理非数值型特征

标签编码(Label Encoding)

标签编码将每个类别映射为一个唯一的整数。这种方法适用于有序类别,但对于无序类别可能导致模型误解类别间的关系。

使用方法:

python 复制代码
from sklearn.preprocessing import LabelEncoder

示例数据
categories = ['apple', 'banana', 'orange', 'banana', 'apple']

创建 LabelEncoder 实例
label_encoder = LabelEncoder()

拟合并转换数据
encoded_labels = label_encoder.fit_transform(categories)
print(encoded_labels)  # 输出: [0 1 2 1 0]

四、 二进制编码(Binary Encoding)

二进制编码首先将类别标签转换为整数,然后将整数转换为二进制形式。对于类别数较多时,比独热编码更高效。

使用方法:

需要安装 category_encoders 库:

python 复制代码
pip install category_encoders
python 复制代码
import category_encoders as ce

# 示例数据
categories = ['apple', 'banana', 'orange', 'banana', 'apple']

# 创建 BinaryEncoder 实例
binary_encoder = ce.BinaryEncoder()

# 拟合并转换数据
binary_encoded = binary_encoder.fit_transform(categories)
print(binary_encoded)

输出:

   0_0  0_1
0    0    1
1    1    0
2    1    1
3    1    0
4    0    1
Selection deleted

五、频率编码(Frequency Encoding)

频率编码根据每个类别的出现频率进行编码。适用于类别较多且频率分布不均的情况。

使用方法:

python 复制代码
import pandas as pd

# 示例数据
data = {'fruit': ['apple', 'banana', 'orange', 'banana', 'apple']}
df = pd.DataFrame(data)

# 计算频率
frequency_encoded = df['fruit'].value_counts(normalize=True).to_dict()
df['fruit_encoded'] = df['fruit'].map(frequency_encoded)
print(df)

输出:

{'apple': 0.4, 'banana': 0.4, 'orange': 0.2}
0    0.4
1    0.4
2    0.2
3    0.4
4    0.4
Name: fruit_encoded, dtype: float64
    fruit  fruit_encoded
0   apple            0.4
1  banana            0.4
2  orange            0.2
3  banana            0.4
4   apple            0.4

六、目标编码(Target Encoding)

目标编码使用目标变量的平均值来编码类别特征,通常用于分类任务。需要注意避免数据泄漏。

使用方法:

需要安装 category_encoders 库:

python 复制代码
pip install category_encoders
python 复制代码
import category_encoders as ce
import pandas as pd

# 示例数据
data = {'fruit': ['apple', 'banana', 'orange', 'banana', 'apple'],
        'target': [1, 0, 1, 0, 1]}
df = pd.DataFrame(data)

# 创建 TargetEncoder 实例
target_encoder = ce.TargetEncoder()

# 拟合并转换数据
df['fruit_encoded'] = target_encoder.fit_transform(df['fruit'], df['target'])
print(df)

输出:

   fruit  target  fruit_encoded
0   apple       1       0.656740
1  banana       0       0.514889
2  orange       1       0.652043
3  banana       0       0.514889
4   apple       1       0.656740

总结

标签编码 适用于有序类别,对于无序类别可能导致误解。

独热编码 适用于无序类别,但会增加维度。

二进制编码 适合类别数量较多的情况,比独热编码更高效。

频率编码 根据类别出现频率进行编码,简单易用。

目标编码 利用目标变量的平均值进行编码,适用于分类问题,但需小心避免数据泄漏。

选择合适的编码方法取决于数据的性质和模型的要求。

相关推荐
算家云5 分钟前
快速识别模型:simple_ocr,部署教程
开发语言·人工智能·python·ocr·数字识别·检测模型·英文符号识别
youcans_36 分钟前
【微软:多模态基础模型】(5)多模态大模型:通过LLM训练
人工智能·计算机视觉·大模型·大语言模型·多模态
飞凌嵌入式40 分钟前
飞凌嵌入式T113-i开发板RISC-V核的实时应用方案
人工智能·嵌入式硬件·嵌入式·risc-v·飞凌嵌入式
sinovoip42 分钟前
Banana Pi BPI-CanMV-K230D-Zero 采用嘉楠科技 K230D RISC-V芯片设计
人工智能·科技·物联网·开源·risc-v
谢眠1 小时前
深度学习day3-自动微分
python·深度学习·机器学习
搏博1 小时前
神经网络问题之一:梯度消失(Vanishing Gradient)
人工智能·机器学习
z千鑫1 小时前
【人工智能】深入理解PyTorch:从0开始完整教程!全文注解
人工智能·pytorch·python·gpt·深度学习·ai编程
YRr YRr1 小时前
深度学习:神经网络的搭建
人工智能·深度学习·神经网络
威桑1 小时前
CMake + mingw + opencv
人工智能·opencv·计算机视觉