- 机器学习基础
- ML - 首页
- ML - 简介
- ML - 入门
- ML - 基本概念
- ML - 生态系统
- ML - Python 库
- ML - 应用
- ML - 生命周期
- ML - 技能要求
- ML - 实现
- ML - 挑战与常见问题
- ML - 限制
- ML - 真实案例
- ML - 数据结构
- ML - 数学基础
- ML - 人工智能
- ML - 神经网络
- ML - 深度学习
- ML - 获取数据集
- ML - 类别型数据
- ML - 数据加载
- ML - 数据理解
- ML - 数据准备
- ML - 模型
- ML - 监督学习
- ML - 无监督学习
- ML - 半监督学习
- ML - 强化学习
- ML - 监督学习 vs. 无监督学习
- 机器学习数据可视化
- ML - 数据可视化
- ML - 直方图
- ML - 密度图
- ML - 箱线图
- ML - 相关矩阵图
- ML - 散点矩阵图
- 机器学习统计学
- ML - 统计学
- ML - 平均数、中位数、众数
- ML - 标准差
- ML - 百分位数
- ML - 数据分布
- ML - 偏度和峰度
- ML - 偏差和方差
- ML - 假设
- 机器学习中的回归分析
- ML - 回归分析
- ML - 线性回归
- ML - 简单线性回归
- ML - 多元线性回归
- ML - 多项式回归
- 机器学习中的分类算法
- ML - 分类算法
- ML - 逻辑回归
- ML - K近邻算法 (KNN)
- ML - 朴素贝叶斯算法
- ML - 决策树算法
- ML - 支持向量机
- ML - 随机森林
- ML - 混淆矩阵
- ML - 随机梯度下降
- 机器学习中的聚类算法
- ML - 聚类算法
- ML - 基于中心点的聚类
- ML - K均值聚类
- ML - K中心点聚类
- ML - 均值漂移聚类
- ML - 层次聚类
- ML - 基于密度的聚类
- ML - DBSCAN聚类
- ML - OPTICS聚类
- ML - HDBSCAN聚类
- ML - BIRCH聚类
- ML - 亲和传播
- ML - 基于分布的聚类
- ML - 凝聚层次聚类
- 机器学习中的降维
- ML - 降维
- ML - 特征选择
- ML - 特征提取
- ML - 后向消除法
- ML - 前向特征构造
- ML - 高相关性过滤
- ML - 低方差过滤
- ML - 缺失值比率
- ML - 主成分分析
- 强化学习
- ML - 强化学习算法
- ML - 利用与探索
- ML - Q学习
- ML - REINFORCE算法
- ML - SARSA强化学习
- ML - 演员-评论家方法
- 深度强化学习
- ML - 深度强化学习
- 量子机器学习
- ML - 量子机器学习
- ML - 使用Python的量子机器学习
- 机器学习杂项
- ML - 性能指标
- ML - 自动工作流
- ML - 提升模型性能
- ML - 梯度提升
- ML - 自举汇聚 (Bagging)
- ML - 交叉验证
- ML - AUC-ROC曲线
- ML - 网格搜索
- ML - 数据缩放
- ML - 训练和测试
- ML - 关联规则
- ML - Apriori算法
- ML - 高斯判别分析
- ML - 成本函数
- ML - 贝叶斯定理
- ML - 精度和召回率
- ML - 对抗性
- ML - 堆叠
- ML - 轮次
- ML - 感知器
- ML - 正则化
- ML - 过拟合
- ML - P值
- ML - 信息熵
- ML - MLOps
- ML - 数据泄露
- ML - 机器学习的盈利化
- ML - 数据类型
- 机器学习 - 资源
- ML - 快速指南
- ML - 速查表
- ML - 面试问题
- ML - 有用资源
- ML - 讨论
机器学习中的类别型数据
什么是类别型数据?
机器学习中的类别型数据指的是由类别或标签组成的数据,而不是数值数据。这些类别可能是名义上的,这意味着它们之间没有固有的顺序或等级(例如,颜色、性别),也可能是顺序的,这意味着类别之间存在自然顺序(例如,教育水平、收入等级)。
类别型数据通常使用离散值表示,例如整数或字符串,并且在用作机器学习模型的输入之前,通常会编码为独热向量。独热编码涉及为每个类别创建一个二进制向量,其中向量在对应于该类别的位置上为1,在所有其他位置上为0。
处理类别型数据的技巧
处理类别型数据是机器学习预处理的重要组成部分,因为许多算法都需要数值输入。根据算法和类别型数据的性质,可以使用不同的编码技术,例如标签编码、序数编码或二进制编码等。
在本章的后续部分,我们将讨论以下处理机器学习中类别型数据的不同技术,以及它们在Python中的实现。
让我们了解上面提到的每种处理机器学习中类别型数据的技术。
1. 独热编码
独热编码是处理机器学习中类别型数据的一种常用技术。它涉及为每个类别创建一个二进制向量,其中向量的每个元素表示该类别的存在或不存在。例如,如果我们有一个表示颜色的类别变量,其值为红色、蓝色和绿色,则独热编码将分别创建三个二进制向量:[1, 0, 0]、[0, 1, 0] 和 [0, 0, 1]。
示例
下面是使用Pandas库在Python中执行独热编码的示例:
import pandas as pd # Creating a sample dataset with a categorical variable data = {'color': ['red', 'green', 'blue', 'red', 'green']} df = pd.DataFrame(data) # Performing one-hot encoding one_hot_encoded = pd.get_dummies(df['color'], prefix='color') # Combining the encoded data with the original data df = pd.concat([df, one_hot_encoded], axis=1) # Drop the original categorical variable df = df.drop('color', axis=1) # Print the encoded data print(df)
输出
这将创建一个具有三个二进制变量(“color_blue”、“color_green”和“color_red”)的独热编码数据框,如果存在相应的颜色,则这些变量取值为1,否则取值为0。此编码数据(下面给出的输出)可用于机器学习任务,例如分类和回归。
color_blue color_green color_red 0 0 0 1 1 0 1 0 2 1 0 0 3 0 0 1 4 0 1 0
独热编码技术适用于小型且有限的类别变量,但对于大型类别变量可能会存在问题,因为它会导致大量的输入特征。
2. 标签编码
标签编码是处理机器学习中类别型数据的另一种技术。它涉及为类别变量中的每个类别分配一个唯一的数值,数值的顺序基于类别的顺序。
例如,假设我们有一个名为“Size”的类别变量,它有三个类别:“small”、“medium”和“large”。使用标签编码,我们将分别为这些类别分配值0、1和2。
示例
下面是使用scikit-learn库在Python中执行标签编码的示例:
from sklearn.preprocessing import LabelEncoder # create a sample dataset with a categorical variable data = ['small', 'medium', 'large', 'small', 'large'] # create a label encoder object label_encoder = LabelEncoder() # fit and transform the data using the label encoder encoded_data = label_encoder.fit_transform(data) # print the encoded data print(encoded_data)
这将创建一个编码数组,其值为[0, 1, 2, 0, 2],分别对应于编码类别“small”、“medium”和“large”。请注意,默认情况下,编码基于类别的字母顺序,但可以通过传递自定义列表到LabelEncoder对象来更改顺序。
输出
[2 1 0 2 0]
当类别之间存在自然顺序时,例如序数类别变量,标签编码很有用。但是,对于名义类别变量,应谨慎使用它,因为数值可能会暗示实际上不存在的顺序。在这些情况下,独热编码是更安全的选择。
3. 频率编码
频率编码是处理机器学习中类别型数据的另一种技术。它涉及用类别在数据集中出现的频率(或计数)替换类别变量中的每个类别。频率编码背后的思想是,更频繁出现的类别可能对机器学习算法更重要或更有信息量。
示例
下面是使用Python执行频率编码的示例:
import pandas as pd # create a sample dataset with a categorical variable data = {'color': ['red', 'green', 'blue', 'red', 'green']} df = pd.DataFrame(data) # calculate the frequency of each category in the categorical variable freq = df['color'].value_counts(normalize=True) # replace each category with its frequency df['color_freq'] = df['color'].map(freq) # drop the original categorical variable df = df.drop('color', axis=1) # print the encoded data print(df)
这将创建一个编码数据框,其中包含一个变量(“color_freq”),表示原始类别变量中每个类别的频率。例如,如果原始变量有两个“red”和三个“green”,则相应的频率将分别为0.4和0.6。
输出
color_freq 0 0.4 1 0.4 2 0.2 3 0.4 4 0.4
频率编码可能是独热编码或标签编码的有用替代方案,尤其是在处理高基数类别变量(即具有大量类别的变量)时。但是,它可能并不总是有效,其性能可能取决于所使用的数据集和机器学习算法。
4. 目标编码
目标编码是处理机器学习中类别型数据的另一种技术。它涉及用该类别的目标变量(即您想要预测的变量)的平均值(或其他聚合)替换类别变量中的每个类别。目标编码背后的思想是,它可以捕获类别变量和目标变量之间的关系,从而提高机器学习模型的预测性能。
示例
下面是使用Scikit-learn库在Python中执行目标编码的示例,通过结合标签编码器和平均编码器:
import pandas as pd from sklearn.preprocessing import LabelEncoder # create a sample dataset with a categorical variable and a target variable data = {'color': ['red', 'green', 'blue', 'red', 'green'], 'target': [1, 0, 1, 0, 1]} df = pd.DataFrame(data) # create a label encoder object and fit it to the data label_encoder = LabelEncoder() label_encoder.fit(df['color']) # transform the categorical variable using the label encoder df['color_encoded'] = label_encoder.transform(df['color']) # create a mean encoder object and fit it to the transformed data mean_encoder = df.groupby('color_encoded')['target'].mean().to_dict() # map the mean encoded values to the categorical variable df['color_encoded'] = df['color_encoded'].map(mean_encoder) # print the encoded data print(df)
在此示例中,我们首先创建一个Pandas DataFrame df,其中包含一个类别变量'color'和一个目标变量'target'。然后,我们从scikit-learn创建一个LabelEncoder对象,并将其拟合到df的'color'列。
接下来,我们使用标签编码器转换类别变量'color',通过在标签编码器对象上调用transform方法,并将生成的编码值分配给df中的新列'color_encoded'。
最后,我们通过对'color_encoded'列进行分组并计算每个组的'target'列的平均值来创建一个平均编码器对象。然后,我们将此平均编码器对象转换为字典,并将平均编码值映射到df的原始'color'列。
输出
color target color_encoded 0 red 1 0.5 1 green 0 0.5 2 blue 1 1.0 3 red 0 0.5 4 green 1 0.5
目标编码可能是提高机器学习模型预测性能的强大技术,尤其是在具有高基数类别变量的数据集中。但是,重要的是要避免过度拟合,方法是使用交叉验证和正则化技术。
5. 二进制编码
二进制编码是另一种用于在机器学习中对类别变量进行编码的技术。在二进制编码中,每个类别都分配一个二进制代码,其中每个数字表示该类别是否存在(1)或不存在(0)。二进制代码通常基于类别在所有类别排序列表中的位置。
示例
以下是使用category_encoders库在Python中实现二进制编码的示例:
import pandas as pd import category_encoders as ce # create a sample dataset with a categorical variable data = {'color': ['red', 'green', 'blue', 'red', 'green']} df = pd.DataFrame(data) # create a binary encoder object and fit it to the data binary_encoder = ce.BinaryEncoder(cols=['color']) binary_encoder.fit(df['color']) # transform the categorical variable using the binary encoder encoded_data = binary_encoder.transform(df['color']) # merge the encoded variable with the original dataframe df = pd.concat([df, encoded_data], axis=1) # print the encoded data print(df)
在此示例中,我们首先创建一个Pandas DataFrame df,其中包含一个类别变量'color'。然后,我们从category_encoders库创建一个BinaryEncoder对象,并将其拟合到df的'color'列。
接下来,我们使用二进制编码器转换类别变量'color',通过在二进制编码器对象上调用transform方法,并将生成的编码值分配给新的DataFrame encoded_data。
最后,我们使用concat方法沿列轴(axis=1)将编码变量与原始DataFrame df合并。结果DataFrame应包含原始'color'列以及编码的二进制列。
输出
运行代码后,将产生以下输出:
color color_0 color_1 0 red 0 1 1 green 1 0 2 blue 1 1 3 red 0 1 4 green 1 0
二进制编码最适合具有中等数量类别的分类变量,因为对于具有大量类别的变量,它可能会很快变得效率低下。