【机器学习技巧】之特征工程:数字编码以及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
相关文章
|
7月前
|
机器学习/深度学习 数据采集 算法
量子机器学习入门:三种数据编码方法对比与应用
在量子机器学习中,数据编码方式决定了量子模型如何理解和处理信息。本文详解角度编码、振幅编码与基础编码三种方法,分析其原理、实现及适用场景,帮助读者选择最适合的编码策略,提升量子模型性能。
556 8
|
12月前
|
机器学习/深度学习 算法 数据挖掘
PyTabKit:比sklearn更强大的表格数据机器学习框架
PyTabKit是一个专为表格数据设计的新兴机器学习框架,集成了RealMLP等先进深度学习技术与优化的GBDT超参数配置。相比传统Scikit-Learn,PyTabKit通过元级调优的默认参数设置,在无需复杂超参调整的情况下,显著提升中大型数据集的性能表现。其简化API设计、高效训练速度和多模型集成能力,使其成为企业决策与竞赛建模的理想工具。
461 12
PyTabKit:比sklearn更强大的表格数据机器学习框架
|
机器学习/深度学习 算法 搜索推荐
机器学习“捷径”:自动特征工程全面解析
​ 在机器学习项目中,特征工程是影响模型性能的关键步骤。它通过从原始数据中提取出更有用的特征,帮助模型更好地捕捉数据中的模式。然而,传统的特征工程过程往往需要大量的领域知识和实验调整,是一项耗时费力的工作。 近年来,自动特征工程(Automated Feature Engineering)技术的兴起,为这一问题提供了新的解决方案。它旨在通过自动化方法从数据中生成和选择最优特征,使得特征工程过程更加高效。本文将详细介绍自动特征工程的基本概念、常用技术、工具,并通过代码示例展示其实际应用。
|
机器学习/深度学习 数据采集 数据挖掘
特征工程在营销组合建模中的应用:基于因果推断的机器学习方法优化渠道效应估计
因果推断方法为特征工程提供了一个更深层次的框架,使我们能够区分真正的因果关系和简单的统计相关性。这种方法在需要理解干预效果的领域尤为重要,如经济学、医学和市场营销。
694 1
特征工程在营销组合建模中的应用:基于因果推断的机器学习方法优化渠道效应估计
|
机器学习/深度学习 算法 数据可视化
【机器学习】决策树------迅速了解其基本思想,Sklearn的决策树API及构建决策树的步骤!!!
【机器学习】决策树------迅速了解其基本思想,Sklearn的决策树API及构建决策树的步骤!!!
|
机器学习/深度学习 SQL 数据采集
"解锁机器学习数据预处理新姿势!SQL,你的数据金矿挖掘神器,从清洗到转换,再到特征工程,一网打尽,让数据纯净如金,模型性能飙升!"
【8月更文挑战第31天】在机器学习项目中,数据质量至关重要,而SQL作为数据预处理的强大工具,助力数据科学家高效清洗、转换和分析数据。通过去除重复记录、处理缺失值和异常值,SQL确保数据纯净;利用数据类型转换和字符串操作,SQL重塑数据结构;通过复杂查询生成新特征,SQL提升模型性能。掌握SQL,就如同拥有了开启数据金矿的钥匙,为机器学习项目奠定坚实基础。
296 0
|
机器学习/深度学习 数据采集 算法
机器学习到底是什么?附sklearn代码
机器学习到底是什么?附sklearn代码
455 4
|
机器学习/深度学习 数据采集 算法
如何使用机器学习神器sklearn做特征工程?
如何使用机器学习神器sklearn做特征工程?
161 0
|
机器学习/深度学习
机器学习中label如何实现多标签编码?
介绍了在机器学习中处理多标签分类问题时的一种标签编码方法。
333 0
|
机器学习/深度学习 安全 算法
机器学习 -之one-hot编码技术
One-hot编码是一种数据处理技术,主要用于将分类变量转换为适合机器学习算法处理的格式。
506 0
下一篇
开通oss服务