类别型数据的预处理方法

本文详细介绍了在机器学习中如何处理类别型数据,包括Replace直接替换、map()替换、LabelEncoding、OneHot Encoding和Dummy variables等编码方式。针对高势集的特殊情况,提出了主观合并类别、聚类和重编码(哈希编码、均值编码)等方法。总结中指出,定类数据推荐使用OneHot Encoding,定序数据使用Label Encoding,数值大小敏感的模型使用OneHot Encoding或Dummy,数值大小不敏感的模型如树模型可考虑Label Encoding。
摘要由CSDN通过智能技术生成

在机器学习过程中,我们往往需要对数据进行预处理。根据数据的取值情况,我们可以把数据总体分为两大类:类别型数据和数值型数据。

对于数值性变量,通常不需要对其进行编码处理。而如何处理类别型数据是一个难题。处理的方法有很多种,各有优缺并且各有适用的范围。

本文在收集相关资料后,试图对目前较为常见的处理方式做一个归纳总结。

 

1. 为什么需要编码

机器学习相关算法对各数据进行衡量时,依赖的大多是其数值关系,如决策树ID3算法依赖于香农熵的计算,线性回归模型依赖于欧式距离的计算。

数值型变量自然是可以直接被算法处理,而算法往往无法直接对分类型变量进行处理,因此在把数据应用于算法训练前,需要对其进行调整,把分类型变量转换成为数值。

 

2. 主要编码方式

2.1 Replace 直接替换

有些时候,在我们要进行特征处理的变量中,并不是所有的取值都需要进行特征处理,只需要对其中部分不符合要求的取值进行替换。

举例如下:

假设 test_df 包含的是8名同学在某次测验中的数学成绩,成绩记录的标准为:

  • 成绩低于60分,记为F

  • 成绩在[60, 70)之间,记为C

  • 成绩在[70, 80)之间,记为B

  • 成绩在[80, 100]之间,记为A

在记录的过程中,由于疏忽,一名同学的成绩被错记为其真实的数值成绩。

所以,在本数据集中需要对其进行特征编码,将该数值根据成绩记录的标准进行替换,以使得最终 math 变量的取值标准统一。

在本案例中,则需要将 93 替换为 A。可以考虑直接使用 Replace() 方法进行处理。

代码如下:

test_dict = {'id': [1, 2, 3, 4, 5, 6, 7, 8],  # 构建测试数据``       
             'math':['F', 'B', 'B', 'F', 93, 'A', 'C', 'C']}
test_df = pd.DataFrame(test_dict)
# 将math一列中的93替换成A
test_df.replace({'math': {93: 'A'}}, inplace=True)
test_df

显示结果如下:

2.2 map() 替换

除了使用 replace() 方法,也可以应用内置的 map() 方法进行直接替换处理。

map() 可以对 Dataframe 中某列内的元素进行操作,在此情景下的作用是:根据映射关系,为指定列匹配结果并进行替换。其处理原理与使用 replace() 进行直接替换的方式一致,需要自行指定各类别取值应该如何转换为数值。

但其特别之处在于,map() 方法作用于整列变量的元素,因此需要对该列变量中所有可能出现的取值指定映射关系,否则没有指定映射关系的取值将会被转换成NaN。因此,不适用于取值类别特别多的时候。

例一:没有指定全部映射关系,出现 NaN

借用讲述 replace() 部分的案例,我们要做的工作是将93转换成为A。

如果使用 map() 方法,并只对93进行转换,而没有对所有取值指定映射关系。上例案例可以修改为:

test_df['math'] = test_df['math'].map({93: 'A'})
test_df

处理后的数据对比:

可以看出,这里的 map() 只对93进行了转换,而 math 变量中其余取值都变成了 NaN。

例二:将 art 变量的取值全部进行映射处理

假设art变量共5个取值:[a1, a2, a3, b1, b2]。现在需要将[a1, a2, a3]转换为a,[b1, b2]转换为b。

代码如下:

import pandas as pd​
test_df2 = pd.DataFrame({'id': [1, 2, 3, 4, 5],
                       'art': ['a1', 'a2', 'b1', 'a3', 'b2']})
# 对art变量的取值一一构建映射关系,并进行替换
test_df2['art'] = test_df2['art'].map({'a1': 'a', 'a2': 'a', 'a3': 'a',
                                       'b1': 'b', 'b2': 'b'})
test_df2

显示结果如下:

2.3 LabelEncoding 标签编码

直接替换方法适用于原始数据集中只存在少量数据需要人工进行调整的情况。如果需要调整的数据量非常大且数据格式不统一,直接替换的方法也可以实现我们的目的,但是这种方法需要的工作量会非常大。因此, 我们需要能够快速对整列变量的所有取值进行编码的方法。

Python中,数据预处理数据分析和机器学习项目的关键步骤,它包括数据清洗、转换、规范化和特征选择等。以下是常用的一些Python数据预处理方法: 1. **数据清洗(Data Cleaning)**: - 处理缺失值:使用`pandas`库中的`dropna`、`fillna`或插补方法(如`mean`, `median`, `mode`)填充缺失值。 - 删除重复项:`duplicated` 和 `drop_duplicates`。 - 异常值检测:通过统计分析(如Z-score, IQR)或可视化找出离群值并处理。 2. **数据转换(Data Transformation)**: - 标准化/归一化:`scikit-learn`的`StandardScaler` 和 `MinMaxScaler` 对数值数据进行标准化或归一化。 - 逻辑编码/独热编码:`pandas.get_dummies` 或 `OneHotEncoder` 对类别变量进行编码。 - 对数/指数变换:处理偏斜分布的数据。 3. **数据转换**: 使用`astype()` 方法数据从一种类转换为另一种类,如字符串转数字。 4. **特征选择(Feature Selection)**: - 相关性分析:计算特征之间的相关系数,`corr()` 函数。 - 特征重要性:使用随机森林、梯度提升机等模计算特征的重要性。 5. **数据切分(Data Splitting)**: - 划分训练集和测试集:`train_test_split` 函数,用于模训练和评估。 6. **编码(Encoding)**: - 数字编码:对文本数据进行编码,如词袋模或TF-IDF。 - 文本预处理:去除停用词、标点符号,进行词干提取或词形还原。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值