Python离散变量One-Hot编码实战:pandas与sklearn对比
本文详解Python中离散变量One-Hot编码的两种主流实现方式。通过对比pandas的get_dummies与sklearn的LabelEncoder结合OneHotEncoder,解析字符串与数值型变量的处理差异。文章包含具体代码示例,展示从数据导入、特征查看到编码生成的完整流程,帮助开发者根据数据类型选择合适方案。
在构建机器学习模型时,数据集中常包含离散型变量(如性别)。由于模型通常无法直接处理此类原始分类数据,预处理阶段需对其进行转换。One-Hot编码是处理离散变量的常用手段。本文将具体介绍在Python中实现离散变量One-Hot编码的方法。
本文提供两种哑编码(One-Hot编码)的实现路径:pandas库与sklearn库。两者的核心区别在于默认处理的数据类型不同:pandas默认针对字符串类型的类别变量进行处理,而sklearn默认针对数值型类别变量(若需处理字符串,需先通过LabelEncoder转换为数值)。
① pd.get_dummies(prefix=)
pandas库中的get_dummies()函数可直接对变量执行One-Hot编码。参数prefix用于为生成的新编码变量指定前缀命名,便于后续特征识别。
②LabelEncoder和OneHotEncoder
利用sklearn模块同样可实现离散变量的One-Hot编码。其中,LabelEncoder的作用是将离散变量映射为数字标签。
OneHotEncoder则负责对已转换为数字的离散变量执行One-Hot编码操作。
注意:get_dummies()支持直接对字符型变量进行编码,但OneHotEncoder不支持直接处理字符型变量,必须先将其转换为数值型。这正是在使用OneHotEncoder前必须引入LabelEncoder的原因。
下文将通过具体实例演示这两种方法的操作步骤。
①数据的导入
import pandas as pd
import os
os.getcwd()
os.chdir('E:\study\kaggle\Titanic')
from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import LabelEncoder
data = pd.read_csv('train.csv')
②数据熟悉
data['Sex'].value_counts() Out[38]: male 577 female 314 Name: Sex, dtype: int64 #可以看到,变量Sex为字符型变量,取值有male和female两种
③get_dummies
Sex_ohe_1 = pd.get_dummies(data['Sex']) Sex_ohe_1.head() Out[40]: female male 0 0 1 1 1 0 2 1 0 3 1 0 4 0 1
④OneHotEncoder
Sex_ohe_2 = OneHotEncoder(sparse=False).fit_transform(data['Sex'].reshape((-1,1))) ValueError: could not convert string to float: male
从代码执行结果可见,OneHotEncoder无法直接对字符型变量进行编码,报错提示涉及字符串转浮点数失败。因此,必须先将字符型变量通过LabelEncoder转换为数值型变量,再传入OneHotEncoder进行处理。
le_sex=LabelEncoder().fit(data['Sex']) Sex_label=le_sex.transform(data['Sex']) Sex_label= LabelEncoder().fit_transform(data['Sex']) #fit_transform等价于fit和transform两个函数结合 ohe_sex=OneHotEncoder(sparse=False).fit(Sex_label.reshape(-1,1)) Sex_ohe=ohe_sex.transform(Sex_label.reshape(-1,1)) Sex_ohe_3 = OneHotEncoder(sparse=False).fit_transform(Sex_label.reshape((-1,1)))
补充说明:get_dummies()的输出结果为DataFrame(数据框),而OneHotEncoder的输出结果为数组(Array)。
以上即为Python中离散变量One-Hot编码的完整方法介绍,供读者参考与实践。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









