【机器学习技巧】之特征工程:数字编码以及One-hot独热编码的几种方式(sklearn与pandas处理方式)

简介: 【机器学习技巧】之特征工程:数字编码以及One-hot独热编码的几种方式(sklearn与pandas处理方式)

1. OneHot独热编码介绍


1.1 为什么要用One-hot编码?


在建模过程中,我们通常会碰到各种类型的属性,如果是标称型属性(非数值类型的属性),也就是不具备序列性、不能比较大小的属性,通常我们不能用简单的数值来粗暴替换。因为属性的数值大小会影响到权重矩阵的计算,不存在大小关系的属性,其权重也不应该发生相应的变化,那么我们就需要用到One-hot编码(也有人称独热编码)这种特殊的编码方式了。


1.2 One-hot举例


data = pd.DataFrame([
            [ 'M', 10.1], 
            [ 'L', 13.5], 
            [ 'XL', 15.3],
            [ 'XL', 16.3]])


One-hot编码后变为:

data = array([[0, 1, 0, 10.1],

[1, 0, 0, 13.5],

[0, 0, 1, 15.3],

[0, 0, 1, 16.3]])


1.3 One-hot使用范围


one-hot通常用在GBDT、XGBoost这些模型里面都挺好的,但是用在逻辑回归里不行。因为逻辑回归要求变量间相互独立,如果你只有一个属性需要做one-hot编码还好,如果你有多个属性需要做one-ont编码,那么当某个样本的多个one-hot属性同时为1时,这两个属性就完全相关了,必然会导致singular error,也就是非奇异矩阵不能求解唯一解,得不出唯一的模型,但是你又不可能把同一个属性的某一个one-hot延伸变量删除。


如果在逻辑回归中入模标称属性,可以直接替换成数值,然后做woe变换,用每个类别的woe值来代替原来的数值,这样既能够避免生成相关性强的变量,又能避开类别间大小无法比较的问题。


创建基础数据


import pandas as pd
import numpy as np
data = pd.DataFrame([
            ['yellow', 'M', 10.1, 'class1'], 
            ['red', 'L', 13.5, 'class2'], 
            ['blue', 'XL', 15.3, 'class1'],
            ['green', 'XL', 16.3, 'class3']])
data.columns = ['颜色', '大小', '价格', '类别标签']
data


image.png


2. sklearn机器学习中Onehot编码方式

2.1 将分类特征进行数字编码—LabelEncoder将分类特征数字化


from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
category = encoder.fit_transform(data['颜色'])
print("颜色编码:",category)
print("编码对应的颜色:",encoder.classes_)
颜色编码: [3 2 0 1]
编码对应的颜色: ['blue' 'green' 'red' 'yellow']


但是LabelEncoder一次只能处理一个属性,因此需要使用循环分别对属性进行处理


columns = ['颜色','大小','类别标签']
data2 = data.copy()
for column in columns:
    data2[column] = encoder.fit_transform(data[column])
    print("{}编码顺序:{}".format(column, encoder.classes_))
data2
颜色编码顺序:['blue' 'green' 'red' 'yellow']
大小编码顺序:['L' 'M' 'XL']
类别标签编码顺序:['class1' 'class2' 'class3']

image.png


2.2 Onehot编码方法一:LabelEncoder后使用OneHotEncoder


from sklearn.preprocessing import OneHotEncoder
columns = ['颜色','大小','类别标签']
enc = OneHotEncoder()
# 将['颜色','大小','类别标签']这3列进行独热编码
enc.fit_transform(data2[columns]).toarray()
array([[0., 0., 0., 1., 0., 1., 0., 1., 0., 0.],
       [0., 0., 1., 0., 1., 0., 0., 0., 1., 0.],
       [1., 0., 0., 0., 0., 0., 1., 1., 0., 0.],
       [0., 1., 0., 0., 0., 0., 1., 0., 0., 1.]])


2.3 Onehot编码方法二:直接对文本使用LabelBinarizer


LabelBinarizer 每次也只能对一个特征进行独热编码,需要使用循环对每个特征进行编码



from sklearn.preprocessing import LabelBinarizer
enc = LabelBinarizer()
transform_data = enc.fit_transform(data['颜色'])
transform_data
array([[0, 0, 0, 1],
       [0, 0, 1, 0],
       [1, 0, 0, 0],
       [0, 1, 0, 0]])
transform_data = enc.fit_transform(data['大小'])
transform_data
array([[0, 1, 0],
       [1, 0, 0],
       [0, 0, 1],
       [0, 0, 1]])


2.4 Onehot编码方法三:DictVectorizer


from sklearn.feature_extraction import DictVectorizer
dict = DictVectorizer(sparse=False)
dict_data= dict.fit_transform(data.to_dict(orient="records"))
dict_data
array([[10.1,  0. ,  1. ,  0. ,  1. ,  0. ,  0. ,  0. ,  0. ,  0. ,  1. ],
       [13.5,  1. ,  0. ,  0. ,  0. ,  1. ,  0. ,  0. ,  0. ,  1. ,  0. ],
       [15.3,  0. ,  0. ,  1. ,  1. ,  0. ,  0. ,  1. ,  0. ,  0. ,  0. ],
       [16.3,  0. ,  0. ,  1. ,  0. ,  0. ,  1. ,  0. ,  1. ,  0. ,  0. ]])
# 查看各列标签名称
dict.get_feature_names()
['价格',
 '大小=L',
 '大小=M',
 '大小=XL',
 '类别标签=class1',
 '类别标签=class2',
 '类别标签=class3',
 '颜色=blue',
 '颜色=green',
 '颜色=red',
 '颜色=yellow']


3. Pandas中Onehot编码方式


3.1 Pandas将分类特征进行数字编码方式–pd.factorize()


data_category, data_class = pd.factorize(data['大小'])
print(data_category)
print(data_class)
[0 1 2 2]
Index(['M', 'L', 'XL'], dtype='object')


3.2 Onehot编码–pd.get_dummies()


data_oneHot = pd.get_dummies(data)
• 1
data_oneHot


image.png


4. 总结


综合上述方法:


个人认为下面两种方式转化为One_hot类型特征最方便:


  1. sklearn中使用DictVectorizer
  2. Pandas中使用pd.get_dummies
相关文章
|
4天前
|
机器学习/深度学习 数据采集 算法
探索机器学习中的特征工程
【5月更文挑战第10天】 在机器学习领域,特征工程扮演着至关重要的角色。它涉及选择、修改和创造从原始数据中提取的特征,旨在提高模型的性能。本文将深入探讨特征工程的多个方面,包括数据清洗、特征选择、维度缩减以及特征编码等,同时提供实用的技巧和策略,帮助读者构建出更有效的机器学习模型。
|
5天前
|
机器学习/深度学习 数据采集 人工智能
机器学习之sklearn基础教程
【5月更文挑战第9天】Sklearn是Python热门机器学习库,提供丰富算法和预处理工具。本文深入讲解基础概念、核心理论、常见问题及解决策略。内容涵盖模型选择与训练、预处理、交叉验证、分类回归、模型评估、数据集划分、正则化、编码分类变量、特征选择与降维、集成学习、超参数调优、模型评估、保存加载及模型解释。学习Sklearn是迈入机器学习领域的关键。
17 3
|
7天前
|
机器学习/深度学习 数据采集 算法
机器学习之sklearn基础教程
机器学习之sklearn基础教程
|
11天前
|
机器学习/深度学习 数据采集 搜索推荐
机器学习中的特征工程:提升模型性能的关键步骤
【5月更文挑战第3天】特征工程是提升机器学习模型性能的关键,涉及从原始数据中提取、选择和创造特征。它能提高模型预测准确率,简化模型复杂度,增强泛化能力。常用技术包括特征选择(Filter、Wrapper、Embedded方法)、特征构造(组合、多项式、文本特征提取)和特征变换(标准化、归一化、离散化)。通过优化特征工程,可找到最佳特征组合,提升模型性能。
|
14天前
|
机器学习/深度学习 Python
【Python机器学习专栏】时间序列数据的特征工程
【4月更文挑战第30天】本文探讨了时间序列数据的特征工程,强调其在捕捉季节性、揭示趋势、处理异常值和提升模型性能中的重要性。介绍了滞后特征、移动窗口统计特征、时间戳特征、频域特征和波动率特征等方法,并提供了Python实现示例。通过有效特征工程,可提高时间序列分析的准确性和预测可靠性。
|
14天前
|
机器学习/深度学习 PyTorch TensorFlow
【Python 机器学习专栏】特征工程在机器学习中的重要性
【4月更文挑战第30天】特征工程是机器学习的关键,涉及数据转换为有意义特征的过程,对模型性能、数据理解、泛化能力和计算效率至关重要。其技术包括特征提取、选择和构建,以及归一化。Python的Pandas、Scikit-learn等工具为特征工程提供支持。面对数据复杂性、相关性和动态性挑战,需灵活应对。通过案例分析展示了特征工程如何提升模型性能,强调了其在构建高效机器学习模型中的作用。
|
14天前
|
机器学习/深度学习 数据采集 算法
【Python机器学习专栏】使用Scikit-learn进行数据编码
【4月更文挑战第30天】本文介绍了Python Scikit-learn库在机器学习数据预处理中的作用,尤其是数据编码。数据编码将原始数据转化为算法可理解的格式,包括标签编码(适用于有序分类变量)、独热编码(适用于无序分类变量)和文本编码(如词袋模型、TF-IDF)。Scikit-learn提供LabelEncoder和OneHotEncoder类实现这些编码。示例展示了如何对数据进行标签编码和独热编码,强调了正确选择编码方法的重要性。
|
18天前
|
机器学习/深度学习 数据采集 自然语言处理
探索机器学习中的维度诅咒与特征工程
【4月更文挑战第26天】 在高维数据空间航行,机器学习模型常受维度诅咒之困扰,遭遇过拟合、计算成本增加和解释性下降等问题。本文通过深入分析维度诅咒的成因,探讨了特征工程作为解决之道的关键策略,包括特征选择、特征提取及特征转换等技术。我们将透过实例说明如何巧妙运用这些方法,以降低数据维度,提升模型性能,同时保持结果的可解释性。
|
28天前
|
机器学习/深度学习 数据采集 算法
构建高效机器学习模型:从特征工程到模型调优
【4月更文挑战第16天】 在数据驱动的时代,机器学习已成为解决复杂问题的关键工具。本文旨在分享一套实用的技术流程,帮助读者构建高效的机器学习模型。我们将重点讨论特征工程的重要性、选择合适算法的策略,以及通过交叉验证和网格搜索进行模型调优的方法。文章的目标是为初学者提供一个清晰的指南,同时为有经验的实践者提供一些高级技巧。
|
29天前
|
算法框架/工具 TensorFlow 机器学习/深度学习
Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(九)(2)
Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(九)
157 0
Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(九)(2)